aboutsummaryrefslogtreecommitdiff
path: root/documentation/content/ru
diff options
context:
space:
mode:
authorSergio Carlavilla Delgado <carlavilla@FreeBSD.org>2021-01-25 23:31:29 +0000
committerSergio Carlavilla Delgado <carlavilla@FreeBSD.org>2021-01-25 23:31:29 +0000
commit989d921f5d4ac8d8b7c831c13b8954ad1901be24 (patch)
treea5d768f9af4b55422fdf5b17064879ae1c7ce032 /documentation/content/ru
parent0cff342f42461c5081b98bce7581f43df319e4f4 (diff)
Diffstat (limited to 'documentation/content/ru')
-rw-r--r--documentation/content/ru/articles/_index.adoc7
-rw-r--r--documentation/content/ru/articles/committers-guide/_index.adoc1149
-rw-r--r--documentation/content/ru/articles/contributing/_index.adoc215
-rw-r--r--documentation/content/ru/articles/cups/_index.adoc237
-rw-r--r--documentation/content/ru/articles/explaining-bsd/_index.adoc168
-rw-r--r--documentation/content/ru/articles/fonts/_index.adoc528
-rw-r--r--documentation/content/ru/articles/freebsd-questions/_index.adoc241
-rw-r--r--documentation/content/ru/articles/geom-class/_index.adoc348
-rw-r--r--documentation/content/ru/articles/gjournal-desktop/_index.adoc438
-rw-r--r--documentation/content/ru/articles/hubs/_index.adoc280
-rw-r--r--documentation/content/ru/articles/ipsec-must/_index.adoc262
-rw-r--r--documentation/content/ru/articles/mailing-list-faq/_index.adoc165
-rw-r--r--documentation/content/ru/articles/new-users/_index.adoc370
-rw-r--r--documentation/content/ru/articles/pam/_index.adoc570
-rw-r--r--documentation/content/ru/articles/pr-guidelines/_index.adoc573
-rw-r--r--documentation/content/ru/articles/problem-reports/_index.adoc367
-rw-r--r--documentation/content/ru/articles/releng/_index.adoc413
-rw-r--r--documentation/content/ru/articles/solid-state/_index.adoc266
-rw-r--r--documentation/content/ru/articles/vm-design/_index.adoc222
-rw-r--r--documentation/content/ru/books/_index.adoc7
-rw-r--r--documentation/content/ru/books/arch-handbook/driverbasics/chapter.adoc493
-rw-r--r--documentation/content/ru/books/arch-handbook/locking/chapter.adoc118
-rw-r--r--documentation/content/ru/books/arch-handbook/sound/chapter.adoc413
-rw-r--r--documentation/content/ru/books/books.adoc4
-rw-r--r--documentation/content/ru/books/design-44bsd/_index.adoc604
-rw-r--r--documentation/content/ru/books/design-44bsd/chapters-order.adoc1
-rw-r--r--documentation/content/ru/books/developers-handbook/_index.adoc290
-rw-r--r--documentation/content/ru/books/developers-handbook/introduction/chapter.adoc120
-rw-r--r--documentation/content/ru/books/developers-handbook/kerneldebug/chapter.adoc658
-rw-r--r--documentation/content/ru/books/developers-handbook/policies/chapter.adoc176
-rw-r--r--documentation/content/ru/books/developers-handbook/secure/chapter.adoc168
-rw-r--r--documentation/content/ru/books/faq/_index.adoc3076
-rw-r--r--documentation/content/ru/books/faq/chapters-order.adoc1
-rw-r--r--documentation/content/ru/books/handbook/_index.adoc44
-rw-r--r--documentation/content/ru/books/handbook/advanced-networking/_index.adoc2336
-rw-r--r--documentation/content/ru/books/handbook/audit/_index.adoc406
-rw-r--r--documentation/content/ru/books/handbook/basics/_index.adoc1732
-rw-r--r--documentation/content/ru/books/handbook/bibliography/_index.adoc166
-rw-r--r--documentation/content/ru/books/handbook/book.adoc160
-rw-r--r--documentation/content/ru/books/handbook/boot/_index.adoc480
-rw-r--r--documentation/content/ru/books/handbook/bsdinstall/_index.adoc1364
-rw-r--r--documentation/content/ru/books/handbook/chapters-order.adoc37
-rw-r--r--documentation/content/ru/books/handbook/config/_index.adoc1297
-rw-r--r--documentation/content/ru/books/handbook/cutting-edge/_index.adoc1056
-rw-r--r--documentation/content/ru/books/handbook/desktop/_index.adoc659
-rw-r--r--documentation/content/ru/books/handbook/disks/_index.adoc2369
-rw-r--r--documentation/content/ru/books/handbook/eresources/_index.adoc1047
-rw-r--r--documentation/content/ru/books/handbook/filesystems/_index.adoc465
-rw-r--r--documentation/content/ru/books/handbook/firewalls/_index.adoc1385
-rw-r--r--documentation/content/ru/books/handbook/geom/_index.adoc564
-rw-r--r--documentation/content/ru/books/handbook/install/_index.adoc2455
-rw-r--r--documentation/content/ru/books/handbook/introduction/_index.adoc212
-rw-r--r--documentation/content/ru/books/handbook/kernelconfig/_index.adoc1174
-rw-r--r--documentation/content/ru/books/handbook/l10n/_index.adoc579
-rw-r--r--documentation/content/ru/books/handbook/linuxemu/_index.adoc2224
-rw-r--r--documentation/content/ru/books/handbook/mac/_index.adoc1126
-rw-r--r--documentation/content/ru/books/handbook/mail/_index.adoc1047
-rw-r--r--documentation/content/ru/books/handbook/mirrors/_index.adoc721
-rw-r--r--documentation/content/ru/books/handbook/multimedia/_index.adoc1052
-rw-r--r--documentation/content/ru/books/handbook/network-servers/_index.adoc2659
-rw-r--r--documentation/content/ru/books/handbook/parti.adoc20
-rw-r--r--documentation/content/ru/books/handbook/partii.adoc20
-rw-r--r--documentation/content/ru/books/handbook/partiii.adoc14
-rw-r--r--documentation/content/ru/books/handbook/partiv.adoc21
-rw-r--r--documentation/content/ru/books/handbook/partv.adoc10
-rw-r--r--documentation/content/ru/books/handbook/pgpkeys/_index.adoc56
-rw-r--r--documentation/content/ru/books/handbook/ports/_index.adoc1181
-rw-r--r--documentation/content/ru/books/handbook/ppp-and-slip/_index.adoc2011
-rw-r--r--documentation/content/ru/books/handbook/preface/_index.adoc232
-rw-r--r--documentation/content/ru/books/handbook/printing/_index.adoc2416
-rw-r--r--documentation/content/ru/books/handbook/security/_index.adoc2279
-rw-r--r--documentation/content/ru/books/handbook/serialcomms/_index.adoc1472
-rw-r--r--documentation/content/ru/books/handbook/x11/_index.adoc953
-rw-r--r--documentation/content/ru/books/porters-handbook/_index.adoc85
-rw-r--r--documentation/content/ru/books/porters-handbook/chapters-order.adoc16
-rw-r--r--documentation/content/ru/books/porters-handbook/keeping-up/chapter.adoc83
-rw-r--r--documentation/content/ru/books/porters-handbook/makefiles/chapter.adoc2365
-rw-r--r--documentation/content/ru/books/porters-handbook/new-port/chapter.adoc46
-rw-r--r--documentation/content/ru/books/porters-handbook/pkg-files/chapter.adoc133
-rw-r--r--documentation/content/ru/books/porters-handbook/plist/chapter.adoc160
-rw-r--r--documentation/content/ru/books/porters-handbook/porting-dads/chapter.adoc409
-rw-r--r--documentation/content/ru/books/porters-handbook/porting-samplem/chapter.adoc125
-rw-r--r--documentation/content/ru/books/porters-handbook/porting-why/chapter.adoc37
-rw-r--r--documentation/content/ru/books/porters-handbook/quick-porting/chapter.adoc233
-rw-r--r--documentation/content/ru/books/porters-handbook/security/chapter.adoc255
-rw-r--r--documentation/content/ru/books/porters-handbook/slow-porting/chapter.adoc187
-rw-r--r--documentation/content/ru/books/porters-handbook/special/chapter.adoc2521
-rw-r--r--documentation/content/ru/books/porters-handbook/testing/chapter.adoc120
-rw-r--r--documentation/content/ru/books/porters-handbook/upgrading/chapter.adoc168
-rw-r--r--documentation/content/ru/books/porters-handbook/uses/chapter.adoc1672
-rw-r--r--documentation/content/ru/books/porters-handbook/versions/chapter.adoc6343
91 files changed, 67407 insertions, 0 deletions
diff --git a/documentation/content/ru/articles/_index.adoc b/documentation/content/ru/articles/_index.adoc
new file mode 100644
index 0000000000..a245ae3d26
--- /dev/null
+++ b/documentation/content/ru/articles/_index.adoc
@@ -0,0 +1,7 @@
+---
+title: Articles
+---
+
+= Articles
+
+{{< list-articles-directories >}}
diff --git a/documentation/content/ru/articles/committers-guide/_index.adoc b/documentation/content/ru/articles/committers-guide/_index.adoc
new file mode 100644
index 0000000000..482bb63234
--- /dev/null
+++ b/documentation/content/ru/articles/committers-guide/_index.adoc
@@ -0,0 +1,1149 @@
+---
+title: Справочник коммиттера
+authors:
+ - author: The FreeBSD Documentation Project
+ - author: Дмитрий Морозовский
+copyright: 1999-2007 The FreeBSD Documentation Project
+releaseinfo: "$FreeBSD$"
+trademarks: ["freebsd", "cvsup", "ibm", "intel", "sparc", "general"]
+---
+
+= Справочник коммиттера
+:doctype: article
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:toc-title: Содержание
+:part-signifier: Часть
+:chapter-signifier: Глава
+:appendix-caption: Приложение
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+
+include::shared/authors.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/urls.adoc[]
+
+[.abstract-title]
+Аннотация
+
+Данный документ содержит информацию для сообщества коммиттеров FreeBSD. Все новые коммиттеры должны изучить его перед началом работы; прочим коммиттерам также рекомендуется время от времени просматривать его.
+
+'''
+
+toc::[]
+
+[[admin]]
+== Административные детали
+
+[.informaltable]
+[cols="20%,80%", frame="none"]
+|===
+
+|__Хост основного репозитория__
+|`ncvs.FreeBSD.org`
+
+|__Способ авторизации__
+|man:ssh[1], только протокол 2
+
+|__Основной корень репозитория (CVSROOT)__
+|`ncvs.FreeBSD.org`: [.filename]#/home/ncvs# (см. также <<cvs.operations>>).
+
+|__`{cvsadm}`__
+|`{peter}` и `{markm}`, а также `{joe}` и `{marcus}` для иерархии [.filename]#ports/#
+
+|__Списки рассылки__
+|{doc-developers-name}, {doc-committers-name}; {ports-developers-name}, {ports-committers-name}; {src-developers-name}, {src-committers-name}. (Каждому репозиторию проекта соответствуют отдельные списки рассылки с суффиксами -developers и -committers. Архивы этих списков хранятся в файлах [.filename]#/home/mail/repository-name-developers-archive# и [.filename]#/home/mail/repository-name-committers-archive# на машинах кластера `FreeBSD.org`).
+
+|__Отчеты Правления__
+|[.filename]#/home/core/public/monthly-report# на машинах кластера `FreeBSD.org`.
+
+|__Наиболее значимые метки CVS__
+|`RELENG_4` (ветвь 4.X-STABLE), `RELENG_5` (ветвь 5.X-STABLE), `RELENG_6` (ветвь 6.X-STABLE), `HEAD` (ветвь -CURRENT)
+|===
+
+Для авторизации на машины проекта вы должны использовать протоколы man:ssh[1] или man:telnet[1] с включенным Kerberos 5. В случае man:ssh[1], допустим только протокол версии 2. Эти протоколы являются значительно более защищенными по сравнению с man:telnet[1] или man:rlogin[1], поскольку информация об авторизации передается в зашифрованном виде. По умолчанию, протокол man:ssh[1] также шифрует весь трафик. Учитывая наличие таких утилит, как man:ssh-agent[1] и man:scp[1], протокол man:ssh[1] значительно удобнее прочих в использовании. Если вы ничего не знаете об man:ssh[1], загляните в раздел <<ssh.guide>>.
+
+[[committer.types]]
+== Типы коммит битов
+
+CVS Репозиторий FreeBSD состоит из нескольких разделов, охватывающих исходные тексты базовой операционной системы, документацию, инфраструктуру построения внешних приложений (портов), а также различные служебные утилиты. Право записи в репозиторий ("коммит бит") подразумевает указание области дерева, в которое оно может быть применено. Как правило, области напрямую связаны с группой, подтвердившей право коммиттера на бит. В дальнейшем, область действия коммит бита может быть расширена; в этом случае, коммиттер должен следовать стандартным правилам нового для коммиттера в данной области, в частности, получая подтверждения на каждый коммит и, возможно, в течение какого-то времени работу с ментором.
+
+[.informaltable]
+[cols="1,1,1", frame="none"]
+|===
+
+|__Тип коммит бита__
+|__Ответственные__
+|__Области репозитория__
+
+|src
+|core@
+|src/ и соответствующие части doc/
+
+|doc
+|doceng@
+|doc/, www/, документация дерева src/
+
+|ports
+|portmgr@
+|ports/
+|===
+
+Биты, выделенные до разделения дерева на области могут использоваться во всех частях дерева. Однако, с точки зрения здравого смысла, коммиттер, не имеющий опыта работы в какой-либо части дерева, должен предоставлять предлагаемые изменения для рассмотрения другими коммиттерами, получать подтверждения от ответственных за различные части репозитория, а также, возможно, работать совместно с ментором. Поскольку правила ведения различных областей кода различаются, указанные нормы скорее направлены на благо коммиттера, не имеющего достаточного опыта работы в данной области.
+
+Вне зависимости от области приложения усилий, запросы коммиттеров на рассмотрение предлагаемых изменений в процессе разработки могут только приветствоваться.
+
+=== Правила для коммиттеров документации ([.filename]#doc/#) при работе с деревом исходных текстов ([.filename]#src/#)
+
+* Коммиттеры документации могут самостоятельно изменять документацию к исходным текстам, например, страницы справочника, файлы README, базы данных утилиты fortune, календарей, а также исправлять комментарии в исходных текстах без дополнительного согласования с коммиттерами исходных текстов, при условии сохранения здравого смысла и манеры коммитов.
+* Коммиттеры документации могут вносить незначительные изменения и исправления в исходные тексты (такие как исправления к процессу сборки, добавление малых дополнительных возможностей и т.п.) при наличии одобрения от коммиттера исходных текстов.
+* Коммиттер документации может расширить область действия своего бита на область исходных текстов (и стать, таким образом, коммиттером исходных текстов), найдя себе ментора, который предложит это расширение Правлению (Core). После одобрения, строка с его именем пользователя вносится в файл 'access', и применяются обычные правила периода работы с ментором, подразумевающие получение одобрения на каждый коммит.
+* Одобрение коммита ("Approved by") может производиться только "полновесным" (не работающим с ментором) коммиттером исходных текстов; последние могут рассматривать предлагаемые изменения и указываться в строке "Reviewed by".
+
+[[cvs.operations]]
+== Работа с CVS
+
+Подразумевается, что вы уже имеете опыт базовой работы с CVS.
+
+`{cvsadm}` являются "владельцами" репозитория CVS и ответственны за все прямые его изменения (в целях чистки или исправления каких-либо вопиющих ошибок коммиттеров при работе с CVS). Если в результате ваших действий с частью репозитория произошел несчастный случай, например, после неверной операции `cvs import` или `cvs tag`, пошлите письмо соответствующей подгруппе `{cvsadm}` (см. следующую таблицу) и сообщите о проблеме. В наиболее серьезных случаях, касающихся не только какой-либо части репозитория, а дерева CVS в целом, вы можете написать `{cvsadm}`. Пожалуйста, _не надо_ писать группе `{cvsadm}` по поводу репозиторного копирования и прочих вопросов, которые может решить соответствующая подгруппа.
+
+[[repomeisters]]Напрямую изменять содержимое репозитория может только группа CVS-мастеров; для обеспечения этого, только CVS-мастера имеют учетные записи на машинах, поддерживающих основной репозиторий.
+
+[NOTE]
+====
+Адреса, на которые следует посылать запросы, зависят от области репозитория, которую требуется поправить:
+
+* ncvs@ - репозиторий [.filename]#/home/ncvs#, основные исходные тексты
+* pcvs@ - репозиторий [.filename]#/home/pcvs#, порты
+* dcvs@ - репозиторий [.filename]#/home/dcvs#, документация
+* projcvs@ - репозиторий [.filename]#/home/projcvs#, прочие проекты
+====
+
+Дерево CVS в настоящее время разделено на четыре независимых репозитория: `doc`, `ports`, `projects` и `src`. Для удобства работы пользователей при распространении через CVSup различные деревья комбинируются в одно, с одним служебным каталогом `CVSROOT`.
+
+[NOTE]
+====
+Обратите внимание, что модуль `www`, содержащий исходные тексты http://www.FreeBSD.org[веб-сайта FreeBSD], расположен в репозитории `doc`.
+====
+
+В настоящее время, все репозитории CVS располагаются на одной машине, `ncvs.FreeBSD.org`, однако, для обеспечения возможности в будущем разнести их по физически различным машинам, для каждой поддерживается отдельное имя хоста. Их и следует использовать коммиттерам. Наконец, каждый репозиторий расположен в отдельном каталоге. В итоге, общая картина выглядит так:
+[[cvs-repositories-and-hosts]]
+.Репозитории CVS FreeBSD, хосты и каталоги
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Репозиторий
+| Хост
+| Каталог
+
+|doc
+|dcvs.FreeBSD.org
+|/home/dcvs
+
+|ports
+|pcvs.FreeBSD.org
+|/home/pcvs
+
+|projects
+|projcvs.FreeBSD.org
+|/home/projcvs
+
+|src
+|ncvs.FreeBSD.org
+|/home/ncvs
+|===
+
+Операции с CVS производятся удаленно, путем установки переменной окружения `CVSROOT` (она должна указывать на соответствующий хост и каталог верхнего уровня, например `ncvs.FreeBSD.org``:`[.filename]#/home/ncvs#) и последующего выполнения команд выгрузки и коммита. Многие коммиттеры определяют команды-синонимы, разворачивающиеся в запуск CVS с правильными параметрами. В частности, пользователи оболочки man:tcsh[1] могут добавить следующие строки в свой скрипт начальной загрузки [.filename]#.cshrc#:
+
+[.programlisting]
+....
+alias dcvs cvs -d user@dcvs.FreeBSD.org:/home/dcvs
+alias pcvs cvs -d user@pcvs.FreeBSD.org:/home/pcvs
+alias projcvs cvs -d user@projcvs.FreeBSD.org:/home/projcvs
+alias scvs cvs -d user@ncvs.FreeBSD.org:/home/ncvs
+....
+
+Теперь все операции с CVS могут выполняться на локальной машине, а для внесения изменений в официальное дерево CVS следует использовать команду `__X__cvs commit`. Если вам нужно добавить в проект что-либо совершенно новое (например, исходные тексты сторонних разработчиков), нужно использовать команду `cvs import`; обратитесь к странице справочника по man:cvs[1] за подробностями.
+
+[NOTE]
+====
+Пожалуйста, _не используйте_ команды `cvs checkout` или `cvs update` для синхронизации ваших исходных текстов. Протокол CVS не оптимизирован для удаленной работы и требует значительных накладных расходов со стороны сервера. Пожалуйста, используйте метод синхронизации посредством `cvsup`, а основной хост используйте только для собственно коммитов. Наша распределенная сеть серверов cvsup достаточно развита. При необходимости синхронизации с самыми свежими изменениями вы можете пользоваться машиной `cvsup-master`, которая обладает достаточными ресурсами для удаленной работы с CVS; за нее отвечает `{kuriyama}`.
+====
+
+Если вам нужно использовать команды CVS `add` и `delete`, так чтобы в реальности переместить часть исходных текстов подобно действию команды man:mv[1], нужно запросить операцию "репозиторного копирования" (repository copy). При этом кто-либо из <<repomeisters,CVS-мастеров>> скопирует необходимые файлы внутри репозитория на нужное место и даст вам знать об этом. Репозиторное копирование производится для сохранения истории (журналов изменения). Возможность отследить историю изменений очень ценна для всего проекта FreeBSD.
+
+Документация по CVS, учебные материалы и FAQ можно найти по адресу: http://www.cvshome.org/docs/[http://www.cvshome.org/docs/]. Очень полезна также книга Карла Фогеля (Karl Fogel) http://cvsbook.red-bean.com/cvsbook.html[Open Source Development with CVS]. Некоторая полезная информация о CVS на русском языке может быть найдена http://alexm.here.ru/cvs-ru/[здесь].
+
+`{des}` написал такой "мини-пример" работы с CVS:
+
+. Извлечение нужного модуля из репозитория: команда `co` или `checkout`.
++
+[source,bash]
+....
+% cvs checkout shazam
+....
++
+Эта команда извлечет копию модуля [.filename]#shazam#. Если модуль с таким именем не существует (не описан в файле modules), будет произведена попытка извлечь директорию верхнего уровня [.filename]#shazam#.
++
+.Полезные опции команды `cvs checkout`
+[cols="1,1", frame="none"]
+|===
+|`-P`
+|Не создавать (точнее, удалить после завершения выполнения) пустые каталоги
+|`-l`
+|Извлекать один уровень каталогов (без подкаталогов)
+
+|`-r__rev__`
+|Извлечь ревизию, ветвь или тег _rev_ для указанного модуля
+
+|`-D__date__`
+|Извлечь состояние модуля в репозитории на момент _date_
+|===
++
+Примеры в применении к FreeBSD:
+
+** Извлечь модуль [.filename]#miscfs#, расположенный в каталоге репозитория [.filename]#src/sys/miscfs#:
++
+[source,bash]
+....
+% cvs co miscfs
+....
++
+После выполнения вы получите каталог [.filename]#miscfs#, содержащий подкаталоги [.filename]#CVS#, [.filename]#deadfs#, [.filename]#devfs# и т.д. Один из них ([.filename]#linprocfs#) будет пустым.
+** Извлечь те же файлы, но с полным путем:
++
+[source,bash]
+....
+% cvs co src/sys/miscfs
+....
++
+Теперь у вас есть каталог [.filename]#src#, содержащий подкаталоги [.filename]#CVS# и [.filename]#sys#. Каталог [.filename]#src/sys# содержит подкаталоги [.filename]#CVS# и [.filename]#miscfs# и т.д.
+** Извлечь те же файлы, удалив при этом пустые подкаталоги:
++
+[source,bash]
+....
+% cvs co -P miscfs
+....
++
+Вы получите каталог [.filename]#miscfs# с подкаталогами [.filename]#CVS#, [.filename]#deadfs#, [.filename]#devfs#... однако без подкаталога [.filename]#linprocfs#, поскольку он не содержит файлов.
+** Извлечь каталог [.filename]#miscfs# без подкаталогов:
++
+[source,bash]
+....
+% cvs co -l miscfs
+....
++
+Теперь в каталоге [.filename]#miscfs# будет только один подкаталог [.filename]#CVS#.
+** Извлечь модуль [.filename]#miscfs# из ветви 6.X:
++
+[source,bash]
+....
+% cvs co -rRELENG_6 miscfs
+....
++
+Теперь вы можете изменить исходные тексты и произвести коммит в эту ветвь.
+** Извлечь модуль [.filename]#miscfs# по состоянию на момент выхода 6.0-RELEASE:
++
+[source,bash]
+....
+% cvs co -rRELENG_6_0_0_RELEASE miscfs
+....
++
+В этом случае вы не сможете внести изменения в репозиторий, поскольку `RELENG_6_0_0_RELEASE` описывает момент времени, а не ветвь разработки.
+** Извлечь модуль [.filename]#miscfs# по состоянию на 15 января 2000 г:
++
+[source,bash]
+....
+% cvs co -D'01/15/2000' miscfs
+....
++
+Как и в предыдущем случае, изменения не могут быть записаны.
+** Извлечь модуль [.filename]#miscfs#, каким он был неделю назад:
++
+[source,bash]
+....
+% cvs co -D'last week' miscfs
+....
++
+И вновь, изменения не могут быть записаны.
++
+Обратите внимание, что мета-данные хранятся в подкаталогах [.filename]#CVS#.
++
+Аргументы опций `-D` and `-r` сохраняются (являются "клейкими", sticky), например, при последующем использовании команды `cvs update`.
+. Проверка состояния извлеченных файлов: команда `status`.
++
+[source,bash]
+....
+% cvs status shazam
+....
+
++
+Эта команда покажет статус файла [.filename]#shazam# или каждого файла в директории [.filename]#shazam#. Для каждого из файлов статус может быть одним из:
++
+[.informaltable]
+[cols="1,1", frame="none"]
+|===
+|Up-to-date
+|Файл соответствует репозиторию и не модифицировался
+
+|Needs Patch
+|Файл не изменялся, но репозиторий содержит обновленную версию
+
+|Locally Modified
+|Файл соответствует репозиторию, но был изменен локально
+
+|Needs Merge
+|Файл изменен локально; вместе с тем, файл изменен и в репозитории
+
+|File had conflicts on merge
+|После последнего обновления возникли конфликты, и они все еще не устранены
+|===
++
+Кроме того, будут показаны локальная версия и дата модификации, версия и дата последней из доступных (если вы применяли "клейкие" дату, тег или ветвь, последняя доступная версия может отличаться от вашей), а также клейкие теги, временные метки и опции.
+. Обновление извлеченного модуля: команда `update`.
++
+[source,bash]
+....
+% cvs update shazam
+....
+
++
+Эта команда обновит состояние файла [.filename]#shazam# или файлов в каталоге [.filename]#shazam# до наиболее свежих версий выбранной вами при извлечении ветви. Если выбирался "момент времени", не произойдет ничего, если только за истекшее время в репозитории не был перемещен тег или не произошло чего-нибудь еще непредвиденного.
++
+Полезные опции в дополнение к уже описанным для команды `checkout`:
++
+[.informaltable]
+[cols="1,1", frame="none"]
+|===
+|`-D`
+|Извлечь вновь появившиеся или пропущенные ранее подкаталоги
+
+|`-a`
+|Обновиться до текущего состояния головной ветви
+
+|`-j__rev__`
+|магическая опция (см. ниже)
+|===
++
+Если вы извлекали модуль с опциями `-r` или `-D`, выполнение команды `cvs update` с другими параметрами `-r` или `-D` или с опцией `-a` приведет к выбору новой ветви, ревизии или даты. Использование опции `-a` удаляет использованные ранее клейкие свойства; опции `-r` и `-D`, наоборот, фиксируют их.
++
+Теоретически использование `HEAD` в качестве аргумента опции `-r` должно дать тот же результат, что и указание опции `-a`, однако это верно лишь в теории.
++
+Опция `-D` полезна, если:
+
+** после извлечения вами модуля кем-либо еще в него были добавлены дополнительные каталоги;
+** вы извлекали верхний уровень модуля при помощи опции `-l`, а в дальнейшем решили извлечь и подкаталоги;
+** вы удалили какие-либо подкаталоги и теперь хотите вновь извлечь их.
+
++
+__Обращайте внимание на вывод команды `cvs update`.__ Действие, произведенное с файлом, обозначается буквой перед его именем:
++
+[.informaltable]
+[cols="1,1", frame="none"]
+|===
+|`U`
+|Файл был успешно обновлен.
+
+|`P`
+|Файл был успешно обновлен (произведен успешный патч из удаленного репозитория).
+
+|`M`
+|Файл был изменен, и при этом обновлен успешно.
+
+|`C`
+|Файл был изменен, и при объединении изменений возникли конфликты.
+|===
++
+Объединение (merging) производится, если вы выгрузили рабочую копию какого-то модуля, изменили его, затем кто-либо еще произвел коммит собственных изменений, и, наконец, вы выполняете команду `cvs update`. CVS знает, что производились локальные изменения, и пытается объединить ваши изменения с теми, что произошли в репозитории (от состоянии версии, которую вы выгружали, до версии, до которой вы пытаетесь обновиться). Если изменения происходили с различными частями файла, объединение почти всегда произойдет успешно (хотя результат при этом может не быть синтаксически или семантически корректным).
++
+CVS выводит букву `M` перед именем всех локально измененных файлов, даже если у них нет новых версий в репозитории, так что команда `cvs update` удобна для быстрого получения списка файлов, которые вы изменяли.
++
+Если в результате вы видите букву `C`, ваши изменения конфликтуют с изменениями, внесенными в репозиторий (изменения были в одних и тех же или рядом расположенных строках, либо вы изменили файл настолько, что при сравнении `cvs` не смогла удержать контекст и приложить изменения из репозитория). Вам необходимо устранить конфликты, вручную редактируя файл. Конфликтующие фрагменты помечаются строками из знаков `<`, `=` и `>`. В начале каждого из конфликтов присутствует строка из семи знаков `<` и имени файла, затем идет фрагмент, содержащий внесенные вами изменения, разделитель из семи знаков `=`, соответствующий фрагмент из версии файла, содержащейся в репозитории, и, наконец, строка из семи знаков `>` совместно с номером версии, до которой вы обновляли файл.
++
+Опция `-J` содержит некоторое количество черной магии. При ее наличии локальный файл обновляется до указанной версии так же, как и при использовании опции `-r`, но отслеживаемые номер версии или ветвь не изменяются. Эта опция умеет смысл лишь при парном использовании: при этом делается попытка применить изменения между двумя указанными версиями к локальной копии файла.
++
+К примеру, вы внесли изменения и произвели коммит в файл [.filename]#shazam/shazam.c# в FreeBSD-CURRENT, а позднее хотите перенести обновления в FreeBSD-STABLE (Merge-From-Current, MFC). Версия, которая требует переноса - 1.15:
+
+** Извлеките текущую версию модуля [.filename]#shazam# для ветви FreeBSD-STABLE:
++
+[source,bash]
+....
+% cvs co -rRELENG_6 shazam
+....
+
+** Приложите изменения между версиями 1.14 и 1.15:
++
+[source,bash]
+....
+% cvs update -j1.14 -j1.15 shazam/shazam.c
+....
++
+Почти наверняка вы получите конфликт в строках, содержащих идентификатор файла (`$Id: article.xml,v 1.19 2007-05-09 06:08:50 bvs Exp $` или, в случае FreeBSD, `$FreeBSD: head/ru_RU.KOI8-R/articles/committers-guide/article.xml 45050 2014-06-13 14:53:24Z taras $`). Вам потребуется отредактировать файл для устранения конфликта (в данном случае достаточно убрать строки-разделители и вторую строку `$Id: article.xml,v 1.19 2007-05-09 06:08:50 bvs Exp $`, оставив лишь строку с `$Id: article.xml,v 1.19 2007-05-09 06:08:50 bvs Exp $` для FreeBSD-STABLE).
+. Просмотр изменение между локальной версией и версией из репозитория: команда `diff`.
++
+[source,bash]
+....
+% cvs diff shazam
+....
++
+Эта команда покажет все отличия локального состояния файла (или файлов модуля) [.filename]#shazam# от состояния, сохраненного в репозитории.
++
+.Полезные опции команды `cvs diff`
+[cols="1,1", frame="none"]
+|===
+|`-u`
+|Использовать унифицированный (unified) формат.
+|`-c`
+|Использовать контекстный (context) формат.
+
+|`-N`
+|Показывать отсутствующие или созданные файлы.
+|===
++
+Всегда имеет смысл пользоваться опцией `-u`, поскольку унифицированный формат гораздо удобнее и лучше читаем, чем почти все другие (в некоторых случаях контекстный формат, генерируемый опцией `-c` может быть несколько лучше, но он гораздо более громоздок). Унифицированный формат различий состоит из серии фрагментов, каждый из которых начинается со строки, состоящей из двух символов `@` и номеров строк, описывающих положение изменившегося участка. Затем следует группа строк: те, что начинаются с пробела, описывают контекст, начинающиеся с символа `-` определяют удаленные строки, наконец, начинающиеся с символа `+` - добавленные.
++
+Вы можете сравнивать текущее состояние с версией, отличающейся от той, с которой вы извлекали файл, указав опцию `-r` или `-D` подобно командам `checkout` и `update`, или даже получить список изменений между любыми двумя версиями (вне зависимости от того, что лежит в вашей локальной копии), указав _две_ версии при помощи опций `-r` или `-D`.
+. Просмотр журнала изменений: команда `log`.
++
+[source,bash]
+....
+% cvs log shazam
+....
++
+Если [.filename]#shazam# является обычным файлом, эта команда выдаст на экран _заголовок_ с информацией о файле, в частности, его местоположении в репозитории, какая версия соответствует текущему состоянию (`HEAD`), в каких ветвях разработки файл присутствует, а также перечислит теги, которыми он помечен. Затем, для каждой версии файла выводится соответствующее ей журнальное сообщение, включающее дату, время и автора коммита, количество добавленных и удаленных строк и собственно журнального сообщения, написанного коммиттером.
++
+Если [.filename]#shazam# является каталогом, вышеописанная процедура выполняется для каждого файла в каталоге. Если при этом команде `log` не был указан флаг `-l`, процедура рекурсивно повторяется для всех подкаталогов.
++
+Команда `log` используется для просмотра истории одного или нескольких файлов в том виде, как она сохранена в репозитории CVS. Используя опцию `-r__rev__`, вы можете посмотреть журнальное сообщение к одной определенной версии:
++
+[source,bash]
+....
+% cvs log -r1.2 shazam
+....
++
+Эта команда покажет журнальное сообщение для версии `1.2` файла [.filename]#shazam# (или для версий `1.2` каждого из файлов в каталоге [.filename]#shazam#).
+. Кто что делал: команда `annotate`. Эта команда показывает перед каждой строкой указанного файла (файлов) имя пользователя, вносившего последние изменения в эту строку.
++
+[source,bash]
+....
+% cvs annotate shazam
+....
+
+. Добавление новых файлов: команда `add`.
++
+Создайте файл, выполните для него команду `cvs add`, затем произведите запись в репозиторий (коммит): `cvs commit`.
++
+Точно так же, новые каталоги добавляются в репозиторий путем создания и последующего выполнения команды `cvs add`. Заметьте, что выполнять коммит после добавления каталога не надо.
+. Удаление устаревших файлов: команда `remove`.
++
+Удалите файл, затем выполните команду `cvs rm` с его именем в качестве параметра, наконец, выполните для него `cvs commit`.
+. Внесение изменений в репозиторий: команда `commit` или `checkin`.
++
+.Useful `cvs commit` options
+[cols="1,1", frame="none"]
+|===
+|`-F`
+|Форсировать внесение изменений для не модифицированного файла.
+|`-m__msg__`
+|Указать сообщение для журнала в командной строке (не запускать текстовый редактор).
+|===
++
+Опцию `-F` следует использовать, если вы поняли, что забыли указать какую-либо важную информацию в журнале изменений.
++
+Хорошие журнальные сообщения очень важны. Они дают возможность другим узнать, зачем вы производили изменения, причем не только в момент их произведения, но и месяцы или годы спустя, когда кто-либо заинтересуется, почему выглядящий нелогично или неэффективно фрагмент кода попал в каши исходные тексты. Кроме того, это очень помогает в оценке того, нужно ли переносить соответствующий код в FreeBSD-STABLE (MFC).
++
+Сообщения должны быть ясными, краткими, четкими, и представлять из себя разумную аннотацию, какие изменения были произведены и почему.
++
+Сообщения должны достаточно ясно показывать сторонним разработчикам, насколько их касаются изменения и нужно ли им исследовать изменения подробно.
++
+Избегайте внесения нескольких не связанных друг с другом изменений за один раз. Это затрудняет объединение изменений, а также, при обнаружении ошибок, усложняет поиск ответственного за ошибки участка.
++
+Избегайте смешивания в одном коммите изменений функциональности со стилистическими правками или исправлениями в пробелах. Это усложняет объединение, и, кроме того, затрудняет понимание того, какие именно функциональные изменения были внесены. В случае коммита в файлы документации, это затруднит работу групп поддержки перевода, поскольку становится сложнее отделить изменения, требующие перевода.
++
+Избегайте коммита большой группы файлов за один раз с одним общим и невнятным сообщением. Напротив, вносите изменения в отдельные файлы (или небольшие группы связанных файлов) с адекватными сообщениями для журналирования.
++
+Перед коммитом, __обязательно__:
+
+** проверьте, что вы будете выполнять коммит в правильную ветвь, посредством команды `cvs status`.
+** проверьте ваши изменения при помощи команды `cvs diff`
+
++
+Кроме того, ВСЕГДА указывайте, в какие именно файлы вы вносите изменения, так чтобы не включить в этот список лишних файлов. Команда `cvs commit` без аргументов включит все измененные файлы в текущем каталоге и всех подкаталогах.
+
+Еще несколько полезных советов:
+
+. Часто используемые опции можно занести в файл [.filename]#~/.cvsrc#, например:
++
+[.programlisting]
+....
+cvs -z3
+diff -Nu
+update -Pd
+checkout -P
+....
++
+Для данного случая:
+
+** всегда использовать компрессию уровня 3 для связи с удаленным сервером CVS. В случае медленного соединения это избавит вас от лишней головной боли.
+** всегда использовать опции `-N` (показывать добавленные или удаленные файлы) и `-u` (унифицированный формат) для man:diff[1].
+** всегда использовать опции `-P` (удалять пустые каталоги) и `-D` (добавлять новые каталоги) при обновлении.
+** всегда использовать опцию `-P` (удалять пустые каталоги) при извлечении файлов и модулей.
+
+. Пользуйтесь скриптом Эйвинда Эклунда (Eivind Eklund) `cdiff` для просмотра изменению унифицированного формата. Он является оберткой для man:less[1], добавляющей цветовые коды ANSI для выделения заголовком, добавленных и удаленных строк; прочие строки не модифицируются. Помимо этого, скрипт корректно разворачивает табуляции (которые часто выглядят неправильно в изменениях из-за дополнительного символа в начале строки).
++
+package:textproc/cdiff[]
++
+Просто используйте его вместо man:more[1] или man:less[1]:
++
+[source,bash]
+....
+% cvs diff -Nu shazam | cdiff
+....
++
+Помимо этого, некоторые текстовые редакторы, такие как man:vim[1] (package:editors/vim[]) поддерживают цветовую синтаксическую разметку многих типов файлов, в том числе файлов изменений и журналов CVS/RCS.
++
+[source,bash]
+....
+% echo "syn on" >> ~/.vimrc
+% cvs diff -Nu shazam | vim -
+% cvs log shazam | vim -
+....
+
+. CVS - старая, загадочная и порой слабо предсказуемая в своем поведении программа. Ни один человек не способен удержать в голове все тонкости ее работы, так что не бойтесь спрашивать совета у Искусственного Интеллекта (а именно `{cvsadm}`).
+. Не оставляйте компьютер в процессе работы команды `cvs commit` (в редакторе при написании журнального сообщения) слишком надолго (более чем на 2-3 минуты). Эта команда блокирует каталог репозитория, в котором она запущена, и не позволяет другим разработчикам изменять его содержимое. Если вам нужно написать длинное журнальное сообщение, подготовьте его заранее и вставьте в редакторе во время выполнения команды `cvs commit`, либо запишите его в файл и используйте опцию CVS `-F`:
++
+[source,bash]
+....
+% vi logmsg
+% cvs ci -F logmsg shazam
+....
++
+Это самый быстрый способ передать журнальное сообщение CVS; однако, вы должны быть внимательны при редактировании файла [.filename]#logmsg#, поскольку при выполнении коммита у вас не будет шансов его поправить.
+. Вы можете существенно ускорить скорость работы CVS с центральным репозиторием, используя постоянное соединение с репозиторием. Для этого добавьте в файл [.filename]#~/.ssh/config# строки
++
+[.programlisting]
+....
+Host ncvs.FreeBSD.org
+ ControlPath /home/user/.ssh/cvs.cpath
+Host dcvs.FreeBSD.org
+ ControlPath /home/user/.ssh/cvs.cpath
+Host projcvs.FreeBSD.org
+ ControlPath /home/user/.ssh/cvs.cpath
+Host pcvs.FreeBSD.org
+ ControlPath /home/user/.ssh/cvs.cpath
+....
++
+Затем откройте постоянное соединение с машиной repoman:
++
+[source,bash]
+....
+% ssh -fNM ncvs.FreeBSD.org
+....
++
+Теперь команды CVS должны выполняться быстрее, поскольку используют существующее соединение с репозиторием. Учтите, что регистр в именах хостов имеет значение.
+
+[[conventions]]
+== Соглашения и традиции
+
+Став коммиттером, вы должны прежде всего произвести некоторые стандартные действия.
+
+* Добавьте себя в список "SGML сущностей" авторов в файл [.filename]#doc/en_US.ISO8859-1/shared/xml/authors.ent#; это изменение должно быть сделано прежде прочих, поскольку в противном случае следующий ваш коммит неизбежно разрушит процесс построения дерева doc/.
++
+Это довольно простая задача, но при этом она является неплохим первым тестом ваших навыков работы с CVS.
+* Также добавьте свою "SGML сущность" в [.filename]#www/en/developers.xml#.
+* Добавьте себя в раздел "Разработчики" статьи link:{contributors}[Участники проекта FreeBSD] ([.filename]#doc/en_US.ISO8859-1/articles/contributors/contrib.committers.xml#) и удалите свою запись из раздела "Прочие участники" ([.filename]#doc/en_US.ISO8859-1/articles/contributors/contrib.additional.xml#).
+* Добавьте новость о новом коммиттере в файл [.filename]#www/shared/xml/news.xml#. Используйте существующие записи вида "Новый коммиттер" как шаблон.
+* Вам нужно добавить ваш PGP или GnuPG ключ в каталог [.filename]#doc/shared/pgpkeys# (а если у вас нет ключа, вам нужно его создать). Не забудьте изменить и произвести коммит в файл [.filename]#doc/shared/pgpkeys/pgpkeys.ent#.
++
+`{des}` написал скрипт для упрощения этого процесса. Дополнительную информацию можно прочесть в файле http://cvsweb.FreeBSD.org/doc/shared/pgpkeys/README[README].
++
+[NOTE]
+====
+Очень важно, чтобы в Руководстве пользователя был записан актуальный PGP/GnuPG ключ, поскольку он может потребоваться для идентификации коммиттера (например, его будет проверять группа `{admins}` для аварийного восстановления учетной записи). Полный набор актуальных ключей пользователей домена `FreeBSD.org` можно найти по адресу link:https://www.FreeBSD.org/doc/pgpkeyring.txt[http://www.FreeBSD.org/doc/pgpkeyring.txt].
+====
+* Добавьте себя в файл [.filename]#src/shared/misc/committers-репозиторий.dot#, где репозиторием будет являться либо doc, либо ports, либо src в зависимости от полученных вами коммиттерских привилегий.
+* Некоторые коммиттеры добавляют информацию о своем местоположении в файл [.filename]#ports/astro/xearth/files/freebsd.committers.markers#.
+* Некоторые добавляют данные о дне своего рождения в файл [.filename]#src/usr.bin/calendar/calendars/calendar.freebsd#.
+* Представьтесь другим коммиттерам, иначе никто не будет знать, кто вы и чем занимаетесь. От вас не требуется писать подробное резюме или биографию: будут достаточны один-два абзаца о себе и областях FreeBSD, в которых вы планируете работать. Пошлите это письмо в {src-developers-name} - и все!
+* Зайдите на машину `hub.FreeBSD.org` и создайте файл [.filename]#/var/forward/user# (замените _user_ на ваше имя пользователя). Этот файл должен содержать адрес электронной почты, на который будет переправляться вся почта на адрес _yourusername_@FreeBSD.org, в том числе сообщения о коммитах и другая почта на адреса {committers-name} и {src-developers-name}. Слишком большие почтовые ящики на машине `hub` могут быть "нечаянно" удалены или обрезаны без предупреждения, так что, чтобы не потерять почту, регулярно читайте ее либо перенаправьте куда-нибудь еще.
++
+Из-за ощутимой загрузки, возникающей на серверах, обрабатывающих списки рассылки, из-за большого количества незапрошенной почты (спама), сервер, принимающий почту для домена FreeBSD.org, производит некоторые основные проверки и на основании их отвергает некоторые письма. На настоящий момент единственным проверяемым параметром является корректность информации DNS для хоста, доставляющего почту, но в будущем список может вырасти. Эти проверки временами обвиняют в том, что они отвергают правильную почту. Если вы хотите отключить проверки для своего адреса, создайте файл [.filename]#~/.spam_lover# в своей домашней директории на машине `freefall.FreeBSD.org`.
+* Если вы были подписаны на {cvs-all}, вам, скорее всего, следует отписаться от него, чтобы не получать дубликатов каждого сообщения о коммитах.
+
+Все новые коммиттеры первоначально работают под руководством ментора. Ваш ментор отвечает за обучение вас правилам и соглашениям, принятым в проекте, и помогает вам сделать первые шаги в среде коммиттеров. Он(а) также персонально отвечает за ваши действия в этот начальный период. До тех пор, пока ваш ментор не решит (и не анонсирует это посредством форсированного коммита файла [.filename]#access#), что вы достаточно освоились и готовы работать самостоятельно, перед любым коммитом вы должны получить одобрение (approval) ментора и указать это в журнальном сообщении коммита строкой `Approved by:`.
+
+Все коммиты в дерево [.filename]#src# сначала должны производиться в ветвь FreeBSD-CURRENT и лишь затем интегрироваться в FreeBSD-STABLE. Никакие серьезные изменения, новые возможности или рискованные модификации не должны производиться напрямую в ветви FreeBSD-STABLE.
+
+[[pref-license]]
+== Предпочтительная лицензия для новых файлов
+
+В настоящее время Проект FreeBSD считает предпочтительной формой лицензии на исходные тексты следующий текст:
+
+[.programlisting]
+....
+/*-
+* Copyright (c) [year] [your name]
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+* 1. Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* 2. Redistributions in binary form must reproduce the above copyright
+* notice, this list of conditions and the following disclaimer in the
+* documentation and/or other materials provided with the distribution.
+*
+* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+*
+* [id for your version control system, if any]
+*/
+....
+
+Проект FreeBSD крайне не рекомендует так называемый "третий пункт", или "пункт о рекламе" в лицензии на новый исходный код. В связи с большим количеством участников проекта FreeBSD, выполнение этого пункта большинством коммерческих производителей все более затруднительно. Если ваш код в дереве исходников содержит "пункт о рекламе", рассмотрите возможность его удаления. На самом деле, рассмотрите возможность перехода на приведенную лицензию.
+
+Проект FreeBSD не рекомендует использование полностью новых лицензий или вариаций стандартных лицензий. Новые лицензии перед использованием в репозитории проекта требуют утверждения группой mailto:core@FreeBSD.org[core@FreeBSD.org]. Большое число различных лицензий затрудняет использование кода, в основном из-за ненамеренных неверных выводов из плохо сформулированных формулировок лицензии.
+
+Политика проекта требует, чтобы код под НЕ-BSD лицензиями располaгался только в определённых местах репозитория, а в некоторых случаях компиляция должна быть условной по умолчанию или вообще отключена. К примеру, ядро GENERIC должно состоять только из лицензий идентичных или в значительной степени схожих с BSD лицензией. Программное обеспечение под лицензиями GPL, APSL, CDDL и др. не должно включаться в состав GENERIC.
+
+Разработчикам напоминается, что в open source правильное понимание "open" также важно, как правильное понимание "source", ибо некорректное использование интеллектуальной собственности имеет серьезные последствия. Какие-либо вопросы или беспокойства на этот счёт должны быть немедленно вынесены на обсуждение главной команде разработчиков (core team).
+
+[[developer.relations]]
+== Взаимодействие между разработчиками
+
+Если вы работаете над собственным исходным кодом, либо в области, в которой вы уже определены как ответственная персона, вам, скорее всего, не потребуется согласовывать коммит с кем-либо еще из разработчиков. Те же правила действуют, если вы нашли ошибку в той части системы, которой явно давно никто не занимается (к нашему стыду, существует несколько таких областей). Если же вы собираетесь модифицировать что-либо активно поддерживаемое (по-хорошему, узнать это можно только исследуя архивы списка рассылки `cvs-committers`), стоит послать предполагаемый патч ответственному за этот участок кода, как вы бы поступали, пока не были коммиттером. В случае портов нужно обращаться по адресу, указанному в строке `MAINTAINER` в файле [.filename]#Makefile#. Для других частей репозитория, в случае если вам не очевидно, кто ведет данный участок кода, может помочь исследование вывода команды `cvs log`. `{fenner}` написал отличный скрипт для определения разработчиков, наиболее активно производивших коммиты, выводящий для каждого из указанных файлов имя пользователя вместе с количеством произведенных им коммитов в данный файл. Скрипт можно найти на машине `freefall` в файле [.filename]#~fenner/bin/whodid#. Если найденная вами персона не отвечает на ваши вопросы или иным образом демонстрирует отсутствие интереса к проблеме, смело производите коммит самостоятельно.
+
+Если вы по каким-либо причинам не уверены в своих изменениях, предложите их для оценки в списке рассылки `-hackers` перед коммитом. Будет лучше, если вас обругают там и тогда, чем когда предлагаемое изменение уже будет частью репозитория. Если случилось так, что ваш коммит встретил сопротивление, возможно, стоит его откатить (back out) до тех пор, пока не будет достигнут консенсус. Помните - с помощью CVS всегда можно вернуться к предыдущему состоянию.
+
+Не принимайте в штыки мнения других разработчиков, с которыми вы не согласны. Если они предлагают иное решение проблемы чем вы, или даже иначе воспринимают проблему, это не значит, что они глупы, имеют сомнительное происхождение, хотят разрушить вашу работу, очернить ваше доброе имя, или развалить проект FreeBSD. Просто они смотрят на мир под иным углом. Различные взгляды - благо.
+
+Будьте честны в спорах. Оценивайте свою позицию по заслугам, честно относитесь к ее слабым сторонам и будьте готовы принять другие точки зрения и пути решения. Будьте открыты.
+
+Будьте терпимы, если вас поправляют. Все мы совершаем ошибки. Если вы ошиблись, извинитесь. Не обвиняйте ни себя, ни, тем более, других в ошибке. Не теряйте времени на смущение или упреки, просто исправьте ошибку и двигайтесь дальше.
+
+Спрашивайте и просите о помощи. Предлагайте ваши изменения для рассмотрения коллегам и рассматривайте их изменения. Одним из преимуществ программного обеспечения с открытыми исходными текстами является открытость разработки. Если никто не будет исследовать чужой код, это преимущество исчезнет.
+
+[[gnats]]
+== GNATS
+
+Для отслеживания ошибок и запросов на изменения проект FreeBSD использует GNATS. Если вы исправили ошибку или внесли изменения, описанные в одном из сообщений об ошибках (PR), не забудьте закрыть это сообщение, используя команду `edit-pr _pr-number_` на машине `freefall`. Хорошо будет, если вы потратите немного времени на поиск и закрытие других PR по этой теме. Вы и сами можете пользоваться man:send-pr[1] для предложения изменений, которые, по вашему мнению, могут потребовать более подробного обсуждения с коллегами.
+
+Более подробно о GNATS можно прочитать по адресам:
+
+* http://www.cs.utah.edu/csinfo/texinfo/gnats/gnats.html[http://www.cs.utah.edu/csinfo/texinfo/gnats/gnats.html]
+* link:https://www.FreeBSD.org/support/[http://www.FreeBSD.org/support/]
+* man:send-pr[1]
+
+Вы можете пользоваться локальной копией GNATS, поддерживая ее синхронность при помощи CVSup. При этом вы можете использовать команды GNATS локально, а также пользоваться другими интерфейсами, такими как `tkgnats`, что позволит вам работать с базой сообщений об ошибках без соединения с Интернет.
+
+[.procedure]
+.Procedure: Использование локальной копии GNATS
+. Если вы еще не поддерживаете зеркало дерева GNATS, добавьте в ваш [.filename]#supfile# строку
++
+[.programlisting]
+....
+gnats release=current prefix=/usr
+....
++
+Учтите, что эта строка должна предшествовать любым строкам, содержащим параметр "tag=", поскольку дерево GNATS не находится под управлением CVS и не имеет символьных меток.
++
+После запуска cvsup в каталоге [.filename]#/usr/gnats# будет создана копия дерева GNATS FreeBSD. Вы можете использовать файл _refuse_ для копирования отдельных категорий. Например, если вас интересуют только сообщения категории `docs`, добавьте в файл [.filename]#/usr/local/etc/cvsup/sup/refuse# footnote:[Точный путь к файлу зависит от установок *default base в вашем файле supfile.] строку
++
+[.programlisting]
+....
+gnats/[a-ce-z]*
+....
++
+Прочие примеры в этом разделе подразумевают, что вы синхронизируете только категорию `docs`.
+. Установите порт GNATS из [.filename]#ports/databases/gnats#. После установки вы обнаружите различные служебные каталоги в дереве [.filename]#$PREFIX/shared/gnats#.
+. Создайте символьные ссылки на синхронизированные каталоги GNATS в служебный каталог GNATS:
++
+[source,bash]
+....
+# cd /usr/local/shared/gnats/gnats-db
+# ln -s /usr/gnats/docs
+....
+
++
+Проделайте эту операцию для всех синхронизируемых категорий.
+. Обновите служебный файл GNATS [.filename]#categories#, расположенный в каталоге [.filename]#$PREFIX/shared/gnats/gnats-db/gnats-adm#:
++
+[.programlisting]
+....
+# This category is mandatory
+pending:Category for faulty PRs:gnats-admin:
+#
+# FreeBSD categories
+#
+docs:Documentation Bug:freebsd-doc:
+....
+. Запустите [.filename]#$PREFIX/libexec/gnats/gen-index# для создания индекса. Вывод этой команды должен быть перенаправлен в файл [.filename]#$PREFIX/shared/gnats/gnats-db/gnats-adm/index#. Эту операцию можно выполнять периодически при помощи man:cron[8] или запускать man:cvsup[1] из скрипта, который затем сгенерирует новый индекс:
++
+[source,bash]
+....
+# /usr/local/libexec/gnats/gen-index \
+ > /usr/local/shared/gnats/gnats-db/gnats-adm/index
+....
+
+. Протестируйте созданную конфигурацию запросом к базе данных GNATS. Следующая команда выведет список открытых сообщений об ошибках в категории `docs`:
++
+[source,bash]
+....
+# query-pr -c docs -s open
+....
+
++
+Другие интерфейсы, например, порт package:databases/tkgnats[] также должны работать.
+. Выберите PR и закройте его.
+
+[NOTE]
+====
+Описанная процедура позволяет вам выбирать и просматривать сообщения об ошибках локально. Для редактирования или закрытия вам потребуется зайти на машину `freefall`.
+====
+
+[[people]]
+== Кто есть кто
+
+Помимо мастеров репозитория, существует еще несколько участников и групп проекта FreeBSD, с которыми вам как коммиттеру может потребоваться общаться. Краткий и ни в коем случае не полный список приводится ниже.
+
+`{jhb}`::
+Джон возглавляет проект SMPng и отвечает за архитектуру, дизайн и реализацию перехода на многонитевое ядро. Джон также является редактором статьи "Архитектура SMPng". Если вы работаете с тонкими блокировками многопроцессорного ядра, координируйте свою работу с Джоном.
+
+`{doceng}`::
+doceng - группа, отвечающая за инфраструктуру построения документации, прием новых коммиттеров документации и актуальность информации относительно CVS на веб-сайте и FTP-сайте FreeBSD. Эта группа не разбирает конфликты. Большая часть обсуждений, связанных с документацией, происходит в {freebsd-doc}. Дополнительную информацию о деятельности группы можно найти в ее http://www.FreeBSD.org/internal/doceng/[собственном документе]. Коммиттеры, заинтересованные в обновлении документации, должны ознакомиться с link:{fdp-primer}[Учебником по Проекту Документирования FreeBSD для новых участников].
+
+`{ru}`::
+Руслан великолепно знает тонкости man:mdoc[7]. Если вы пишете справочную страницу и нуждаетесь в совете по ее структуре или разметке, обратитесь к Руслану.
+
+`{bde}`::
+Брюс занимается общим стилем кода проекта. Если ваш коммит мог бы быть лучше оформлен, Брюс укажет вам на это. Радуйтесь, что такой человек вообще есть. Брюс также является знатоком различных стандартов, применимых к FreeBSD.
+
+`{murray}`::
+Таков состав группы `{re}`. Эта группа отвечает за сроки и процесс выпуска релизов. В период заморозки кода, выпускающие инженеры принимают окончательные решения по поводу всех изменений системы в ветви, готовящейся к очередному релизу. Если вы хотите интегрировать какие-либо изменения из FreeBSD-CURRENT в FreeBSD-STABLE (какими бы они ни были в данный конкретный момент), вам предстоит общаться с этой группой.
++
+Хироки, кроме того, ведет раздел документации к релизам ([.filename]#src/release/doc/*#). Если ваши изменения стоят того, чтобы быть упомянутыми в информации о релизе, сообщите об этом Хироки. Еще лучше, если вы пошлете патч с предлагаемыми изменениями к документу.
+`{cperciva}`::
+Колин - link:https://www.FreeBSD.org/security/[FreeBSD Security Officer] и отвечает за деятельность группы `{security-officer}`.
+
+`{wollman}`::
+Если вам нужен совет по поводу темных мест сетевой части ядра, или вы не уверены в планируемом изменении сетевой подсистемы, мудрым решением будет обратиться к Гарретту. Помимо того, он хорошо разбирается в различных стандартах, применимых к FreeBSD.
+
+{cvs-src-desc}::
+cvs-committers - адрес, используемый CVS для посылки сообщений о коммитах. Вы _никогда_ не должны посылать письма напрямую на этот адрес; следует лишь отвечать на него, когда вам нужно послать короткие комментарии, непосредственно относящиеся к коммиту.
+
+{developers-name}::
+Все коммиттеры подписаны на список рассылки -developers. Этот список создан для обсуждения вопросов, касающихся "сообщества" коммиттеров FreeBSD, таких как выборы Правления, анонсы и т.п.
++
+{developers-name} служит для только для использования FreeBSD коммиттерами. Коммиттеры должны иметь возможность публично обсуждать вещи, которые должны быть разрешены, перед тем, как они будут публично объявлены. Данные дискуссии не предназначены для широкой публики и могут нанести вред FreeBSD.
++
+Все FreeBSD коммиттеры должны соблюдать авторские права оригинального автора или авторов писем из этого списка рассылки. Не публикуйте и не пересылайте сообщения из {developers-name} вне подписчиков данного списка рассылки без согласия всех авторов.
++
+Нарушители авторских прав будут удалены из списка подписчиков {developers-name}, и будут приостановлены их коммиттерские привилегии. Повторяющиеся или вопиющие нарушения приведут к полному лишению коммиттерских прав.
++
+Этот список _не_ предназначен для обсуждения кода, и _не является_ заменой списков {freebsd-arch}. На самом деле, такое его использование вредит проекту, поскольку открытые обсуждения вопросов, касающихся всего сообщества пользователей FreeBSD в закрытом списке недопустимы. И, наконец: __никогда, действительно никогда не пишите в {developers-name} с копией в другой список рассылки FreeBSD__. Никогда не пишите в какой-либо другой список рассылки с копией в {developers-name:}. Подобные действия серьезно подрывают смысл существования данного списка рассылки.
+[[ssh.guide]]
+== SSH: быстрый старт
+
+[.procedure]
+. Если вы используете FreeBSD версии 4.0 или более позднюю, OpenSSH включен в базовую поставку системы. Для более ранних версий обновите и установите OpenSSH из порта package:security/openssh[].
+. Для тех, кто не хочет набирать свой пароль каждый раз при использовании man:ssh[1] и использует для авторизации ключи RSA или DSA, удобной будет утилита man:ssh-agent[1]. Если вы собираетесь использовать ее, убедитесь, что она запущена раньше прочих приложений. Пользователи X Window, например, обычно запускают ее из файлов [.filename]#.xsession# или [.filename]#.xinitrc#. Подробнее смотрите в справочной странице man:ssh-agent[1].
+. Создайте пару ключей при помощи man:ssh-keygen[1]. Ключи появятся в каталоге [.filename]#$HOME/.ssh/#.
+. Пошлите ваш публичный ключ (содержимое файла [.filename]#$HOME/.ssh/id_dsa.pub# или [.filename]#$HOME/.ssh/id_rsa.pub#) вашему будущему ментору, чтобы он мог быть помещен в файл [.filename]#yourlogin# в каталоге [.filename]#/c/ssh-keys/# на машине `freefall`.
+
+Теперь вы можете пользоваться утилитой man:ssh-add[1] для авторизации один раз за сессию. Утилита запросит кодовую фразу для вашего секретного ключа и затем сохранит ее в агенте авторизации (man:ssh-agent[1]). Если вы хотите удалить сохраненный секретный ключ из агента, используйте команду `ssh-add -d`.
+
+Для теста используйте команду типа `ssh freefall.FreeBSD.org ls /usr`.
+
+За дополнительной информацией обращайтесь к package:security/openssh[], man:ssh[1], man:ssh-add[1], man:ssh-agent[1], man:ssh-keygen[1] и man:scp[1].
+
+[[rules]]
+== Большой Список Правил Коммиттера FreeBSD
+
+. Уважайте других коммиттеров.
+. Уважайте других участников проекта.
+. Обсудите любые значимые изменения _до_ коммита.
+. Уважайте существующих мейнтейнеров (указанных в поле `MAINTAINER` файлов [.filename]#Makefile# или в файле [.filename]#MAINTAINER# в корневом каталоге репозитория).
+. Любое спорное изменение необходимо откатить (back out) в ожидании решения, если того требует мейнтейнер. Вопросы безопасности могут перекрывать мнение мейнтейнера, если так решит Security Officer.
+. Изменения вносятся в ветвь FreeBSD-CURRENT до FreeBSD-STABLE, за исключением случаев, прямо разрешенных выпускающими инженерами или неприменимости изменения к FreeBSD-CURRENT. Любое нетривиальное и не срочное изменение должно быть выдержано в FreeBSD-CURRENT в течение по крайней мере 3 дней перед переносом, чтобы его могли адекватно протестировать. Выпускающие инженеры обладают той же властью в ветви FreeBSD-STABLE, что и мейнтейнеры (см. правило 5).
+. Не пререкайтесь с другими коммиттерами публично: это дурно выглядит. Если вам необходимо с чем-либо "категорически не согласиться", делайте это личной почтой.
+. Соблюдайте все периоды заморозки кода (core freeze), а также своевременно читайте списки рассылки `committers` и `developers`, чтобы быть в курсе расписания таких периодов.
+. Если вы сомневаетесь в какой-либо процедуре, сначала спросите!
+. Тестируйте свои изменения перед коммитом.
+. Не производите коммит в деревья [.filename]#src/contrib#, [.filename]#src/crypto# и [.filename]#src/sys/contrib# без _прямого_ разрешения (approval) соответствующего мейнтейнера(ов).
+
+Невыполнение этих правил может служить основанием для приостановки или, в случае рецидивов, полного лишения коммиттерских прав. Члены Правления (Core) имеют право временно приостановить права коммиттера до момента, когда Правление в целом сможет решить вопрос. В "аварийном" случае (коммиттер разрушает репозиторий) такие права имеют также ответственные за репозиторий. Для приостановки прав коммиттера более чем на неделю или для полного лишения таковых прав требуется квалифицированное большинство (2/3) голосов Правления. Это правило существует не потому, что Правление состоит из злобных диктаторов, разбрасывающихся коммиттерами словно банками из-под колы, но ради предоставления проекту аварийного выключателя. Если кто-то выходит из-под контроля, важно иметь возможность справиться с ситуацией немедленно, а не быть втянутыми в дебаты. В любом случае, коммиттер, чьи права приостановлены, имеет право на "слушания Правления", на которых определяется срок приостановки или лишения коммиттерских прав. Коммиттер, права которого приостановлены может запросить пересмотр своего вопроса через 30 дней и каждые последующие 30 дней (если общий период приостановки превышает 30 дней). Коммиттер, полностью лишенный прав, может запросить пересмотр по истечении 6 месяцев. Правила пересмотра являются _полностью неформальными_ и во всех случаях Правление имеет право отвергнуть запрос на пересмотр, если считает свое первоначальное решение верным.
+
+Во всех прочих аспектах деятельности проекта, Правление является подмножеством коммиттеров и ограничено __теми же правилами__. Само по себе членство в Правлении не дает права преступать описанные правила. Правление обладает "особой силой" только в случае деятельность как целое, а не на индивидуальной основе. Члены Правления - в первую очередь коммиттеры.
+
+=== Подробности
+
+[[respect]]
+. Уважайте других коммиттеров.
++
+Вы должны относиться к другим коммиттерам как к коллегам по разработке (кем они и являются). Несмотря на возникающие временами попытки утверждать обратное, никто не стал коммиттером по своей или чьей-либо еще глупости, и мало что обижает сильнее, чем подобные обвинения от коллег. Вне зависимости от того, всегда ли мы чувствуем уважение друг к другу или нет (у каждого бывают не лучшие дни), мы всегда должны _выказывать_ уважение к другим коммиттерам, как в публичных форумах, так и в личной почте.
++
+Способность совместной работы в течение длительного времени - одно из главных достижений проекта, много более важное, чем любой набор изменений в коде, и никакие аргументы относительно кода не стоят потерь в возможности гармонично работать вместе.
++
+Чтобы не противоречить этому правилу, никогда не посылайте писем, когда вы злы или каким-либо иным образом можете спровоцировать других на конфронтацию. Сначала успокойтесь, затем подумайте о том, как наиболее эффективно убедить оппонента(ов) в правильности ваших аргументов; не подливайте масла в огонь ради краткого мига злорадства, если ценой будет долгая ругань. Это не просто крайне "энергетически неэффективно": повторяющиеся прецеденты публичной агрессии, влияющие на нашу способность работать вместе, будут всерьез рассмотрены лидерами проекта, и могут привести к приостановке или потере прав коммиттера. Во внимание будут приниматься как публичные высказывания, так и личная переписка; это не означает, что Правление будет требовать раскрытия тайны переписки, однако, все предоставленные затронутыми коммиттерами материалы будут рассмотрены.
++
+Описанные процедуры никого не могут порадовать даже в малом, однако "целостность проекта превыше всего". Никакой объем кода не стоит потери целостности.
+. Уважайте других участников проекта.
++
+Вы не всегда были коммиттером. В свое время вы были простым сторонним участником (contributor). Помните об этом все время. Помните, сколь важно было добиться внимания и помощи. Не забывайте, насколько ваше участие было важным для вас. Помните свои ощущения. Не препятствуйте другим участникам и не унижайте их. Относитесь к ним с уважением. Возможно, они наши будущие коммиттеры, и они настолько же важны для проекта, как и коммиттеры. Их вклад в проект настолько же ценен и важен, как и ваш. В конце концов, вам пришлось приложить немало усилий для проекта, чтобы стать коммиттером. Всегда помните об этом.
++
+Обдумайте первое правило <<respect,Уважайте других коммиттеров>> и применяйте его и к другим участникам проекта.
+. Обсудите любые значимые изменения _до_ коммита.
++
+Репозиторий CVS - не место для анонса изменений или обсуждения их. Все изменения должны обсуждаться в списках рассылки, и лишь после достижения консенсуса вносится в репозиторий. Это не означает, что вы должны спрашивать разрешения на исправление очевидной синтаксической ошибки в коде или опечатки в странице справочника. Вы должны ощутить, когда предполагаемое изменение требует предварительного обсуждения и обратной связи. Как правило, никто не станет возражать против обширных изменений, если результат очевидно лучше предыдущего состояния, однако никто не любит, когда эти изменения __неожиданны__. Лучший способ убедиться, что вы на правильном пути - дать ваш код просмотреть кому-либо еще из коммиттеров.
++
+Если вы сомневаетесь, просите отзыва!
+. Уважайте существующих мейнтейнеров.
++
+Многие части кода FreeBSD не являются чьей-либо "собственностью": ситуация, когда некто подпрыгнет и завопит, если вы внесете изменения в "его" код, редка; однако, всегда стоит предварительно проверить. Одним из используемых соглашений было добавление строки MAINTAINER в файл [.filename]#Makefile# пакета или части дерева, которая активно поддерживается одним или несколькими коммиттерами; см. также соответствующий раздел link:{developers-handbook}#policies[Source Tree Guidelines and Policies]. В случае, если какой-то участок системы имеет несколько мейнтейнеров, изменение его одним из них должно быть одобрено по крайней мере одним из других. В случаях, когда "принадлежность" кода неясна, вы можете взглянуть на историю коммитов, чтобы понять, кто наиболее активно либо в последнее время работал в этой области.
++
+Отдельные области FreeBSD попадают под контроль коммиттеров, занимающихся поддержкой целых категорий на пути эволюции FreeBSD, таких как локализация или сетевая подсистема. Для дополнительной информации смотрите link:{contributors}#staff-who/[http://www.FreeBSD.org/doc/en_US.ISO8859-1/articles/contributors/staff-who]
+. Любое спорное изменение необходимо откатить в ожидании решения, если того требует мейнтейнер. Вопросы безопасности могут перекрывать мнение мейнтейнера, если так решит Security Officer.
++
+Это может быть нелегко, особенно в период конфликта (когда каждый участник уверен, что прав именно он). К счастью, CVS дает возможность, вместо того чтобы вести бушующую перебранку, просто откатить внесенные изменения, успокоиться всем участникам конфликта, а затем попробовать найти взаимоприемлемый путь. Если в конце концов окажется, что изменение стоит того, оно может быть легко применено вновь. В противном случае, пользователям не придется жить с неправильным состоянием дерева исходных текстов, пока стороны заняты выяснением отношений. Запросы на откаты возникают _крайне_ редко, поскольку обсуждение обычно выявляет неверные или спорные моменты до коммита; однако, если такой запрос все же возник, он должен быть безусловно удовлетворен, чтобы мы могли спокойно выяснить, было изменение неверным или нет.
+. Изменения вносятся в ветвь FreeBSD-CURRENT до FreeBSD-STABLE, за исключением случаев, прямо разрешенных выпускающими инженерами или неприменимости изменения к FreeBSD-CURRENT. Любое нетривиальное и не срочное изменение должно быть выдержано в FreeBSD-CURRENT в течение по крайней мере 3 дней перед переносом, чтобы его могли адекватно протестировать. Выпускающие инженеры обладают той же властью в ветви FreeBSD-STABLE, что и мейнтейнеры (см. правило 5).
++
+Это еще одно "не обсуждаемое" правило: выпускающий инженер безусловно отвечает за последствия, если выясняется что внесенные изменения неверны. Уважайте эти права, и помогайте группе выпуска релизов в работе с ветвью FreeBSD-STABLE. На первый взгляд может показаться, что ветвь FreeBSD-STABLE развивается чересчур консервативно. Не забывайте, однако, что разумный консерватизм - отличительное свойство FreeBSD-STABLE, и что эта ветвь развивается по законам, отличным от законов FreeBSD-CURRENT. Кроме того, нет смысла тестировать изменения в FreeBSD-CURRENT, если они немедленно переносятся в FreeBSD-STABLE. Разработчики FreeBSD-CURRENT должны иметь возможность протестировать внесенные изменения, так что оставьте время для такого тестирования, если только речь не идет о критическом исправлении или о чем-либо очевидно не требующем тестирования (например, исправления опечаток в страницах справочника, очевидных ошибок или опечаток в исходных текстах и т.п.) Иными словами, исходите из соображений здравого смысла.
++
+Изменения в ветви поддержки безопасности (security branches, например, `RELENG_6_0`) должны быть одобрены членом группы `{security-officer}` или, в некоторых случаях, одним из выпускающих инженеров (`{re}`).
+. Не пререкайтесь с другими коммиттерами публично: это дурно выглядит. Если вам необходимо с чем-либо "категорически не согласиться", делайте это личной почтой.
++
+Для всех участников проекта очень важно поддержание его публичного образа; особенно это важно, если мы хотим продолжать привлекать новых участников. Случается, что, несмотря на все усилия по сохранению власти над собой, люди срываются и грубят друг другу. Лучшее, что здесь можно сделать - минимизировать эффект, пока все участники не успокоятся. Следовательно, вы не должны озвучивать свою ярость публично, а равно и пересылать частную переписку в общедоступные списки рассылки. Выражения, употребляющиеся в переписке один на один зачастую гораздо менее сдержанны, чем те, которые каждый участник употребил бы публично, так что подобной переписке нет места в публичных рассылках: это лишь усугубит и без того неприятную ситуацию. Если кто-либо, говорящий вам нелицеприятные слова, делает это в частной переписке, соблюдайте приличия и вы: отвечайте приватно. Если, по вашему мнению, кто-либо из разработчиков поступает с вами нечестно, и это настолько мучит вас, обратитесь к Правлению, а не выносите конфликт наружу. Правление приложит все силы к разрешению ситуации, выступая в роли третейского судьи. В случаях, когда спор затрагивает какие-либо части кода, и участники не могут прийти к взаимно приемлемому соглашению, Правление может привлечь независимого участника для разрешения вопроса. В этом случае все участники конфликта должны согласиться принять решение, вынесенное третьей стороной.
+. Соблюдайте все периоды заморозки кода (core freeze), а также своевременно читайте списки рассылки `committers` и `developers`, чтобы быть в курсе расписания таких периодов.
++
+Внесение не одобренных изменений в период заморозки кода является довольно большой ошибкой. Коммиттеры должны быть в курсе событий, прежде чем внести 10 мегабайт изменений после долгого отсутствия. Нарушающие это правило будут подвергаться заморозке коммиттерского бита до прохождения курса в Счастливом Лагере Повышения Квалификации FreeBSD, который организован в Гренландии.
+. Если вы сомневаетесь в какой-либо процедуре, сначала спросите!
++
+Множество ошибок совершается, когда кто-либо совершает поспешные действия, думая, что поступает правильно. Делая что-либо впервые, вы, скорее всего, не знаете принятых мелочей и тонкостей, и лучше всего будет сначала спросить, не то вы имеете шансы выставить себя не в лучшем свете. Не стоит стыдиться спросить "Как, черт возьми, это надо делать?" Мы и так знаем, что вы умны: иначе вы не стали бы коммиттером.
+. Тестируйте свои изменения перед коммитом.
++
+Это правило может показаться очевидным. Впрочем, если бы оно действительно было очевидно для всех, мы не так часто сталкивались со случаями явного его нарушения. Если ваши изменения затрагивают ядро, убедитесь, что после него нормально собираются ядра GENERIC и LINT. Если вы изменяете другую часть исходного кода, убедитесь, что код собирается (успешно завершается make buildworld). Если вы изменяете код в какой-либо ветви, убедитесь, что вы тестируете его на машине, которая работает именно на этой ветви кода. Если ваши изменения могут затронуть другие архитектуры, проверьте его на всех поддерживаемых архитектурах. Список доступных ресурсов можно найти на странице link:https://www.FreeBSD.org/internal/[www.FreeBSD.org/internal/]. По мере расширения списка поддерживаемых платформ в кластер будут добавляться соответствующие машины для тестирования.
+. Не производите коммит в деревья [.filename]#src/contrib#, [.filename]#src/crypto# и [.filename]#src/sys/contrib# без _прямого_ разрешения (approval) соответствующего мейнтейнера(ов).
++
+Описанные деревья содержат исходный код сторонних производителей, который, как правило, импортируется в соответствующие ветви. Любой коммит, даже не выводящий файл из ветви производителя, может стать головной болью для ответственных за эту часть проекта разработчиков. Так что, если у вас нет _прямого_ разрешения от мейнтейнера, _ничего_ не делайте с этой частью репозитория (если, конечно, вы не поддерживаете этот код сами).
++
+Отметим, что только что сказанное вовсе не означает, что вы не должны пытаться улучшить упомянутый код, наоборот, этому будут только рады. Лучше всего, если вы передадите ваши исправления вендору. Если изменения специфичны для FreeBSD, обсудите вопрос с мейнтейнером, возможно, он посчитает разумным применить их локально. Тем не менее, что бы вы ни делали, _не_ производите коммит сами!
++
+Если вы хотите стать ответственным за "ничей" участок дерева исходников, свяжитесь с {core}.
+
+=== Правила работы с различными архитектурами
+
+Начиная с версии 5.0 проект FreeBSD начал поддерживать несколько новых вычислительных архитектур, и более не является "i386(TM)-центричным". Для упрощения поддержки FreeBSD на базе всех этих платформ Правлением было сформулировано следующее заявление:
+
+[.blockquote]
+Основной 32-битной платформой разработки является i386; основная 64-битная платформа - Sparc64. Крупные изменения в дизайне (в том числе основные изменения в API и ABI) до попадания в репозиторий должны быть отлажены по крайней мере на одной 32 и одной 64-битной платформе, желательно на основных поддерживаемых платформах.
+
+Платформы i386 и Sparc64 были выбраны по причине широкой распространенности доступности для разработчиков; кроме того, они представляют принципиально разные подходы к дизайну процессора и системы в целом: порядок байт в слове, организация регистров, реализация DMA, кэша, страничной адресации и т.д.
+
+Процессор Alpha, конечно, является 64-битным, однако он представляет более традиционный дизайн и потому не может служить достаточно хорошей тестовой платформой для отработки тонкостей, с которыми разработчик может столкнуться на других 64-битных платформах. Платформа ia64 во многом сложна так же, как и Sparc64, однако ее доступность для разработчиков пока оставляет желать лучшего.
+
+Мы будем переформулировать эти правила по мере того, как будут меняться цены и доступность 64-битных платформ.
+
+Кроме того, разработчики должны быть в курсе наших правил классов поддержки (Tier Policy) различных аппаратных архитектур. Эти правила предназначены для общего описание процесса разработки, и потому отличаются от вышеописанных требований к возможностям и архитектурам. Правила классов поддержки на период выпуска релизов много жестче, чем ограничения на изменения в процессе разработки.
+
+=== Другие рекомендации
+
+Перед коммитом в области документации используйте какие-либо средства проверки орфографии. Для документов SGML, кроме того, при помощи команды `make lint` следует проверить корректность форматирования.
+
+Для страниц справочника, при помощи утилиты из коллекции портов `manck` проверяйте корректность перекрестных ссылок и ссылок на файлы, а также наличие всех необходимых ссылок на синонимы (переменная `MLINK`).
+
+Не смешивайте функциональные изменения со стилистическими (не изменяющими функциональных свойств кода). Такое смешивание затрудняет вычленение изменений при использовании команды `cvs diff` и, таким образом, может скрыть появившиеся ошибки. Не смешивайте в коммите в деревья [.filename]#doc/# и [.filename]#www/# изменения текста и переформатирование: это затрудняет работу переводчиков. Производите все стилистические изменения или переформатирования отдельными коммитами, и четко обозначайте их как таковые в журнальных сообщениях к коммиту.
+
+=== Удаление возможностей
+
+При необходимости удаления какой-либо функциональной возможности из утилит базовой системы следует использовать следующую схему действий:
+
+. В странице справочника и, возможно, в комментариях к релизу опция, утилита или интерфейс объявляются устаревающими и не рекомендованными к использованию (deprecated); их использование выводит предупреждение.
+. Опция, утилита или интерфейс сохраняются до очередного основного релиза (релиз X.0).
+. Опция, утилита или интерфейс удаляются, в том числе из документации: теперь они являются устаревшими. Как правило, об этом стоит упомянуть в комментариях к релизу.
+
+[[archs]]
+== Поддержка различных архитектур
+
+FreeBSD является хорошо портируемой операционной системой и предназначена для работы на самых разнообразных аппаратных архитектурах. Важной частью процесса обеспечения гибкости в поддержке современных тенденций развития оборудования является деление кода на машинно-зависимый (Machine Dependent, MD) и машинно-независимый (Machine Independent, MI), а также, по возможности, минимизация машинно-зависимой части кода. Каждая новая аппаратная архитектура, которую начинает поддерживать FreeBSD, ощутимо увеличивает работу по поддержке кода, инструментария и процесса выпуска релизов. Кроме того, становится значительно сложнее эффективно тестировать изменения в коде ядра. Все это делает необходимым введение различных классов поддержки для различных архитектур, при сохранении максимальной стабильности малого числа "основных платформ".
+
+=== Основные намерения
+
+Проект FreeBSD предназначен для работы на рабочих станциях, серверах и высокопроизводительных встроенных системах. Сохраняя ориентир на малое количество архитектур в интересах таких систем, проект FreeBSD остается способен поддерживать высокий уровень надежности, стабильности и производительности, а также уменьшить нагрузку на различные группы поддержки проекта, такие как группы поддержки портов, документации, безопасности и выпуска релизов. Разнообразие поддерживаемых аппаратных платформ расширяет область применимости FreeBSD за счет поддержки новых возможностей (например, поддержка 64-битных процессоров, использование во встроенных системах и т.п.); тем не менее, расширение этого списка всегда должно быть тщательно оценено с позиций увеличения затрат на поддержку дополнительной аппаратной платформы.
+
+Проект FreeBSD делит различные аппаратные платформы на 4 класса. Для каждого класса описывается набор требований, необходимых для присвоения платформе данного класса, и обязательства разработчиков по отношению к платформе. Кроме того, определяется порядок смены класса для архитектуры.
+
+=== Класс 1: Полностью поддерживаемые архитектуры
+
+Платформы 1 класса полностью поддерживаются группой безопасности, группой выпуска релизов и мейнтейнерами инструментария. Новые возможности, добавляемые в код системы, должны быть полностью функциональны для всех архитектур первого класса для каждого из релизов (исключением могут быть архитектурно-зависимые возможности, такие как драйвера аппаратуры). Как правило, все платформы 1 класса должны поддерживаться системами сборки либо расположенными непосредственно в кластере FreeBSD.org, либо легко доступными для всех разработчиков.
+
+Архитектуры первого класса должны быть готовыми к эксплуатации под управлением FreeBSD во всех аспектах, включая процесс установки и среду разработки.
+
+В настоящее время платформами 1 класса являются i386, Sparc64, AMD64, and PC98.
+
+=== Класс 2: Архитектуры для разработчиков
+
+Платформы 2 класса не поддерживаются группами безопасности и выпуска релизов. Поддержка инструментария оставляется на усмотрение его мейнтейнеров. Новые возможности, реализуемые в FreeBSD, должны быть реализуемы на этих платформах, однако непосредственная реализация на момент добавления кода в дерево исходных текстов не требуется. Реализация порта на архитектуру 2 класса может быть добавлена в репозиторий, если она не входит в противоречие с текущим состоянием систем первого класса и не влияет в существенной степени на прочие платформы 2 класса. Для добавления архитектуры 2 класса в дерево исходных текстов FreeBSD система должна быть способна загрузиться хотя бы в однопользовательский режим на реальной аппаратуре. Некоторые исключения из последнего правила могут быть сделаны для новой аппаратуры, находящейся в состоянии разработки и временно не доступной для проекта.
+
+Обычно архитектурами 2 класса являются те, которые планируются к переходу в 1 класс, но пока находятся в состоянии разработки. Также во втором классе могут находится платформы, перешедшие из 1 класса по причине потери актуальности, по мере того как уменьшается количество ресурсов, доступных для поддержки системы в состоянии готовности к промышленной эксплуатации.
+
+В настоящее время платформами 2 класса являются PowerPC и ia64.
+
+=== Класс 3: Экспериментальные архитектуры
+
+Платформы 3 класса не поддерживаются группами безопасности и выпуска релизов. Поддержка инструментария оставляется на усмотрение его мейнтейнеров. Архитектурами третьего класса могут быть: те, для которых нет и в ближайшее время не предвидится доступного проекту оборудования; имеющие менее трех активных разработчиков; не способные загрузиться в однопользовательский режим на реальной аппаратуре (или под управлением эмулятора, если реальная аппаратура недоступна); наконец, системы, которые оцениваются как исчезающие, чья дальнейшая распространенность сомнительна. Поддержка систем 3 класса не вносится в основное дерево исходных текстов FreeBSD, однако работа над такими архитектурами может производиться в репозитории Perforce FreeBSD, для облегчения контроля версий и дальнейшей интеграции с основной массой кода.
+
+В настоящее время единственной платформой 3 класса является S/390(R).
+
+=== Класс 4: не поддерживаемые архитектуры
+
+Системы 4 класса никак не поддерживаются проектом.
+
+К 4 классу относятся все архитектуры, не перечисленные выше.
+
+=== Правила смены класса для архитектуры
+
+Для переноса платформы из класса в класс требуется решение, утвержденное Правлением, которое, в свою очередь, согласует его с группами безопасности, выпуска релизов и поддержки инструментария.
+
+[[ports]]
+== FAQ по работе с портами
+
+.Добавление нового порта
+
+=== Как добавить новый порт?
+
+Для начала прочитайте раздел, посвященный репозиторному копированию.
+
+Самым простым будет использовать скрипт `addport` на машине `freefall`. Он добавит порт из указанного вами каталоге, определив нужную категорию из файла [.filename]#Makefile#, добавит строку в файл [.filename]#CVSROOT/modules# и в файл [.filename]#Makefile# для нужной категории. Скрипт был написан `{mharo}` и `{will}`; вопросы и исправления по поводу `addport` следует отправлять Уиллу, как текущему мейнтейнеру.
+
+=== Что еще следует сделать, добавляя новый порт?
+
+Проверьте его. Желательно убедиться в том, что порт и соответствующий пакет корректно собираются. Рекомендуемая последовательность действий такова:
+
+[source,bash]
+....
+# make install
+# make package
+# make deinstall
+# pkg_add имя собранного пакета
+# make deinstall
+# make reinstall
+# make package
+
+....
+
+Более подробные инструкции можно найти в link:{porters-handbook}[Руководстве FreeBSD по созданию портов].
+
+Пользуйтесь man:portlint[1] для проверки корректности порта. Не обязательно добиваться полного отсутствия предупреждений, но по крайней мере исправьте простейшие из них.
+
+Если новый порт прислал человек, еще не упомянутый в link:{contributors}#contrib-additional[Списке прочих участников], добавьте его имя туда.
+
+Закройте PR, если новый порт пришел в виде PR. Для этого воспользуйтесь командой `edit-pr _PR#_` на машине `freefall` и измените значение в строке `state` с `open` на `closed`. Затем опишите причину смены статуса, и на этом работа закончена.
+
+[[perks]]
+== Пряники и прочие льготы
+
+Увы, льгот, возникающих от того, что вы являетесь коммиттером, не так уж много. Пожалуй, единственным несомненным долговременным преимуществом будет признание вас как компетентного специалиста. Тем не менее, кое-какие льготы все же существуют:
+
+Прямой доступ к машине `cvsup-master`::
+Будучи коммиттером, вы можете обратиться к `{kuriyama}`, чтобы получить доступ к машине `cvsup-master.FreeBSD.org`, приложив вывод команды `cvpasswd _yourusername_@FreeBSD.org freefall.FreeBSD.org`. Обратите внимание: в командной строке вы должны указать `freefall.FreeBSD.org`, хотя реальным сервером будет `cvsup-master`. Доступом к `cvsup-master` не следует злоупотреблять: это весьма загруженная машина.
+
+Бесплатная подписка на комплект из 4 CD или DVD::
+Компания http://www.freebsdmall.com[FreeBSD Mall, Inc.] предоставляет для всех коммиттеров FreeBSD возможность бесплатной подписки на выпуски FreeBSD. Порядок подписки появляется в списке рассылки mailto:developers@FreeBSD.org[developers@FreeBSD.org] после каждого релиза.
+
+[[misc]]
+== Прочие вопросы
+
+=== Почему не следует вносить малозначимые изменения в ветви разработчика (vendor branches)?
+
+* После этого действия каждый новый релиз от разработчика требует ручного приложения и объединения патчей.
+* Что хуже, каждый новый релиз от разработчика требует ручной _проверки_ приложенных патчей.
+* Опция CVS `-J` не всегда хорошо работает. Можете спросить `{obrien}`, он расскажет вам жутких историй.
+
+=== Как мне добавить файл в ветвь CVS?
+
+Для добавления файла в ветви просто обновите исходные файлы до нужной ветви, а затем используйте команду `cvs add`. Например, если мы хотите перенести файл [.filename]#src/sys/alpha/include/smp.h# из ветви HEAD в ветвь RELENG_6, в которой он пока не существует, можно использовать следующую последовательность действий:
+
+.MFC для нового файла
+[example]
+====
+
+[source,bash]
+....
+% cd sys/alpha/include
+% cvs update -rRELENG_6
+cvs update: Updating .
+U clockvar.h
+U console.h
+...
+
+% cvs update -kk -Ap smp.h > smp.h
+===================================================================
+Checking out smp.h
+RCS: /usr/cvs/src/sys/alpha/include/smp.h,v
+VERS: 1.1
+***************
+
+% cvs add smp.h
+cvs add: scheduling file `smp.h' for addition on branch `RELENG_6'
+cvs add: use 'cvs commit' to add this file permanently
+
+% cvs commit
+
+....
+
+====
+
+=== Какую мета-информацию я должен включать в сообщения для коммита?
+
+Помимо информативного описания содержания коммита вам может потребоваться включить в сообщение дополнительную информацию.
+
+Она состоит из одной или нескольких строк вида: ключевое слово или словосочетание, двоеточие, табуляции для форматирования, собственно дополнительная информация.
+
+Ключевыми словами могут быть:
+
+[.informaltable]
+[cols="1,1", frame="none"]
+|===
+
+|`PR:`
+|Идентификатор сообщения об ошибке, затрагиваемого (как правило, закрываемого) данным коммитом.
+
+|`Submitted by:`
+|Имя и e-mail адрес приславшего исправление; для коммиттеров - просто имя пользователя в кластере FreeBSD.
+
+|`Reviewed by:`
+|Имя и e-mail адрес того или тех, кто рецензировал изменения; для коммиттеров - имя пользователя в кластере FreeBSD. Если изменения были посланы в список рассылки на рецензию и получили одобрение, имя списка рассылки.
+
+|`Approved by:`
+|Имя и e-mail адрес того или тех, кто одобрил изменение; как и прежде, для коммиттеров просто имя пользователя в кластере. Обычной практикой является получение одобрения для коммитов в новые для вас области дерева. Кроме того, в период перед каждым релизом все коммиты _должны_ быть одобрены группой выпускающих инженеров. В случае ваших первых коммитов вы должны получить одобрение на них у вашего ментора, и упомянуть его в виде "_username-of-mentor_`(mentor)`".
+
+|`Obtained from:`
+|Имя проекта, из исходного кода которого было взято изменение.
+
+|`MFC after:`
+|Если вы хотите получать по почте напоминания об MFC, укажите число дней, недель или месяцев с момента изначального коммита, через которое вы планируете произвести MFC.
+
+|`Security:`
+|Если ваши изменения затрагивают вопросы безопасности или исправляют какие-либо уязвимости, укажите ссылки на опубликованные отчеты или описание проблемы.
+|===
+
+.Сообщение для коммита, основанного на PR
+[example]
+====
+
+Вы собираетесь внести коммит, основанный на PR, присланном John Smith и содержащим патч для исправления проблемы. Ваше сообщение должно заканчиваться примерно такими строками:
+
+[.programlisting]
+....
+...
+
+PR: foo/12345
+Submitted by: John Smith <John.Smith@example.com>
+....
+
+====
+
+.Сообщение для коммита, требующего рецензии
+[example]
+====
+
+Вы собираетесь изменить подсистему работы с виртуальной памятью. Вы опубликовали предполагаемые изменения в соответствующем списке рассылки (в данном случае `freebsd-arch`), и изменения были одобрены.
+
+[.programlisting]
+....
+...
+
+Reviewed by: -arch
+....
+
+====
+
+.Сообщение для коммита, требующего одобрения
+[example]
+====
+
+Вы намерены произвести коммит в область дерева, для которой определен ведущий (MAINTAINER). Вы скоординировали усилия с мейнтейнером, и он отреагировал "Отлично. Производи коммит."
+
+[.programlisting]
+....
+...
+
+Approved by: abc
+....
+
+Где _abc_ имя пользователя, одобрившего ваш коммит.
+====
+
+.Сообщение для коммита, использующего код OpenBSD
+[example]
+====
+
+Вы собираетесь внести изменение, основанное на коде, использованном проектом OpenBSD.
+
+[.programlisting]
+....
+...
+
+Obtained from: OpenBSD
+....
+
+====
+
+.Сообщение для коммита, планирующего интеграцию из FreeBSD-CURRENT в FreeBSD-STABLE через некоторое время
+[example]
+====
+
+Вы хотите внести изменения, которые должны быть интегрированы из FreeBSD-CURRENT в ветвь FreeBSD-STABLE через две недели.
+
+[.programlisting]
+....
+...
+
+MFC after: 2 weeks
+....
+
+Где _2_ является количеством дней, недель или месяцев, через которое вы планируете интегрировать (MFC) в FreeBSD-STABLE. В качестве _weeks_ может быть использовано `week`, `weeks`, `month`, `months`, либо этот параметр может быть опущен (при этом подразумевается _X_ дней).
+====
+
+В отдельных случаях вам потребуется комбинировать приведенные примеры.
+
+Рассмотрим ситуацию, когда некто прислал сообщение об ошибке, содержащее код из проекта NetBSD. Вы заинтересовались этим случаем, но он расположен в той части дерева, в которой вы обычно не работаете, так что вы решаете выдать изменения на рассмотрение списка рассылки `arch`. Поскольку изменения были достаточно сложны, вы решаете интегрировать их (MFC) через месяц, чтобы обеспечить адекватное время для тестирования.
+
+В описанном случае сообщения для коммита может выглядеть примерно так:
+
+[.programlisting]
+....
+PR: foo/54321
+Submitted by: John Smith <John.Smith@example.com>
+Reviewed by: -arch
+Obtained from: NetBSD
+MFC after: 1 month
+....
+
+=== Как мне получить доступ к people.FreeBSD.org для того чтобы разместить там персональную информацию или информацию о моих проектах?
+
+`people.FreeBSD.org` - синоним для `freefall.FreeBSD.org`. Просто создайте каталог [.filename]#public_html#. Все, что вы разместите в нем, будет автоматически доступно по адресу http://people.FreeBSD.org/[http://people.FreeBSD.org/].
+
+=== Где расположены архивы списков рассылки?
+
+Списки рассылки архивируются в иерархию каталогов [.filename]#/g/mail#, видимую на всех машинах кластера как [.filename]#/hub/g/mail# (см. man:pwd[1]).
+
+=== Мне бы хотелось стать ментором для нового коммиттера. Какого технологического процесса я должен придерживаться?
+
+Обратитесь к документу http://www.freebsd.org/internal/new-account/[Процедура создания нового аккаунта].
diff --git a/documentation/content/ru/articles/contributing/_index.adoc b/documentation/content/ru/articles/contributing/_index.adoc
new file mode 100644
index 0000000000..2f45bfa963
--- /dev/null
+++ b/documentation/content/ru/articles/contributing/_index.adoc
@@ -0,0 +1,215 @@
+---
+title: Участие в проекте FreeBSD
+authors:
+ - author: Джордан Хаббард
+releaseinfo: "$FreeBSD$"
+trademarks: ["freebsd", "ieee", "general"]
+---
+
+= Участие в проекте FreeBSD
+:doctype: article
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:toc-title: Содержание
+:part-signifier: Часть
+:chapter-signifier: Глава
+:appendix-caption: Приложение
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+
+include::shared/ru/mailing-lists.adoc[lines=9..-1]
+include::shared/ru/urls.adoc[]
+
+[.abstract-title]
+Аннотация
+
+В этой статье описаны различные способы, которыми отдельные лица и организаций могут принять участие в Проекте FreeBSD.
+
+'''
+
+toc::[]
+
+Итак, вы хотите внести свой вклад во FreeBSD? Это великолепно! Жизнеспособность FreeBSD _основана_ на помощи её пользователей. Ваша помощь не только принимается, она жизненно необходима для продолжения роста FreeBSD.
+
+Несмотря на уверения некоторых людей, вам не нужно быть гениальным программистом или персоной, лично связанной с руководящей группой FreeBSD, чтобы ваша помощь была принята. FreeBSD разрабатывает большое и увеличивающееся количество участников со всего мира, самого разного возраста и разных областей технической экспертизы. Работы, которую необходимо сделать, всегда больше, чем разработчиков, могущих её выполнить, и дополнительная помощь всегда приветствуется.
+
+Проект FreeBSD занимается операционной системой в целом, а не только ядром или несколькими отдельными утилитами. Таким образом, в нашем [.filename]#TODO#-списке широкий спектр задач: от документации, бета-тестирования и презентаций до программы установки системы и специфических разработок уровня ядра. Люди любого уровня практически в любой области определённо смогут помочь проекту.
+
+Коммерческие структуры, связанные с использованием FreeBSD, также приглашаются к диалогу. Нужны ли вам особые расширения, для работы вашего продукта? Вы увидите, что мы отвечаем на ваши запросы, если они не слишком необычны. Вы работаете над дополнительными продуктами? Дайте нам знать! Мы сможем работать вместе над некоторыми его аспектами. Мир свободного программного обеспечения ставит под сомнение многие существующие представления о том, как программного обеспечение разрабатывается, продаётся и поддерживается, и мы настоятельно просим вас посмотреть на него ещё раз.
+
+[[contrib-what]]
+== Что нужно
+
+В следующем перечне представлены задачи и подпроекты, являющиеся некоторым отражением различных списков [.filename]#TODO# и запросов пользователей.
+
+[[non-programmer-tasks]]
+=== Текущие задачи не для программистов
+
+Многие люди, связанные с FreeBSD, не являются программистами. В Проекте участвуют создатели документации, Web-дизайнеры и специалисты по поддержке пользователей. Все, что им нужно для участия, это своё время и желание учиться.
+
+. Периодически читайте FAQ и Руководство. Если что-то описано плохо, устарело или даже полностью неправильно, дайте нам знать. Ещё лучше, если вы пришлёте нам исправление (выучить Docbook не так сложно, но и против посланий в формате ASCII никто возражать не будет).
+. Помогите перевести документацию FreeBSD на ваш родной язык. Если документация на вашем языке уже существует, вы можете помочь перевести дополнительные документы или проверить, не устарели ли переводы. Первым делом взгляните на link:{fdp-primer}#translations[FAQ по переводам] в Учебнике проекта документирования FreeBSD. Вас не призывают перевести все документы FreeBSD - как доброволец, вы можете делать столько переводов, сколько захотите. Если кто-то начал перевод, другие всегда присоединятся. Если у вас есть время и желание перевести одну часть документации, пожалуйста, переведите инструкции по установке.
+. Время от времени (или даже регулярно) читайте {freebsd-questions} и news:comp.unix.bsd.freebsd.misc. Вам может понравиться делиться своим опытом и помогать людям решать их проблемы; иногда вы сможете узнать для себя что-то новое! Эти форумы могут также стать источником идей, над которыми вам стоит поработать.
+
+[[ongoing-programmer-tasks]]
+=== Текущие задачи для программистов
+
+Большинство задач, перечисленных здесь, требуют либо значительных затрат времени, либо глубоких знаний ядра FreeBSD, либо того и другого. Однако имеется также много полезных задач, которые подойдут для "воскресных хакеров".
+
+. Если вы работаете с FreeBSD-CURRENT и обладаете хорошим подключением к Internet, то существует машина `current.FreeBSD.org`, которая строит полный релиз ежедневно-сейчас и всегда. Попробуйте установить самый последний релиз с этой машины и сообщите обо всех обнаруженных при этом ошибках.
+. Читайте {freebsd-bugs}. Здесь может встретиться проблема, которую вы сможете конструктивно прокомментировать или патчи, которые вы можете протестировать. Либо вы можете даже попытаться исправить какую-то проблему самостоятельно.
+. Если вы знаете о существовании каких-либо исправлений ошибок, успешно применённых к -CURRENT, но ещё не перенесённых в -STABLE после достаточно большого интервала времени (обычно несколько недель), направьте коммиттеру вежливое напоминание.
+. Перенос стороннего программного обеспечения в каталог [.filename]#src/contrib# дерева исходных текстов.
+. Проверка актуальности кода в каталоге [.filename]#src/contrib#.
+. Построение из дерева исходных текстов (или её части) с включением режима дополнительных предупреждений, избавление от них.
+. Исправление предупреждений от портов, которые используют недопустимые вызовы типа `gets()` или включают файл объявлений [.filename]#malloc.h#.
+. Если вы создавали порты и вам приходилось делать специфичные для FreeBSD исправления, пошлите ваши патчи авторам оригинального программного обеспечения (это упростит вам жизнь при выпуске следующей версии).
+. Найдите копии официальных стандартов, например, POSIX(R). Вы можете найти несколько ссылок на них на странице Web-сайта link:https://www.FreeBSD.org/projects/c99/[Проекта соответствия FreeBSD стандартам C99 & POSIX]. Сравните поведение FreeBSD с тем, что определено стандартом. Если реакция отличается, особенно в незначительных или непонятных разделах спецификации, направьте об этом PR. Если можете, найдите, как исправить это и включите в PR патч. Если вы полагаете, что в стандарте есть ошибка, направьте запрос его разработчикам.
+. Предложите дополнительные задачи для этого списка!
+
+=== Работа с базой сообщений об ошибках PR
+
+http://www.FreeBSD.org/cgi/query-pr-summary.cgi[Список сообщений об ошибках FreeBSD] содержит все актуальные сообщения о проблемах и запросы на улучшения, которые были посланы пользователями FreeBSD. База данных PR содержит задачи как для программистов, так и не для них. Просмотрите открытые PR, найдите те, что привлекут ваше внимание. Некоторые из них могут быть очень простыми, требующими лишь ещё одной пары глаз, чтобы посмотреть и подтвердить, что предлагаемое в PR исправление достаточно. Другие могут быть гораздо сложнее и даже вовсе не содержать исправления.
+
+Начните с тех PR, которые никому ещё не назначены. Если PR уже за кем-то закреплено, но содержит проблему, которую вы можете решить, направьте по электронной почте письмо человеку, которому назначено это PR, и спросите, можете ли вы поработать над ней-у них уже может готов патч для тестирования или какие-то идеи, которые можно вместе обсудить.
+
+=== Выберите один из пунктов со странички "идей"
+
+http://wiki.freebsd.org/IdeasPage[Список проектов и идей для добровольцев] также доступен для людей, желающих помочь проекту FreeBSD. Список постоянно обновляется и содержит пункты, как для программистов, так и для не программистов, с информацией о каждом проекте.
+
+[[contrib-how]]
+== Как принять участие в работе
+
+Характер участия в работе над системой обычно подпадает под одну или несколько из следующих 5 категорий:
+
+[[contrib-general]]
+=== Сообщения об ошибках и отзывы общего характера
+
+Идеи или пожелания _общего_ технического характера должны направляться по электронной почте в адрес {freebsd-hackers}. Подобным же образом тот, кто интересуется такими вещами (и устойчив к _большому_ потоку почты!) может подписаться на список рассылки {freebsd-hackers}. Обратитесь к link:{handbook}#eresources-mail[Руководству FreeBSD] для получения дополнительной информации об этом и других списках рассылки.
+
+Если вы нашли ошибку или предлагаете внести какое-то конкретное исправление, пожалуйста, отправьте сообщение при помощи программы man:send-pr[1] или её link:https://www.FreeBSD.org/send-pr/[Web-эквивалента]. Постарайтесь заполнить все поля в сообщении об ошибке. Если его размер оно не превышает 65 Кбайт, включите все патчи непосредственно в сообщение. Если патч предназначен для дерева исходных текстов, поместите `[PATCH]` в теме сообщения. При включении патчей _не используйте_ технику cut-and-paste, потому что при этом символы табуляции преобразуются в пробелы и патч становится непригодным к использованию. Если объём патчей превышает 20 Кбайт, лучше включать их в сообщение в сжатом виде, для чего упакуйте их (например, при помощи man:gzip[1] или man:bzip2[1]) и обработайте архив утилитой man:uuencode[1].
+
+После отправки сообщения вы должны получить подтверждение и номер для отслеживания. Сохраните этот номер, чтобы использовать его в дальнейшем при направлении подробностей о проблеме по электронной почте на адрес {bugfollowup}. Используйте номер в качестве темы письма, например, `"Re: kern/3377"`. Дополнительная информация о любом сообщении об ошибке должна направляться этим способом.
+
+Если вы не получили подтверждения в течение разумного периода времени (от 3 дней до недели, в зависимости от вашего подключения к электронной почты) или по какой-то причине не можете воспользоваться командой man:send-pr[1], то можете попросить кого-нибудь направить сообщение за вас на адрес {freebsd-bugs}.
+
+Прочтите также link:{problem-reports}[эту статью], чтобы узнать, как писать хорошие сообщения о проблемах.
+
+=== Изменения в документации
+
+Изменения в документации обсуждаются в {freebsd-doc}. Пожалуйста, посмотрите link:{fdp-primer}[Учебник Проекта документирования FreeBSD] для получения полных инструкций. Посылайте свои пожелания и изменения (принимаются даже самые небольшие!) при помощи man:send-pr[1], как это описано в разделе о <<contrib-general>>.
+
+=== Изменения к имеющемуся исходному коду
+
+Добавление нового исходного кода или внесение изменений в существующий является не такой простой задачей, и зависит во многом от того, насколько вы далеки от текущего состояния разработок во FreeBSD. Существуют специальные промежуточные релизы FreeBSD, известные как "FreeBSD-CURRENT", которые доступны несколькими разными способами, удобными разработчикам, активно работающим над системой. Обратитесь к link:{handbook}#current-stable[Руководству FreeBSD] для получения дополнительной информации о получении и использовании FreeBSD-CURRENT.
+
+Если вы работаете с несколько устаревшими исходными текстами, то ваши изменения иногда могут оказаться уже ненужными или слишком большими, чтобы повторно интегрировать их во FreeBSD. Уменьшить такой риск можно, подписавшись на списки рассылки {freebsd-announce} и {freebsd-current}, в которых обсуждается текущее состояние системы.
+
+Предположим, что вы смогли получить актуальные исходные тексты, на базе которых делали свои изменения. Тогда следующим шагом является создание набора файлов, отражающих ваши изменения для их посылки тем, кто отвечает за поддержку FreeBSD. Это делается при помощи команды man:diff[1].
+
+Предпочтительным форматом man:diff[1] для посылки патчей является унифицированная выдача, создаваемая командой `diff -u`.
+
+К примеру:
+
+[source,bash]
+....
+% diff -u oldfile newfile
+....
+
+или
+
+[source,bash]
+....
+% diff -u -r -N olddir newdir
+....
+
+создаст набор патчей в унифицированном формате для конкретного файла с исходным текстом или для иерархии каталогов.
+
+Дополнительную информацию можно найти в man:diff[1].
+
+После того, как вы получили набор diff-файлов (которые вы можете протестировать командой man:patch[1]), вы должны прислать их для включения во FreeBSD. Воспользуйтесь программой man:send-pr[1], как это описано в разделе о <<contrib-general>>. _Не посылайте_ diff-файлы в список рассылки {freebsd-hackers}, они будут потеряны! Нам очень нужна ваша помощь (это добровольный проект!); из-за нашей занятости мы не сможем рассмотреть его сразу, и он будет находиться в базе данных PR, пока мы не сделаем это. Укажите на вашу посылку, включив строку `[PATCH]` в тему сообщения.
+
+Если вы считаете, что это нужно (к примеру, вы добавляли, удаляли или переименовывали файлы), то объедините ваши изменения в `tar`-файл и обработайте его программой man:uuencode[1]. Принимаются также и архивы, созданные программой man:shar[1].
+
+Если ваше изменение потенциально может оказаться сомнительным, например, вы не уверены в отсутствии лицензионных ограничений относительно его распространения, то вы должны послать его напрямую в список рассылки {core}, а не через man:send-pr[1]. В списке рассылки {core} участвует гораздо меньшее количество людей, которые выполняют основную ежедневную работу над FreeBSD. Заметьте, что эта группа также __очень занята__, так что сюда письма нужно посылать только в случае действительной необходимости.
+
+Пожалуйста, обратитесь к справке по man:intro[9] и man:style[9] для получения некоторой информации о стиле кодирования. Мы надеемся, что вы хотя бы примете эту информацию к сведению перед тем, как прислать нам свой код.
+
+=== Новый код или большие дополнительные пакеты
+
+В случае значительного объёма присланного вами кода и соответствующей работы, либо добавления к FreeBSD важной новой функции, становится практически всегда необходимо посылать изменения в виде tar-файлов, обработанных uuencode, или передавать их на Web-сайт или FTP-сервер для получения другими людьми. Если у вас нет доступа к Web- или FTP-серверам, попросите в соответствующем списке рассылке FreeBSD кого-нибудь разместить изменения за вас.
+
+При работе с большим объёмом кода неизбежно возникает вопрос о соблюдении авторских прав. Допустимыми лицензионными соглашениями для кода, включаемого во FreeBSD, являются следующие:
+
+. Лицензионное соглашение BSD. Оно является самым предпочтительным из-за "отсутствия дополнительных условий" и общей привлекательности для коммерческих компаний. Проект FreeBSD далёк от того, чтобы выступать против коммерческого использования, но активно популяризирует такое пересечение коммерческих интересов, которое позволит постепенно запустить механизм инвестиций во FreeBSD.
+. GNU General Public License, или "GPL". Это лицензионное соглашение не очень популярно у нас из-за объёма требований, которые нужно выполнять всем, кто собирается использовать код в коммерческих целях. Однако, учитывая абсолютное превосходство объёма этого кода (компилятор, ассемблер, инструменты форматирования текста и так далее) было бы глупо отказываться от дополнительных разработок, подпадающих под действие этой лицензии. Код, распространяемый по условиям лицензионного соглашения GPL также размещается в отдельной части дерева исходных текстов, в [.filename]#/sys/gnu# или [.filename]#/usr/src/gnu#, и поэтому легко идентифицируется всяким, для кого GPL представляет проблему.
+
+Разработки, подпадающие под действие других типов лицензионных соглашений, должны быть тщательно просмотрены перед принятием решения об их включении во FreeBSD. Разработки, на которые распространяются жёсткие ограничения коммерческих лицензионных соглашений, обычно отвергаются, а авторам всегда предлагается распространять подобные изменения по собственным каналам.
+
+Для того, чтобы на вашу работу распространялись условия лицензионного ограничения "в стиле BSD", разместите следующий текст в самом начале каждого файла с исходными текстами, которые вы хотите защитить, заменив текст между `%%` соответствующей информацией:
+
+[.programlisting]
+....
+Copyright (c) %%полные_номера_годов%%
+ %%ваше_имя%%, %%ваш_штат%% %%ваш_почтовый_индекс%%.
+ All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer as
+ the first lines of this file unmodified.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY %%your_name_here%% ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL %%your_name_here%% BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ $FreeBSD$
+....
+
+Для вашего удобства копия этого текста размещена в файле [.filename]#/usr/shared/examples/etc/bsd-style-copyright#.
+
+=== Деньги, оборудование или Internet-доступ
+
+Мы всегда с удовольствием примем материальную помощь, нужную для дальнейшего существования Проекта FreeBSD, а в добровольном проекте, типа нашего маленькая помощь может послужить долго! Безвозмездная передача вычислительной техники также очень важна для расширения списка поддерживаемого периферийного оборудования, так как обычно у нас нет средств для самостоятельного его приобретения.
+
+[[donations]]
+==== Финансовая помощь
+
+The FreeBSD Foundation является некоммерческой организацией, освобождённой от уплаты налогов, созданной с целью реализации целей Проекта FreeBSD. Как организация типа 501(c)3, Фонд обычно освобождается от федерального налога США на прибыль. Суммы безвозмездных пожертвований таким организациям часто вычитаются из общей суммы налогооблагаемой прибыли.
+
+Финансовая помощь может быть направлена в виде чеков на адрес:
+
+[.address]
+****
+The FreeBSD Foundation +
+P.O. Box 20247, +
+Boulder, +
+CO 80308 +
+USA
+****
+
+The FreeBSD Foundation теперь может принимать помощь через Web по системе PayPal. Для направления помощи, пожалуйста, посетите http://www.freebsdfoundation.org[Web-сайт] Фонда.
+
+Дополнительную информацию о Фонде FreeBSD можно найти на странице, содержащей http://people.FreeBSD.org/~jdp/foundation/announcement.html[ вводную информации о Фонде FreeBSD]. Для того, чтобы обратиться в Фонд по электронной почте, напишите письмо на адрес mailto:bod@FreeBSDFoundation.org[bod@FreeBSDFoundation.org].
+
+==== Помощь в виде оборудования
+
+Проект FreeBSD с удовольствие примет помощь в виде оборудования, которому он найдёт хорошее применение. Если вы заинтересованы в передаче оборудования, пожалуйста, обратитесь к link:https://www.FreeBSD.org/donations/[Руководству Центра пожертвований].
diff --git a/documentation/content/ru/articles/cups/_index.adoc b/documentation/content/ru/articles/cups/_index.adoc
new file mode 100644
index 0000000000..411ebe522f
--- /dev/null
+++ b/documentation/content/ru/articles/cups/_index.adoc
@@ -0,0 +1,237 @@
+---
+title: Универсальная Система Печати Unix на FreeBSD
+authors:
+ - author: Chess Griffin
+ email: chess@chessgriffin.com
+releaseinfo: "$FreeBSD$"
+trademarks: ["freebsd", "general"]
+---
+
+= Универсальная Система Печати Unix на FreeBSD
+:doctype: article
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:toc-title: Содержание
+:part-signifier: Часть
+:chapter-signifier: Глава
+:appendix-caption: Приложение
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+
+[.abstract-title]
+Аннотация
+
+Эта статья посвящена конфигурированию Универсальной Системы Печати UNIX (CUPS) на FreeBSD.
+
+'''
+
+toc::[]
+
+[[printing-cups]]
+== Знакомимся с Универсальной Системой Печати UNIX (CUPS)
+
+Универсальная Система Печати UNIX (Common Unix Printing System, или сокращенно CUPS), предоставляет переносимую среду печати для UNIX(R) и UNIX(R)-подобных операционных систем. Она была разработана компанией Easy Software Products, чтобы предоставить стандартное решение в печати для всех разработчиков и пользователей UNIX(R).
+
+Универсальная Система Печати UNIX использует протокол межсетевой печати (Internet Printing Protocol, IPP) как основу для управления заданиями на печать и очередями. Также частично поддерживаются следующие протоколы: LPD, SMB и AppSocket (также известный как JetDirect). CUPS дает возможность обзора сетевых принтеров и использования опций, базирующихся на ПостСкрипт Описании Принтеров (PostScript Printer Definition, PPD), чтобы поддерживать в UNIX(R) общепринятые традиции печати. В результате CUPS идеально подходит для совместного использования принтеров в смешанной среде из FreeBSD, Linux(R), Mac OS(R) X или Windows(R).
+
+Официальный сайт Универсальной Системы Печати UNIX - http://www.cups.org/[http://www.cups.org/].
+
+[[printing-cups-install]]
+== Установка сервера печати CUPS
+
+Для установки CUPS используя пакет, запустите на выполнение такую команду:
+
+[source,bash]
+....
+# pkg install cups
+....
+
+Другие необязательные, но рекомендуемые к установке пакеты это package:print/gutenprint-cups[] и package:print/hplip[], каждый из которых добавляет драйвера и утилиты для разнообразных принтеров. После установки файлы конфигурации CUPS могут быть найдены в директории [.filename]#/usr/local/etc/cups#.
+
+[[printing-cups-configuring-server]]
+== Настройка сервера печати CUPS
+
+Чтобы настроить сервер CUPS необходимо отредактировать несколько конфигурационных файлов. Для начала создайте или исправьте файл [.filename]#/etc/devfs.rules# и добавьте следующую информацию для того, чтобы установить соответствующие права на все потенциальные файлы устройств принтеров и связать принтеры с группой пользователей `cups`:
+
+[.programlisting]
+....
+[system=10]
+add path 'unlpt*' mode 0660 group cups
+add path 'ulpt*' mode 0660 group cups
+add path 'lpt*' mode 0660 group cups
+add path 'usb/X.Y.Z' mode 0660 group cups
+....
+
+[NOTE]
+====
+Замените _X_, _Y_ и _Z_ номерами соответствующего принтеру целевого устройства USB, отображаемого в каталоге [.filename]#/dev/usb#. Чтобы найти требуемые значения, просмотрите вывод man:dmesg[8] и найдите связанное с вашим принтером имя специального устройства [.filename]#ugenX.Y#, последнее будет символической ссылкой на искомое устройство в каталоге [.filename]#/dev/usb#.
+====
+
+Затем, добавьте следующие две записи в [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+cupsd_enable="YES"
+devfs_system_ruleset="system"
+....
+
+Эти две записи будут запускать сервер печати CUPS во время загрузки системы и применять локальное правило devfs, созданное выше.
+
+Для того, чтобы печать CUPS стала доступна для некоторых Microsoft(R) Windows(R) клиентов, необходимо раскомментировать следующую запись в [.filename]#/usr/local/etc/cups/mime.types# и [.filename]#/usr/local/etc/cups/mime.convs#:
+
+[.programlisting]
+....
+application/octet-stream
+....
+
+По окончанию внесения изменений службы man:devfs[8] и CUPS необходимо перезапустить, для чего перезагрузите операционную систему или выполните от пользователя `root` следующие две команды:
+
+[source,bash]
+....
+# /etc/rc.d/devfs restart
+# /usr/local/etc/rc.d/cupsd restart
+....
+
+[[printing-cups-configuring-printers]]
+== Настройка принтеров на сервере печати CUPS
+
+После того, как система CUPS была установлена и сконфигурирована, системный администратор может начать конфигурирование локальных принтеров, подключенных к серверу печати CUPS. Эта часть процесса очень похожа, если не идентична настройке принтеров CUPS в других UNIX(R)-подобных операционных системах, таких как дистрибутивы Linux(R).
+
+Основным способом управления и администрирования сервера CUPS является веб-интерфейс, на который можно попасть запустив веб-браузер и набрав http://localhost:631[http://localhost:631] в его адресной строке. Если сервер CUPS находится на другой машине в сети, замените `localhost` на IP адрес сервера. Веб-интерфейс CUPS достаточно очевиден, там есть разделы для управления принтерами и заданиями на печать, авторизацией пользователей и т.п. Кроме того, в правой части страницы администрирования есть несколько флажков (check-box), дающих удобный доступ к часто меняемым установкам, таким как разрешение публичного доступа к подключенным к системе принтерам, предоставление удаленного управления сервером CUPS, изменение уровня доступа пользователей к принтерам и их заданиям на печать.
+
+Добавление принтера в общем такое же простое, как нажатие "Add Printer" на странице администрирования веб-интерфейса сервера CUPS или как нажатие одной из кнопок "New Printers Found" на той же странице администрирования. Когда перед вами предстанет выпадающий список "Device", просто выберите требуемый локально подключенный принтер, а дальше следуйте подсказкам интерфейса. В случае если были установлены порты или пакеты package:print/gutenprint-cups[] или package:print/hplip[], как указывалось выше, дополнительные драйвера печати будут доступны на последующих страницах, что может обеспечить большую надежность и расширенные возможности.
+
+[[printing-cups-clients]]
+== Конфигурирование клиентов CUPS
+
+После того, как сервер CUPS был настроен, принтеры добавлены и сделаны доступными в сети, следующий шаг - это настройка клиентов или машин, которые будут иметь доступ к серверу CUPS. Если у вас единственный настольный компьютер, который работает одновременно и сервером и клиентом, то в большинстве этой информации вы не нуждаетесь.
+
+[[printing-cups-clients-unix]]
+=== UNIX(R) клиенты
+
+На UNIX(R) клиентах также потребуется установить CUPS. После установки системы печати на клиенте, CUPS-принтеры, присутствующие в сети, чаще всего автоматически находятся менеджерами принтеров разных графических оболочек, таких как GNOME или KDE. В качестве альтернативы, вы можете воспользоваться веб-интерфейсом CUPS на клиентской машине по адресу http://localhost:631[http://localhost:631] и на странице администрирования выбрать "Add Printer". Когда перед вами предстанет выпадающий список "Device", просто выберите сетевой CUPS принтер, если он был обнаружен автоматически, или выберите `ipp` или `http` и введите IPP или HTTP адрес (URI) сетевого CUPS принтера:
+
+[.programlisting]
+....
+ipp://server-name-or-ip/printers/printername
+....
+
+[.programlisting]
+....
+http://server-name-or-ip:631/printers/printername
+....
+
+Если CUPS клиент не находит в сети принтеры, доступные через сервер CUPS, то иногда помогает создание или изменение файла [.filename]#/usr/local/etc/cups/client.conf# с добавлением единственной записи, подобной следующей:
+
+[.programlisting]
+....
+ServerName server-ip
+....
+
+В этом случае _server-ip_ необходимо заменить на IP адрес сервера CUPS в сети.
+
+[[printing-cups-clients-windows]]
+=== Windows(R)-клиенты
+
+Версии Windows(R), предшествующие XP, не имели встроенной поддержки протокола IPP. Однако Windows(R) XP и более поздние версии уже обладают такой возможностью. Следовательно, добавить CUPS принтер в этих версиях Windows(R) довольно просто. В большинстве случаев, администратору Windows(R) потребуется запустить мастера установки принтера (`Add Printer`) выбрать сетевой принтер (`Network Printer`), а затем ввести URI следующего формата:
+
+[.programlisting]
+....
+http://server-name-or-ip:631/printers/printername
+....
+
+Если используется версия Windows(R) без поддержки протокола IPP, то общим случаем подключения к CUPS-принтеру будет совместное использование CUPS и package:net/samba3[]. Описание этой возможности выходит за рамки данной статьи.
+
+[[printing-cups-troubleshooting]]
+== Устранение неполадок с CUPS
+
+Проблемы c CUPS часто возникают из-за неверных прав доступа. Сначала дважды проверьте права доступа в man:devfs[8] (сверьтесь с уже описанными выше). Затем, проверьте реальные права устройств, созданных в файловой системе. Также бывает полезным удостовериться, что ваш пользователь входит в группу `cups`. Если у вас складывается впечатление, что флажки прав доступа на странице администрирования веб-интерфейса CUPS не работают, то иным решением может быть резервное копирование конфигурационного файла [.filename]#/usr/local/etc/cups/cupsd.conf# и редактирование разных опций конфигурации с подбором их комбинаций. Ниже приведено содержимое тестового файла конфигурации [.filename]#/usr/local/etc/cups/cupsd.conf#. Пожалуйста, обратите внимание на то, что безопасность в этом примере [.filename]#cupsd.conf# была пожертвована в угоду простоте настройки; как только администратор успешно подсоединится к серверу CUPS и сконфигурирует клиентов, рекомендуется пересмотреть данную конфигурацию и добавить разграничение доступа.
+
+[.programlisting]
+....
+# Log general information in error_log - change "info" to "debug" for
+# troubleshooting...
+LogLevel info
+
+# Administrator user group...
+SystemGroup wheel
+
+# Listen for connections on Port 631.
+Port 631
+#Listen localhost:631
+Listen /var/run/cups.sock
+
+# Show shared printers on the local network.
+Browsing On
+BrowseOrder allow,deny
+#BrowseAllow @LOCAL
+BrowseAllow 192.168.1.* # change to local LAN settings
+BrowseAddress 192.168.1.* # change to local LAN settings
+
+# Default authentication type, when authentication is required...
+DefaultAuthType Basic
+DefaultEncryption Never # comment this line to allow encryption
+
+# Allow access to the server from any machine on the LAN
+<Location />
+ Order allow,deny
+ #Allow localhost
+ Allow 192.168.1.* # change to local LAN settings
+</Location>
+
+# Allow access to the admin pages from any machine on the LAN
+<Location /admin>
+ #Encryption Required
+ Order allow,deny
+ #Allow localhost
+ Allow 192.168.1.* # change to local LAN settings
+</Location>
+
+# Allow access to configuration files from any machine on the LAN
+<Location /admin/conf>
+ AuthType Basic
+ Require user @SYSTEM
+ Order allow,deny
+ #Allow localhost
+ Allow 192.168.1.* # change to local LAN settings
+</Location>
+
+# Set the default printer/job policies...
+<Policy default>
+ # Job-related operations must be done by the owner or an adminstrator...
+ <Limit Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs \
+Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription \
+Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job \
+CUPS-Move-Job>
+ Require user @OWNER @SYSTEM
+ Order deny,allow
+ </Limit>
+
+ # All administration operations require an adminstrator to authenticate...
+ <Limit Pause-Printer Resume-Printer Set-Printer-Attributes Enable-Printer \
+Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs \
+Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer \
+Promote-Job Schedule-Job-After CUPS-Add-Printer CUPS-Delete-Printer CUPS-Add-Class \
+CUPS-Delete-Class CUPS-Accept-Jobs CUPS-Reject-Jobs CUPS-Set-Default>
+ AuthType Basic
+ Require user @SYSTEM
+ Order deny,allow
+ </Limit>
+
+ # Only the owner or an administrator can cancel or authenticate a job...
+ <Limit Cancel-Job CUPS-Authenticate-Job>
+ Require user @OWNER @SYSTEM
+ Order deny,allow
+ </Limit>
+
+ <Limit All>
+ Order deny,allow
+ </Limit>
+</Policy>
+....
diff --git a/documentation/content/ru/articles/explaining-bsd/_index.adoc b/documentation/content/ru/articles/explaining-bsd/_index.adoc
new file mode 100644
index 0000000000..856f56a993
--- /dev/null
+++ b/documentation/content/ru/articles/explaining-bsd/_index.adoc
@@ -0,0 +1,168 @@
+---
+title: Что такое BSD
+authors:
+ - author: Greg Lehey
+ email: grog@FreeBSD.org
+releaseinfo: "$FreeBSD$"
+trademarks: ["freebsd", "amd", "apple", "intel", "linux", "opengroup", "sparc", "sun", "unix", "general"]
+---
+
+= Что такое BSD
+:doctype: article
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:toc-title: Содержание
+:part-signifier: Часть
+:chapter-signifier: Глава
+:appendix-caption: Приложение
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+
+[.abstract-title]
+Аннотация
+
+В мире программ с открытыми исходниками, слово "Linux" практически стало синонимом слова "Операционная Система", хотя это далеко не единственная операционная система UNIX(R), исходные коды которой доступны широкой публике. Согласно данным http://www.leb.net/hzo/ioscount/data/r.9904.txt[Internet Operating System Counter], в апреле 1999-го 31,3% всех подключённых к Internet машин работали под Linux. 14,6% использовали BSD UNIX(R). Некоторые из мировых лидеров в области Web-услуг, например http://www.yahoo.com/[Yahoo!], работают под BSD. Самый загруженный в мире FTP-сервер 1999 года (сейчас он не работает), link:ftp://ftp.cdrom.com/[ftp.cdrom.com], функционировал под управлением BSD и передавал 1,4 Тбайта данных в день. Очевидно, что это не узкий, специализированный рынок: можно сказать, что BSD - это тщательно скрываемая тайна.
+
+Так в чём же секрет? Почему известность BSD оставляет желать лучшего? Эта публикация ставить целью ответить на эти и другие вопросы.
+
+На протяжении всего текста обращайте внимание на _выделенные_ отличия BSD от Linux.
+
+'''
+
+toc::[]
+
+[[what-is-bsd]]
+== Что такое BSD?
+
+BSD означает "Berkeley Software Distribution". Так называлось программное обеспечение, распространявшееся в исходных кодах Калифорнийским Университетом в Беркли, которое сначала представляло из себя дополнения к операционной системе UNIX(R) компании AT&T. На основе версии 4.4BSD-Lite были созданы несколько операционных систем с открытыми исходными кодами. В их состав включены разработки других проектов, среди которых особо следует выделить Проект GNU. Вот что такое собственно операционная система BSD:
+
+* Ядро BSD, отвечающее за планировку процессов, управление памятью, поддержку многопроцессорных систем (SMP), работу с устройствами и так далее.
++
+__В отличие от Linux, существует несколько ядер BSD, отличающихся возможностями.__
+* Библиотека C, основной системный интерфейс программирования.
++
+__Библиотека C в BSD основывается на коде из Беркли, а не из Проекта GNU.__
+* Оболочки, файловые утилиты, компиляторы, редакторы связей и другие утилиты пользователя.
++
+__Некоторые из них базируются на коде GNU, а некоторые -- нет.__
+* Система X Window, отвечающая за графический интерфейс.
++
+Система X Window, которая используется в большинстве версий BSD, поддерживается http://www.X.org/[проектом X.Org]. FreeBSD дает пользователю возможность выбирать из множества графических оболочек, таких как GNOME, KDE или Xfce; а также из множества легких оконных менеджеров наподобие Openbox, Fluxbox или Awesome.
+* Множество разных других прикладных и системных программ.
+
+[[what-a-real-unix]]
+== Что, настоящий UNIX(R)?
+
+Операционные системы BSD не являются клонами друг друга. Они лишь потомки общего предка, ОС UNIX(R) от AT&T Research, которая также дала начало современной ОС UNIX(R) System V. Это факт может удивить, если вспомнить, что AT&T никогда не открывала исходные коды своих разработок.
+
+Действительно, UNIX(R) никогда не был программным обеспечением с открытым исходным кодом, и в законном смысле BSD определённо _НЕ_ UNIX(R). Но с другой стороны, в AT&T активно использовали чужие разработки, например программное обеспечение, разрабатываемое Группой по Исследованиям в области Информатики (CSRG) Калифорнийского Университета в Беркли. С 1976 CSRG выпускала свой код на магнитных лентах под названием __Berkely Software Distribution__, сокращённо __BSD__.
+
+Изначально дистрибутивы BSD представляли собой наборы пользовательских программ, и так было до тех пор, пока CSRG не заключила контракт с Агентством по Перспективным Проектам при Министерстве Обороны США (DARPA). Целью контракта было обновление коммуникационных протоколов, на которых держалась компьютерная сеть агентства -- ARPANET. Новое семейство протоколов получило имя _Internet Protocols_ или __TCP/IP__, по названиям двух основных протоколов. Их первая широко известная реализация была выпущена в составе 4.2BSD в 1982 году.
+
+В течение восьмидесятых годов образовалось несколько компаний по производству рабочих станций. Многие из них предпочли купить лицензию на UNIX(R), нежели разрабатывать своё ПО с нуля. Следует отметить компанию Sun, которая поступила именно таким образом и на основе 4.2BSD выпустила свою операционную систему SunOS(TM). Когда AT&T тоже решила заняться коммерческой продажей своей ОС UNIX(R), появилась на свет несколько аскетичная реализация под названием System III, за которой в скором времени последовала System V. Интересно, что эти версии не содержали в себе собственной поддержки работы в сети и использовали код BSD, в том числе реализацию TCP/IP и набор утилит, среди которых следует выделить оболочку _csh_ и текстовый редактор __vi__. Все эти "добавки" совместно получили название __Berkely Extensions__.
+
+Дистрибутив BSD содержал код, принадлежавший AT&T, и, следовательно, требовал лицензии. К 1990 году финансирование CSRG прекратилось, и группа была распущена. Кое-кто из бывших членов группы решил опубликовать код BSD отдельно от закрытого кода AT&T. В концe концов это удалось, и так появилась на свет версия _Networking Tape 2_ или __Net/2__. Net/2 не была законченной, цельной операционной системой: около 20% кода ядра отсутствовало. Один из членов CSRG, William F. Jolitz, дописал недостающий код и опубликовал результат в начале 1992 года под именем __386BSD__. В то же самое время другая группа бывших членов CSRG организовала коммерческую компанию http://www.bsdi.com/[Berkeley Software Design Inc.] и выпустила бета-версию операционной системы http://www.bsdi.com/[BSD/386], которая базировалась на том же самом коде. Позже это название было изменено на BSD/OS.
+
+386BSD так никогда и не стала полноценной операционной системой. Зато в 1993 году из неё выделились два проекта: http://www.NetBSD.org/[NetBSD] и link:https://www.FreeBSD.org/[FreeBSD]. Изначально разработчики разделились на два лагеря из-за расхождений во мнениях относительно того, сколько же ещё можно ждать улучшений в 386BSD. В начале года образовалась NetBSD, а первая версия FreeBSD была готова только к его концу. Время шло, и технические различия возрастали. Вдобавок проекты поставили перед собой разные цели, как будет показано ниже. В 1996 году от NetBSD отделился ещё один проект - http://www.OpenBSD.org/[OpenBSD], а в 2003 году от FreeBSD отделилась http://www.dragonflybsd.org/[DragonFlyBSD].
+
+[[why-is-bsd-not-better-known]]
+== Почему BSD недостаточно известна?
+
+Действительно, существует ряд причин этому недоразумению:
+
+. Разработчики BSD часто больше заинтересованы в качестве своего кода и заняты его "шлифовкой", а не рекламой.
+. По большому счёту Linux своей популярностью обязан прежде всего внешним по отношению к проекту факторам, например средствам массовой информации и компаниям, которые решили сделать бизнес на предоставлении услуг пользователям Linux.
+. Разработчики BSD, как правило, более опытны, чем разработчики Linux, и в силу этого часто уделяют меньше внимания облегчению жизни простым пользователям. Новичок чувствует себя более комфортно в среде Linux.
+. В 1992 году компания AT&T подала в суд на http://www.bsdi.com/[BSDI], компанию-поставщика ОС BSD/386. Основным пунктом обвинения было то, что BSD/386 содержала в себе закрытый код, принадлежавший AT&T. Дело вроде бы уладили за пределами суда в 1994-ом, но целая серия вторичных тяжб и по сей день отравляет жизнь многим людям. Совсем недавно, в марте 2000, в Internet была опубликована статья, утверждавшая, что судебное разбирательство окончательно завершено ("recently settled").
++
+В результате разбирательства прояснился вопрос с названиями: если в 80-х годах BSD была известна под именем "BSD UNIX(R)", то с исключением последних следов кода, принадлежавшего AT&T, BSD потеряла право называться UNIX(R). Вы можете заметить этот факт по изменившимся заглавиям книг: "операционная система 4.3BSD UNIX(R)" и "операционная система 4.4BSD".
+. Существует мнение, что проекты BSD сильно отличаются и, в добавок, "воюют" между собой. http://interactive.wsj.com/bin/login?Tag=/&URI=/archive/retrieve.cgi%253Fid%253DSB952470579348918651.djm&[Статья в Wall Street Journal] называет это "балканизацией" среди проектов BSD. Можно утверждать, что такое мнение, как и описанная судебная тяжба, основывается прежде всего на событиях давно минувших дней.
+
+[[compairing-bsd-and-linux]]
+== Сравнение BSD и Linux
+
+В чём заключается главная разница, к примеру, между Debian Linux и FreeBSD? Для среднего пользователя она на удивление мала: оба продукта представляют собой UNIX(R)-подобные операционные системы. Оба продукта разрабатываются на некоммерческой основе (это не относится к некоторым другим дистрибутивам Linux). В этом разделе мы рассмотрим BSD в сравнении с Linux. Всё сказанное в основном будет касаться FreeBSD, которой принадлежит около 80% всех инсталляций BSD в мире, хотя отличия от NetBSD, OpenBSD и DragonFlyBSD в рамках предмета данной статьи незначительны.
+
+=== Кому принадлежит BSD?
+
+Нельзя сказать, что какой-то конкретный человек или корпорация владеет BSD. Разработка и распространение ведутся группой высококвалифицированных и преданных проекту специалистов со всего мира. Некоторые компоненты BSD представляют собой отдельные проекты с открытым кодом со своими законами и коллективами разработчиков.
+
+=== Как выглядит процесс разработки и обновления BSD?
+
+Ядра BSD используют Open Source модель разработки. Каждый проект поддерживает публично доступное _дерево исходников_ с помощью http://www.cvshome.org/[Concurrent Versions System] (CVS). Это дерево содержит абсолютно весь исходный код проекта, а также документацию и вспомогательные файлы. CVS позволяет пользователям получить копию дерева любой версии системы.
+
+Огромное число людей со всего мира участвуют в совершенствовании BSD. Все они разделены на три группы:
+
+* _Контрибуторы_ пишут код или документацию. Они не могут добавлять или изменять код непосредственно в дереве исходников проекта. Это привилегия особым образом зарегистрированных разработчиков, или __коммиттеров (committers)__, которые просматривают и тестируют присылаемый им код и включают его в дерево.
+* _Коммиттеры_ являются разработчиками, которые имеют доступ на запись в дерево исходных кодов проекта. Чтобы стать коммиттером, человек должен проявить себя в той области, в которой он хочет работать.
++
+Каждый коммиттер по своему собственному усмотрению решает, нужно ли ему подтверждение правильности планируемых изменений от других разработчиков или нет. В общем случае опытный коммиттер может вносить очевидно выгодные изменения ни с кем не советуясь. К примеру, коммиттер проекта документации может исправлять опечатки или грамматические ошибки в документах без предварительного согласования. Напротив, далеко идущие или просто сложные изменения настоятельно рекомендуется представлять к обсуждению перед окончательным внесением в дерево. Бывают крайние случаи, когда член Core Team, выполняющий функцию архитектора проекта, может санкционировать немедленную отмену или _откат_ каких-то изменений в дереве. Все коммиттеры обязательно получают уведомление о каждом изменении в дереве по электронной почте, так что их невозможно сохранить в тайне.
+* _Правление_ (Core Team). В проектах FreeBSD и NetBSD имеются управляющие советы, которые занимаются координационной деятельностью. Их роль, права и обязанности не всегда чётко определены. Необязательно (хотя в порядке вещей) быть коммиттером для того, чтобы входить в состав Core Team. Правила, которым следует Core Team, различаются между проектами, но в общем случае члены Core Team определяют общее направление развития системы в большей степени, чем все остальные разработчики.
+
+Такое положение вещей отличается от принятого в Linux:
+
+. Не существует человека, который бы контролировал содержимое системы. На практике значение этого отличия оказывается переоценённым, так как Ведущий Архитектор может всегда потребовать откат изменений. Ко всему прочему, в проекте Linux на современном этапе изменения в код вносятся тоже не одним, а несколькими людьми.
+. С другой стороны, _существует_ центральное хранилище (repository), откуда можно получить полный код всей системы, причём как современных, так и предыдущих версий.
+. Проекты BSD являются цельными "Операционными Системами", а не просто ядрами. Это различие тоже иногда переоценивают: ни BSD, ни Linux не представляют ценности без приложений, а они порой одни и те же в обеих средах.
+. В результате формализованной процедуры поддержки единого дерева исходников в CVS процесс разработки BSD является полностью открытым, и мы получаем возможность доступа к любой версии системы по номеру или по дате. CVS также очень хорошо подходит для последовательных изменений в коде: к примеру, хранилище кода FreeBSD обновляется около ста раз за день, и большинство этих изменений весьма малы и незначительны в отдельности друг от друга.
+
+=== Версии BSD
+
+FreeBSD, NetBSD и OpenBSD предоставляет миру три различных варианта системы. Как и в Linux, версиям присваиваются номера, например 1.4.1 или 3.5. В добавок, номер версии имеет суффикс -- обозначение варианта, которое указывает на цели той или иной версии.
+
+. Версия для разработчиков носит название _CURRENT_. FreeBSD присваивает ей и номер, например FreeBSD 5.0-CURRENT. NetBSD использует чуть-чуть другую схему наименований и добавляет к номеру однобуквенный суффикс, обозначающий изменения во внутренних интерфейсах. Пример: NetBSD 1.4.3G. OpenBSD не нумерует разрабатываемую версию ("OpenBSD-current"). Все новые разработки производятся именно на этой "ветке" (branch) системы.
+. Через определённые интервалы от 3 до 6 месяцев проект выпускает версию _RELEASE_, которая распространяется на CD-ROM и доступна для скачивания с серверов FTP. Примерами таких версий могут служить OpenBSD 2.6-RELEASE и NetBSD 1.4-RELEASE. Этот вариант предназначен для конечных пользователей. NetBSD также предоставляет так называемые __исправленные релизы (patch releases)__, обозначаемые третьей цифрой в номере, например NetBSD 1.4.2.
+. По мере обнаружения ошибок в версии RELEASE необходимые исправления вносятся в дерево CVS. Получающаяся система в проекте FreeBSD носит название _STABLE_, а в NetBSD и OpenBSD продолжает называться RELEASE. Некоторые мелкие улучшения тоже иногда вносятся в эту версию после продолжительного периода тестирования в CURRENT.
+
+_Linux, напротив, поддерживает два различных дерева исходников, которые называются соответственно стабильной версией и версией для разработчиков. Стабильные версии имеют чётный вторичный номер, например 2.0, 2.2 или 2.4. Версии для разработчиков используют нечётные номера, такие как 2.1, 2.3 или 2.5. Во обоих случаях, к двойному номеру версии добавляется ещё одно число, указывающее на конкретный релиз. Стоит также отметить, что каждый поставщик предоставляет свой собственный вариант пользовательских программ (userland), так что имя дистрибутива тоже имеет значение. Естественно, что поставщики нумеруют свои изделия каждый по-своему, и, таким образом, мы получаем что-то вроде "TurboLinux 6.0 с ядром 2.2.14"._
+
+=== Какие существуют варианты BSD?
+
+В отличие от многочисленных дистрибутивов Linux, в мире существует лишь четыре крупных BSD проекта с открытыми исходными кодами. Каждый из них поддерживает своё собственное дерево исходников и своё собственное ядро. На практике однако оказывается, что пользовательские части (userland) различных BSD отличаются гораздо меньше, чем у разных дистрибутивов Linux.
+
+Цели каждого из проектов не поддаются чёткой формулировке. Различия между ними весьма субъективны. В основном,
+
+* проект FreeBSD нацелен на повышение производительности и простоту в использовании конечными пользователями. FreeBSD очень ценят в среде web-хостеров. Эта ОС работает на link:https://www.FreeBSD.org/platforms/[нескольких аппаратных платформах], число пользователей FreeBSD значительно превышает число пользователей других проектов.
+* проект NetBSD ставит целью максимальную мобильность (или переносимость) кода: девиз "конечно NetBSD работает на этом". NetBSD поддерживает машины от крошечных палмтопов до огромных серверов и использовалась NASA в космических миссиях. Это хороший выбор для старой не-Intel(R) аппаратуры.
+* проект OpenBSD нацелен на безопасность и "чистоту" кода. С помощью комбинирования концепций открытых исходников и скрупулёзного анализа кода проект демонстрирует чудеса корректности работы системы. В силу названных причин совершенно естественно, что OpenBSD выбирают организации, для которых очень важна защита информации, например банки, фондовые биржи и различные департаменты правительства США. Также как и NetBSD, проект поддерживает целый ряд аппаратных платформ.
+* Целью DragonFlyBSD является достижение высокой производительности и масштабируемости в любой ситуации-как для одиночных однопроцессорных, так и крупных кластерных систем. DragonFlyBSD ставит перед собой несколько долгосрочных технических задач, но основной упор делается на создание инфраструктуры для работы с SMP, которая была бы проста для понимания, поддержки и ведения в ней разработок.
+
+Следует упомянуть ещё две операционных системы BSD UNIX(R), которые не предоставляют публичного доступа к своим исходным кодам. Это BSD/OS компании BSDI и Mac OS(R) X компании Apple.
+
+* BSD/OS являлась самым старым из потомков 4.4BSD. Исходный код был недоступен широкой публике, хотя лицензия на него стоила относительно немного. BSD/OS во многом похожа на FreeBSD. Через два года после поглощения BSDi компанией Wind River Systems, BSD/OS перестала существовать как отдельный продукт. Поддержку и исходный код ещё можно получить у Wind River, но все новые разработки сосредоточены на встраиваемой операционной системой VxWorks.
+* http://www.apple.com/macosx/server/[Mac OS(R) X] - это самая последняя версия операционной системы для линейки компьютеров Apple(R) Mac(R). Ядро этой операционной системы, http://developer.apple.com/darwin/[Darwin], построенное на коде BSD, доступно в виде полностью функциональной операционной системы с открытым кодом для компьютеров архитектур x86 и PPC. Однако код графической системы Aqua/Quartz и многих других проприетарных компонентов Mac OS(R) X остаётся закрытым. Несколько разработчиков Darwin являются также коммиттерами FreeBSD и наоборот.
+
+=== В чём отличие между лицензией BSD и Общественной Лицензией GNU (GPL)?
+
+Linux распространяется на условиях лицензии http://www.fsf.org/copyleft/gpl.html[GNU General Public License] (GPL), русский перевод которой тоже http://www.gnu.org/copyleft/copyleft.ru.html[существует]. Эта лицензия имеет целью уничтожить программное обеспечение с закрытым исходным кодом. В частности, любое ПО, базирующееся на продукте, выпущенном на условиях лицензии GPL, тоже должно поставляться с исходными кодами по первому требованию. http://www.opensource.org/licenses/bsd-license.html[Лицензия BSD] не накладывает таких жёстких ограничений: разрешается распространение программного обеспечения в двоичном виде (binary-only). Этот факт привлекает разработчиков встроенных (embedded) приложений.
+
+=== Что ещё следует знать?
+
+То обстоятельство, что приложений для BSD существует меньше, чем для Linux, вынудило разработчиков BSD позаботиться о создании дополнительной совместимости с Linux, которая позволяет запускать программы для Linux на компьютере, работающем под BSD. Программный пакет, обеспечивающий совместимость, включает в себя как ядерную реализацию системных вызовов Linux, так и разнообразные файлы, необходимые программам, скомпилированным для Linux, например библиотеку C. Разница в скорости выполнения Linux-приложений на машине с Linux и на такой же машине с BSD незаметна.
+
+Принцип "вся система от одного поставщика", используемый в BSD, приводит к упрощению процедур обновления системы по сравнению с многими дистрибутивами Linux. BSD предоставляет специальные модули совместимости с устаревшими версиями системных библиотек, и таким образом делает возможным запуск откомпилированных несколько лет назад программ на обновлённой системе.
+
+=== Что же выбрать, BSD или Linux?
+
+Во что выливается всё вышесказанное на практике? Кому предназначена BSD, и кому -- Linux?
+
+Это действительно очень сложный вопрос. Приведём несколько советов, которые призваны помочь Вам с выбором:
+
+* "Не тронь, пока работает": если Вы уже успешно используете какую-нибудь Open Source ОС, и она Вас устраивает, то пожалуй не стоит ничего менять.
+* Системы BSD, в особенности FreeBSD, могут демонстрировать большую по сравнению с Linux производительность. Но это вовсе не универсальное правило. Во многих случаях эта разница не заметна, если вообще есть. Иногда Linux может работать лучше, чем FreeBSD.
+* В общем случае, у систем BSD очень хорошая репутация, когда дело касается надёжности. Это, в основном, связано с более "зрелой" базой исходных кодов.
+* BSD проекты имеют более лучшую репутацию за качество и полноту документации. Различные проекты документирования ставят своей целью предоставлять активно изменяющуюся документацию, в том числе и на нескольких языках и покрывающую все аспекты системы.
+* Лицензия BSD иногда может быть более привлекательной, нежели GPL.
+* В BSD может работать большинство исполнимых файлов Linux, однако в Linux выполнимые файлы BSD запускаться не будут. Во многих реализациях BSD могут также выполняться двоичные файл и других UNIX(R)-подобных систем. Таким образом, BSD может предложить более простой способ перехода с других систем, чем Linux.
+
+=== Кто предоставляет техническую поддержку, обслуживание и обучение для систем BSD?
+
+BSDi / http://www.freebsdmall.com[FreeBSD Mall, Inc.] уже около десяти лет предлагает контракты на поддержку FreeBSD.
+
+Кроме того, каждый из проектов постоянно обновляет список консультантов, которые оказывают поддержку за отдельную плату: link:https://www.FreeBSD.org/commercial/consult_bycat/[FreeBSD], http://www.NetBSD.org/gallery/consultants.html[NetBSD] и http://www.OpenBSD.org/support.html[OpenBSD].
diff --git a/documentation/content/ru/articles/fonts/_index.adoc b/documentation/content/ru/articles/fonts/_index.adoc
new file mode 100644
index 0000000000..487fa9910d
--- /dev/null
+++ b/documentation/content/ru/articles/fonts/_index.adoc
@@ -0,0 +1,528 @@
+---
+title: Шрифты и FreeBSD
+subtitle: Пособие
+authors:
+ - author: Dave Bodenstab
+ email: imdave@synet.net
+releaseinfo: "$FreeBSD$"
+trademarks: ["freebsd", "adobe", "apple", "linux", "microsoft", "opengroup", "general"]
+---
+
+= Шрифты и FreeBSD
+:doctype: article
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:toc-title: Содержание
+:part-signifier: Часть
+:chapter-signifier: Глава
+:appendix-caption: Приложение
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+
+[.abstract-title]
+Аннотация
+
+Этот документ содержит описание различных файлов шрифтов, которые могут использоваться с FreeBSD и драйвером системной консоли, системой X11, программами Ghostscript и Groff. Даются реально работающие примеры по переключению экрана системной консоли в режим 80x60 и использованию файлов шрифтов формата Type 1 с перечисленными выше прикладными программами.
+
+'''
+
+toc::[]
+
+[[intro]]
+== Введение
+
+Существует много мест, где можно найти файлы шрифтов, но встает вопрос о возможных способах их использования с FreeBSD. Ответ может быть найден в результате тщательного изучения документации по тем компонентам, которые вы собираетесь использовать. На это тратится очень много времени, и это пособие является попыткой дать готовые ответы для тех, кто заинтересуется такими вопросами.
+
+[[terminology]]
+== Основные термины
+
+Имеется множество различных форматов файлов шрифтов и соответствующих окончаний имен файлов. Здесь обсуждаются лишь следующие из них:
+
+[.filename]#.pfa#, [.filename]#.pfb#::
+Файлы шрифтов PostScript(R) type 1. Файлы [.filename]#.pfa# являются текстовым ( __A__scii) представлением, а [.filename]#.pfb# - двоичным (__B__inary).
+
+[.filename]#.afm#::
+Параметры (метрики) соответствующих шрифтов типа type 1.
+
+[.filename]#.pfm#::
+Метрики для принтеров соответствующих шрифтов типа type 1.
+
+[.filename]#.ttf#::
+Файл шрифтов TrueType(R)
+
+[.filename]#.fot#::
+Неявная ссылка на файл шрифтов TrueType (реальной информации о шрифте здесь не содержится)
+
+[.filename]#.fon#, [.filename]#.fnt#::
+Файлы экранных шрифтов с побитным представлением
+
+Файлы [.filename]#.fot# используются в Windows(R) в качестве некой символической ссылки на файл со шрифтом в формате TrueType(R) ([.filename]#.ttf#). Файлы шрифтов [.filename]#.fon# также используются в Windows(R). Мне неизвестно, как можно использовать этот формат шрифтов во FreeBSD.
+
+[[font-formats]]
+== Какие форматы файлов шрифтов я могу использовать?
+
+То, файл шрифтов какого формата будет полезен, зависит от используемого приложения. Сама по себе FreeBSD шрифтов не использует. Прикладные программы и/или драйверы могут использовать файлы шрифтов. Вот краткий справочник по типам файлов шрифтов и приложениям/драйверам:
+
+Драйвер::
+
+vt:::
+[.filename]#.hex#
+
+syscons:::
+[.filename]#.fnt#
+
+Приложение::
+
+Ghostscript:::
+[.filename]#.pfa#, [.filename]#.pfb#, [.filename]#.ttf#
+
+X11:::
+[.filename]#.pfa#, [.filename]#.pfb#
+
+Groff:::
+[.filename]#.pfa#, [.filename]#.afm#
+
+Povray:::
+[.filename]#.ttf#
+
+Окончание [.filename]#.fnt# используется достаточно часто. Я полагаю, что когда кто-нибудь собирается создать файл шрифтов для своего приложения, чаще всего выбирается именно это окончание. Поэтому файлы с таким окончанием не все имеют одинаковый формат; в частности, формат файлов [.filename]#.fnt#, используемых драйвером syscons во FreeBSD, может отличаться от формата файлов [.filename]#.fnt#, встречающихся в MS-DOS(R)/Windows(R). Я даже не пытался использовать другие файлы [.filename]#.fnt#, кроме тех, что поставляются с FreeBSD.
+
+[[virtual-console]]
+== Настройка виртуальной консоли на режим работы 80x60
+
+Во-первых, должен быть загружен шрифт размера 8x8. Для этого файл [.filename]#/etc/rc.conf# должен содержать строчку (измените в ней имя файла со шрифтом на соответствующий вашей локализации):
+
+[.programlisting]
+....
+font8x8="iso-8x8" # font 8x8 from /usr/shared/syscons/fonts/* (or NO).
+....
+
+Команда для переключения режимов называется man:vidcontrol[1]:
+
+[source,bash]
+....
+% vidcontrol VGA_80x60
+....
+
+Различные программы, ориентированные на работу с экраном, такие, как man:vi[1], должны уметь определять текущие размеры экрана. Так как это делается через вызовы `ioctl` к драйверу консоли (такому, как man:syscons[4]), то размеры будут определяться правильно.
+
+Чтобы это проходило более гладко, можно включить эти команды в скрипты начальной загрузки, чтобы они выполнялись при запуске системы. Чтобы это сделать, добавьте такую строчку в [.filename]#/etc/rc.conf#
+
+[.programlisting]
+....
+
+ allscreens_flags="VGA_80x60" # Set this vidcontrol mode for all virtual screens
+....
+
+Справочная информация: man:rc.conf[5], man:vidcontrol[1].
+
+[[type1-fonts-x11]]
+== Использование шрифтов type 1 с системой X11
+
+X11 может использовать файлы шрифтов в формате [.filename]#.pfa# или [.filename]#.pfb#. Шрифты для X11 располагаются в различных подкаталогах в [.filename]#/usr/X11R6/lib/X11/fonts#. На каждый файл со шрифтом имеется ссылка по его X11-имени в файле [.filename]#fonts.dir# в каждом таком каталоге.
+
+Существует каталог по имени [.filename]#Type1#. Самым простым способом добавить новый шрифт заключается в помещении его в этот каталог. Но лучше хранить все новые шрифты в отдельном каталоге и использовать символические ссылки для добавляемых шрифтов. Это позволяет легко управлять отдельными добавляемыми шрифтами, не путая их с изначально поставляемыми. Например:
+
+[source,bash]
+....
+
+Создаем каталог для файлов шрифтов
+% mkdir -p /usr/local/shared/fonts/type1
+% cd /usr/local/shared/fonts/type1
+
+Помещаем сюда файлы .pfa, .pfb и .afm
+
+Кому-то может потребоваться хранить здесь также
+
+сопроводительные файлы и документацию к шрифтам
+% cp /cdrom/fonts/atm/showboat/showboat.pfb .
+% cp /cdrom/fonts/atm/showboat/showboat.afm .
+
+Обновление индексного файла со ссылками на файлы шрифтов
+% echo showboat - InfoMagic CICA, Dec 1994, /fonts/atm/showboat >>INDEX
+....
+
+Теперь, чтобы использовать новый шрифт с X11, нужно дать доступ к файлу шрифтов и обновить файлы и именами шрифтов. Имена шрифтов в X11 выглядят следующим образом:
+
+[source,bash]
+....
+-bitstream-charter-medium-r-normal-xxx-0-0-0-0-p-0-iso8859-1
+ | | | | | | | | | | | | \ \
+ | | | | | \ \ \ \ \ \ \ +----+- набор символов
+ | | | | \ \ \ \ \ \ \ +- средняя ширина
+ | | | | \ \ \ \ \ \ +- spacing
+ | | | \ \ \ \ \ \ +- разрешение по вертикали
+ | | | \ \ \ \ \ +- разрешение по горизонтали
+ | | | \ \ \ \ +- пунктов
+ | | | \ \ \ +- пиксел
+ | | | \ \ \
+ foundry family weight slant width additional style
+....
+
+Для каждого нового файла шрифтов необходимо создать новое имя. Если у вас есть какая-либо информация из сопроводительной документации к шрифту, то она может служить основой для создания имени. Если информации нет, то можно получить некоторую информацию от использования программы man:strings[1] над файлом шрифта. Например:
+
+[source,bash]
+....
+% strings showboat.pfb | more
+%!FontType1-1.0: Showboat 001.001
+%%CreationDate: 1/15/91 5:16:03 PM
+%%VMusage: 1024 45747
+% Generated by Fontographer 3.1
+% Showboat
+ 1991 by David Rakowski. Alle Rechte Vorbehalten.
+FontDirectory/Showboat known{/Showboat findfont dup/UniqueID known{dup
+/UniqueID get 4962377 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+12 dict begin
+/FontInfo 9 dict dup begin
+ /version (001.001) readonly def
+ /FullName (Showboat) readonly def
+ /FamilyName (Showboat) readonly def
+ /Weight (Medium) readonly def
+ /ItalicAngle 0 def
+ /isFixedPitch false def
+ /UnderlinePosition -106 def
+ /UnderlineThickness 16 def
+ /Notice (Showboat
+ 1991 by David Rakowski. Alle Rechte Vorbehalten.) readonly def
+end readonly def
+/FontName /Showboat def
+--stdin--
+....
+
+Пользуясь этой информацией, можно составить возможное имя:
+
+[source,bash]
+....
+-type1-Showboat-medium-r-normal-decorative-0-0-0-0-p-0-iso8859-1
+....
+
+Компонентами нашего имени являются:
+
+Foundry::
+Давайте называть все новые шрифты `type1`.
+
+Family::
+Имя шрифта.
+
+Weight::
+Normal, bold, medium, semibold, и так далее. Из результата работы команды man:strings[1] похоже, что этот шрифт имеет ширину __medium__.
+
+Slant::
+__r__oman, __i__talic, __o__blique, и так далее. Так как _ItalicAngle_ равен нулю, то будет использоваться __roman__.
+
+Width::
+Normal, wide, condensed, extended, и так далее. Пока это не будет проверено, предполагаем __normal__.
+
+Дополнительный стиль::
+Обычно опускается, но он будет указывать, что в шрифте есть декоративные заглавные буквы.
+
+Spacing::
+proportional или monospaced. Используется __proportional__, потому что _isFixedPitch_ равен false.
+
+Все эти имена произвольны, но нужно стараться следовать существующим соглашениям. В программе для X11 на шрифт ссылаются по имени с применением шаблонов, так что в выбираемом имени это должно учитываться. Можно начать с простого использования
+
+[source,bash]
+....
+...-normal-r-normal-...-p-...
+....
+
+в качестве имени, а затем использовать man:xfontsel[1] для его проверки и изменения имени на основе того, как выглядит шрифт.
+
+Итак, завершая наш пример:
+
+[source,bash]
+....
+Делаем шрифт доступным для X11
+% cd /usr/X11R6/lib/X11/fonts/Type1
+% ln -s /usr/local/shared/fonts/type1/showboat.pfb .
+
+Редактируем файлы fonts.dir and fonts.scale, добавляя строку,
+описывающую шрифт и увеличивая количество шрифтов в первой строке.
+% ex fonts.dir
+:1p
+25
+:1c
+26
+.
+:$a
+showboat.pfb -type1-showboat-medium-r-normal-decorative-0-0-0-0-p-0-iso8859-1
+.
+:wq
+
+fonts.scale идентичен
+fonts.dir...
+% cp fonts.dir fonts.scale
+
+Указываем X11, что произошли изменения
+% xset fp rehash
+
+Проверяем новый шрифт
+% xfontsel -pattern -type1-*
+....
+
+Справочная информация: man:xfontsel[1], man:xset[1], The X Windows System in a Nutshell, http://www.ora.com/[O'Reilly & Associates].
+
+[[type1-fonts-ghostscript]]
+== Использование шрифтов type 1 с пакетом Ghostscript
+
+Ghostscript ссылается на шрифт через свой файл [.filename]#Fontmap#. Он должен быть подправлен так же, как и файл [.filename]#fonts.dir# в случае X11. Ghostscript может использовать файлы шрифтов в форматах [.filename]#.pfa# или [.filename]#.pfb#. Взяв шрифт из предыдущего примера, его можно использовать с Ghostscript вот так:
+
+[source,bash]
+....
+Помещаем файл со шрифтом в каталог со шрифтами Ghostscript
+% cd /usr/local/shared/ghostscript/fonts
+% ln -s /usr/local/shared/fonts/type1/showboat.pfb .
+
+Редактируем Fontmap, чтобы Ghostscript знал о шрифте
+% cd /usr/local/shared/ghostscript/4.01
+% ex Fontmap
+:$a
+/Showboat (showboat.pfb) ; % From CICA /fonts/atm/showboat
+.
+:wq
+
+Используем Ghostscript для проверки шрифта
+% gs prfont.ps
+Aladdin Ghostscript 4.01 (1996-7-10)
+Copyright (C) 1996 Aladdin Enterprises, Menlo Park, CA. All rights
+reserved.
+This software comes with NO WARRANTY: see the file PUBLIC for details.
+Loading Times-Roman font from /usr/local/shared/ghostscript/fonts/tir_____.pfb...
+ /1899520 581354 1300084 13826 0 done.
+GS>Showboat DoFont
+Loading Showboat font from /usr/local/shared/ghostscript/fonts/showboat.pfb...
+ 1939688 565415 1300084 16901 0 done.
+>>showpage, press <return> to continue<<
+>>showpage, press <return> to continue<<
+>>showpage, press <return> to continue<<
+GS>quit
+....
+
+Справочная информация: [.filename]#fonts.txt# из дистрибутива Ghostscript 4.01
+
+[[type1-fonts-groff]]
+== Использование шрифтов в формате type 1 с программой Groff
+
+Теперь, когда новый шрифт может быть использован как с X11, так и в Ghostscript, как использовать его с программой Groff? Во-первых, так как мы имеем дело со PostScript(R)-шрифтами формата type 1, то подходящим устройством Groff является __ps__. Для каждого шрифта, который может использоваться программой Groff, должен быть создан файл шрифта. Имя шрифта для Groff является просто именем файла из каталога [.filename]#/usr/shared/groff_font/devps#. В нашем примере файлом шрифта может быть [.filename]#/usr/shared/groff_font/devps/SHOWBOAT#. Файл должен быть создан с помощью утилит, поставляемых с программой Groff.
+
+Первой утилитой является `afmtodit`. Обычно она не устанавливается, так что она должна быть получена из дистрибутива с исходными текстами. Я обнаружил, что нужно изменить первую строку файла, что я делал так:
+
+[source,bash]
+....
+% cp /usr/src/gnu/usr.bin/groff/afmtodit/afmtodit.pl /tmp
+% ex /tmp/afmtodit.pl
+:1c
+#!/usr/bin/perl -P-
+.
+:wq
+....
+
+Эта утилита создаст файл шрифтов для Groff из файла метрик (с окончанием [.filename]#.afm#). Продолжая с нашим примером:
+
+[source,bash]
+....
+Многие файлы .afm в формате Mac
+... строки разделены символом ^M. Нам нужно преобразовать их в
+разделитель ^J в стиле UNIX(R)
+% cd /tmp
+% cat /usr/local/shared/fonts/type1/showboat.afm |
+ tr '\015' '\012' >showboat.afm
+
+Теперь создаем файл шрифтов groff
+% cd /usr/shared/groff_font/devps
+% /tmp/afmtodit.pl -d DESC -e text.enc /tmp/showboat.afm generate/textmap SHOWBOAT
+....
+
+Теперь к шрифту можно обращаться по имени SHOWBOAT.
+
+Если в системе для управления принтерами используется программа Ghostscript, то больше ничего делать не нужно. Однако, если используются настоящие PostScript(R)-принтеры, то для использования шрифта его нужно загрузить в принтер (если только в принтере шрифт showboat не встроен или не имеется на диске со шрифтами). Последний шаг заключается в создании загружаемого шрифта. Утилита `pfbtops` используется для создания шрифта в формате [.filename]#.pfa#, а файл для [.filename]#загрузки# изменяется для указания нового шрифта. Файл для [.filename]#загрузки# должен ссылаться на внутреннее имя шрифта. Оно может быть легко определено из файла шрифтов groff, как это показывается здесь:
+
+[source,bash]
+....
+Создание файла шрифта .pfa
+% pfbtops /usr/local/shared/fonts/type1/showboat.pfb >showboat.pfa
+....
+
+Конечно, если файл [.filename]#.pfa# уже имеется, для его использования создаем символическую ссылку на него.
+
+[source,bash]
+....
+Получение внутреннего имени шрифта
+% fgrep internalname SHOWBOAT
+internalname Showboat
+Указываем утилите groff, что шрифт должен быть загружен
+% ex download
+:$a
+Showboat showboat.pfa
+.
+:wq
+....
+
+Для тестирования шрифта:
+
+[source,bash]
+....
+% cd /tmp
+% cat >example.t <<EOF
+.sp 5
+.ps 16
+This is an example of the Showboat font:
+.br
+.ps 48
+.vs (\n(.s+2)p
+.sp
+.ft SHOWBOAT
+ABCDEFGHI
+.br
+JKLMNOPQR
+.br
+STUVWXYZ
+.sp
+.ps 16
+.vs (\n(.s+2)p
+.fp 5 SHOWBOAT
+.ft R
+To use it for the first letter of a paragraph, it will look like:
+.sp 50p
+\s(48\f5H\s0\fRere is the first sentence of a paragraph that uses the
+showboat font as its first letter.
+Additional vertical space must be used to allow room for the larger
+letter.
+EOF
+% groff -Tps example.t >example.ps
+
+Для использования с ghostscript/ghostview
+% ghostview example.ps
+
+Для его печати
+% lpr -Ppostscript example.ps
+....
+
+Справочная информация: [.filename]#/usr/src/gnu/usr.bin/groff/afmtodit/afmtodit.man#, man:groff_font[5], man:groff_char[7], man:pfbtops[1].
+
+[[convert-truetype]]
+== Преобразование файлов шрифтов TrueType в формат groff/PostScript для использования с groff
+
+Потенциально это требует некоторых усилий, просто потому что зависит некоторых утилит, которые в качестве части системы не устанавливаются. Это:
+
+`ttf2pf`::
+Утилита для преобразования TrueType в PostScript. Она позволяет преобразовать шрифт TrueType в метрику шрифта в текстовом формате (файл [.filename]#.afm#).
++
+Доступна по адресу http://sunsite.icm.edu.pl/pub/GUST/contrib/BachoTeX98/ttf2pf/[http://sunsite.icm.edu.pl/pub/GUST/contrib/BachoTeX98/ttf2pf/]. Замечание: Эти файлы являются PostScript-программами и должны быть скачаны на диск щелчком на ссылке при нажатой клавише kbd:[Shift]. В противном случае для их просмотра ваш браузер может попытаться запустить программу ghostview.
++
+Интерес представляют следующие файлы:
+
+** [.filename]#GS_TTF.PS#
+** [.filename]#PF2AFM.PS#
+** [.filename]#ttf2pf.ps#
++
+Смесь верхнего/нижнего регистров присутствует из-за того, что эти файлы предназначены и для DOS. [.filename]#ttf2pf.ps# использует остальные с именами в верхнем регистре, так что при переименовании это нужно учитывать. (На самом деле [.filename]#GS_TTF.PS# и [.filename]#PFS2AFM.PS# предположительно являются частью дистрибутива Ghostscript, но их легко использовать как отдельные утилиты. В поставку FreeBSD они не включены.) Вы можете также установить их в каталог [.filename]#/usr/local/shared/groff_font/devps#(?).
+
+`afmtodit`::
+Создает файлы шрифтов для использования с программой Groff из текстовых файлов с метриками шрифта. Она обычно располагается в каталоге [.filename]#/usr/src/contrib/groff/afmtodit# и для ее использования требуется проделать некоторую работу.
++
+[NOTE]
+====
+Если вы избегаете работать в дереве [.filename]#/usr/src#, просто скопируйте содержимое вышеупомянутого каталога во временный рабочий каталог.
+====
++
+Во рабочем каталоге вам нужно построить утилиту. Просто введите такую команду:
++
+[source,bash]
+....
+# make -f Makefile.sub afmtodit
+....
++
+Вам может также потребоваться скопировать [.filename]#/usr/contrib/groff/devps/generate/textmap# в [.filename]#/usr/shared/groff_font/devps/generate#, если его не существует.
+
+Как только эти утилиты готовы, вы можете начать:
+
+. Создайте файл [.filename]#.afm# по такой команде:
++
+[source,bash]
+....
+% gs -dNODISPLAY -q -- ttf2pf.ps TTF_name PS_font_name AFM_name
+....
++
+Здесь _TTF_name_ обозначает ваш файл со шрифтом TrueType, _PS_font_name_ является именем для файла [.filename]#.pfa#, _AFM_name_ задает имя для файла [.filename]#.afm#. Если вы не укажете имена выходных файлов, для форматов [.filename]#.pfa# или [.filename]#.afm#, то по умолчанию будут использоваться имена, получаемые из имени файла со шрифтом TrueType.
++
+При этом также будет создан файл [.filename]#.pfa#, текстовый файл с метриками PostScript-шрифта (([.filename]#.pfb# для двоичного представления). Это не не обязательно, но может быть (я думаю) полезным для сервера шрифтов.
++
+Например, для преобразования шрифта 30f9 Barcode с именами файлов по умолчанию, воспользуйтесь следующей командой:
++
+[source,bash]
+....
+% gs -dNODISPLAY -- ttf2pf.ps 3of9.ttf
+Aladdin Ghostscript 5.10 (1997-11-23)
+Copyright (C) 1997 Aladdin Enterprises, Menlo Park, CA. All rights reserved.
+This software comes with NO WARRANTY: see the file PUBLIC for details.
+Converting 3of9.ttf to 3of9.pfa and 3of9.afm.
+....
++
+Если вы хотите, чтобы преобразованные шрифты сохранялись в файлы [.filename]#A.pfa# and [.filename]#B.afm#, то выдайте такую команду:
++
+[source,bash]
+....
+% gs -dNODISPLAY -- ttf2pf.ps 3of9.ttf A B
+Aladdin Ghostscript 5.10 (1997-11-23)
+Copyright (C) 1997 Aladdin Enterprises, Menlo Park, CA. All rights reserved.
+This software comes with NO WARRANTY: see the file PUBLIC for details.
+Converting 3of9.ttf to A.pfa and B.afm.
+....
+
+. Создайте PostScript-файл для Groff:
++
+Смените текущий каталог на [.filename]#/usr/shared/groff_font/devps# для облегчения запуска упоминаемых далее программ. Для этого вам может понадобиться иметь привилегии администратора системы. (Или, если вы избегаете здесь работать, обязательно посмотрите файлы [.filename]#DESC#, [.filename]#text.enc# и [.filename]#generate/textmap# в этом каталоге.)
++
+[source,bash]
+....
+% afmtodit -d DESC -e text.enc file.afm \
+ generate/textmap PS_font_name
+....
++
+Здесь [.filename]#file.afm# является файлом _AFM_name_, созданным программой `ttf2pf.ps` выше, а _PS_font_name_ является именем шрифта, используемым в той команде, так же, как и имя, которое будет использовать утилита man:groff[1] для ссылки на этот шрифт. Например, полагая, что вы использовали первую команду `tiff2pf.ps` выше, то шрифт 3of9 Barcode может быть создан при помощи такой команды:
++
+[source,bash]
+....
+% afmtodit -d DESC -e text.enc 3of9.afm \
+ generate/textmap 3of9
+....
++
+Проверьте, что полученный файл _PS_font_name_ (к примеру, [.filename]#3of9# из примера выше) расположен в каталоге [.filename]#/usr/shared/groff_font/devps#, скопировав или перенеся его сюда.
++
+Заметьте, что если [.filename]#ttf2pf.ps# назначает имя шрифта, используя один из найденных в файле шрифта TrueType, а вы хотите использовать другое имя, то вы должны отредактировать файл [.filename]#.afm# до запуска команды `afmtodit`. Это имя к тому же должно совпадать с тем, что используется в файле Fontmap, если вы собираетесь перенаправлять вывод man:groff[1] утилите man:gs[1].
+
+[[truetype-for-other-programs]]
+== Можно ли использовать шрифты в формате TrueType с другими программами?
+
+Формат TrueType используется в Windows, Windows 95 и на компьютерах Macintosh. Он достаточно популярен и в этом формате имеется большое количество шрифтов.
+
+К сожалению, я знаю лишь несколько программ, которые могут использовать этот формат: на ум приходят Ghostscript и Povray. Его поддержка в программе Ghostscript, согласно документации, находится в зачаточном состоянии и получаемый результат хуже того, что получается при использовании шрифтов type 1. Программа Povray версии 3 также может использовать шрифты TrueType, но я очень сомневаюсь, что много кто создает документы как последовательность анимированных страниц :-).
+
+Такая весьма печальная ситуация может вскоре измениться. В рамках проекта http://www.freetype.org/[FreeType Project] в настоящее время разрабатывается полезный набор инструментов для работы с FreeType:
+
+* Сервер шрифтов `xfsft` для X11 может работать и со шрифтами TrueType, и с обычными шрифтами. Хотя в настоящее время он еще находится в стадии отладки, но его уже можно использовать. Посмотрите http://www.dcs.ed.ac.uk/home/jec/programs/xfsft/[страницу Juliusz Chroboczek], чтобы получить более полную информацию. Указания по переносу на FreeBSD можно найти на странице http://math.missouri.edu/~stephen/software/[Стивена Монтгомери] (Stephen Montgomery), посвященной программному обеспечению.
+* xfstt является еще одним сервером шрифтов для X11, доступный по адресу link:ftp://sunsite.unc.edu/pub/Linux/X11/fonts[ftp://sunsite.unc.edu/pub/Linux/X11/fonts].
+* Программа, которая называется `ttf2bdf`, может генерировать BDF-файлы, которые можно использовать в системе X Window, из файлов шрифтов TrueType. Выполнимые файлы Linux могут находиться по адресу link:ftp://crl.nmsu.edu/CLR/multiling/General[ftp://crl.nmsu.edu/CLR/multiling/General].
+* и другие ...
+
+[[obtaining-additional-fonts]]
+== Где можно найти дополнительные шрифты?
+
+Много шрифтов можно найти в сети Интернет. Они либо абсолютно бесплатны, либо условно-бесплатны. В добавок, множество шрифтов находится в категории [.filename]#x11-fonts/# Коллекции Портов.
+
+[[additional-questions]]
+== Дополнительные вопросы
+
+* Для чего предназначены файлы [.filename]#.pfm#?
+* Можно ли получить файл [.filename]#.afm# из файла [.filename]#.pfa# или [.filename]#.pfb#?
+* Как получить файлы преобразования символов Groff для PostScript-шрифтов с нестандартными названиями символов?
+* Можно ли настроить xditview и устройства devX?? на работу всех новых шрифтов?
+* Хорошо бы иметь примеры использования шрифтов TrueType с программами Povray и Ghostscript.
diff --git a/documentation/content/ru/articles/freebsd-questions/_index.adoc b/documentation/content/ru/articles/freebsd-questions/_index.adoc
new file mode 100644
index 0000000000..aeaa8107e0
--- /dev/null
+++ b/documentation/content/ru/articles/freebsd-questions/_index.adoc
@@ -0,0 +1,241 @@
+---
+title: Как работать со списком рассылки FreeBSD-questions c максимальной отдачей
+authors:
+ - author: Greg Lehey
+ email: grog@FreeBSD.org
+releaseinfo: "$FreeBSD$"
+trademarks: ["freebsd", "microsoft", "opengroup", "qualcomm", "general"]
+---
+
+= Как работать со списком рассылки FreeBSD-questions c максимальной отдачей
+:doctype: article
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:toc-title: Содержание
+:part-signifier: Часть
+:chapter-signifier: Глава
+:appendix-caption: Приложение
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+
+include::shared/ru/mailing-lists.adoc[lines=9..-1]
+include::shared/ru/urls.adoc[]
+
+[.abstract-title]
+Аннотация
+
+В этом документе содержится информация, которая будет полезна тем, кто собирается отправить письмо в список рассылки FreeBSD-questions. Даются советы и рекомендации, которые максимально увеличат шанс на получение полезных ответов.
+
+Этот документ регулярно публикуется в списке рассылки FreeBSD-questions.
+
+'''
+
+toc::[]
+
+== Введение
+
+`FreeBSD-questions` является списком рассылки, который поддерживается проектом FreeBSD для оказания помощи тем, у кого возникли вопросы по поводу использования FreeBSD в повседневной работе. В другом списке рассылки, `FreeBSD-hackers`, обсуждаются более сложные вопросы, такие, как направление будущей работы над системой.
+
+[NOTE]
+====
+Термин "хакер" не имеет ничего общего с проникновением на компьютеры других людей. Правильным термином для обозначения такой деятельности является "кракер", однако популярная пресса этого еще не поняла. Хакеры FreeBSD нарушением защиты не занимаются. Более полное описание хакеров находится в руководстве Эрика Рэймонда (Eric Raymond) http://www.catb.org/~esr/faqs/hacker-howto.html[Как стать хакером]
+====
+
+Данный регулярно рассылаемый документ предназначен для помощи как тем, кто ищет ответов на вопросы во FreeBSD-questions ("новички"), так и тем, кто на эти вопросы отвечает ("хакеры").
+
+Несомненно, здесь существуют некоторые трения, которые проистекают из-за разных точек зрения этих двух групп. Новички обвиняют хакеров в высокомерии, заносчивости и несостоятельности в оказании помощи, когда как хакеры обвиняют начинающих в том, что последние глупы, не умеют читать по-английски и ждут, что им все будет преподнесено на блюдечке с голубой каемочкой. Конечно, есть элемент правды в обоих этих утверждениях, однако по большей части такие мнения появляются из-за чувства разочарования.
+
+В этом документе я постараюсь уменьшить это разочарование и помочь всем получить более хорошие результаты от FreeBSD-questions. В следующем разделе я дам рекомендации по посылке вопросов; после этого мы посмотрим, как нужно на них отвечать.
+
+== Как подписаться на FreeBSD-questions
+
+FreeBSD-questions является списком рассылки, распространяемым по электронной почте, поэтому вам нужен доступ к системе электронной почты. Зайдите через ваш WWW браузер на {freebsd-questions}. В разделе "Подписка на freebsd-questions" (Subscribing to freebsd-questions) заполните поле "Ваш адрес электронной почты" (Your email address); другие поля являются опциональными.
+
+[NOTE]
+====
+Поля для паролей в форме для подписки предоставляют только слабую защищённость, но должны предохранить других от путаницы с вашей подпиской. __Не используйте ценный пароль__, потому как он будет отослан вам по почте обратно в виде незашифрованного текста.
+====
+
+Вы получите подтверждающее письмо от mailman; следуйте включенным в него инструкциям для завершения процесса подписки.
+
+И наконец, когда вы получите приветственное письмо от mailman с подробной информацией о списке и с паролем, __пожалуйста, сохраните его__. Если вы когда-нибудь захотите покинуть список рассылки, вам нужна будет эта информация. За дополнительной информацией обращайтесь к следующему разделу.
+
+== Как отписаться от FreeBSD-questions
+
+Когда вы подписывались на список рассылки FreeBSD-questions, вы получили приглашающее сообщение от mailman. В этом сообщении, кроме всего прочего, вам рассказывалось о том, как отписаться. Вот типичное сообщение:
+
+....
+
+Welcome to the freebsd-questions@freebsd.org mailing list!
+
+To post to this list, send your email to:
+
+ freebsd-questions@freebsd.org
+
+General information about the mailing list is at:
+
+ http://lists.freebsd.org/mailman/listinfo/freebsd-questions
+
+If you ever want to unsubscribe or change your options (e.g., switch to
+or from digest mode, change your password, etc.), visit your
+subscription page at:
+
+http://lists.freebsd.org/mailman/options/freebsd-questions/grog%40lemsi.de
+
+You can also make such adjustments via email by sending a message to:
+
+ freebsd-questions-request@freebsd.org
+
+with the word `help' in the subject or body (don't include the
+quotes), and you will get back a message with instructions.
+
+You must know your password to change your options (including changing
+the password, itself) or to unsubscribe. It is:
+
+ 12345
+
+Normally, Mailman will remind you of your freebsd.org mailing list
+passwords once every month, although you can disable this if you
+prefer. This reminder will also include instructions on how to
+unsubscribe or change your account options. There is also a button on
+your options page that will email your current password to you.
+....
+
+Используя URL, указанный в вашем приветственном сообщении, вы можете посетить "страничку по управлению учетной записью" и запросить "отписать" вас от списка рассылки FreeBSD-questions.
+
+Подтверждающее письмо будет выслано вам от mailman; следуйте включённым в него инструкциям для завершения процесса отписки.
+
+Если вы это сделали, и до сих пор не можете понять, что происходит, отправьте письмо на mailto:freebsd-questions-request@FreeBSD.org[freebsd-questions-request@FreeBSD.org], и они помогут вам разобраться. _Не_ посылайте сообщений во FreeBSD-questions: здесь вам помочь не смогут.
+
+== Нужно задавать вопросы в `-questions` или `-hackers`?
+
+Общим вопросам по FreeBSD посвящены два списка рассылки, `FreeBSD-questions` и `FreeBSD-hackers`. В некоторых случаях на самом деле не ясно, в каком списке нужно задавать вопрос. Следующий критерий, однако, должен помочь в 98% всех случаев:
+
+. Если вопрос является общим, спрашивайте во `FreeBSD-questions`. Примерами могут служить вопросы по установке FreeBSD или использованию конкретных утилит UNIX(R).
+. Если вы думаете, что вопрос относится к ошибке, но вы не уверены или не знаете, как ее исправить, пошлите сообщение во `FreeBSD-questions`.
+. Если вопрос относится к ошибке и вы __уверены__, что это ошибка (например, вы можете указать место в коде, где она происходит, и, может быть, у вас есть для нее исправление), то пошлите сообщение в список рассылки `FreeBSD-hackers`.
+. Если вопрос относится к усовершенствованию FreeBSD, и вы можете дать предложения по ее реализации, то посылайте сообщение во `FreeBSD-hackers`.
+
+Имеется также некоторое количество других link:{handbook}#eresources-mail[специализированных списков рассылки]. Здесь также подходит указанный выше критерий, и в ваших интересах следовать ему, потому что именно так можно получить результат.
+
+== Перед посылкой вопроса
+
+Вы можете (и должны) что-нибудь сделать сами перед тем, как задать вопрос в одном из списков рассылки:
+
+* Попытайтесь решить проблему самостоятельно. Если вы пошлёте вопрос, который покажет, что вы пытались решить проблему, ваш вопрос, как правило, привлечёт более положительное внимание со стороны людей, читающих его. Попытка решить проблему самостоятельно также увеличит уровень вашего понимания FreeBSD, и в конечном счёте позволит вам использовать ваши знания для помощи другим, отвечая на вопросы, посылаемые в списки рассылки.
+* Прочтите страницы справочника и документацию FreeBSD (установлена в [.filename]#/usr/doc# или доступна через WWW на http://www.FreeBSD.org[http://www.FreeBSD.org]), особенно link:{handbook}[Руководство пользователя] и link:{faq}[FAQ].
+* Просмотрите и/или поищите в архивах списка рассылки, задавился ли ваш или схожий вопрос (и возможно отвечался) в списке. Вы можете просмотреть и/или поискать в архивах списков рассылки на http://www.FreeBSD.org/mail[http://www.FreeBSD.org/mail] и http://www.FreeBSD.org/search/#mailinglists[http://www.FreeBSD.org/search#mailinglists] соответственно. Это может быть сделано также и на других WWW сайтах, к примеру, на http://marc.theaimsgroup.com[http://marc.theaimsgroup.com].
+* Используйте поисковик, например, http://www.google.com[Google] или http://www.yahoo.com[Yahoo] для поиска ответов на ваш вопрос. Google имеет даже http://www.google.com/bsd[BSD ориентированный поисковой интерфейс].
+
+== Как посылать вопрос
+
+При посылке сообщения в список рассылки FreeBSD-questions, имейте в виду следующее:
+
+* Помните, что за ответы на вопросы о FreeBSD никто денег не получает. Все делают это в свободное время. Вы можете привлечь внимание, послав четко сформулированный вопрос, содержащий как можно больше относящейся к делу информации. Вы можете не получить внимания, послав неполный, непонятный или примитивный вопрос. В действительности можно посылать сообщение в список рассылки FreeBSD-questions и не получить ответа, даже если вы следуете этим правилам. Еще более вероятно не получить ответа, если вы им не следуете. В оставшейся части документа мы рассмотрим, как получить максимум от вопроса во FreeBSD-questions.
+* Не всякий человек, могущий ответить на вопрос о FreeBSD, читает все сообщения: обычно читается строка с темой письма и решается, представляет ли сообщение интерес. То есть в ваших интересах указать тему письма. "FreeBSD problem" или "Help" недостаточно. Если вы не укажете тему вообще, то многие даже не потрудятся прочесть сообщение. Если тема сообщения недостаточно конкретна, то люди, которые могут ответить, могут его не прочесть.
+* Оформляйте ваше сообщение так, чтобы оно было читабельно, и ПОЖАЛУЙСТА, НЕ КРИЧИТЕ!!!!!. Мы понимаем, что для многих английский не является родным языком, и не исключаем этого, однако действительно очень трудно и мучительно читать сообщение, полное опечаток или в котором отсутствуют разделители строк.
++
+Не упускайте из виду эффект, который производит плохо отформатированное письмо, причем не только в списке рассылки FreeBSD-questions. По вашему почтовому сообщению люди составляют мнение о вас, и если сообщение плохо отформатировано, содержит по одной строке на абзац, неправильно разделено или полно ошибок, то о вас сложится плохое впечатление.
++
+Множество плохо форматированных сообщений возникает из-за http://www.lemis.com/email.html[неправильно работающих или плохо настроенных почтовых программ]. Известно, что следующие почтовые программы могут посылать неправильно отформатированные сообщения без вашего ведома об этом:
+
+** Eudora(R)
+** exmh
+** Microsoft(R) Exchange
+** Microsoft(R) Outlook
+
++
+Постарайтесь не использовать MIME: многие используют программы, которые не очень хорошо работают с MIME.
+* Проверьте правильность настроек времени и временной зоны. Это может выглядеть немножко глупо, потому что ваши сообщения все равно будут доставляться, однако многие люди получают несколько сотен сообщений в день. Зачастую они сортируют входящие сообщения по теме и дате, и если ваше сообщение не будет предшествовать первому ответу, то они могут предположить, что оно потерялось и даже не взглянут на него.
+* Не включайте не связанные друг с другом вопросы в одно и то же письмо. Во-первых, длинное сообщение отпугивает людей, а во-вторых, труднее найти людей, которые могут ответить на все вопросы, и прочитали такое сообщение.
+* Сообщите максимальное количество информации. Это трудно, и нужно пояснить, какую информацию нужно сообщать, а поначалу:
+
+** Практически в любом случае важно знать версию FreeBSD, с которой вы работаете. Особенно, в частности, в случае FreeBSD-CURRENT вы должны также указать дату исходных текстов, хотя, конечно, вам не нужно посылать сообщения о -CURRENT в список рассылки FreeBSD-questions.
+** В случае любой проблемы, которая _может_ быть связана с работой оборудования, расскажите о вашем аппаратном обеспечении. В случае сомнений предположите, что это, возможно, вина оборудования. Какой тип процессора используется? Насколько он быстр? Какая материнская плата? Сколько установлено памяти? Какое периферийное оборудование?
++
+Конечно, это приговор, но вывод команды man:dmesg[8] зачастую может оказаться очень полезным, так как он говорит не только об оборудовании, с которым вы работаете, но также и о версии FreeBSD.
+** Если выдаются сообщения об ошибках, недостаточно написать "I get error messages", напишите (например) "I get the error message 'No route to host'".
+** Если ваша система завершает работу аварийно, не пишите "My system panicked", напишите (к примеру) "my system panicked with the message 'free vnode isn't'".
+** Если у вас возникли трудности при установке FreeBSD, пожалуйста, опишите ваше оборудование. В частности, важно знать адреса ввода/вывода и IRQ адаптеров, установленных в вашей машине.
+** Если у вас возникли трудности в настройке PPP, опишите настройку. Какую версию PPP вы используете? Какой тип аутентификации? У вас используется статическое или динамическое выделение адресов IP? Какие сообщения вы получили в файле протокола?
+
+* Основной объем информации, который вы должны дать, представляет собой вывод программ, таких, как man:dmesg[8], или консольные сообщения, которые обычно появляются в файле [.filename]#/var/log/messages#. Не пытайтесь скопировать эту информацию, набрав ее снова; это действительно трудно, и здесь легко сделать ошибку. Чтобы послать содержимое файлов протоколов, сделайте копию файла и воспользуйтесь редактором для того, чтобы обрезать информацию, оставив только относящуюся к делу, либо скопируйте и вставьте текст в ваше сообщение. В случае вывода программ, таких, как man:dmesg[8], перенаправьте вывод в файл и включите его в письмо. Например,
++
+[source,bash]
+....
+% dmesg > /tmp/dmesg.out
+
+....
+
++
+Эта команда перенаправляет информацию в файл [.filename]#/tmp/dmesg.out#.
+* Если вы все это сделали, и все же не можете получить ответа, этому могут быть другие причины. Например, проблема столь сложна, что никто не знает ответа, или тот, кто знает, отсутствовал. Если вы не получили ответа, скажем, в течении недели, может помочь повторная посылка сообщения. Если вы не получили ответа на свое второе послание, скорее всего, вы вовсе не получите его из этого списка рассылки. Повторная посылка того же самого сообщения снова и снова только повредит вашей репутации.
+
+Подводя итог, давайте предположим, что вы знаете ответ на следующий вопрос (да, это один и тот же вопрос). Выберите, на какой вопрос вы в большей степени готовы ответить:
+
+.Сообщение 1
+[example]
+====
+
+....
+
+Subject: HELP!!?!??
+I just can't get hits damn silly FereBSD system to
+workd, and Im really good at this tsuff, but I have never seen
+anythign sho difficult to install, it jst wont work whatever I try
+so why don't you guys tell me what I doing wrong.
+....
+====
+
+.Сообщение 2
+[example]
+====
+
+....
+
+Subject: Problems installing FreeBSD
+
+I've just got the FreeBSD 2.1.5 CDROM from Walnut Creek, and I'm having a lot
+of difficulty installing it. I have a 66 MHz 486 with 16 MB of
+memory and an Adaptec 1540A SCSI board, a 1.2GB Quantum Fireball
+disk and a Toshiba 3501XA CDROM drive. The installation works just
+fine, but when I try to reboot the system, I get the message
+Missing Operating System.
+....
+====
+
+== Как дополнить вопрос
+
+Часто вам бывает нужно дать дополнительную информацию к вопросу, который вы уже отослали. Лучшим способом сделать это является ответ на первоначальное сообщение. Здесь есть три момента:
+
+. Вы включаете текст исходного сообщения, чтобы люди знали, о чем вы говорите. Однако не забудьте удалить ненужный текст.
+. Текст в строке с темой письма остается тем же самым (вы не забыли его указать, не правда ли?). Многие почтовые программы сортируют сообщения по теме письма. Это поможет при группировке сообщений.
+. Ссылочные номера сообщений в заголовке будут указывать на предыдущее сообщение. Некоторые почтовые программы, такие, как http://www.mutt.org/[mutt], могут _упорядочивать_ сообщения, показывая точную связь между ними.
+
+== Как отвечать на вопрос
+
+Перед тем, как отвечать на вопрос в списке рассылки FreeBSD-questions, имейте в виду:
+
+. Многие замечания, касающиеся посылки вопросов, относятся и к ответам на них. Прочтите эти замечания.
+. Ответил ли кто-либо на вопрос? Самым простым способом проверить это является сортировка входящей почты по темам писем: тогда (надеемся) вы увидите вопрос с последующими ответами все вместе.
++
+Если кто-то уже ответил на вопрос, это вовсе не значит, что вы не должны посылать свой ответ. Но сначала имеет смысл прочитать все другие ответы.
+. Есть ли у вас что добавить сверх того, что уже было сказано? В общем случае ответы "Yeah, me too" сильно не помогут, хотя есть и исключения, например, когда кто-нибудь описывает свою проблему и не знает, его ли это ошибка, или что-то не так с аппаратным или программным обеспечением. Если вы посылаете сообщение "me too", включите также относящуюся к делу информацию.
+. Уверены ли вы, что поняли вопрос? Очень часто тот, кто задает вопрос, путается или не может все хорошо описать. Даже при самом полном понимании системы легко послать ответ, который не отвечает на вопрос. К сожалению, так вы никому не поможете, только ещё больше запутаете и разочаруете спрашивающего. Если никто больше не отвечает, или вы не очень уверены, то всегда можете запросить более подробную информацию.
+. Уверены ли вы, что ваш ответ корректен? Если нет, то подождите пару дней. Если никого больше не появится с лучшим ответом, чем ваш, то вы можете ответить и сказать, например, "I don't know if this is correct, but since nobody else has replied, why don't you try replacing your ATAPI CDROM with a frog?".
+. Если нет причин поступить как-то иначе, то ответьте отправителю и в список рассылки FreeBSD-questions. Многие подписчики FreeBSD-questions "таятся": они учатся на чтении сообщений, посланных и отвеченных другими. Если вы пошлете сообщение, представляющее интерес для всех, минуя список рассылки, то лишите этих людей их информации. Будьте внимательны при ответе всем; многие посылают сообщения с сотнями CC-адресатов. В таких случаях удалите лишние строки Cc:.
+. Из исходного сообщения включите текст, который относится к делу. Избегайте излишнего цитирования, но не переусердствуйте. Тот, кто не читал первоначального сообщения, должен понять, о чём же идёт речь.
+. Используйте приемы выделения текста, который взят из исходного сообщения и текста, который добавили вы. Лично я нахожу, что для первоначального текста лучше всего работает вставка символа "`>`". Вставка пробела после "`>`" и пустых строк между вашим и первоначальным текстами сделает результат более читабельным.
+. Поместите ваш ответ в правильном месте (после текста, на который вы отвечаете). Очень трудно читать набор ответов, когда каждый из них следует перед текстом, к которому относится.
+. Большинство почтовых программ меняют строку темы письма в ответе, предваряя ее текстом типа "Re: ". Если ваша почтовая программа не делает это автоматически, вы должны делать это вручную.
+. Если спрашивающий не следует соглашениям по форматированию текста (слишком длинные строки, неподходящая строка темы), __пожалуйста__, исправьте эти ошибки. В случае некорректной строки темы письма (типа "HELP!!??") измените её, например, так: "Re: Difficulties with sync PPP (was: HELP!!??)". В таком случае у других людей, пытающихся отследить обсуждение, будет меньше проблем.
++
+В таких случаях хорошо сказать, что вы сделали и почему, но постарайтесь не грубить. Если вы чувствуете, что не можете ответить, не скатываясь на грубость, воздержитесь от ответа вообще.
++
+Если вы хотите ответить на сообщение лишь потому, что оно плохо оформлено, ответьте только автору, но не в список. Если хотите, то в ответ можете просто послать ему эту статью.
diff --git a/documentation/content/ru/articles/geom-class/_index.adoc b/documentation/content/ru/articles/geom-class/_index.adoc
new file mode 100644
index 0000000000..8ae7c22a71
--- /dev/null
+++ b/documentation/content/ru/articles/geom-class/_index.adoc
@@ -0,0 +1,348 @@
+---
+title: Создание класса GEOM
+authors:
+ - author: Ivan Voras
+ email: ivoras@FreeBSD.org
+releaseinfo: "$FreeBSD$"
+trademarks: ["freebsd", "intel", "general"]
+---
+
+= Создание класса GEOM
+:doctype: article
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:toc-title: Содержание
+:part-signifier: Часть
+:chapter-signifier: Глава
+:appendix-caption: Приложение
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+
+include::shared/ru/urls.adoc[]
+
+[.abstract-title]
+Аннотация
+
+Эта статья документирует некоторые начальные выкладки в разработке GEOM-классов, а также модулей ядра в общем. Предполагается, что читатель близко знаком с программированием на Си в контексте пространства пользовательских процессов (userland).
+
+'''
+
+toc::[]
+
+[[intro]]
+== Вступление
+
+[[intro-docs]]
+=== Документация
+
+Документация по программированию для ядра скудная, это одна из немногих областей программирования, где почти нет хороших учебных пособий, и совет "читай исходники!" - сохраняет свою справедливость. Однако, существует несколько статей и книг разной актуальности, которые рекомендуются к изучению перед тем, как начать программировать:
+
+* link:{developers-handbook}[Руководство FreeBSD для разработчиков] - часть Проекта Документации FreeBSD, ничего специфичного о программировании ядра в нем нет, зато есть немного общей полезной информации.
+* link:{arch-handbook}[Руководство по Архитектуре FreeBSD] - также является частью Проекта Документации FreeBSD, содержит описания некоторых низкоуровневых средств и процедур. Уделите внимание разделу номер 13 - link:{arch-handbook}#driverbasics[Написание драйверов устройств для FreeBSD].
+* Несколько интересных статей об устройстве ядра можно найти на сайте http://www.freebsddiary.com[FreeBSD Diary].
+* Страницы из раздела номер 9 системного справочника, содержат важную документацию по функциям ядра.
+* Страница справочника man:geom[4], а также http://phk.freebsd.dk/pubs/[слайды Пола-Хеннинга Кампа ] - общее представление о подсистеме GEOM.
+* Страницы справочника man:g_bio[9], man:g_event[9], man:g_data[9], man:g_geom[9], man:g_provider[9], man:g_consumer[9], man:g_access[9], а также другие, связанные с вышеупомянутыми и раскрывающие специфический функционал подсистемы GEOM.
+* Страница справочника man:style[9] - документирует соглашения о стиле оформления кода, которые обязаны быть соблюдены если вы планируете передать ваш код в Subversion репозиторий FreeBSD.
+
+[[prelim]]
+== Подготовка
+
+Для того, чтоб заниматься разработками для ядра, желательно иметь два отдельных компьютера. Один из них предназначен для среды разработки и исходных кодов, а второй - для запуска тестов отлаживаемого кода. Второму компьютеру для работы достаточно иметь возможность выполнять начальную загрузку по сети и монтирование файловых систем по сети. В этой ситуации, если отлаживаемый код содержит ошибки и вызовет аварийную остановку системы, то это не повлечет порчу или утерю исходного кода . Второму компьютеру даже не потребуется иметь свой монитор, достаточно будет соединения асинхронных портов кабелем RS-232 или соединения при помощи KVM-устройства.
+
+Но так как далеко не у каждого есть два или более компьютеров под рукой, есть пара способов подготовить иную "живую" систему для разработки кода для ядра. Один из них - это разработка в http://www.vmware.com/[VMWare] или http://www.qemu.org/[QEmu] виртуальной машине (это лучшее из доступного, после, конечно-же, выделенного для тестов компьютера).
+
+[[prelim-system]]
+=== Настройка системы для разработки
+
+Прежде всего необходимо иметь в ядре поддержку `INVARIANTS`. Добавьте следующие строки в файл конфигурации ядра:
+
+[.programlisting]
+....
+options INVARIANT_SUPPORT
+options INVARIANTS
+....
+
+Для большей информативности при отладке включите поддержку WITNESS, которая будет предупреждать вас в случае возникновения взаимоблокировок:
+
+[.programlisting]
+....
+options WITNESS_SUPPORT
+options WITNESS
+....
+
+Также включите отладочные символы, если планируете выполнять отладку по дампам аварийных отказов
+
+[.programlisting]
+....
+ makeoptions DEBUG=-g
+....
+
+Установка отладочного ядра обычным способом (`make installkernel`) не даст привычного результата: файл ядра будет называться [.filename]#kernel.debug# и будет находиться в [.filename]#/usr/obj/usr/src/sys/KERNELNAME/#. Для удобства, отладочное ядро необходимо скопировать в [.filename]#/boot/kernel/#.
+
+Также удобно иметь включенный отладчик ядра, так вы сможете исследовать паники сразу-же после их возникновения. Для включения отладчика добавьте следующие строки в файл конфигурации ядра:
+
+[.programlisting]
+....
+options KDB
+options DDB
+options KDB_TRACE
+....
+
+Для автоматического запуска отладчика ядра после возникновения паники может понадобиться установить переменную sysctl:
+
+[.programlisting]
+....
+ debug.debugger_on_panic=1
+....
+
+Паники системы будут происходить, поэтому уделите внимание кэшу файловой системы. Обычно, при включенном механизме softupdates, последняя версия файла может быть утеряна если паника произошла раньше сбрасывания кэша на устройство хранения. Выключение механизма softupdates (посредством монтирования файловой системы с опцией "sync") значительно сказывается на производительности и, опять-же, не гарантирует целостности данных. Как компромисс, можно сократить задержки сбрасывания кэша механизма softupdates. Есть три переменных sysctl, значения которых необходимо изменить (лучше всего - прописав их в [.filename]#/etc/sysctl.conf#):
+
+[.programlisting]
+....
+kern.filedelay=5
+kern.dirdelay=4
+kern.metadelay=3
+....
+
+Значения этих переменных - секунды.
+
+Для отладки паник ядра необходимы дампы памяти. Так как паника ядра может "сломать" файловую систему, дамп сначала сохраняется в "сырой" раздел. Обычно, это своп-раздел. Поэтому, размер своп-раздела должен быть не меньше размера ОЗУ компьютера. При последующей загрузке дамп копируется в обычный файл. Это происходит сразу-же после проверки и монтирования файловых систем, но перед активированием раздела свопа. Такое поведение контролируется следующими переменными [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+dumpdev="/dev/ad0s4b"
+dumpdir="/usr/core"
+....
+
+Переменная `dumpdev` указывает на раздел подкачки, а `dumpdir` сообщает системе куда перемещать дамп ядра при следующей загрузке.
+
+Сохранение дампа ядра - процесс медленный, и, если у вашего компьютера много оперативной памяти (>256M) и если паники случаются часто, то ожидание сохранения дампов может начать раздражать (вспомним, что над дампом происходит две операции: сохранение в своп-файл и перемещение на файловую систему). В таком случае может оказаться удобным ограничивание объема используемой системой памяти путем установки переменной в [.filename]#/boot/loader.conf#:
+
+[.programlisting]
+....
+ hw.physmem="256M"
+....
+
+Если паники случаются часто и размер файловых систем большой (или же вы просто не доверяете softupdates и фоновой проверке файловых систем), рекомендуется отключить фоновую проверку файловых систем посредством установки переменной в [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+ background_fsck="NO"
+....
+
+В этом случае файловые системы будут проверяться только при необходимости. Также заметьте, что в случае использования фоновой проверки, новая паника может случиться в то время, когда проверяются диски. Другими словами, наиболее безопасный способ - не иметь много локальных файловых систем, а использовать второй компьютер в качестве NFS-сервера.
+
+[[prelim-starting]]
+=== Начало проекта
+
+Для написания нового класса GEOM необходимо создать поддиректорию в любой доступной пользователю директории. Совсем не обязательно, чтоб ваш модуль изначально размещался в [.filename]#/usr/src#.
+
+[[prelim-makefile]]
+=== Makefile
+
+Правилом хорошего тона является создание [.filename]#Makefile#-ов для каждого нетривиального проекта, примером которого конечно-же является создание модулей ядра.
+
+Создание [.filename]#Makefile# - дело не сложное благодаря исчерпывающему набору вспомогательных средств, предоставляемых системой. В вкратце, вот как должен выглядеть [.filename]#Makefile# для модуля ядра:
+
+[.programlisting]
+....
+SRCS=g_journal.c
+KMOD=geom_journal
+
+.include <bsd.kmod.mk>
+....
+
+Этот [.filename]#Makefile# (с измененными именами файлов) подойдет к любому модулю ядра. Класс GEOM может размещаться в одном единственном модуле ядра. Если для сборки вашего модуля требуется больше, чем один файл, то перечислите их имена, разделенные пробельными символами, в переменной `SRCS`.
+
+[[kernelprog]]
+== Программирование в ядре FreeBSD
+
+[[kernelprog-memalloc]]
+=== Выделение памяти
+
+Прочитайте man:malloc[9] - выделение памяти лишь немного отличается от своего эквивалента, используемого в пространстве пользовательских процессов (userland). Наиболее приметно то, что `malloc`() и `free`() принимают дополнительные параметры, которые описаны в странице справочника.
+
+Тип "malloc_type" необходимо объявить в секции деклараций файла с исходным кодом, например:
+
+[.programlisting]
+....
+ static MALLOC_DEFINE(M_GJOURNAL, "gjournal data", "GEOM_JOURNAL Data");
+....
+
+Для того, чтобы можно было использовать этот макрос, необходимо включить следующие заголовочные файлы: [.filename]#sys/param.h#, [.filename]#sys/kernel.h# и [.filename]#sys/malloc.h#
+
+Существует еще один механизм выделения памяти - UMA (Universal Memory Allocator), описанный в man:uma[9]. Это специфический метод, преимущественно предназначенный для быстрого выделения памяти под списки, состоящие из элементов одинакового размера (например, динамические массивы структур).
+
+[[kernelprog-lists]]
+=== Очереди и списки
+
+Ознакомьтесь с man:queue[3] Во множестве случаев вам необходимо будет организовывать и управлять такой структурой данных, как списки. К счастью, эта структура данных реализована несколькими способами в виде макросов на Си, а также включена в систему. Наиболее гибкий и часто употребляемый тип списка - TAILQ. Этот тип списка также один из наиболее требовательных к памяти (его элементы - с двойными связями), а также - наиболее медленный (однако счет идет на несколько инструкций ЦПУ, поэтому последнее утверждение не следует воспринимать в всерьез).
+
+Если важна скорость получения данных, то возьмите на вооружение man:tree[3] и man:hashinit[9].
+
+[[kernelprog-bios]]
+=== BIOs
+
+Структура `bio` используется для всех операций ввода/вывода, касающихся GEOM. Она содержит информацию о том, какое устройство ('поставщик geom') должно ответить на запрос, тип запроса, смещение, длину и указатель на буфер, а также набор "определенных пользователем" флагов и полей .
+
+Важным моментом является то, что `bio` обрабатываются асинхронно. Это значит, что во многих частях кода нет аналога к man:read[2] и man:write[2] функциям из пространства пользовательских процессов, которые не возвращают управление пока не выполнится системный вызов. Скорее, по завершении обработки запроса (или в случае ошибки при обработке) как извещение вызывается определенная пользователем функция.
+
+Асинхронная модель программирования в чем-то сложней, нежели чаще используемая императивная модель, используемая в пространстве пользовательских процессов; в любом случае, привыкание займет некоторое время. В некоторых случаях могут быть использованы вспомогательные функции `g_write_data`() и `g_read_data`(), но __далеко не всегда__. В частности, эти функции не могут использоваться когда захвачен мьютекс; например, мьютекс GEOM-топологии или внутренний мьютекс, удерживаемый в ходе выполнения `.start`() или `.stop`().
+
+[[geom]]
+== Программирование в системе GEOM
+
+[[geom-ggate]]
+=== Ggate
+
+Если максимальная производительность не требуется, то более простой способ совершать преобразования данных - это выполнять их в пространстве пользовательских процессов посредством ggate (GEOM gate). К недостаткам следует отнести невозможность простого переноса кода в ядро.
+
+[[geom-class]]
+=== Класс GEOM
+
+Класс GEOM выполняет преобразования данных. Эти преобразования могут быть скомпонованы друг с другом в виде дерева. Экземпляр класса GEOM называют __geom__.
+
+В каждом классе GEOM есть несколько "методов класса", которые вызываются когда экземпляра класса нет в наличии (или же они не привязаны к конкретному экземпляру класса).
+
+* `.init` вызывается тогда, когда системе GEOM становится известно о классе GEOM (например, когда загружается модуль ядра).
+* `.fini` будет вызван в случае отказа GEOM системы от класса (например, при выгрузке модуля).
+* `.taste` вызывается, когда в системе появляется новый класс или поставщик geom ("provider"). Если соответствие найдено, то эта функция обычно создает и запускает экземпляр geom.
+* `.destroy_geom` вызывается при необходимости разрушить экземпляр geom.
+* `.ctlconf` будет вызван, когда пользователь запросит изменение конфигурации существующего экземпляра geom
+
+Также определены функции событий GEOM, которые копируются в экземпляр geom.
+
+Поле `.geom` в структуре `g_class` - это список (LIST) экземпляров geom, реализованных из класса.
+
+Эти функции вызываются из g_event потока ядра.
+
+[[geom-softc]]
+=== Softc
+
+"softc" - это устаревший термин для "приватных данных драйвера" ("driver private data"). Название вероятней всего происходит от устаревшего термина "software control block". В системе GEOM softc это структура (точнее: указатель на структуру) которая может быть присоединена к экземпляру geom и может содержать приватные данные экземпляра. У большинства классов GEOM есть следующие члены:
+
+* `struct g_provider *provider` : "поставщик geom" предоставляемый данным экземпляром geom
+* `uint16_t n_disks` : Количество потребителей geom ("consumer"), обслуживаемых данным экземпляром geom
+* `struct g_consumer \**disks` : Массив `struct g_consumer*`. (Невозможно обойтись одинарным указателем, потому что система GEOM создает для нас структуры struct g_consumer)
+
+Структура `softc` содержит состояние экземпляра geom. У каждого экземпляра есть свой softc.
+
+[[geom-metadata]]
+=== Метаданные
+
+Формат метаданных в той или иной мере зависит от конкретного класса, но _обязан_ начинаться с:
+
+* 16-байтного буфера для подписи - строки с завершающим нулем (обычно это имя класса)
+* uint32 идентификатора версии
+
+Подразумевается, что классы geom знают как обращаться с метаданными с идентификаторами версий ниже, чем их собственные.
+
+Метаданные размещаются в последнем секторе поставщика geom (поэтому обязаны целиком умещаться в нем).
+
+(Все это зависит от реализации, но весь существующий код работает подобно описанному и поддерживается библиотеками.)
+
+[[geom-creating]]
+=== Маркирование/создание экземпляра geom
+
+Последовательность событий следующая:
+
+* пользователь запускает служебную программу man:geom[8]
+* программа решает каким классом geom ей придется управлять и ищет библиотеку [.filename]#geom_CLASSNAME.so# (которая обычно находится в [.filename]#/lib/geom#).
+* она открывает библиотеку при помощи man:dlopen[3], извлекает вспомогательные функции и определения параметров командной строки.
+
+Вот так происходит создание/маркирование нового экземпляра geom:
+
+* man:geom[8] ищет команду в аргументах командной строки (обычно это `label`) и вызывает вспомогательную функцию.
+* Вспомогательная функция проверяет параметры и собирает метаданные, которые записываются во все вовлеченные поставщики geom.
+* Это "повреждает (spoil)" существующие экземпляры geom (если они были) и порождает новый виток "тестирования" поставщиков geom. Целевой класс geom опознает метаданные и активирует экземпляр geom.
+
+(Приведенная выше последовательность событий зависит от конкретной реализации, но весь существующий код работает подобно описанному и поддерживается библиотеками.)
+
+[[geom-command]]
+=== Структура команд geom
+
+Вспомогательная библиотека [.filename]#geom_CLASSNAME.so# экспортирует структуру `class_commands`, которая является массивом элементов `struct g_command`. Эти команды одинакового формата и выглядят следующим образом:
+
+[.programlisting]
+....
+ команда [-опции] имя_geom [другие]
+....
+
+Общими командами являются:
+
+* label - записать метаданные в устройства, чтобы они могли быть опознаны в процессе тестирования и использованы в соответствующих экземплярах geom
+* destroy - разрушить метаданные, за которым последует разрушение экземпляров geom
+
+Общие опции:
+
+* `-v` : детальный вывод
+* `-f` : принудить
+
+Некоторые операции, к примеру маркирование метаданными и разрушение метаданных могут быть выполнены из пространства пользовательских процессов. Для этого, структура `g_command` содержит поле `gc_func`, которое может быть установлено на функцию (в том-же [.filename]#.so#), которая будет вызвана для обработки команды. В случае, когда `gc_func` равно NULL, команда будет передана модулю ядра: функции `.ctlreq` класса GEOM.
+
+[[geom-geoms]]
+=== Экземпляры geom
+
+У экземпляров классов GEOM есть внутренние данные, которые хранятся в структурах softc, а также есть некоторые функции, посредством которых они реагируют на внешние события.
+
+Функции событий:
+
+* `.access` : просчитывает права доступа (чтение/запись/исключительный доступ)
+* `.dumpconf` : возвращает информацию о экземпляре geom; формат XML
+* `.orphan` : вызывается, когда отсоединяется любой из низлежащих поставщиков geom
+* `.spoiled` : вызывается, когда производится запись в низлежащий поставщик geom
+* `.start` : обрабатывает ввод/вывод
+
+Эти функции вызываются из ядерного потока `g_down` и в этом контексте не может быть блокировок (поищите определение "блокировка" в других источниках), что немного ограничивает свободу действий, но способствует быстроте обработки.
+
+Из вышеупомянутых, наиболее важной и выполняющей полезную работу функцией является `.start`(), которая вызывается всякий раз, когда поставщику geom, управляемому экземпляром класса, приходит запрос BIO.
+
+[[geom-threads]]
+=== Потоки выполнения системы geom
+
+Системой GEOM в ядре ОС создаются и используются три потока выполнения (kernel threads):
+
+* `g_down` : Обрабатывает запросы, приходящие от высокоуровневых сущностей (таких, как запросы из пространства пользовательских процессов) на пути к физическим устройствам
+* `g_up` : Обрабатывает ответы от драйверов устройств на запросы, выполненные высокоуровневыми сущностями
+* `g_event` : Отрабатывает в остальных случаях, как-то создание экземпляра geom, просчитывание прав доступа, события "повреждения" и т.п.
+
+Когда пользовательский процесс запрашивает "прочитать данные X по смещению Y файла", происходит следующее:
+
+* Файловая система преобразует запрос в экземпляр структуры bio и передает его системе GEOM. Файловая система "знает", что экземпляр geom должен обработать запрос, так как файловые системы размещаются непосредственно над экземпляром geom.
+* Запрос завершается вызовом функции `.start`() в потоке g_down и достигает верхнего экземпляра geom.
+* Верхний экземпляр geom (например, это секционировщик разделов (partition slicer)) определяет, что запрос должен быть переадресован нижестоящему экземпляру geom (к примеру, драйверу диска). Вышестоящий экземпляр geom создает копию запроса bio (запросы bio _ВСЕГДА_ копируются при передаче между экземплярами geom при помощи `g_clone_bio`()!), изменяет поля смещения и целевого поставщика geom и запускает на обработку копию при помощи функции `g_io_request`()
+* Драйвер диска также получает запрос bio, как вызов функции `.start`() в потоке `g_down`. Драйвер обращается к контроллеру диска, получает блок данных и вызывает функцию `g_io_deliver`() используя копию запроса bio
+* Теперь, извещение о завершении bio "всплывает" в потоке `g_up`. Сначала в потоке `g_up` вызывается функция `.done`() секционировщика разделов, последний использует полученную информацию, разрушает клонированный экземпляр структуры bio посредством `g_destroy_bio`() и вызывает `g_io_deliver`() используя первоначальный запрос
+* Файловая система получает данные и передает их пользовательскому процессу
+
+За информацией о том, как данные передаются в структуре `bio` между экземплярами geom, смотрите man:g_bio[9] (обратите внимание на использование полей `bio_parent` и `bio_children`).
+
+Важный момент в том, что __НЕЛЬЗЯ ДОПУСКАТЬ БЛОКИРОВОК В ПОТОКАХ G_UP И G_DOWN__. Вот неполный перечень того, что нельзя делать в этих потоках:
+
+* Вызывать функции `msleep`() или `tsleep`().
+* Использовать функции `g_write_data`() и `g_read_data`(), так как они блокируются в момент обмена данными с потребителями geom.
+* Ожидать ввод/вывод.
+* Вызывать man:malloc[9] и `uma_zalloc`() с установленным флагом `M_WAITOK`.
+* Использовать man:sx[9]
+
+Это ограничение на код GEOM призвано избежать от "засорения" пути запроса ввода/вывода, так как блокировки обычно не имеют четких временных границ, и нет гарантий на занимаемое время (также на то есть и другие технические причины). Это также значит, что в вышеупомянутых потоках сколь-нибудь сложные операции выполнить нельзя, например: любое сложное преобразование требует выделения памяти. К счастью решение есть: создание дополнительных ядерных потоков.
+
+[[geom-kernelthreads]]
+=== Ядерные потоки выполнения, предназначенные для использования в коде geom
+
+Ядерные потоки выполнения создаются функцией man:kthread_create[9], в своем поведении они схожи с потоками, созданными в пространстве пользовательских процессов, но есть одно отличие: они не могут известить вызвавший их поток о своем завершении; по завершению - необходимо вызывать man:kthread_exit[9]
+
+В коде GEOM обычное назначение этих потоков - разгрузить поток `g_down` (функцию `.start`() ) от обработки запросов. Эти потоки подобны "обработчикам событий" ("event handlers"): у них есть очередь событий (которая наполняется событиями от разных функций из разных потоков; очередь необходимо защищать мьютексом), события из очереди выбираются одно за другим и обрабатываются в большом блоке `switch`().
+
+Основное преимущество использования отдельного потока, который обрабатывает запросы ввода/вывода, то, что он может блокироваться по мере необходимости. Это, несомненно, привлекательно, но должно быть хорошо обдумано. Блокирование - хорошо и удобно, но может существенно снизить производительность преобразований данных в системе GEOM. Особо требовательные к производительности классы могут делать всю работу в функции `.start`(), уделяя особое внимание ошибкам при работе с памятью.
+
+Еще одно преимущество потока "обработчика событий" это сериализация всех запросов и ответов, приходящих с разных потоков geom в один поток. Это также удобно, но может быть медленным. В большинстве случаев, обработка запросов функцией `.done`() может быть оставлена потоку `g_up`.
+
+У мьютексов в ядре FreeBSD (man:mutex[9]) есть одно различие с их аналогами из пространства пользовательских процессов - во время удержания мьютекса в коде не должно быть блокировки. Если в коде необходимо блокирование, то лучше использовать man:sx[9]. С другой стороны, если вся ваша работа выполняется в одном потоке, вы можете обойтись вообще без мьютексов.
diff --git a/documentation/content/ru/articles/gjournal-desktop/_index.adoc b/documentation/content/ru/articles/gjournal-desktop/_index.adoc
new file mode 100644
index 0000000000..53b483cb6e
--- /dev/null
+++ b/documentation/content/ru/articles/gjournal-desktop/_index.adoc
@@ -0,0 +1,438 @@
+---
+title: Настройка журналирования UFS для настольного компьютера.
+authors:
+ - author: Manolis Kiagias
+ email: manolis@FreeBSD.org
+releaseinfo: "$FreeBSD$"
+trademarks: ["freebsd", "general"]
+---
+
+= Настройка журналирования UFS для настольного компьютера.
+:doctype: article
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:toc-title: Содержание
+:part-signifier: Часть
+:chapter-signifier: Глава
+:appendix-caption: Приложение
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+
+include::shared/authors.adoc[]
+include::shared/ru/mailing-lists.adoc[lines=9..-1]
+include::shared/ru/urls.adoc[]
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/articles/gjournal-desktop/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/articles/gjournal-desktop/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/articles/gjournal-desktop/
+endif::[]
+
+[.abstract-title]
+Аннотация
+
+Журналируемая файловая система использует лог для записи всех транзакций, происходящих в файловой системе, который также сохраняет ее целостность в случае краха системы или пропадания питания. Несмотря на то, что всё еще возможна потеря несохранённых изменений файлов, журналирование почти полностью исключает возможность повреждения структуры файловой системы, вызванное непредвиденным остановом работы. Журналирование также сокращает до минимума время, необходимое для проверки файловой системы после отказа. Несмотря на то, что в используемой FreeBSD файловой системе UFS нет поддержки журналирования, новый класс системы GEOM в FreeBSD 7._X_ может быть использован для для ведения независимого от файловой системы журналирования. Эта статья объясняет, как реализовать журналирование UFS для типичного настольного компьютера.
+
+'''
+
+toc::[]
+
+[[introduction]]
+== Вступление
+
+Серверное оборудование обычно хорошо защищено от потери питания. Настольный компьютер часто подвержен неожиданным пропаданиям питания, случайным нажатиям кнопки Reset и другим происшествиям (часто связанным с неосторожностью пользователей), которые могут привести к непредвиденным выключениям. Механизм Soft Updates, как правило, достаточно эффективно защищает файловую систему в таких случаях, однако в последствии требуется длительная фоновая проверка. В очень редких случаях повреждения файловой системы достигают того уровня, при котором становится необходимым вмешательство пользователя и данные могут быть утерянными.
+
+Новая возможность журналирования, предоставленная системой GEOM, может существенно выручить в подобных случаях, исключая время, необходимое для проверки файловых систем и удостовериваясь, что файловая система быстро восстановлена в целостное состояние.
+
+Эта статья описывает порядок действий, необходимых для конфигурирования журналирования UFS на типичном настольном компьютере, в котором один жесткий диск используется для размещения как операционной системы, так и данных. В статье подразумевается установка FreeBSD "с нуля". Шаги достаточно просты и не требуют чрезмерно сложных манипуляций с командной строкой
+
+После прочтения данной статьи вы будете знать:
+
+* Как зарезервировать место для журнала во время новой установки FreeBSD.
+* Как загрузить модуль `geom_journal` (или включить поддержку журналирования в специализированном ядре системы).
+* Как преобразовать существующую файловую систему, в систему, использующую журналирование, и какие опции монтирования использовать в [.filename]#/etc/fstab#.
+* Как реализовать журналирование на новых (пустых) разделах.
+* Как диагностировать неполадки, связанные с журналированием.
+
+Перед прочтением этой статьи вам необходимо:
+
+* Понимать базовые концепции таких операционных систем, как UNIX(R) и FreeBSD.
+* Быть знакомым с процедурой установки FreeBSD, а также с программой Sysinstall.
+
+[WARNING]
+====
+Процедура, описанная здесь, подразумевает подготовку к новой установке, в которой на дисках еще нет пользовательских данных. Так как эту процедуру можно модифицировать и расширить на системы, которые уже используются, вам настоятельно рекомендуется сделать _резервную копию_ всех ценных данных. Путаница в низкоуровневых операциях с дисками и разделами может привести к фатальным ошибкам и потере данных.
+====
+
+[[understanding-journaling]]
+== Реализация журналирования в FreeBSD
+
+Журналирование, предоставляемое системой GEOM в FreeBSD 7._X_, не является особенностью файловой системы (в отличие от, например, файловой системы ext3 в Linux(R)), оно функционирует на блочном уровне. А это значит, что оно может быть применено к разным типам файловых систем, однако для FreeBSD 7.0-RELEASE журналирование может быть применено только для UFS2.
+
+Возможность журналирования обеспечивается загрузкой модуля [.filename]#geom_journal.ko# в ядро (или сборкой собственного ядра с активированием соответствующих опций) и использованием команды `gjournal` для конфигурирования файловой системы. В общем, вы предпочтете журналировать файловые системы большого размера, к примеру - [.filename]#/usr#. Однако, вам придется зарезервировать некоторое количество свободного места (см. следующий раздел).
+
+Когда файловая система журналируется, некоторая часть дискового пространства требуется для хранения самого журнала. Дисковое пространство, содержащее данные, называется __поставщиком данных (data provider)__, а часть пространства, содержащая журнал, называется __поставщиком журнала (journal provider)__. Поставщики данных и журнала должны быть на разных разделах, если журналирование достраивается к содержащему данные разделу. А если журналирование включается для нового раздела, у вас есть возможность использовать один поставщик для данных и журнала. В любом из двух вышеупомянутых случаев команда `gjournal` задействует поставщики и создаст конечную журналируемую файловую систему. Например:
+
+* Вы намереваетесь журналировать файловую систему [.filename]#/usr#, размещенную на [.filename]#/dev/ad0s1f#, файловая система уже содержит данные.
+* Вы зарезервировали часть дискового пространства на разделе [.filename]#/dev/ad0s1g#.
+* Используя команду `gjournal`, создаем новый файл устройства [.filename]#/dev/ad0s1f.journal#, для которого [.filename]#/dev/ad0s1f# является поставщиком данных, а [.filename]#/dev/ad0s1g# - поставщик журнала. Это новое устройство необходимо использовать во всех последующих операциях.
+
+Размер дискового пространства, отводимого под поставщик журнала, зависит от нагруженности файловой системы, а не от размера самого поставщика данных. Например, для типичного настольного компьютера достаточно отвести 1 Гб под поставщик журнала для файловой системы [.filename]#/usr#, в то время как компьютеру, имеющему интенсивный дисковый ввод/вывод (например, редактирование видео) может потребоваться больше. Если свободное место на поставщике журнала заканчивается раньше, чем происходит сброс журнала на диск, - вы получите панику ядра.
+
+[NOTE]
+====
+Очень маловероятно то, что размеры журнала, предложенные здесь, станут причиной проблем с обычным настольным компьютером (на котором вы просматриваете веб-страницы, обрабатываете текст или проигрываете мультимедийные файлы). Если работа вашего компьютера подразумевает интенсивную дисковую активность, то для обеспечения стабильности следует придерживаться следующего правила: размер ОЗУ должен уместиться в 30% размера, отведенного под журнал. Например, если в вашем компьютере установлен 1 Гб ОЗУ, создайте под поставщик журнала раздел размером около 3.3 Гб. (Умножьте размер ОЗУ в 3.3 раза, чтоб получить размер журнала).
+====
+
+Для получения дополнительной информации о журналировании, пожалуйста, прочитайте страницу справочника, посвященную man:gjournal[8].
+
+[[reserve-space]]
+== Действия, необходимые во время установки FreeBSD
+
+=== Выделение места под журналирование
+
+Типичный настольный компьютер обычно имеет один жесткий диск, на котором хранится как операционная система, так и пользовательские данные. Вероятно, что схема разбития винчестера (по умолчанию), выбранная в меню Sysinstall, является более или менее подходящей: настольному компьютеру не требуется большой раздел [.filename]#/var#, в то время, как для раздела [.filename]#/usr# выделяется значительный объем дискового пространства, ввиду того, что пользовательские данные и множество пэкэджей хранятся именно в поддиректориях [.filename]#/usr#.
+
+Разбиение по умолчанию (получаемое при нажатии kbd:[A] в редакторе разделов FreeBSD, называемом Disklabel) не оставляет свободного места. Каждый подлежащий журналированию раздел требует отдельного раздела для журнала. Ввиду того, что раздел [.filename]#/usr# - наибольший, есть смысл немного уменьшить его размер, чтобы получить пространство, необходимое для журнала.
+
+В нашем примере используется жесткий диск размером 80 Гб. Следующий скриншот показывает результаты разбиения по умолчанию, выполненного при помощи Disklabel в процессе установки операционной системы:
+
+image::disklabel1.png[]
+
+Если это разбиение более или менее вас устраивает, то его легко модифицировать для журналирования. Используйте клавиши со стрелками для того, чтобы выделить раздел, отведенный под [.filename]#/usr#, потом нажмите kbd:[D] чтобы удалить его.
+
+Теперь переведите подсвечивание к имени диска, находящемуся вверху экрана, и нажмите kbd:[C] - создайте новый раздел [.filename]#/usr#. Новый раздел должен быть меньше на 1 Гб (если вы собираетесь журналировать только [.filename]#/usr#) или на 2 Гб (если журналированию подлежат как [.filename]#/usr#, так и [.filename]#/var#). Во всплывающем окне выберите "создать файловую систему" и укажите [.filename]#/usr# точкой монтирования.
+
+[NOTE]
+====
+Следует ли журналировать [.filename]#/var# раздел? Обычно есть смысл журналировать большие разделы. Вы можете решить не журналировать [.filename]#/var#, однако журналирование на обычном настольном компьютере не причинит вреда. Если файловая система не нагружена (что типично для настольной системы), то можно выделить меньше дискового пространства под журнал.
+
+В этом примере подразумевается журналирование двух файловых систем: [.filename]#/usr# и [.filename]#/var#. Естественно, вы можете подкорректировать процедуру под свои задачи.
+====
+
+Чтобы не усложнять описываемую методику, для создания разделов, необходимых для размещения журналов, мы будем использовать утилиту Sysinstall. Однако, во время установки утилита Sysinstall требует указания точек монтирования для каждого созданного вами раздела. Но разделы, содержащие журналы, вам никогда и никуда монтировать не придется.
+
+Чтобы избежать вопросов о точках монтирования, мы создадим разделы под журналы и установим их тип в swap. Раздел, предназначенный для свопа, никогда и никуда не монтируется, плюс к тому, утилита Sysinstall позволяет создавать столько разделов под своп, сколько необходимо. После первой перезагрузки необходимо подредактировать файл [.filename]#/etc/fstab#, удалив в нём лишние записи о своп-разделах.
+
+Для создания своп-раздела, используя клавиши со стрелками, перемещайте подсвечивание к верхней части экрана в утилите Disklabel так, чтобы стало подсвеченным имя диска. Потом, нажмите kbd:[N], введите необходимый размер раздела (_1024M_), а после - выберите во всплывшем окне "swap space". Повторите эти шаги для всех оставшихся журналов. В этом примере мы создаем два раздела, на которых будут размещаться журналы для [.filename]#/usr# и [.filename]#/var#. Конечный результат показан на следующем скриншоте:
+
+image::disklabel2.png[]
+
+По завершении создания разделов мы рекомендуем вам записать на бумагу названия разделов и их точек монтирования: с этой информацией вы будете сверяться во время конфигурирования. Это также поможет уменьшить количество ошибок, приводящих к повреждению установки. Следующая табличка отображает наши заметки, сделанные для данного примера:
+
+.Разделы и журналы
+[cols="1,1,1", options="header"]
+|===
+| Раздел
+| Точка монтирования
+| Журнал
+
+|ad0s1d
+|/var
+|ad0s1h
+
+|ad0s1f
+|/usr
+|ad0s1g
+|===
+
+Дальше продолжайте обычную установку. Однако, мы рекомендуем вам отложить инсталляцию приложений сторонних разработчиков (пакетов) до полной настройки журналирования.
+
+[[first-boot]]
+=== Первая загрузка
+
+Ваша система загрузится нормально, однако вам необходимо будет подредактировать [.filename]#/etc/fstab# и удалить те лишние своп-разделы, которые вы создавали под журналы. Как правило, в названии файла устройства, созданного автоматически утилитой Sysinstall, присутствует суффикс "b" (в нашем примере это ad0s1b). Удалите другие записи о своп-разделах и перезагрузите компьютер, после чего FreeBSD перестанет их использовать.
+
+После второй перезагрузки, компьютер будет готов к конфигурированию журналирования.
+
+[[configure-journal]]
+== Настройка журналирования
+
+[[running-gjournal]]
+=== Работа с командой `gjournal`
+
+Подготовив необходимые разделы, перейдем к конфигурированию журналирования. Нам будет необходимо загрузиться в однопользовательском режиме, для этого залогинимся пользователем `root` и напечатаем:
+
+[source,bash]
+....
+# shutdown now
+....
+
+Нажмите kbd:[Enter] для получения приглашения командного интерпретатора. Нам необходимо будет размонтировать разделы, которые подлежат журналированию, в нашем примере это [.filename]#/usr# и [.filename]#/var#.
+
+[source,bash]
+....
+# umount /usr /var
+....
+
+Загрузите модуль ядра, необходимый для журналирования:
+
+[source,bash]
+....
+# gjournal load
+....
+
+На данном этапе сверьтесь со своими записями и определите, какие разделы будут использоваться под какой журнал. В нашем примере [.filename]#/usr# располагается на [.filename]#ad0s1f#, а его журнал будет располагаться на [.filename]#ad0s1g#, и, по аналогии, для [.filename]#/var#: файловая система располагается на [.filename]#ad0s1d#, а ее журнал - на [.filename]#ad0s1h#. Наберите следующие команды:
+
+[source,bash]
+....
+# gjournal label ad0s1f ad0s1g
+GEOM_JOURNAL: Journal 2948326772: ad0s1f contains data.
+GEOM_JOURNAL: Journal 2948326772: ad0s1g contains journal.
+
+# gjournal label ad0s1d ad0s1h
+GEOM_JOURNAL: Journal 3193218002: ad0s1d contains data.
+GEOM_JOURNAL: Journal 3193218002: ad0s1h contains journal.
+....
+
+[NOTE]
+====
+Если последний сектор любого из двух разделов (поставщиков данных) используется, команда `gjournal` возвратит ошибку. Вам необходимо будет использовать флаг `-F` для принудительной перезаписи, например:
+
+[source,bash]
+....
+# gjournal label -f ad0s1d ad0s1h
+....
+
+Так как это - новая установка, очень маловероятен факт, что что-нибудь будет действительно переписано.
+====
+
+На данном этапе созданы два устройства: [.filename]#ad0s1d.journal# и [.filename]#ad0s1f.journal#. Они представляют [.filename]#/var# и [.filename]#/usr# соответственно. Перед монтированием, нам необходимо установить флаг журналирования и снять флаг механизма Soft Updates:
+
+[source,bash]
+....
+# tunefs -J enable -n disable ad0s1d.journal
+tunefs: gjournal set
+tunefs: soft updates cleared
+
+# tunefs -J enable -n disable ad0s1f.journal
+tunefs: gjournal set
+tunefs: soft updates cleared
+....
+
+Теперь, смонтируйте новые устройства в соответствующие места файловой системы (обратите внимание на то, что мы можем использовать опцию монтирования `async`):
+
+[source,bash]
+....
+# mount -o async /dev/ad0s1d.journal /var
+# mount -o async /dev/ad0s1f.journal /usr
+....
+
+Откройте [.filename]#/etc/fstab# и исправьте записи для следующих файловых систем: [.filename]#/usr# и [.filename]#/var#:
+
+[.programlisting]
+....
+/dev/ad0s1f.journal /usr ufs rw,async 2 2
+/dev/ad0s1d.journal /var ufs rw,async 2 2
+....
+
+[WARNING]
+====
+
+Убедитесь, что упомянутые выше записи правильные, иначе старт системы будет проблематичным после перезагрузки!
+====
+
+И напоследок, подредактируйте [.filename]#/boot/loader.conf#: добавьте следующую строку и модуль man:gjournal[8] будет загружаться автоматически при старте системы:
+
+[.programlisting]
+....
+geom_journal_load="YES"
+....
+
+Поздравляем! Журналирование успешно сконфигурировано. Вам необходимо лишь набрать `exit` для возвращения в многопользовательский режим или перезагрузить систему, чтобы полностью проверить вашу конфигурацию (рекомендуется). Во время загрузки вы увидите сообщения, подобные следующим:
+
+[source,bash]
+....
+ad0: 76293MB XEC XE800JD-00HBC0 08.02D08 at ata0-master SATA150
+GEOM_JOURNAL: Journal 2948326772: ad0s1g contains journal.
+GEOM_JOURNAL: Journal 3193218002: ad0s1h contains journal.
+GEOM_JOURNAL: Journal 3193218002: ad0s1d contains data.
+GEOM_JOURNAL: Journal ad0s1d clean.
+GEOM_JOURNAL: Journal 2948326772: ad0s1f contains data.
+GEOM_JOURNAL: Journal ad0s1f clean.
+....
+
+После непредвиденного останова работы системы сообщения будут немного отличаться, например:
+
+[source,bash]
+....
+GEOM_JOURNAL: Journal ad0s1d consistent.
+....
+
+Это обычно значит, что man:gjournal[8] воспользовался информацией в журнале для возвращения файловой системы к целостному состоянию.
+
+[[gjournal-new]]
+=== Журналирование новых разделов
+
+Процедура, описанная выше, необходима для подключения журналирования разделов, содержащих данные. Журналирование пустых разделов немного проще, ввиду того, что поставщик данных и поставщик журнала могут быть размещены на одном и том же разделе. Например, предположим, что был установлен новый жесткий диск и был создан новый раздел [.filename]#/dev/ad1s1d#. Создание журнала не сложнее набора:
+
+[source,bash]
+....
+# gjournal label ad1s1d
+....
+
+Размер журнала - 1 Гб по умолчанию. Однако, вы можете изменить это значение используя ключ `-s`. Значение можно задавать в байтах, в килобайтах, мегабайтах или гигабайтах (используя суффикс `K`, `M` или `G`). Имейте ввиду, что команда `gjournal` не позволит вам создать журнал недопустимо малого размера.
+
+К примеру, чтобы создать журнал размером в 2Гб, можно использовать следующую команду:
+
+[source,bash]
+....
+# gjournal label -s 2G ad1s1d
+....
+
+Далее, вы можете создать файловую систему на новом разделе, а также разрешить журналирование ключом `-J`:
+
+[source,bash]
+....
+# newfs -J /dev/ad1s1d.journal
+....
+
+[[configure-kernel]]
+=== Встраивание журналирования в специализированное ядро
+
+Если вы не желаете загружать `geom_journal` как модуль, то можно встроить его функции прямо в ваше специализированное ядро. Редактируя конфигурационный файл ядра, убедитесь, что в нем находятся следующие две строки:
+
+[.programlisting]
+....
+options UFS_GJOURNAL # Прим.: Это включено в GENERIC
+
+options GEOM_JOURNAL # А эту строку необходимо добавить
+....
+
+Соберите и установите новое ядро следуя указаниям link:{handbook}#kernelconfig[Руководства FreeBSD.]
+
+И не забудьте удалить соответствующую строку загрузки модуля ("load") из [.filename]#/boot/loader.conf# (если на предыдущем этапе она была туда внесена).
+
+[[troubleshooting-gjournal]]
+== Устранение неполадок с журналированием
+
+Этот раздел содержит часто задаваемые вопросы касательно неполадок, связанных с журналированием.
+
+=== Я получаю паники ядра во время высокой дисковой активности. Как это связано с журналированием?
+
+Вероятно, что журнал заполняется раньше, чем происходит сброс его на диск. Помните, размер журнала зависит от загруженности диска, а не от размера поставщика данных. Если загрузка диска высокая, вам потребуется раздел большего размера для журнала. См. замечания в разделе <<understanding-journaling>>
+
+=== Я допустил некоторые ошибки во время конфигурирования, теперь система не загружается. Можно это как-нибудь исправить?
+
+Вы либо забыли внести запись (опечатались) в [.filename]#/boot/loader.conf#, либо есть ошибки в файле [.filename]#/etc/fstab#. Это легко исправить. Нажмите kbd:[Enter], чтобы получить приглашение командного интерпретатора в однопользовательском режиме. Потом, проверьте возможные варианты:
+
+[source,bash]
+....
+# cat /boot/loader.conf
+....
+
+Если отсутствует запись `geom_journal_load`, или она содержит ошибки, журналируемые устройства не создадутся. Загрузите модуль вручную, примонтируйте все разделы и переходите в многопользовательский режим (продолжайте загрузку).
+
+[source,bash]
+....
+# gjournal load
+
+GEOM_JOURNAL: Journal 2948326772: ad0s1g contains journal.
+GEOM_JOURNAL: Journal 3193218002: ad0s1h contains journal.
+GEOM_JOURNAL: Journal 3193218002: ad0s1d contains data.
+GEOM_JOURNAL: Journal ad0s1d clean.
+GEOM_JOURNAL: Journal 2948326772: ad0s1f contains data.
+GEOM_JOURNAL: Journal ad0s1f clean.
+
+# mount -a
+# exit
+(boot continues)
+....
+
+Если же запись о `geom_journal_load` верна, то проверьте [.filename]#/etc/fstab#. Вероятней всего, что вы обнаружите опечатку или отсутствие необходимой записи. В этом случае смонтируйте вручную оставшиеся разделы и продолжите загрузку в многопользовательский режим.
+
+=== Возможно ли отказаться от журналирования и вернуться к моей привычной файловой системе с механизмом Soft Updates?
+
+Несомненно. Используйте приведенную ниже последовательность действий, которая обращает изменения. Разделы, созданные для поставщиков журналов, могут позже быть использованы для других целей.
+
+Залогиньтесь `root` и переведите систему в однопользовательский режим:
+
+[source,bash]
+....
+# shutdown now
+....
+
+Размонтируйте журналируемые разделы:
+
+[source,bash]
+....
+# umount /usr /var
+....
+
+Синхронизируйте журналы:
+
+[source,bash]
+....
+# gjournal sync
+....
+
+Остановите поставщиков журналов:
+
+[source,bash]
+....
+# gjournal stop ad0s1d.journal
+# gjournal stop ad0s1f.journal
+....
+
+Удалите метаданные журналирования со всех задействованных устройств:
+
+[source,bash]
+....
+# gjournal clear ad0s1d
+# gjournal clear ad0s1f
+# gjournal clear ad0s1g
+# gjournal clear ad0s1h
+....
+
+Снимите флаг журналирования и установите флаг механизма Soft Updates:
+
+[source,bash]
+....
+# tunefs -J disable -n enable ad0s1d
+tunefs: gjournal cleared
+tunefs: soft updates set
+
+# tunefs -J disable -n enable ad0s1f
+tunefs: gjournal cleared
+tunefs: soft updates set
+....
+
+Смонтируйте вручную старые (первоначальные) устройства:
+
+[source,bash]
+....
+# mount -o rw /dev/ad0s1d /var
+# mount -o rw /dev/ad0s1f /usr
+....
+
+Откройте файл [.filename]#/etc/fstab# и приведите его к изначальному виду:
+
+[.programlisting]
+....
+/dev/ad0s1f /usr ufs rw 2 2
+/dev/ad0s1d /var ufs rw 2 2
+....
+
+И напоследок, удалите строку, загружающую модуль `geom_journal`, из файла [.filename]#/boot/loader.conf# и перезагрузите операционную систему.
+
+[[further-reading]]
+== Для дальнейшего ознакомления
+
+Журналирование - относительно новая функциональная возможность FreeBSD, и как такова, она еще недостаточно документирована. Однако, вы можете сочти полезными следующие источники:
+
+* Новый link:{handbook}#geom-gjournal[раздел Руководства FreeBSD], посвященный журналированию.
+* http://lists.freebsd.org/pipermail/freebsd-current/2006-June/064043.html[Этот пост] в списке рассылки {freebsd-current}, написанный `{pjd}` - автором man:gjournal[8].
+* http://lists.freebsd.org/pipermail/freebsd-questions/2008-April/173501.html[Этот пост] от `{ivoras}` в списке рассылки {freebsd-questions}.
+* Страницы справочника man:gjournal[8] и man:geom[8].
diff --git a/documentation/content/ru/articles/hubs/_index.adoc b/documentation/content/ru/articles/hubs/_index.adoc
new file mode 100644
index 0000000000..5130f1782b
--- /dev/null
+++ b/documentation/content/ru/articles/hubs/_index.adoc
@@ -0,0 +1,280 @@
+---
+title: Поддержка зеркал FreeBSD
+authors:
+ - author: Jun Kuriyama
+ email: kuriyama@FreeBSD.org
+ - author: Valentino Vaschetto
+ email: logo@FreeBSD.org
+ - author: Daniel Lang
+ email: dl@leo.org
+ - author: Ken Smith
+ email: kensmith@FreeBSD.org
+ - author: Дмитрий Морозовский
+releaseinfo: "$FreeBSD$"
+trademarks: ["freebsd", "general"]
+---
+
+= Поддержка зеркал FreeBSD
+:doctype: article
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:toc-title: Содержание
+:part-signifier: Часть
+:chapter-signifier: Глава
+:appendix-caption: Приложение
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+
+include::shared/ru/mailing-lists.adoc[lines=9..-1]
+include::shared/ru/urls.adoc[]
+include::shared/releases.adoc[]
+
+[.abstract-title]
+Аннотация
+
+Рабочий вариант статьи, описывающей процесс создания и поддержки зеркала FreeBSD и адресованной администраторам зеркал.
+
+'''
+
+toc::[]
+
+[NOTE]
+====
+На текущий момент заявки на подключение новых зеркал не принимаются.
+====
+
+[[mirror-contact]]
+== Контактная информация
+
+Координаторы системы зеркал доступны по электронной почте по адресу mailto:mirror-admin@FreeBSD.org[mirror-admin@FreeBSD.org]. Помимо этого, существует {freebsd-hubs}.
+
+[[mirror-requirements]]
+== Требования к зеркалам FreeBSD
+
+[[mirror-diskspace]]
+=== Дисковое пространство
+
+Одним из наиболее важных требований является дисковое пространство. В зависимости от набора релизов, архитектур и степени полноты зеркала вам может потребоваться огромный объем диска. Не лишним будет помнить, что _официальное_ зеркало, скорее всего, должно быть полным. Веб-страницы всегда должны зеркалироваться полностью. Кроме того, учтите, что приводимые оценки объема относятся к состоянию на момент последнего редактирования данной статьи ({rel112-current}-RELEASE/{rel120-current}-RELEASE). Дальнейший процесс разработки и последующие релизы только увеличат требуемый объем. Кроме того, разумно будет зарезервировать некоторое (10-20%) дополнительное пространство спокойствия ради. Вот некоторые оценки объема:
+
+* Полное зеркало FTP: 1.4 TB
+* Комплект изменений CTM: 10 GB
+* Веб-страницы: 1 GB
+
+Текущее использование диска зеркалом FTP можно посмотреть на link:ftp://ftp.FreeBSD.org/pub/FreeBSD/dir.sizes[ftp://ftp.FreeBSD.org/pub/FreeBSD/dir.sizes].
+
+[[mirror-bandwidth]]
+=== Требования к сетевой связности и пропускной способности
+
+Разумеется, у вас должно быть подключение к интернет. Требуемая пропускная способность ваших каналов зависит от предполагаемого профиля использования вашего зеркала. Если вы собираетесь копировать некоторые части FreeBSD для локального использования на вашей машине или в интранете, требования могут быть много мягче, чем для публичного зеркала. Для официального зеркала необходимая пропускная способность увеличивается еще больше. Мы можем дать лишь очень грубые оценки:
+
+* Зеркало для локального доступа: фактически минимум не определен, но канал шириной менее 2 Mbps может сделать процесс обновления мучительно медленным.
+* Неофициальное публичное зеркало: 34 Mbps выглядит неплохо для начала.
+* Официальное зеркало: рекомендуется канал шириной более 100 Mbps; кроме того, ваша машина должна стоять как можно ближе к граничным маршрутизаторам вашей сети.
+
+[[mirror-system]]
+=== Системные требования, процессор и память
+
+Эти требования в первую очередь определяются максимальным ожидаемым количеством клиентов (устанавливается администратором сервера). Также, на требуемые ресурсы влияет список сервисов, которые вы будете предоставлять. Зеркала FTP и/или HTTP не требуют особенно много ресурсов. Будьте на чеку, если планируете предоставлять rsync. Выбор rsync может иметь огромное влияние на требования к аппаратным ресурсам, поскольку rsync признан "прожорливым" по памяти. Вот некоторые советы по конфигурации аппаратной части сервера:
+
+Для умеренно посещаемого сайта, предоставляющего rsync, можно использовать процессор с частотой 800MHz - 1 GHz и по крайней мере 512MB памяти. Скорее всего, данная конфигурация может считаться минимальной для _официального_ зеркала.
+
+Для регулярно посещаемого сайта вам потребуется больше памяти (хорошим стартом будет 2GB) и больше процессорной мощности, что может означать требование многопроцессорной (SMP) платформы.
+
+Кроме того, вам потребуется быстрая дисковая подсистема, в первую очередь, для работы с репозиторием SVN (крайне рекомендуем RAID). Контроллер SCSI, оборудованный собственной памятью, также может ощутимо ускорить процесс, поскольку большая часть сервисов связана с большим количеством дисковых запросов небольшого размера.
+
+[[mirror-services]]
+=== Предоставляемые сервисы
+
+Всякое зеркало должно предоставлять набор основных сервисов. Помимо требуемого минимального набора, существуют дополнительные сервисы, которые администратор сервера может пожелать предоставлять. Этот раздел описывает, какие сервисы вы можете предоставлять, и какие действия для этого потребуются от вас.
+
+[[mirror-serv-ftp]]
+==== FTP (требуется для FTP зеркала)
+
+Это один из наиболее базовых сервисов; его предоставление требуется для каждого зеркала, распространяющего файлы FreeBSD по FTP. Доступ по FTP должен быть анонимным, и не должны применяться какие-либо ограничения по соотношению объема передано/принято (что вообще является, на наш взгляд, странным подходом). Закачка (upload) файлов на сервер не требуется (и _должна_ быть запрещена в разделе FreeBSD). Кроме того, архив файлов FreeBSD должен быть доступен с путем [.filename]#/pub/FreeBSD#.
+
+ Для предоставления анонимного FTP доступа может быть использован целый ряд программ (перечислены в алфавитном порядке):
+
+* `/usr/libexec/ftpd`: базовый FTP-даемон FreeBSD. Не забудьте прочитать man:ftpd[8].
+* package:ftp/ncftpd[]: коммерческий пакет, свободен для использования в учебных целях.
+* package:ftp/oftpd[]: FTP-даемон, написанный в основном с точки зрения защищенности.
+* package:ftp/proftpd[]: Модульный и очень гибкий FTP-даемон.
+* package:ftp/pure-ftpd[]: Еще один FTP-даемон, разработанный с позиций защищенности.
+* package:ftp/twoftpd[]: См. предыдущий пункт.
+* package:ftp/vsftpd[]: "очень защищенный" ("very secure") ftpd.
+
+ftpd, proftpd и, возможно, ncftpd являются наиболее часто встречающимися FTP серверами. Прочие распространены среди существующих зеркал в существенно меньшей степени. Дополнительным поводом для рассмотрения может являться возможность гибко ограничивать количество одновременных соединений, что поможет вам удержать в нужных рамках потребление пропускной способности ваших каналов и машинные ресурсы.
+
+[[mirror-serv-rsync]]
+==== Rsync (необязательный сервис для FTP зеркала)
+
+rsync часто используется для предоставления доступа к FTP-области FreeBSD, чтобы другие зеркала могли синхронизироваться по вашему. Протокол rsync во многом отличается от FTP, в частности, он гораздо гуманнее с точки зрения пропускной способности каналов, поскольку не требует передачи измененного файла целиком (передаются лишь различия). Взамен rsync требует значительных объемов памяти. Размер каждого процесса зависит от размера синхронизируемого модуля (в основном от количества директорий и файлов). rsync может использовать в качестве транспортного протокола `rsh` или `ssh` (по умолчанию); также, может использоваться внутренний протокол rsync (этот метод предпочтителен для публичных rsync-серверов). Поддерживается авторизация клиентов и различные ограничения. Для протокола rsync существует единственный пакет:
+
+* package:net/rsync[]
+
+[[mirror-serv-http]]
+==== HTTP (требуется для веб-страниц, дополнителен для FTP зеркал)
+
+Если вы хотите поддерживать зеркало веб-страниц FreeBSD, вам потребуется установить веб-сервер. Дополнительно, вы можете предоставлять HTTP доступ к FTP-набору файлов FreeBSD. Выбор веб-сервера остается на усмотрение администратора зеркала. Некоторые из наиболее популярных веб-серверов перечислены ниже.
+
+* package:www/apache13[]: Apache - самый широко распространённый в Интернете веб-сервер, активно используемый проектом FreeBSD. Вы можете также использовать веб-сервер Apache следующего поколения, доступный в коллекции портов как package:www/apache22[].
+* package:www/thttpd[]: Для обслуживания большого количества запросов к статическим документам сервер thttpd может оказаться более эффективным, чем Apache. thttpd отлично оптимизирован по производительности при работе под FreeBSD.
+* package:www/boa[]: Boa - еще одна альтернатива thttpd и Apache. Этот сервер должен быть ощутимо более высокопроизводительным, чем Apache, для полностью статических страниц. На время написания данного документа, впрочем, он не так хорошо оптимизирован под FreeBSD, как thttpd.
+* package:www/nginx[]: Nginx - высокопроизводительный веб-сервер, отличающийся низкими требованиями к объему оперативной памяти и обладающий ключевыми функциональными возможностями для построения современной веб-инфраструктуры. Функциональные возможности включают следующее: HTTP-сервер, обратный прокси для HTTP, почтовый прокси сервер, кеширование, балансировка нагрузки, сжатие, ограничение количества запросов, мультиплексирование и повторное использование соединений, поддержка разгрузки SSL (SSL offload) и вещания медиапотоков (media streaming).
+
+[[mirror-howto]]
+== Как вести зеркало FreeBSD
+
+Теперь вам известно, какая потребуется машина и как предоставлять сервисы, но не как получить их самому. :-) В этом разделе описывается процесс ведения зеркала и поддержания его в актуальном состоянии, в том числе какие инструменты использовать и какие сайты выбирать в качестве источников для синхронизации.
+
+[[mirror-ftp-rsync]]
+=== Зеркалирование FTP-области
+
+Файлы, доступные по FTP, составляют большую часть зеркала. Они включают __дистрибутивные наборы__, необходимые для установки по сети, __ветви (branches)__, в которых отражено текущее состояние исходных текстов, _образы ISO_ для записи компакт-дисков с дистрибутивами для установки, образами "живых" файловых систем и пакетами, дерево портов, исходные дистрибутивы для сборки портов и кучу готовых пакетов. И, разумеется, все вышеописанное - для разных версий FreeBSD и различных архитектур.
+
+Наиболее эффективным будет синхронизация FTP-области при помощи rsync. Для этого следует установить пакет package:net/rsync[], который был описан в разделе <<mirror-serv-rsync>>. Поскольку доступ по протоколу rsync не является обязательным, выбранный вами сайт может его не поддерживать. Возможно, вам придется немного поискать в сетевой окрестности зеркало, поддерживающее rsync.
+
+[NOTE]
+====
+Поскольку от количества клиентов rsync ощутимо зависит загрузка сервера, большинство администраторов вводят ограничения доступа. Для поддержания зеркала вам следует связаться с администратором сайта, с которым вы будете синхронизироваться, для уточнения локальных правил и, возможно, для внесения в них исключения для вас (поскольку вы также поддерживаете зеркало).
+====
+
+Строка для синхронизации FreeBSD по rsync выглядит примерно так:
+
+[source,bash]
+....
+% rsync -vaHz --delete rsync://ftp4.de.FreeBSD.org/FreeBSD/ /pub/FreeBSD/
+....
+
+Загляните в документацию по rsync, также доступную по адресу http://rsync.samba.org/[http://rsync.samba.org/] за дополнительной информацией по различным опциям rsync. Обратите внимание, что в случае синхронизации модуля целиком (а не отдельного каталога) необходимо явно указать результирующий каталог, потому что каталог с именем модуля (в данном случае "FreeBSD") не создается. Для поддержания актуальности вам потребуется создать скрипт для запуска подобной команды из man:cron[8].
+
+[[mirror-www]]
+=== Зеркалирование страниц WWW
+
+Веб-сайт FreeBSD следует зеркалировать исключительно при помощи rsync.
+
+Командная строка для синхронизации веб-сайта FreeBSD выглядит примерно так:
+
+[source,bash]
+....
+% rsync -vaHz --delete rsync://bit0.us-west.freebsd.org/FreeBSD-www-data/ /usr/local/www/
+....
+
+[[mirror-how-often]]
+=== Как часто синхронизироваться?
+
+Каждое зеркало должно регулярно обновляться. Вам потребуется какой-то набор скриптов, выполняемых посредством man:cron[8]. Поскольку каждый администратор, как правило, пишет такие скрипты сам и на свой лад, мы не можем выдать конкретных указаний. Общие же советы выглядят так:
+
+[.procedure]
+. Создайте скрипт с командой, которая запустит нужное приложение для обновления зеркала. Рекомендуем использовать скрипт на языке обычного `/bin/sh`.
+. Добавьте команд перенаправления вывода, чтобы записать диагностику работы в файл.
+. Попробуйте, как ваш скрипт работает. По завершении проверьте логи.
+. При помощи утилиты man:crontab[1] добавьте ваш скрипт в таблицу регулярных заданий man:crontab[5] соответствующего пользователя. Это должен быть пользователь, отличный от пользователя FTP-даемона, чтобы файлы в FTP-области без атрибута "чтение для всех" не были доступны анонимным FTP-пользователям. Данное свойство используется для тестирования перед выходом новых релизов, для того чтобы удостовериться, что все официальные зеркала содержат все необходимые файлы к моменту официального объявления релиза.
+
+Некоторые рекомендуемые установки частоты обновления:
+
+* FTP-набор: раз в сутки
+* WWW-страницы: раз в сутки
+
+[[mirror-where]]
+== С какого сервера синхронизироваться
+
+Это важный вопрос, так что мы попытаемся пояснить, откуда берутся ответы. Для начала повторим еще несколько раз: _никогда не синхронизируйтесь с ftp.FreeBSD.org_.
+
+[[mirror-where-organization]]
+=== Организация системы зеркал
+
+Зеркала организуются по странам. Имена хостов всех официальных зеркал построены по принципу `ftpN.CC.FreeBSD.org`, где _CC_ (country code) - домен верхнего уровня страны, где расположено зеркало, _N_ - номер зеркала в данной стране. Этот же принцип применим к именам хостов `wwwN.CC.FreeBSD.org` и т.п. Кроме того, есть зеркала без доменной части, обозначающей страну. Все они имеют очень хорошие внешние каналы и обслуживают большое число одновременных соединений. Имя `ftp.FreeBSD.org` на самом деле указывает на две машины, одна из которых в настоящее время находится в Дании, а другая в США. Ни одна из этих машин _НЕ_ является основным сайтом, и потому не должна использоваться для синхронизации. Масса документации для "живых" пользователей указывает на `ftp.FreeBSD.org`, так что автоматическим системам ведения зеркал следует выбирать другие источники синхронизации.
+
+Кроме того, существует иерархия зеркал в терминах их удаленности от центра, или __слоях__. Основные сайты могут быть описаны как __Зеркала нулевого слоя__. Зеркала, синхронизирующиеся по ним, считаются __слоем 1__, следующие - _слоем 2_ и т.д. Официальные сайты приглашаются на низкие слои, однако следует помнить, что чем меньше номер слоя, тем выше требования к зеркалу, как было описано в <<mirror-requirements>>. Помимо того, доступ к зеркалам 1 слоя может быть ограничен; безусловно ограничен доступ к основным сайтам. Иерархия _слоев_ не отражается в DNS и, вообще говоря, нигде (кроме мастер-сайтов) не документирована. Тем не менее, официальные зеркала с малыми (1-4, как правило) номерами обычно представляют первый слой. (Это грубая оценка, и ни в коем случае не правило).
+
+[[mirror-where-where]]
+=== Так откуда же мне синхронизироваться?
+
+Главное - НЕ с `ftp.FreeBSD.org`. Короткий ответ: с зеркала, которое расположено недалеко от вас в терминах Интернет, и/или доступ к которому наилучший.
+
+[[mirror-where-simple]]
+==== Я хочу получить копию зеркала хоть откуда-нибудь!
+
+Если у вас нет каких-либо специальных предпочтений или требований, см. <<mirror-where-where>>. Это означает:
+
+[.procedure]
+. Выберите те из них, с которыми вам работать быстрее всего (меньшее число промежуточных узлов и время отклика), и которые предоставляют нужные вам сервисы (такие как rsync).
+. Свяжитесь с администраторами выбранного сервера, опишите ваши запросы и уточните их правила.
+. Сконфигурируйте ваше зеркало, как описывалось выше.
+
+[[mirror-where-official]]
+==== Я поддерживаю официальное зеркало, какой сайт мне выбрать?
+
+В основном, правила, описанные в <<mirror-where-simple>>, применимы. Дополнительно можно убедиться, что выбранный сайт принадлежит низкому слою. Другие соображения относительно _официальных_ зеркал описаны в <<mirror-official>>.
+
+[[mirror-where-master]]
+==== Мне нужен доступ к основным сайтам!
+
+При наличии достаточных причин вы можете получить доступ к одному из основных сайтов. Доступ к ним ограничен; существуют специальные правила их использования. Наличие у вас статуса _официального_ зеркала, безусловно, является хорошим подспорьем. В противном случае убедитесь, что ваша страна действительно нуждается еще в одном зеркале. Если их уже три или более, сначала свяжитесь с администратором соответствующей зоны DNS (mailto:hostmaster@CC.FreeBSD.org[hostmaster@CC.FreeBSD.org]) или напишите в {freebsd-hubs}.
+
+Доступ к одному из мастер-сайтов или подходящему зеркалу 1 уровня вам помогут обеспечить те же, кто помогал вам получить статус _официального_ зеркала. В случае неудачи свяжитесь с mailto:mirror-admin@FreeBSD.org[mirror-admin@FreeBSD.org] и попросите помощи у них.
+
+Существует один основной сайт для синхронизации набора файлов FTP.
+
+[[mirror-where-master-ftp]]
+===== ftp-master.FreeBSD.org
+
+Это основной сервер для синхронизации FTP набора.
+
+В дополнение к FTP, `ftp-master.FreeBSD.org` поддерживает доступ по rsync. Использование этих протоколов описано в <<mirror-ftp-rsync>>.
+
+Приветствуется предоставление зеркалами _1 уровня_ доступа к FTP-области по протоколу rsync.
+
+[[mirror-official]]
+== Официальные зеркала
+
+Официальные зеркала обладают следующим свойствами:
+
+* a) имеют запись в домене `FreeBSD.org` (обычно типа CNAME).
+* b) присутствуют в списке официальных зеркал в Руководстве по FreeBSD и другой документации.
+
+На настоящий момент это все, что отличает их от прочих зеркал. Официальные зеркала не обязательно принадлежат к __Первому уровню__, однако, вряд ли можно найти зеркало __уровня 1__, не являющееся официальным.
+
+[[mirror-official-requirements]]
+=== Отдельные требования к официальным зеркалам 1 уровня
+
+Описать требования для всех официальных зеркал не так просто, поскольку проект FreeBSD достаточно мягок в этом отношении. Несколько проще указать, что требуется от __официальных зеркал уровня 1__. Прочие официальные зеркала должны рассматривать этот список как __настойчивые пожелания__.
+
+Зеркала 1 уровня должны:
+
+* поддерживать полный список файлов
+* предоставлять доступ для других зеркал
+* обеспечивать доступ по протоколам ftp и rsync.
+
+Кроме того, администратор такого зеркала должен быть подписан на {freebsd-hubs}. См. link:{handbook}#eresources-mail[здесь] для дополнительной информации о подписке.
+
+[IMPORTANT]
+====
+Администраторы зеркал, в особенности 1 уровня, должны _очень_ внимательно следить за http://www.FreeBSD.org/releng/[графиком релизов]. Это поможет подготовиться к крупным всплескам нагрузки на зеркало, которые всегда происходят после очередного релиза.
+
+Кроме того, важно поддерживать актуальность зеркал (в особенности зеркал уровня 1). Если Зеркало1 не синхронизировалось в течение длительного времени, то зеркала следующего уровня будут синхронизироваться по устаревшей информации и т.д. Поддерживайте актуальность ваших зеркал!
+====
+
+[[mirror-official-become]]
+=== Как стать официальным зеркалом?
+
+На текущий момент заявки на подключение новых зеркал не принимаются.
+
+[[mirror-statpages]]
+== Статистика некоторых зеркал
+
+Вот несколько ссылок на статистику использования зеркал
+
+[[mirror-statpagesftp]]
+=== Статистика FTP сайтов
+
+* ftp.is.FreeBSD.org - mailto:hostmaster@is.FreeBSD.org[hostmaster@is.FreeBSD.org] - http://www.rhnet.is/status/draupnir/draupnir.html[ (загрузка канала)] http://www.rhnet.is/status/ftp/ftp-notendur.html[(FTP процессы)] http://www.rhnet.is/status/ftp/http-notendur.html[(HTTP процессы)]
+* ftp.cz.FreeBSD.org - mailto:cejkar@fit.vutbr.cz[cejkar@fit.vutbr.cz] - http://www.cz.FreeBSD.org/stats/mrtg/net.html[(загрузка канала)] http://www.freebsd.cz/stats/mrtg/ftpd.html[(FTP процессы)] http://www.freebsd.cz/stats/mrtg/rsyncd.html[(rsync процессы)]
+
+* ftp2.ru.FreeBSD.org - mailto:mirror@macomnet.ru[mirror@macomnet.ru] - http://mirror.macomnet.net/mrtg/mirror.macomnet.net_195.128.64.25.html[(Bandwidth)] http://mirror.macomnet.net/mrtg/mirror.macomnet.net_proc.html[(HTTP and FTP users)]
diff --git a/documentation/content/ru/articles/ipsec-must/_index.adoc b/documentation/content/ru/articles/ipsec-must/_index.adoc
new file mode 100644
index 0000000000..dcef69d999
--- /dev/null
+++ b/documentation/content/ru/articles/ipsec-must/_index.adoc
@@ -0,0 +1,262 @@
+---
+title: Независимое исследование работы IPsec во FreeBSD
+authors:
+ - author: David Honig
+ email: honig@sprynet.com
+releaseinfo: "$FreeBSD$"
+trademarks: ["freebsd", "opengroup", "general"]
+---
+
+= Независимое исследование работы IPsec во FreeBSD
+:doctype: article
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:toc-title: Содержание
+:part-signifier: Часть
+:chapter-signifier: Глава
+:appendix-caption: Приложение
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+
+include::shared/ru/urls.adoc[]
+
+[.abstract-title]
+Аннотация
+
+Вы только что установили и настроили IPsec, и оно, кажется, заработало. Как это можно проверить? Я опишу метод экспериментальной проверки правильного функционирования IPsec.
+
+'''
+
+toc::[]
+
+[[problem]]
+== Постановка задачи
+
+Для начала предположим, что Вы <<ipsec-install>>. Как Вы узнаете, что IPsec <<caveat>>? Несомненно, соединения не будет, если Вы неверно его сконфигурировали. И оно, конечно, появится в выводе команды man:netstat[1], когда Вы всё сделаете верно. Но можно ли как-то подтвердить сам факт функционирования IPsec?
+
+[[solution]]
+== Решение
+
+Для начала немножко криптографической теории:
+
+. Шифрованные данные равномерно распределены по области определения, то есть каждый символ имеет максимальную энтропию;
+. "Сырые" и несжатые данные как правило избыточны, то есть их энтропия меньше максимально возможной.
+
+Предположим, что у Вас имеется возможность измерить энтропию входящего и исходящего трафика на сетевом интерфейсе. В этом случае Вы сможете легко отличить зашифрованные данные от открытых, причём даже в том случае, когда часть данных в "режиме шифрования" передаётся в открытом виде, к примеру внешние заголовки IP, которые используются для маршрутизации.
+
+[[MUST]]
+=== MUST
+
+"Универсальный Статистический Тест для Генераторов Случайных Чисел" Уэли Маурера (Ueli Maurer's Universal Statistical Test for Random Bit Generators), сокращённо http://www.geocities.com/SiliconValley/Code/4704/universal.pdf[MUST] позволяет быстро измерить энтропию последовательного набора данных. Используемый алгоритм похож на алгоритм сжатия. <<code>> приведён исходный код, позволяющий измерять энтропию последовательных кусков данных размером около четверти мегабайта.
+
+[[tcpdump]]
+=== Tcpdump
+
+Ещё нам нужен способ сохранения информации, проходящей через интерфейс. Программа man:tcpdump[1] позволяет сделать это в случае, если Вы <<kernel>> с поддержкой __Пакетного Фильтра Беркли (Berkeley Packet Filter)__.
+
+Команда
+
+[source,bash]
+....
+ tcpdump -c 4000 -s 10000 -w dumpfile.bin
+....
+
+сохранит 4000 пакетов в файл _dumpfile.bin_. В данном примере объём записываемой информации в каждом пакете не может превышать 10,000 байтов.
+
+[[experiment]]
+== Эксперимент
+
+Повторите следующие шаги эксперимента:
+
+[.procedure]
+. Откройте два окна терминала и свяжитесь в одном из них с каким-нибудь компьютером через канал IPsec, а в другом - с обычным, "незащищённым" компьютером.
+. Теперь начните <<tcpdump>>.
+. В "шифрованном" окне запустите команду UNIX(R) man:yes[1], которая будет выдавать бесконечный поток символов `y`. Немножко подождите и завершите её. Затем переключитесь в обычное окно (не использующее канал IPsec) и сделайте то же самое.
+. Заключительный этап: запустите <<code>>, передав ему для обработки только что сохранённые пакеты через командную строку. Вы должны увидеть что-то вроде изображённого чуть ниже. Заметьте, что безопасное соединение имеет 93% (6,7) от ожидаемого значения (7,18), а обычное соединение - всего лишь 29% (2,1).
++
+[source,bash]
+....
+% tcpdump -c 4000 -s 10000 -w ipsecdemo.bin
+% uliscan ipsecdemo.bin
+Uliscan 21 Dec 98
+L=8 256 258560
+Measuring file ipsecdemo.bin
+Init done
+Expected value for L=8 is 7.1836656
+6.9396 --------------------------------------------------------
+6.6177 -----------------------------------------------------
+6.4100 ---------------------------------------------------
+2.1101 -----------------
+2.0838 -----------------
+2.0983 -----------------
+....
+
+[[caveat]]
+== Замечание
+
+Этот эксперимент показывает, что IPsec _действительно_ распределяет передаваемые байты по области определения __равномерно__, как и любое другое шифрование. Однако этот метод _не может_ обнаружить множество других изъянов в системе (хотя я таковых не знаю). Для примера можно привести плохие алгоритмы генерации или обмена ключами, нарушение конфиденциальности данных или ключей, использование слабых в криптографическом смысле алгоритмов, взлом ядра и т. д. Изучайте исходный код, узнавайте, что там происходит.
+
+[[IPsec]]
+== Определение IPsec
+
+IPsec представляет собой протокол безопасного обмена информацией по Internet. Существует в виде расширения к IPv4; является неотъемлемой частью IPv6. Содержит в себе протокол шифрования и аутентификации на уровне IP (межмашинное "host-to-host" взаимодействие). SSL защищает только лишь конкретный прикладной сокет; SSH защищает вход на машину; PGP защищает определённый файл или письмо. IPsec шифрует всю информацию, передаваемую между двумя машинами.
+
+[[ipsec-install]]
+== Установка IPsec
+
+Большинство современных версий FreeBSD уже имеют поддержку IPsec. Вероятно, Вы должны будете лишь добавить опцию `IPSEC` в конфигурационный файл ядра, и после сборки и инсталляции нового ядра, сконфигурировать соединение IPsec с помощью команды man:setkey[8].
+
+Более подробно о том, как запустить IPsec во FreeBSD можно прочесть в link:{handbook}#ipsec[Руководстве пользователя].
+
+[[kernel]]
+== src/sys/i386/conf/KERNELNAME
+
+Для того, чтобы захватывать сетевой трафик при помощи man:tcpdump[1], следующие строки должны присутствовать в конфигурационном файле ядра. Не забудьте после модификации запустить man:config[8], и, как обычно, пересобрать и установить новое ядро.
+
+[.programlisting]
+....
+device bpf
+....
+
+[[code]]
+== Универсальный Статистический Тест Маурера (размер блока - 8 бит)
+
+Оригинал нижеприведённого кода находится по http://www.geocities.com/SiliconValley/Code/4704/uliscanc.txt[ этому адресу].
+
+[.programlisting]
+....
+/*
+ ULISCAN.c ---blocksize of 8
+
+ 1 Oct 98
+ 1 Dec 98
+ 21 Dec 98 uliscan.c derived from ueli8.c
+
+ This version has // comments removed for Sun cc
+
+ This implements Ueli M Maurer's "Universal Statistical Test for Random
+ Bit Generators" using L=8
+
+ Accepts a filename on the command line; writes its results, with other
+ info, to stdout.
+
+ Handles input file exhaustion gracefully.
+
+ Ref: J. Cryptology v 5 no 2, 1992 pp 89-105
+ also on the web somewhere, which is where I found it.
+
+ -David Honig
+ honig@sprynet.com
+
+ Usage:
+ ULISCAN filename
+ outputs to stdout
+*/
+
+#define L 8
+#define V (1<<L)
+#define Q (10*V)
+#define K (100 *Q)
+#define MAXSAMP (Q + K)
+
+#include <stdio.h>
+#include <math.h>
+
+int main(argc, argv)
+int argc;
+char **argv;
+{
+ FILE *fptr;
+ int i,j;
+ int b, c;
+ int table[V];
+ double sum = 0.0;
+ int iproduct = 1;
+ int run;
+
+ extern double log(/* double x */);
+
+ printf("Uliscan 21 Dec 98 \nL=%d %d %d \n", L, V, MAXSAMP);
+
+ if (argc < 2) {
+ printf("Usage: Uliscan filename\n");
+ exit(-1);
+ } else {
+ printf("Measuring file %s\n", argv[1]);
+ }
+
+ fptr = fopen(argv[1],"rb");
+
+ if (fptr == NULL) {
+ printf("Can't find %s\n", argv[1]);
+ exit(-1);
+ }
+
+ for (i = 0; i < V; i++) {
+ table[i] = 0;
+ }
+
+ for (i = 0; i < Q; i++) {
+ b = fgetc(fptr);
+ table[b] = i;
+ }
+
+ printf("Init done\n");
+
+ printf("Expected value for L=8 is 7.1836656\n");
+
+ run = 1;
+
+ while (run) {
+ sum = 0.0;
+ iproduct = 1;
+
+ if (run)
+ for (i = Q; run && i < Q + K; i++) {
+ j = i;
+ b = fgetc(fptr);
+
+ if (b < 0)
+ run = 0;
+
+ if (run) {
+ if (table[b] > j)
+ j += K;
+
+ sum += log((double)(j-table[b]));
+
+ table[b] = i;
+ }
+ }
+
+ if (!run)
+ printf("Premature end of file; read %d blocks.\n", i - Q);
+
+ sum = (sum/((double)(i - Q))) / log(2.0);
+ printf("%4.4f ", sum);
+
+ for (i = 0; i < (int)(sum*8.0 + 0.50); i++)
+ printf("-");
+
+ printf("\n");
+
+ /* refill initial table */
+ if (0) {
+ for (i = 0; i < Q; i++) {
+ b = fgetc(fptr);
+ if (b < 0) {
+ run = 0;
+ } else {
+ table[b] = i;
+ }
+ }
+ }
+ }
+}
+....
diff --git a/documentation/content/ru/articles/mailing-list-faq/_index.adoc b/documentation/content/ru/articles/mailing-list-faq/_index.adoc
new file mode 100644
index 0000000000..e6154b6a70
--- /dev/null
+++ b/documentation/content/ru/articles/mailing-list-faq/_index.adoc
@@ -0,0 +1,165 @@
+---
+title: Часто задаваемые вопросы по спискам рассылки FreeBSD
+authors:
+ - author: The FreeBSD Documentation Project
+copyright: 2004-2005 The FreeBSD Documentation Project
+releaseinfo: "$FreeBSD$"
+---
+
+= Часто задаваемые вопросы по спискам рассылки FreeBSD
+:doctype: article
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:toc-title: Содержание
+:part-signifier: Часть
+:chapter-signifier: Глава
+:appendix-caption: Приложение
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+
+include::shared/authors.adoc[]
+include::shared/ru/mailing-lists.adoc[lines=9..-1]
+include::shared/ru/urls.adoc[]
+
+[.abstract-title]
+Аннотация
+
+Эта статья посвящена часто задаваемым вопросам (FAQ) по спискам рассылки FreeBSD. Если вы хотите помочь поддерживать данный документ, напишите письмо в {freebsd-doc}. Последняя версия данного документа доступна на link:.[WWW сервере FreeBSD]. Вы можете получить данную статью в виде одного большого link:.[HTML] файла, используя HTTP протокол или в виде простого текста, форматов PostScript, PDF, и других с link:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/[FTP сервера FreeBSD]. Возможно вы захотите link:https://www.FreeBSD.org/search/[Найти FAQ].
+
+'''
+
+toc::[]
+
+[[introduction]]
+== Введение
+
+Цель этого документа ответить на часто задаваемые вопросы, касающиеся списков рассылки FreeBSD. Хотя FAQ задумывались для снижения количества задаваемых повторяющихся вопросов, они стали восприниматься, как ценные источники информации.
+
+Этот документ - попытка представить консенсус всего сообщества, и поэтому он не может считаться __официальным__. Если вы найдете технические неточности в данном документе или у вас есть предложения по добавлению новых пунктов, пожалуйста отправьте PR или напишите в {freebsd-doc}. Спасибо.
+
+=== Зачем вообще нужны списки рассылки по FreeBSD?
+
+Списки рассылки по FreeBSD служат, как первичное средство связи FreeBSD сообщества, они покрывают множество различных тем.
+
+=== Кто пользуется этими списками рассылки?
+
+Это зависит от темы обсуждения каждого конкретного списка рассылки. Некоторые списки больше ориентированны на разработчиков, некоторые на всё сообщество FreeBSD в целом. Список существующих на сегодняшний день списков рассылки доступен http://lists.FreeBSD.org/mailman/listinfo[здесь].
+
+=== Доступны ли списки рассылки по FreeBSD для каждого?
+
+Повторюсь, это зависит от характера обсуждаемых тем в каждом конкретном листе. Пожалуйста прочтите устав списка рассылки перед отправлением в него письма и соблюдайте его при каждом отправлении. Это будет полезно каждому получить больше опыта по работе со списками рассылки.
+
+Если после просмотра выше расположенного списка, вы до сих пор не знаете в какой список рассылки направить письмо, то вам наверняка подойдёт freebsd-questions (но прежде прочтите ниже).
+
+Заметьте, что для отправки письма в список рассылки необязательно быть подписанным на него. Это поможет легче присоединиться к сообществу FreeBSD и способствует открытому обмену идей. Но, из-за небрежности некоторых людей некоторые списки проводят политику предварительного ручного просмотра сообщений от не подписанных пользователей, чтобы убедиться в их целесообразности.
+
+=== Как я могу подписаться?
+
+Вы можете использовать http://lists.FreeBSD.org/mailman/listinfo[web интерфейс Mailman] для подписки на любой из открытых списков рассылки.
+
+=== Как мне отписаться?
+
+Вы можете использовать вышеупомянутый интерфейс или следовать инструкциям, находящимся в конце каждого письма, отправленного в этот список рассылки.
+
+Пожалуйста, не посылайте письма с отказом от подписки в сами публичные списки. Во-первых, вы так не отпишитесь, а во-вторых, вызовете раздражение подписчиков, и вероятно получите неприятные высказывания в свой адрес. Это классическая ошибка при работе со списками рассылки; старайтесь не повторять её.
+
+=== Доступны ли архивы?
+
+Да. Архивы доступны http://docs.FreeBSD.org/mail/[здесь].
+
+=== Доступны ли списки рассылки в дайджест формате?
+
+Да. Посмотрите http://lists.FreeBSD.org/mailman/listinfo[web интерфейс Mailman].
+
+[[etiquette]]
+== Этикет списков рассылки
+
+Участие в любом списке рассылки, как и в любом другом сообществе требует общего базиса для общения. Пожалуйста, отправляйте только подходящие сообщения и следуйте общепринятым нормам этикета.
+
+=== Что я должен сделать перед отправлением письма?
+
+Вы уже сделали важный шаг, решив прочитать эту статью. Если вы новичок во FreeBSD, то сначала ознакомьтесь с программным обеспечением и связанной с нею документацией, включающей множество link:https://www.FreeBSD.org/docs/[книг и статьей]. Могут быть интересными: link:{faq}[Часто задаваемые вопросы по FreeBSD (FAQ)], link:{handbook}[Руководство по FreeBSD], и статьи link:{freebsd-questions-article}[Как работать со списком рассылки FreeBSD-questions с максимальной отдачей], link:{explaining-bsd}[Что такое BSD], и link:{new-users}[Пособие для новичков во FreeBSD].
+
+Вы можете получить нелицеприятные высказывания в свой адрес, если зададите вопрос, ответ на который есть в приведённой выше документации. Это не потому что добровольцы, работающие над данным проектом очень плохие люди, а после многократного ответа на одни и те же вопросы - раздражение берёт своё. Это особенно справедливо, если уже существует и доступен ответ на вопрос. Не забывайте, что вся работа по улучшению FreeBSD выполняется добровольцами, и что мы только люди.
+
+=== Что считается несоответствующим письмом?
+
+* Письма должны соответствовать уставу списка рассылки.
+* Избегайте личных оскорблений. Как хорошие жители сети, мы должны держать себя по высоким стандартам поведения.
+* Спам не разрешён. Нарушители данного правила будут забаненны.
+
+=== Что считается хорошим этикетом при посылке писем в списки рассылки?
+
+* Пожалуйста, составляйте строки длиной примерно в 75 символов, так так не каждый использует модную почтовую программу с графическим интерфейсом.
+* Пожалуйста, обращайте внимание на тот факт, что пропускная способность ограничена. Не каждый читает почту через высокоскоростное соединение. Если вы отправляете содержимое какого-нибудь файла, например [.filename]#config.log# или объёмную трассировку стека, то, пожалуйста, размещайте его на каком-нибудь веб-сайте и присылайте просто ссылку на на него. Помните, что такие сообщения будут заархивированны, и это просто добавит ненужные байты к архиву.
+* Оформляйте ваше сообщение, чтобы оно было читабельно и ПОЖАЛУЙСТА, НЕ КРИЧИТЕ!!!!!. Не упускайте из виду эффект, которое производит плохо отформатированное письмо, причём не только в списках рассылки FreeBSD. Ваше сообщение будет просмотрено другими людьми, и если оно плохо отформатировано, имеет множество ошибок и/или восклицательных знаков, то это создаст нехорошее впечатление о вас.
+* Пожалуйста, используйте подходящий язык общения для конкретного списка рассылки. link:https://www.FreeBSD.org/community/mailinglists/[ Существует] много не англоязычных рассылок.
++
+Мы понимаем, что для многих английский не родной язык и поэтому мы пытаемся сделать некие пособия. Считается плохим тоном критиковать людей не говорящих по-английски за лексические и грамматические ошибки. FreeBSD имеет отличные продвижения в этом отношении. Пожалуйста, помогайте сохранять нам эту традицию.
+* Пожалуйста, используйте совместимый со стандартами почтовый клиент (MUA). Много плохо отформатированных сообщений исходят от http://www.lemis.com/grog/email/email.php[неправильно работающих или плохо сконфигурированных почтовых клиентов]. Известно, что следующие почтовые программы могут посылать неправильно отформатированные сообщения без вашего ведома:
+
+** exmh
+** Microsoft(R) Exchange
+** Microsoft(R) Outlook(R)
+
++
+Постарайтесь не использовать MIME: многие используют программы, которые не очень хорошо работают с MIME.
+* Проверьте правильность настроек времени и временной зоны. Это может выглядеть немножко глупо, потому что ваши сообщения все равно будут доставляться, однако многие люди получают несколько сотен сообщений в день. Зачастую они сортируют входящие сообщения по теме и дате, и если ваше сообщение не будет предшествовать первому ответу, то они могут предположить, что оно потерялось и даже не взглянут на него.
+* Основной объем информации, который вы должны предоставить, представляет собой вывод программ, таких, как man:dmesg[8], или консольные сообщения, которые обычно появляются в файле [.filename]#/var/log/messages#. Не пытайтесь скопировать эту информацию, набрав ее снова; это действительно трудно, и здесь легко сделать ошибку. Чтобы послать содержимое файлов протоколов, сделайте копию файла и воспользуйтесь редактором для того, чтобы обрезать информацию, оставив только относящуюся к делу, либо скопируйте и вставьте текст в ваше сообщение. В случае вывода программ, таких, как `dmesg`, перенаправьте вывод в файл и включите его в письмо. Например,
++
+[source,bash]
+....
+% dmesg > /tmp/dmesg.out
+....
++
+Данная команда перенаправит информацию в файл [.filename]#/tmp/dmesg.out#.
+* При использовании операций копирования и вставки учтите, что некоторые такие операции отрицательно сказываются на формате строк. Особенно это стоит учесть при посылке содержимого файлов [.filename]#Makefile#, где `tab` является важным символом. Это довольно часто встречающаяся проблема в link:https://www.FreeBSD.org/support/[ базе данных сообщений об ошибках]. В [.filename]#Makefile# символы tab меняются на пробелы, или раздражающие `=3B` escape последовательности.
+
+=== Каких правил этикета стоит придерживаться при ответе на уже существующее сообщение?
+
+* Пожалуйста, включайте относящийся к теме текст из исходного письма. Сокращайте его до минимума, но не переусердствуйте. Любой, кто не читал исходное сообщение должен суметь понять о чём идёт речь.
++
+Это особенно важно для ответов, где исходное сообщение составляло сотни строчек.
+* Отделяйте текст исходного сообщения от текста, добавляемого вами. Чаще всего строчки исходного сообщения предваряются "`>`" и пробелом. Отделяйте ваш текст от текста исходного сообщения пустыми строчками. Эти правила помогут сделать ваши сообщения более читабельными.
+* Пожалуйста, убедитесь, что присваивания текста, который вы цитируйте корректны. Люди могут обидеться, если вы присвоите им слова, которые они не писали.
+* Пожалуйста, не пишите `ответ в начале`. Это значит, что при ответе на сообщения, вставляйте ваши ответы в конец, после текста, копируемого из исходного сообщения.
++
+** A: Потому что это не соответствует логическому ходу обсуждения.
+** Q: Почему верхнее сообщение осуждает это?
++
+(Спасибо Рэнди Бушу (Randy Bush) за шутку.)
+
+[[recurring]]
+== Повторяющиеся темы в списках рассылки
+
+Участие в списках рассылки, как и участие в любом сообществе требует общего базиса для общения. Большое количество рассылок предполагают знание истории Проекта. В частности, существует несколько тем обсуждения, которые возникают у новичков. Обязанность каждого участника не создавать дискуссии на эти темы, тем самым помочь спискам рассылки не отрываться от обсуждаемых тем и обезопасить себя от разгорячённых бесед.
+
+Лучший способ предотвратить это - ознакомиться с http://docs.FreeBSD.org/mail/[архивами списков рассылки], чтобы понять, что происходило до этого. В этом случае, незаменимым окажется http://www.FreeBSD.org/search/#mailinglists[ интерфейс поиска по спискам рассылки]. (Если этот способ не принёс результатов, воспользуйтесь вашей любимой поисковой системой).
+
+Познакомившись с архивами, вы не только будете знать какие темы обсуждались до этого, а также узнаете какие тенденции общения существуют в данной рассылке, кто является участниками и какова конечная аудитория. Эти вещи довольно хорошо знать перед отправкой письма в любую рассылку, и это касается не только списков рассылки FreeBSD.
+
+Нет сомнения, что архивы довольно объёмные и некоторые вопросы повторяются гораздо чаще чем другие, иногда в виде откликов (followups), где тема сообщения уже не соответствует новому положению дел. Тем не менее, старайтесь избегать повторяющихся тем.
+
+[[bikeshed]]
+== Что такое велосипедный навес ("Bikeshed")?
+
+В литературной нотации, `велосипедный навес` - это маленький внешний кожух, в который можно поместить один вид двухколёсного транспорта. Тем не менее, на языке FreeBSD, этот термин ("bikeshed") относится к темам, которые достаточно просты, и на которые (почти) каждый может предложить собственное мнение, и часто (почти) каждый его и предлагает. Детали происхождения данного термина более подробно рассмотрены link:{faq}#BIKESHED-PAINTING[здесь]. У вас должно иметься представление о данном понятии перед отправкой письма в любой список рассылки FreeBSD.
+
+Bikeshed - это тема разговора, которая будет иметь тенденцию порождать немедленные мета-дискуссии и флэйм.
+
+Пожалуйста, помогайте сохранять списки рассылки настолько полезными для многих людей, насколько это возможно путём предотвращения bikeshed. Спасибо.
+
+[[acknowledgments]]
+== Благодарности
+
+`{grog}`::
+Первоначальный автор большинства материала по этикету списков рассылки, взятого из статьи link:{freebsd-questions-article}[Как работать со списком рассылки FreeBSD-questions с максимальной отдачей].
+
+`{linimon}`::
+Создание черновой версии данного FAQ.
diff --git a/documentation/content/ru/articles/new-users/_index.adoc b/documentation/content/ru/articles/new-users/_index.adoc
new file mode 100644
index 0000000000..32e4d23aeb
--- /dev/null
+++ b/documentation/content/ru/articles/new-users/_index.adoc
@@ -0,0 +1,370 @@
+---
+title: Пособие для новичков во FreeBSD и UNIX®
+authors:
+ - author: Annelise Anderson
+ email: andrsn@andrsn.stanford.edu
+releaseinfo: "$FreeBSD$"
+trademarks: ["freebsd", "ibm", "microsoft", "opengroup", "general"]
+---
+
+= Пособие для новичков во FreeBSD и UNIX(R)
+:doctype: article
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:toc-title: Содержание
+:part-signifier: Часть
+:chapter-signifier: Глава
+:appendix-caption: Приложение
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+
+[.abstract-title]
+Аннотация
+
+Поздравляем вас с установкой FreeBSD! Это вводное пособие предназначено для тех, кто является новичком в мире FreeBSD _и_ UNIX(R)-так что оно начнётся с основ.
+
+'''
+
+toc::[]
+
+[[in-and-out]]
+== Регистрация в системе и выход из неё
+
+Зарегистрируйтесь в системе (когда увидите приглашение `login:`) как пользователь, которого вы создали во время установки, или войдите в систему как пользователь `root`. (В вашей установленной системе уже имеется учётная запись для пользователя `root`; который может переходить хоть куда и делать всё, что угодно, в том числе удаление необходимых для работы файлов, так что будьте внимательны!) Обозначения % и # в последующем тексте означают приглашения системы (ваше может отличаться от него), причём % обозначает обычного пользователя, а # пользователя `root`.
+
+Чтобы выйти из системы (и получить новое приглашение `login:`) наберите
+
+[source,bash]
+....
+# exit
+....
+
+столько раз, сколько нужно. Да, нажимайте kbd:[enter] после набора команд, и помните, что UNIX(R) чувствителен к регистру букв-набирайте `exit`, но не `EXIT`.
+
+Для завершения работы машины наберите
+
+[source,bash]
+....
+# /sbin/shutdown -h now
+....
+
+Или, для перезагрузки нужно набрать
+
+[source,bash]
+....
+# /sbin/shutdown -r now
+....
+
+или
+
+[source,bash]
+....
+# /sbin/reboot
+....
+
+Перезагрузку можно также выполнить нажатием клавиш kbd:[Ctrl+Alt+Delete]. Подождите некоторое время, чтобы дать этой команде отработать. В последних релизах FreeBSD она эквивалента выдаче команды `/sbin/reboot` и гораздо, гораздо лучше, чем нажатие кнопки сброса. Вы ведь не хотите всё переустанавливать заново, не так ли?
+
+[[adding-a-user]]
+== Добавление пользователя с привилегиями root
+
+Если при установке системы вы не создали ни одного пользователя, и поэтому вошли в систему как `root`, то теперь вы должны создать пользователя по команде
+
+[source,bash]
+....
+# adduser
+....
+
+При первом использовании утилиты `adduser` она может запрашивать сохранение некоторых параметров для использования их по умолчанию. вы можете сделать оболочкой, используемой по умолчанию, командный процессор man:csh[1], а не man:sh[1], если по умолчанию вам предлагается `sh`. В противном случае просто нажимайте enter для принятия всех предлагаемых по умолчанию вариантов. Эти значения по умолчанию сохраняются в файле [.filename]#/etc/adduser.conf#, в форме, доступной для редактирования.
+
+Предположим, что вы создали пользователя `jack` с полным именем __Jack Benimble__. Назначьте пользователю `jack` пароль, если информационная безопасность имеет значение (даже если это дети, которые могут стучать по клавиатуре). Когда вам будет задан вопрос по включению пользователя `jack` в другие группы, наберите `wheel`
+
+[source,bash]
+....
+Login group is "jack". Invite jack into other groups: wheel
+....
+
+Это позволит входить в систему как пользователь `jack` и использовать команду man:su[1] для того, чтобы стать пользователем `root`. Тогда вас не будут больше обвинять в том, чтобы вы входите в систему как пользователь `root`.
+
+Вы можете прекратить работы с `adduser` в любой момент, нажав kbd:[Ctrl+C], а в завершении ввода у вас будет шанс подтвердить заведение нового пользователя или набрать kbd:[n] в качестве отрицательного ответа. Вам может захотеться создать второго нового пользователя, для того, чтобы при редактировании файлов для входа пользователя `jack` имелся горячий резерв на тот случай, если что-то пойдёт не так.
+
+После того, как вы это сделаете, воспользуйтесь командой `exit` для возврата к приглашению ко входу в систему и зарегистрируйтесь в ней как пользователь `jack`. Вообще говоря, лучше всего основную массу работы выполнять, работая как обычный пользователь, который не имеет мощь и опасность пользователя `root`.
+
+Если вы уже создали пользователя и хотите, чтобы он мог выполнять команду `su` для получения привилегий `root`, вы можете войти в систему как `root` и отредактировать файл [.filename]#/etc/group#, добавив пользователя `jack` в первую строчку (в группу `wheel`). Однако сначала вам нужно поупражняться с программой man:vi[1], текстовым редактором,-или использовать более простой редактор, man:ee[1], имеющийся в последней версии FreeBSD.
+
+Для удаления пользователя воспользуйтесь командой `rmuser`.
+
+[[looking-around]]
+== Просмотр окружения
+
+Войдя в систему как обычный пользователь, оглянитесь вокруг и попробуйте выполнить некоторые команды, дающие доступ к источникам информации и помощи внутри FreeBSD.
+
+Вот некоторые команды и то, что они делают:
+
+`id`::
+Говорит вам, кто вы!
+
+`pwd`::
+Показывает, где вы находитесь-текущий рабочий каталог.
+
+`ls`::
+Выдаёт список файлов, находящихся в текущем каталоге.
+
+`ls -F`::
+Выдаёт перечень файлов, находящихся в текущем каталоге, добавляя символы `\*` после выполнимых файлов, `/` после каталогов и `@` после символических ссылок.
+
+`ls -l`::
+Выдаёт перечень файлов в расширенном формате-размер, дата и права доступа.
+
+`ls -a`::
+Вместе со всеми выдаёт и список скрытых "dot"-файлов (начинающихся с точки). Если вы являетесь пользователем `root`, то "dot"-файлы выдаются и без указания флага `-a`.
+
+`cd`::
+Смена каталогов. `cd ..` перемещает на один уровень выше; обратите внимание на промежуток после `cd`. `cd /usr/local` перейдёт в указанное место. `cd ~` перейдёт в домашний каталог человека, который вошёл в систему-к примеру, [.filename]#/usr/home/jack#. попробуйте выполнить команду `cd /cdrom`, а затем `ls` для проверки того, что ваш CDROM смонтирован и работает.
+
+`less _filename_`::
+Позволяет вам просмотреть файл (с именем _filename_) без внесения в него изменений. Попробуйте выполнить команду `less /etc/fstab`. Для выхода наберите `q`.
+
+`cat _filename_`::
+Выдаёт содержимое _filename_ на экран. если он слишком длинный и вы можете увидеть только его конец, нажмите kbd:[ScrollLock] и используйте клавишу kbd:[стрелка вверх] для движения назад; вы можете также использовать kbd:[ScrollLock] и со страницами справки. Нажмите kbd:[ScrollLock] снова для прекращения прокрутки. Вам может захотеться попробовать команду `cat` с некоторыми из dot-файлов в вашем домашнем каталоге-`cat .cshrc`, `cat .login`, `cat .profile`.
+
+В файле [.filename]#.cshrc# вы заметите алиасы для некоторых из команд `ls` (они очень удобны). Вы можете создать другие алиасы, отредактировав файл [.filename]#.cshrc#. Вы можете сделать эти алиасы доступными всем пользователям системы, поместив их в общесистемный конфигурационный файл для `csh`, [.filename]#/etc/csh.cshrc#.
+
+[[getting-help]]
+== Получение помощи и информации
+
+Вот несколько полезных источников получения помощи. Здесь _Text_ обозначает что-то по вашему выбору, что вы вводите-обычно команду или имя файла.
+
+`apropos _text_`::
+Всё, что содержит строку _text_ в `базе whatis`.
+
+`man _text_`::
+Страница справки по _text_. Это главный источник документации в UNIX(R)-системах. `man ls` покажет вам все способы использования команды `ls`. Нажимайте kbd:[Enter] для передвижения по тексту, kbd:[Ctrl+B] для возврата на страницу назад, kbd:[Ctrl+F] для продвижения вперёд, kbd:[q] или kbd:[Ctrl+C] для выхода.
+
+`which _text_`::
+Покажет, в каком месте из маршрута поиска пользователя находится команда _text_.
+
+`locate _text_`::
+Все маршруты, где находится строчка _text_.
+
+`whatis _text_`::
+Описывает, что делает команда _text_ и её справочная страница. Команда `whatis *` расскажет вам обо всех двоичных файлах в текущем каталоге.
+
+`whereis _text_`::
+Ищет файл _text_ и выдаёт полный путь до него.
+
+Вы можете захотеть попробовать использоваться команду `whatis` с некоторыми полезными командами типа `cat`, `more`, `grep`, `mv`, `find`, `tar`, `chmod`, `chown`, `date`, и `script`. Команда `more` позволит вам читать постранично, как и в DOS, например, `ls -l | more` или `more _filename_`. Знак `\*` работает как общий шаблон-например, `ls w*` выдаст перечень файлов, начинающихся с буквы `w`.
+
+Некоторые из этих команд работают не очень хорошо? Обе команды man:locate[1] и man:whatis[1] зависят от базы данных, которая перестраивается еженедельно. Если ваша машина будет оставаться включенной на выходные (и она работает под FreeBSD), то вы можете пожелать запускать определённые команды раз в день, неделю, месяц. Запускайте их как `root` и дайте каждой отработать, прежде чем запускать следующую.
+
+[source,bash]
+....
+# periodic daily
+выдача опущена
+# periodic weekly
+выдача опущена
+# periodic monthly
+выдача опущена
+....
+
+Если вам надоело ждать, нажмите kbd:[Alt+F2] для перехода в другую _виртуальную консоль_, и войдите в систему снова. В конце концов, это многопользовательская и многозадачная система. Тем не менее эти команды, скорее всего, в процессе работы будут выдавать сообщения вам на экран; вы можете набрать `clear` в приглашении для очистки экрана. Пока они работают, вы можете смотреть в содержимое файлов [.filename]#/var/mail/root# и [.filename]#/var/log/messages#.
+
+Выполнение таких команд является частью системного администрирования-и как единственный пользователь UNIX(R)-системы вы являетесь собственным системным администратором. Практически всё, для чего вам нужно быть пользователем `root`, это системное администрирование. Эти обязанности не описываются достаточно хорошо даже в тех больших толстых книгах по UNIX(R), в которых слишком много места отдаётся описанию работы с меню в оконных менеджерах. Вам может понадобиться одна из двух лучших книг по системному администрированию, либо автора Эви Немет UNIX System Administration Handbook (Prentice-Hall, 1995, ISBN 0-13-15051-7)-второе издание с красной обложкой; или автора Æleen Frisch Essential System Administration (O'Reilly & Associates, 2002, ISBN 0-596-00343-9). Я использую книгу Немет.
+
+[[editing-text]]
+== Редактирование текста
+
+Для конфигурации вашей системы вам нужно редактировать текстовые файлы. Большинство из них будут находиться в каталоге [.filename]#/etc#; и вам необходимо командой `su` получить полномочия пользователя `root`, чтобы их править. Вы можете использовать простой редактор `ee`, однако в смысле перспективности лучше изучить текстовый редактор `vi`. В каталоге [.filename]#/usr/src/contrib/nvi/docs/tutorial# есть прекрасный учебник по vi, если у вас есть исходники системы.
+
+Перед тем, как редактировать файл, наверное, вы должны сохранить резервную копию. Предположим, что вы собираетесь отредактировать файл [.filename]#/etc/rc.conf#. Вы можете воспользоваться командой `cd /etc` для перехода в каталог [.filename]#/etc# и выполнить следующее:
+
+[source,bash]
+....
+# cp rc.conf rc.conf.orig
+....
+
+При этом файл [.filename]#rc.conf# скопируется в [.filename]#rc.conf.orig#, и в последующем вы сможете скопировать [.filename]#rc.conf.orig# в файл [.filename]#rc.conf# для восстановления оригинала. Но ещё лучше его переместить (переименовать), после чего скопировать обратно:
+
+[source,bash]
+....
+# mv rc.conf rc.conf.orig
+# cp rc.conf.orig rc.conf
+....
+
+потому что команда `mv` сохраняет исходную информацию о дате и владельце файла. Теперь вы можете редактировать [.filename]#rc.conf#. Если вы захотите восстановить исходное состояние, то выполните `mv rc.conf rc.conf.myedit` (полагаем, что вы хотите сохранить отредактированную версию), а затем
+
+[source,bash]
+....
+# mv rc.conf.orig rc.conf
+....
+
+для возврата всего на место.
+
+Для редактирования файла наберите
+
+[source,bash]
+....
+# vi filename
+....
+
+Передвигайтесь по тексту при помощи клавиш со стрелками. kbd:[Esc] (клавиша отмены) переводит редактор `vi` в командный режим. Вот некоторые из них:
+
+`x`::
+удалить символ, на котором находится курсор
+
+`dd`::
+удалить целую строку (даже если на экране она не помещается в целую строку)
+
+`i`::
+вставка текста в позиции курсора
+
+`a`::
+вставка текста после курсора
+
+Сразу после набора `i` или `a` вы можете вводить текст. `Esc` возвратит вас обратно в командный режим, где вы можете набрать
+
+`:w`::
+для записи ваших изменений на диск и продолжения редактирования
+
+`:wq`::
+для записи и выхода
+
+`:q!`::
+для выхода без сохранения изменений
+
+`/_text_`::
+для перемещения курсора на _text_; `/` kbd:[Enter] (клавиша ввода) для поиска следующего экземпляра _text_.
+
+`G`::
+для перехода в конец файла
+
+`nG`::
+Для перехода к строке _n_ в файле, где _n_ является числом
+
+kbd:[Ctrl+L]::
+для перерисовки экрана
+
+kbd:[Ctrl+b] и kbd:[Ctrl+f]::
+для перемотки на экран назад и вперёд, как при работе с `more` и `view`.
+
+Поупражняйтесь с редактором `vi` в своём домашнем каталоге, создав новый файл по команде `vi _filename_`, добавляя и удаляя текст, сохраняя файл и вызывая его снова. Редактор `vi` преподносит некоторые сюрпризы, потому что он на самом деле достаточно сложный, и иногда вы можете неправильно вызвать команду, которая сделает нечто, чего вы не ожидали. (Некоторым людям действительно нравится `vi`-он более мощный, чем EDIT из DOS-посмотрите команду `:r`.) Для того, чтобы удостовериться, что вы находитесь в режиме команд, нажимайте kbd:[Esc] один или несколько раз, и начинайте снова с этого места, если возникли какие-то проблемы, часто сохраняйте текст командой `:w` и используйте `:q!` для того, чтобы прекратить работу и начать всё сначала (с вашей последней команды `:w`), если это нужно.
+
+Теперь вы можете выполнить `cd` для перехода в каталог [.filename]#/etc#, `su` в пользователя `root`, использовать `vi` для редактирования файла [.filename]#/etc/group# и добавлять пользователя в группу `wheel`, чтобы он имел полномочия пользователя root. Просто добавьте запятую и имя входа пользователя в конце первой строки этого файла, нажмите kbd:[Esc] и воспользуйтесь `:wq` для записи файла на диск и выхода. Работает всегда. (Вы не поставили пробел после запятой, ведь так?)
+
+[[other-useful-commands]]
+== Другие полезные команды
+
+`df`::
+выдаёт данные о занятом файлами пространстве и смонтированных файловых системах.
+
+`ps aux`::
+показывает работающие процессы. `ps ax` является частоупотребительной формой.
+
+`rm _filename_`::
+удаляет _filename_.
+
+`rm -R _dir_`::
+удаляет каталог _dir_ и все его подкаталоги-осторожно!
+
+`ls -R`::
+выдаёт список файлов в текущем каталоге и всех его подкаталогах; я использовал вариант, `ls -AFR > where.txt`, для получения перечня всех файлов в [.filename]#/# и (отдельно) [.filename]#/usr# до того, как узнал о более эффективном способе поиска файлов.
+
+`passwd`::
+для изменения пароля пользователя (или пароля `root`)
+
+`man hier`::
+справочная страница по файловой структуре UNIX(R)
+
+Используйте `find` для поиска [.filename]#filename# в [.filename]#/usr# или в любом из её подкаталогов при помощи команды
+
+[source,bash]
+....
+% find /usr -name "filename"
+....
+
+Вы можете использовать `\*` в качестве шаблона внутри `"_filename_"` (это выражение должно быть в кавычках). Если вы укажете команде `find` на поиск в [.filename]#/#, а не в [.filename]#/usr#, то она будет искать файл(ы) во всех смонтированных файловых системах, включая CDROM и раздел DOS.
+
+Прекрасным пособием, описывающим команды и утилиты UNIX(R), является книга Abrahams & Larson, Unix for the Impatient (2nd ed., Addison-Wesley, 1996). Масса информации по UNIX(R) есть и в Internet.
+
+[[next-steps]]
+== Следующие шаги
+
+Теперь вы должны иметь инструменты, которые необходимо держать под рукой и умеете редактировать файлы, так что вы должны суметь запустить всё, что угодно. Много полезной информации содержится в Руководстве по FreeBSD (которое, скорее всего, есть на вашем жёстком диске) и link:https://www.FreeBSD.org/[Web-сайте FreeBSD]. На CDROM, а также Web-сайте находятся различные пакеты и порты. В Руководстве рассказывается более подробно о том, как их использовать (получить пакет, если он существует, командой `pkg_add /cdrom/packages/All/_packagename_`, где _packagename_ является именем файла пакета). На CDROM находится перечни пакетов и портов с их краткими описаниями в файлах [.filename]#cdrom/packages/index#, [.filename]#cdrom/packages/index.txt# и [.filename]#cdrom/ports/index#, а более полные описания можно найти в [.filename]#/cdrom/ports/\*/*/pkg/DESCR#, где знаки `*` обозначают тематические подкаталоги с программами и названиями программ, соответственно.
+
+Если вы посчитаете, что Руководство является слишком сложной книгой (что с `lndir` и всё) по установке портов с CDROM, вот рецепт, который обычно срабатывает:
+
+Найдите нужный вам порт, скажем, `kermit`. На CDROM для него должен существовать каталог. Скопируйте этот подкаталог в каталог [.filename]#/usr/local# (хорошее место для программного обеспечения, которое вы добавляете, и которое должно быть доступно всем пользователям) такой командой:
+
+[source,bash]
+....
+# cp -R /cdrom/ports/comm/kermit /usr/local
+....
+
+В результате должен образоваться подкаталог [.filename]#/usr/local/kermit#, содержащий все файлы, что есть в подкаталоге `kermit` на CDROM.
+
+Затем создайте каталог [.filename]#/usr/ports/distfiles#, если он ещё не существует, при помощи команды `mkdir`. Теперь проверьте содержимое [.filename]#/cdrom/ports/distfiles# на предмет наличия файла с именем, говорящем о том, что это тот порт, который вы хотите иметь. Скопируйте этот файл в каталог [.filename]#/usr/ports/distfiles#; в последних версиях вы можете пропустить этот шаг, и FreeBSD выполнит его за вас. В случае с `kermit`, дистрибутивного файла не существует.
+
+После этого по команде `cd` перейдите в подкаталог [.filename]#/usr/local/kermit#, в котором есть файл [.filename]#Makefile#. Наберите
+
+[source,bash]
+....
+# make all install
+....
+
+Во время выполнения порт обратится к FTP для получения всех архивных файлов, нужных ему и которых не найдено на CDROM или в каталоге [.filename]#/usr/ports/distfiles#. Если сеть у вас ещё не работает, и файла для порта в каталоге [.filename]#/cdrom/ports/distfiles# нет, вам потребуется получить дистрибутивный файл на другой машине и скопировать его в каталог [.filename]#/usr/ports/distfiles#. Прочтите [.filename]#Makefile# (при помощи команд `cat`, `more` или `view`), чтобы понять, как называется файл и куда нужно обратиться (основной сайт распространения), чтобы его получить. (Используйте двоичный тип передачи файлов!) Затем перейдите обратно в каталог [.filename]#/usr/local/kermit#, найдите каталог с [.filename]#Makefile# и наберите `make all install`.
+
+[[your-working-environment]]
+== Ваше рабочее окружение
+
+Ваш командный процессор является самой важной частью вашего рабочего окружения. Оболочка занимается интерпретацией команд, которые вы вводите в командной строке, и таким образом взаимодействует с остальной частью операционной системы. Вы можете также писать скрипты командного процессора, то есть последовательности команд, которые должны выполняться без вашего участия.
+
+Вместе с FreeBSD устанавливаются два командный процессора: `csh` и `sh`. `csh` хорош для работы в командной строке, однако скрипты должны писаться на языке оболочек `sh` (или `bash`). Вы можете выяснить, какой командный процессор у вас используется, набрав `echo $SHELL`.
+
+Оболочка `csh` подходящая, однако `tcsh` может всё, что умеет `csh` и ещё больше. Она позволяет вам восстанавливать прошлые команды клавишами со стрелками и редактировать их. В нём есть автозавершение имён файлов по нажатию клавиши табуляции (в `csh` используется клавиша kbd:[Esc]) и он позволяет вам переключаться в каталог, в котором вы были ранее, по команде `cd -`. Также в `tcsh` гораздо легче изменять системное приглашение. Это гораздо упрощает жизнь.
+
+Вот три шага по установке нового командного процессора:
+
+[.procedure]
+. Установите командный процессор как порт или пакет, как вы обычно это делаете с другим портом или пакетом.
+. Работая как пользователь `root`, отредактируйте файл [.filename]#/etc/shells#, добавив в него строку с новой оболочкой, в нашем случае это [.filename]#/usr/local/bin/tcsh#, и сохраните файл. (Некоторые порты могут делать это за вас.)
+. Воспользуйтесь командой `chsh` для смены постоянно используемой вами оболочки на `tcsh`, либо наберите `tcsh` в командной строке для смены вашей оболочки без повторного входа в систему.
+
+[NOTE]
+====
+Менять командный процессор для пользователя `root` на что-то, отличающееся от `sh` или `csh`, в ранних версиях FreeBSD и во многих других версиях UNIX(R) может быть опасно; вы можете лишиться работающей оболочки при переходе системы в однопользовательский режим. Решением является использование `su -m` для того, чтобы стать пользователем `root`, что даст в качестве оболочки `tcsh`, но вы будете являться пользователем `root`, потому что оболочка является частью окружения. Вы можете сделать это постоянным, добавив в ваш файл [.filename]#.tcshrc# в качестве алиаса по такой команде:
+
+[.programlisting]
+....
+alias su su -m
+....
+
+====
+
+При запуске `tcsh` он будет считывать файлы [.filename]#/etc/csh.cshrc# и [.filename]#/etc/csh.login#, как и `csh`. Эта оболочка также читает файл [.filename]#.login# из вашего домашнего каталога, а также файл [.filename]#.cshrc#, если только вы не создали файл [.filename]#.tcshrc#. Это вы можете сделать простым копированием файла [.filename]#.cshrc# в [.filename]#.tcshrc#.
+
+Теперь, когда у вас установлен командный процессор `tcsh`, вы можете настроить приглашение командной строки. Все подробности можно найти на странице справки по `tcsh`, но всё же вот строка, которая помещается в ваш файл [.filename]#.tcshrc#, которая может показать, сколько команд вы уже набрали, сколько сейчас времени и в каком каталоге вы находитесь. Она также выдаёт `>`, если вы являетесь обычным пользователем, и #, если вы являетесь пользователем `root`, однако tsch будет делать это в любом случае:
+
+set prompt = "%h %t %~ %# "
+
+Эта строка должна быть поставлена на то же самое место, что и существующая строка установки приглашения, если она есть, либо после строки "if($?prompt) then", если её нет. Закомментируйте старую строку; вы всегда сможете вернуться к ней обратно, если предпочтёте её. Не забудьте о пробелах и кавычках. Вы можете заставить перечитать [.filename]#.tcshrc#, набрав `source .tcshrc`.
+
+Перечень других установленных переменных окружения вы можете получить, набрав `env` в приглашении командной строки. В результате, кроме всего прочего, будут показаны редактор, используемый по умолчанию, программа постраничной выдачи и тип терминала. Командой, полезной при входе в систему с удалённого места и невозможности запуска программы, потому что терминал не обладает некоторыми возможностями, является команда `setenv TERM vt100`.
+
+[[other]]
+== Остальное
+
+Работая как пользователь `root`, вы можете отмонтировать CDROM по команде `/sbin/umount /cdrom`, вытащить его из привода, вставить другой диск и смонтировать его командой `/sbin/mount_cd9660 /dev/cd0a /cdrom`, при этом предполагается, что `cd0a` является именем устройства для вашего привода CDROM. Самые последние версии FreeBSD позволяют вам монтировать CDROM просто по команде `/sbin/mount /cdrom`.
+
+Использование живой файловой системы-она находится на втором диске FreeBSD из набора CDROM-полезно при нехватке пространства. То, что находится в этой файловой системе, меняется от релиза к релизу. Вы можете попытаться поиграть в игры с CDROM. При этом применяется команда `lndir`, которая устанавливается с X Window System, и служит для указания программам, где искать необходимые файлы, потому что они находятся в файловой системе [.filename]#/cdrom#, а не в [.filename]#/usr# и её подкаталогах, где должны находиться. Прочтите справку по команде `man lndir`.
+
+[[comments-welcome]]
+== Пожелания приветствуются
+
+Если вы используете это руководство, мне будет интересно знать, в каком месте оно написано непонятно и что упущено из того, что, по вашему мнению, должно быть включено ценного. Мои благодарности Eugene W. Stark, профессору информатики в SUNY-Stony Brook, и John Fieber за ценные советы.
+
+Annelise Anderson, mailto:andrsn@andrsn.stanford.edu[andrsn@andrsn.stanford.edu]
diff --git a/documentation/content/ru/articles/pam/_index.adoc b/documentation/content/ru/articles/pam/_index.adoc
new file mode 100644
index 0000000000..be563e753c
--- /dev/null
+++ b/documentation/content/ru/articles/pam/_index.adoc
@@ -0,0 +1,570 @@
+---
+title: Подключаемые Модули Аутентификации (PAM)
+authors:
+ - author: Dag-Erling Smørgrav
+releaseinfo: "$FreeBSD$"
+trademarks: ["pam", "freebsd", "linux", "opengroup", "sun", "general"]
+---
+
+= Подключаемые Модули Аутентификации (PAM)
+:doctype: article
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:toc-title: Содержание
+:part-signifier: Часть
+:chapter-signifier: Глава
+:appendix-caption: Приложение
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+
+[.abstract-title]
+Abstract
+
+В этой статье описываются принципы и механизмы, лежащие в основе библиотеки Подключаемых Модулей Аутентификации (PAM - Pluggable Authentication Modules), и рассказывается, как настроить PAM, как интегрировать PAM в приложения и как создавать модули PAM.
+
+'''
+
+toc::[]
+
+[[pam-intro]]
+== Введение
+
+Библиотека Pluggable Authentication Modules (PAM) является обобщённым API для служб, связанных с аутентификацией, которые позволяют системному администратору добавлять новые методы аутентификации простой установкой новых модулей PAM, и изменять политику аутентификации посредством редактирования конфигурационных файлов.
+
+PAM описали и разработали Vipin Samar и Charlie Lai из Sun Microsystems в 1995 году, с тех он сильно не менялся. В 1997 году Open Group опубликовала предварительные спецификации на X/Open Single Sign-on (XSSO), что стандартизовало API для PAM и добавило расширения для одноразовой (или достаточно интегрированной) подписи. На момент написания этого документа эта спецификация ещё не была принята за стандарт.
+
+Хотя эта статья посвящена в основном FreeBSD 5.x, в которой используется OpenPAM, она подойдёт для FreeBSD 4.x, использующей Linux-PAM, и других операционных систем, таких, как Linux и Solaris(TM).
+
+[[pam-terms]]
+== Термины и соглашения
+
+[[pam-definitions]]
+== Определения
+
+Терминология, используемая в PAM, достаточно запутана. Ни оригинальная работа Samar и Lai, ни спецификация XSSO не делают никаких попыток формально определить термины для различных объектов и участвующих в PAM сторон, а термины, которые они используют (но не определяют) иногда неверны и неоднозначны. Первой попыткой создать недвусмысленную и согласованную терминологию была работа, которую написал Andrew G. Morgan (автор Linux-PAM) в 1999 году. Хотя выбор терминологии, которую сделал Морган, был гигантским скачком вперед, это, по мнению автора данной статьи, не означает ее правильность. Далее делается попытка, в значительной степени на основе работы Моргана, дать точные и недвусмысленные определения терминов для всех участников и объектов PAM.
+
+[.glosslist]
+учётная запись (account)::
+ Набор полномочий, которые аппликант запрашивает от арбитратора.
+
+аппликант (applicant)::
+ Пользователь или объект, запрашивающие аутентификацию.
+
+арбитратор (arbitrator)::
+ Пользователь или объект, имеющий привилегии, достаточные для проверки полномочий аппликанта и права подтвердить или отклонить запрос.
+
+цепочка (chain)::
+ Последовательность модулей, которые будут вызваны в ответ на запрос PAM. В цепочку включена информация о последовательности вызовов модулей, аргументах, которые нужно им передать, и о том, как интерпретировать результаты.
+
+клиент (client)::
+ Приложение, отвечающее за инициирование запроса на аутентификацию от имени аппликанта и получающее от него необходимую для аутентификации информацию.
+
+подсистема (facility)::
+ Одна из четырех основных групп функциональности, которые дает PAM: аутентификация, управление учетными записями, управление сеансом и обновление ключом аутентификации.
+
+модуль (module)::
+ Набор из одной или большего количества связанных функций, реализующих определенную подсистему аутентификации, собранный в один (обычно динамически загружаемый) двоичный файл, идентифицируемый по имени.
+
+политика (policy)::
+ Полный набор конфигурационных деклараций, описывающих, как обрабатывать запросы PAM к определенной услуге. Политика обычно состоит из четырех цепочек, по одной для каждой подсистемы, хотя некоторые службы используют не все четыре подсистемы.
+
+сервер (server)::
+ Приложение, выступающее от имени арбитратора для общения с клиентом, запрашивания аутентификационной информации, проверки полномочий аппликанта и подтверждающее или отклоняющее запрос.
+
+сервис (service)::
+ Класс серверов, предоставляющих похожую или связанную функциональность, и требующую подобную аутентификацию. Политики PAM задаются на основе сервисов, так что ко всем серверам, объявляющим одно и тоже имя сервиса, будет применяться одна и та же политика.
+
+сеанс (session)::
+ Контекст, в котором сервис оказывается аппликанту сервером. Одна из четырех подсистем PAM, управление сеансом, касается исключительно настройке и очистке этого контекста.
+
+ключ (token)::
+ Блок информации, связанный с учётной записью, например, пароль или ключевая фраза, которую аппликант должен предоставить для своей идентификации.
+
+транзакция (transaction)::
+ Последовательность запросов от одного и того же аппликанта к одному и тому же экземпляру того же самого сервера, начиная с аутентификации и установления сеанса и заканчивая закрытием сеанса.
+
+[[pam-usage-examples]]
+== Примеры использования
+
+Этот раздел предназначен для иллюстрации значений некоторых терминов, определенных выше, при помощи простых примеров.
+
+== Объединенные клиент и сервер
+
+В этом простом примере показывается пользователь `alice`, выполняющий команду man:su[1] для того, чтобы стать пользователем `root`.
+
+[source,bash]
+....
+% whoami
+alice
+
+% ls -l `which su`
+-r-sr-xr-x 1 root wheel 10744 Dec 6 19:06 /usr/bin/su
+
+% su -
+Password: xi3kiune
+# whoami
+root
+....
+
+* Аппликантом является `alice`.
+* Учетной записью является `root`.
+* Процесс man:su[1] является как клиентом, так и сервером.
+* Аутентификационным ключом является `xi3kiune`.
+* Арбитратором выступает `root`, и именно поэтому у команды man:su[1] выставлен бит выполнения с правами `root`.
+
+== Клиент и сервер разделены
+
+В примере ниже рассматривается пользователь `eve`, пытающийся установить man:ssh[1]-соединение с `login.example.com`, и успешно входя как пользователь `bob`. Боб должен был выбрать пароль получше!
+
+[source,bash]
+....
+% whoami
+eve
+
+% ssh bob@login.example.com
+bob@login.example.com's password:
+% god
+Last login: Thu Oct 11 09:52:57 2001 from 192.168.0.1
+Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
+ The Regents of the University of California. All rights reserved.
+FreeBSD 4.4-STABLE (LOGIN) 4: Tue Nov 27 18:10:34 PST 2001
+
+Welcome to FreeBSD!
+%
+%
+
+....
+
+* Аппликантом является `eve`.
+* Клиентом является процесс man:ssh[1] пользователя Eve.
+* Сервером является процесс man:sshd[8] на машине `login.example.com`
+* Учетной записью является `bob`.
+* Ключом аутентификации является `god`.
+* Хотя этого не видно в примере, но арбитратором является `root`.
+
+== Пример политики
+
+Следующее является политикой, используемой во FreeBSD по умолчанию для `sshd`:
+
+[.programlisting]
+....
+sshd auth required pam_nologin.so no_warn
+sshd auth required pam_unix.so no_warn try_first_pass
+sshd account required pam_login_access.so
+sshd account required pam_unix.so
+sshd session required pam_lastlog.so no_fail
+sshd password required pam_permit.so
+....
+
+* Эта политика применяется к службе `sshd` (что не обязательно ограничено сервером man:sshd[8]).
+* `auth`, `account`, `session` и `password` являются подсистемами.
+* [.filename]#pam_nologin.so#, [.filename]#pam_unix.so#, [.filename]#pam_login_access.so#, [.filename]#pam_lastlog.so# и [.filename]#pam_permit.so# являются модулями. Из этого примера видно, что [.filename]#pam_unix.so# реализует по крайней мере две подсистемы (аутентификацию и управление учётными записями).
+
+[[pam-essentials]]
+== Основы PAM
+
+[[pam-facilities-primitives]]
+== Подсистемы и примитивы
+
+API для PAM предоставляет шесть различных примитивов для аутентификации, сгруппированных в четыре подсистемы, каждая из которых описывается ниже.
+
+`auth`::
+_Аутентификация._ Эта подсистема, собственно говоря, реализует аутентификацию аппликанта и выяснение полномочий учётной записи. Она предоставляет два примитива:
+
+** Функция man:pam_authenticate[3] аутентифицирует аппликанта, обычно запрашивая аутентификационный ключ и сравнивая его со значением, хранящимся в базе данных или получаемым от сервера аутентификации.
+** Функция man:pam_setcred[3] устанавливает полномочия учётной записи, такие, как идентификатор пользователя, членство в группах и ограничения на использование ресурсов.
+
+`account`::
+_Управление учётной записью._ Эта подсистема обрабатывает вопросы доступности учетной записи, не связанные с аутентификацией, такие, как ограничения в доступе на основе времени суток или загрузки сервера. Он предоставляет единственный примитив:
+
+** Функция man:pam_acct_mgmt[3] проверяет, доступна ли запрашиваемая учётная запись.
+
+`session`::
+_Управление сеансом._ Эта подсистема отрабатывает задачи, связанные с установлением и закрытием сеанса, такие, как учет входов пользователей. Она предоставляет два примитива:
+
+** Функция man:pam_open_session[3] выполняет действия, связанные с установлением сеанса: добавление записей в базы данных [.filename]#utmp# и [.filename]#wtmp#, запуск агента SSH и так далее.
+** Функция man:pam_close_session[3] выполняет действия, связанные с закрытием сеанса: добавление записей в базы данных [.filename]#utmp# и [.filename]#wtmp#, завершение работы агента SSH и так далее.
+
+`password`::
+_Управление паролем._ Эта подсистема используется для изменения ключа аутентификации, связанного с учетной записью, по причине истечения его срока действия или желания пользователя изменить его. Она предоставляет единственный примитив:
+
+** Функция man:pam_chauthtok[3] изменяет ключ аутентификации, опционально проверяя, что он труден для подбора, не использовался ранее и так далее.
+
+[[pam-modules]]
+== Модули
+
+Модули являются центральной концепцией в PAM; в конце концов, им соответствует буква "M" в сокращении "PAM". Модуль PAM представляет собой самодостаточный кусок программного кода, который реализует примитивы одной или большего количества подсистем одного конкретного механизма; к возможным механизмам для подсистемы аутентификации, к примеру, относятся базы данных паролей UNIX(R), системы NIS, LDAP или Radius.
+
+[[pam-module-naming]]
+== Именование модулей
+
+Во FreeBSD каждый механизм реализуется в отдельном модуле с именем `pam_mechanism.so` (например, `pam_unix.so` для механизма UNIX(R).) В других реализациях иногда отдельные модули используются для разных подсистем, и в их имя включается, кроме названия механизма, и имя подсистемы. К примеру, в Solaris(TM) имеется модуль `pam_dial_auth.so.1`, который часто используется для аутентификации пользователей, работающих по коммутируемым каналам связи.
+
+[[pam-module-versioning]]
+== Версии модулей
+
+Изначальная реализация PAM во FreeBSD, которая была основана на Linux-PAM, не использовала номера версий для модулей PAM. Это будет приводить к проблемам при работе унаследованных приложений, которые могут быть скомпонованы со старыми версиями системных библиотек, так как способа подгрузить соответствующую версию требуемых модулей нет.
+
+OpenPAM, с другой стороны, ищет модули, которые имеют тот же самый номер версии, что и библиотека PAM (на данный момент 2), и использует модуль без версии, только если модуль с известной версией не был загружен. Поэтому для старых приложений могут предоставляться старые модули, при этом новые (или заново построенные) приложения будут использовать все возможности последних версий модулей.
+
+Хотя модули PAM в Solaris(TM) имеют номер версии, по-настоящему номер версии в них не отслеживается, потому что номер является частью имени и должен включаться в конфигурацию.
+
+[[pam-chains-policies]]
+== Цепочки и политики
+
+Когда сервер инициирует PAM-транзакцию, библиотека PAM пытается загрузить политику для службы, указанной при вызове функции man:pam_start[3]. Политика определяет, как должны обрабатываться запросы на аутентификацию, и задаётся в конфигурационном файле. Это составляет другую основополагающую концепцию PAM: возможность администратору настраивать политику безопасности системы (в самом широком её понимании) простым редактированием текстового файла.
+
+Политика состоит из четырёх цепочек, по одной на каждый из методов PAM. Каждое звено представляет собой последовательность конфигурационных утверждений, задающих вызываемый модуль, некоторые (необязательные) параметры для передачи в модуль, и управляющий флаг, описывающий, как интерпретировать возвращаемый из модуля код.
+
+Понимание смысла управляющего флага необходимо для понимания конфигурационных файлов PAM. Существуют четыре различных управляющих флага:
+
+`binding`::
+Если модуль отработал успешно, и ни один из предыдущих модулей в цепочке не сработал отрицательно, то цепочка прерывается, а запрос подтверждается. Если же модуль отработает неудачно, то выполняется оставшаяся часть цепочки, однако запрос отвергается.
++
+Этот управляющий флаг был добавлен компанией Sun в Solaris(TM) 9 (SunOS(TM) 5.9), и поддерживается в OpenPAM.
+`required`::
+Если модуль возвратил положительный ответ, выполняется оставшаяся часть цепочки, запрос удовлетворяется, если никакой другой модуль не отработает отрицательно. Если же модуль возвратит отрицательный ответ, остаток цепочки тоже отрабатывается, но запрос отвергается.
+`requisite`::
+Если модуль возвращает положительный ответ, выполняется оставшаяся часть цепочки, запрос удовлетворяется, если никакой другой модуль не отработает отрицательно. Если же модуль отрабатывает отрицательно, то отработка цепочки немедленно прекращается, а запрос отвергается.
+
+`sufficient`::
+Если модуль возвратит положительный ответ, и ни один из предыдущих модулей в цепочке на отработал отрицательно, то отработка цепочки немедленно прекращается, а запрос удовлетворяется. Если модуль отработал отрицательно, то результат игнорируется и цепочка отрабатывается дальше.
++
+Так как семантика этого флага может оказаться запутанной, особенно при его использовании с последним модулем в цепочке, рекомендуется вместо него использовать управляющий флаг `binding`, если реализация его поддерживает.
+`optional`::
+Модуль отрабатывается, но результат выполнения игнорируется. Если все модули в цепочке помечены как `optional`, то удовлетворяться будут все запросы.
+Когда сервер вызывает один из шести PAM-примитивов, PAM запрашивает цепочку подсистемы, к которой принадлежит примитив, и запускает каждый модуль, перечисленный в цепочке в порядке их перечисления, пока список не будет исчерпан либо не будет определено, что дальнейшей обработки не нужно (по причине достижение модуля, вернувшего положительный ответ при условии `binding` или `sufficient`, либо отрицательный с условием `requisite`). Запрос подтверждается, если только был вызван по крайней мере один модуль, и все неопциональные модули вернули положительный ответ.
+
+Заметьте, что возможно, хотя это не распространено, перечислять один и тот же модуль несколько раз в одной цепочке. К примеру, модуль, просматривающий имена и пароли пользователя в сервере каталога может быть вызван несколько раз с различными параметрами, задающими различные серверы каталогов для связи. PAM считает различные появления одного модуля в той же самой цепочке разными и не связанными модулями.
+
+[[pam-transactions]]
+== Транзакции
+
+Жизненный цикл типичной PAM-транзакции описан ниже. Заметьте, что в случае, если любой из перечисленных шагов оканчивается неудачно, сервер должен выдать клиенту соответствующее сообщение об ошибке и прервать транзакцию.
+
+. Если это необходимо, сервер получает полномочия арбитратора через независимый от PAM механизм-чаще всего по факту запуска пользователем `root` или с установленным setuid-битом `root`.
+. Сервер вызывает функцию man:pam_start[3] для инициализации библиотеки PAM и задания имени сервиса и целевой учётной записи, а также регистрации подходящего способа общения.
+. Сервер получает различную информацию, относящуюся к транзакции (такую, как имя пользователя аппликанта и имя хоста, на котором запущен клиент), и отправляет её в PAM при помощи функции man:pam_set_item[3].
+. Сервер вызывает функцию man:pam_authenticate[3] для аутентификации аппликанта.
+. Сервер вызывает функцию man:pam_acct_mgmt[3] для проверки того, что запрошенная учётная запись доступна и корректна. Если пароль верен, но его срок истёк, man:pam_acct_mgmt[3] возвратит результат `PAM_NEW_AUTHTOK_REQD`, а не `PAM_SUCCESS`.
+. Если на предыдущем шаге был получен результат `PAM_NEW_AUTHTOK_REQD`, то сервер вызывает функцию man:pam_chauthtok[3] для того, чтобы вынудить клиента изменить ключ аутентификации для запрошенной учётной записи.
+. Теперь, когда аппликант полностью аутентифицирован, сервер вызывает функцию man:pam_setcred[3] для получения полномочий запрошенной учётной записи. Сделать это возможно, потому что он работает как арбитратор, и оставляет за собой полномочия арбитратора.
+. После получения необходимых полномочий, сервер вызывает функцию man:pam_open_session[3] для установления сеанса.
+. Теперь сервер выполняет тот сервис, который затребовал клиент-например, предоставляет аппликанту оболочку.
+. После того, как сервер закончил обслуживание клиента, он вызывает функцию man:pam_close_session[3] для закрытия сеанса.
+. Наконец, сервер вызывает функцию man:pam_end[3] для оповещения библиотеки PAM о том, что работа с ней завершена и какие-либо выделенные в течение сеанса ресурсы можно освободить.
+
+[[pam-config]]
+== Настройка PAM
+
+[[pam-config-file]]
+== Файлы политик PAM
+
+[[pam-config-pam.conf]]
+== Файл [.filename]#/etc/pam.conf#
+
+Традиционно файлом политик PAM является [.filename]#/etc/pam.conf#. Он содержит все политики PAM для вашей системы. Каждая строка файла описывает один шаг в цепочке, как показано ниже:
+
+[.programlisting]
+....
+login auth required pam_nologin.so no_warn
+....
+
+Поля следуют в таком порядке: имя службы, имя подсистемы, управляющий флаг, имя модуля и параметры модуля. Любые дополнительные поля интерпретируются как дополнительные параметры модуля.
+
+Для каждой пары сервис/подсистема составляется отдельная цепочка, и тогда получается, что, хотя порядок следования строк для одной и той же услуги и подсистемы является значимым, порядок перечисления отдельных сервисов не значим. В примерах из оригинальной работы по PAM строки конфигурации сгруппированы по подсистемам, в поставляемом с Solaris(TM) файле [.filename]#pam.conf# именно так и сделано, но в стандартном конфигурационном файле из поставки FreeBSD строки настроек сгруппированы по сервисам. Подходит любой из этих способов; они имеют один и тот же смысл.
+
+[[pam-config-pam.d]]
+== Каталог [.filename]#/etc/pam.d#
+
+OpenPAM и Linux-PAM поддерживают альтернативный механизм настройки, который для FreeBSD является предпочтительным. В этой схеме каждая политика содержится в отдельном файле с именем, соответствующем сервису, к которому она применяется. Эти файлы размещаются в каталоге [.filename]#/etc/pam.d/#.
+
+Такие файлы политик, ориентированные на сервисы, имеют только четыре поля, вместо пяти полей в файле [.filename]#pam.conf#: поле имени сервиса опущено. Таким образом, вместо примера строки файла [.filename]#pam.conf# из предыдущего раздела получится следующая строка в файле [.filename]#/etc/pam.d/login#:
+
+[.programlisting]
+....
+auth required pam_nologin.so no_warn
+....
+
+Как следствие такого упрощённого синтаксиса, возможно использование одних и тех же политик для нескольких сервисов, связывая каждое имя сервиса с тем же самым файлом политик. К примеру, для использования той же самой политики для сервисов `su` и `sudo`, можно сделать следующее:
+
+[source,bash]
+....
+# cd /etc/pam.d
+# ln -s su sudo
+....
+
+Это работает, потому что имя сервиса определяется именем файла, а не его указанием в файле политики, так что один и тот же файл может использоваться для нескольких сервисов с разными названиями.
+
+Так как политика каждого сервиса хранится в отдельном файле, то механизм [.filename]#pam.d# делает установку дополнительных политик для программных пакетов сторонних разработчиков очень лёгкой задачей.
+
+[[pam-config-file-order]]
+== Порядок поиска политик
+
+Как вы видели выше, политики PAM могут находиться в нескольких местах. Что будет, если политики для одного и того же сервиса имеются в разных местах?
+
+Необходимо осознать, что система конфигурации PAM ориентирована на цепочки.
+
+[[pam-config-breakdown]]
+== Структура строки настройки
+
+Как это объяснено в <<pam-config-file>>, каждая строка файла [.filename]#/etc/pam.conf# состоит из четырёх или большего количества полей: имени сервиса, имени подсистемы, управляющего флага, имени модуля и дополнительных параметров модуля, которые могут отсутствовать.
+
+Имя сервиса обычно (хотя не всегда) является именем приложения, которое этот сервис обслуживает. Если вы не уверены, обратитесь к документации по конкретному приложению для определения используемого имени сервиса.
+
+Заметьте, что если вы используете [.filename]#/etc/pam.d/# вместо [.filename]#/etc/pam.conf#, то имя сервиса задается именем файла политики, и опускается из строк настройки, которые в таком случае начинаются с названия подсистемы.
+
+Имя подсистемы представляет собой одно из четырёх ключевых слов, описанных в <<pam-facilities-primitives>>.
+
+Точно также управляющий флаг является одним из четырёх ключевых слов, описанных в <<pam-chains-policies>>, в котором рассказано, как интерпретировать возвращаемый из модуля код. В Linux-PAM поддерживается альтернативный синтаксис, который позволяет указать действие, связанной с каждый возможным кодом возврата, но этого следует избегать, так как он не является стандартным и тесно связан со способом диспетчеризации вызовов сервисов в Linux-PAM (а он значительно отличается от способа взаимодействия в Solaris(TM) и OpenPAM). Не вызывает удивления тот факт, что в OpenPAM этот синтаксис не поддерживается.
+
+[[pam-policies]]
+== Политики
+
+Для корректной настройки PAM необходимо понимать, как происходит интерпретация политик.
+
+В момент, когда приложение вызывает функцию man:pam_start[3], библиотека PAM загружает политику для указанного сервиса и выстраивает четыре цепочки модулей (по одной для каждой подсистемы). Если одна или большее количество этих цепочек являются пустыми, то будут выполняться подстановки соответствующих цепочек из политики для сервиса `other`.
+
+Когда затем приложение вызывает одну из шести примитивов PAM, библиотека PAM выделяет из цепочки нужную подсистему и вызывает функцию, соответствующую сервису, в каждом модуле, перечисленном в цепочке, в том порядке, в каком они перечислены в конфигурации. После каждого обращения к функции сервиса, тип модуля и возвращённый из этой функции код результата выполнения используются для того, что делать дальше. За некоторыми исключениями, которые будут описаны ниже, применяется такая таблица:
+
+.Сводная таблица отработки цепочек PAM
+[cols="1,1,1,1", options="header"]
+|===
+|
+| PAM_SUCCESS
+| PAM_IGNORE
+| other
+
+|binding
+|if (!fail) break;
+|-
+|fail = true;
+
+|required
+|-
+|-
+|fail = true;
+
+|requisite
+|-
+|-
+|fail = true; break;
+
+|sufficient
+|if (!fail) break;
+|-
+|-
+
+|optional
+|-
+|-
+|-
+|===
+
+Если переменная `fail` принимает истинное значение в конце отработки цепочки, или когда достигнут "break", диспетчер возвращает код ошибки, возвращённый первым модулем, отработавшим неудачно. В противном случае возвращается `PAM_SUCCESS`.
+
+Первым исключением является то, что код ошибки `PAM_NEW_AUTHTOK_REQD` интерпретируется как успешный результат, кроме случая, когда модуль отработал успешно, и по крайней мере один модуль возвратил `PAM_NEW_AUTHTOK_REQD`, тогда диспетчер возвратит результат `PAM_NEW_AUTHTOK_REQD`.
+
+Вторым исключением является то, что man:pam_setcred[3] считает, что модули `binding` и `sufficient` являются равнозначными `required`.
+
+Третьим и последним исключением является то, что функция man:pam_chauthtok[3] отрабатывает полную цепочку дважды (один раз для предварительных проверок, и ещё раз для реального задания пароля), и на подготовительной фазе она считает, что модули `binding` и `sufficient` являются равнозначными `required`.
+
+[[pam-freebsd-modules]]
+== Модули PAM во FreeBSD
+
+[[pam-modules-deny]]
+=== man:pam_deny[8]
+
+Модуль man:pam_deny[8] является одним из простейших доступных модулей; на любой запрос он возвращает результат `PAM_AUTH_ERR`. Он полезен для быстрого отключения сервиса (добавьте его на верх каждой цепочки) или завершения цепочек модулей `sufficient`.
+
+[[pam-modules-echo]]
+=== man:pam_echo[8]
+
+Модуль man:pam_echo[8] просто передаёт свои параметры в функцию взаимодействия как сообщение `PAM_TEXT_INFO`. В основном полезна для отладки, но также может использоваться для вывода сообщений, таких как "Unauthorized access will be prosecuted" до запуска процедуры аутентификации.
+
+[[pam-modules-exec]]
+=== man:pam_exec[8]
+
+Модуль man:pam_exec[8] воспринимает первый переданный ему параметр как имя программы для выполнения, а остальные аргументы передаются этой программе в качестве параметров командной строки. Одним из возможных применений является его использование для запуска в момент регистрации в системе программы монтирования домашнего каталога пользователя.
+
+[[pam-modules-ftpusers]]
+=== man:pam_ftpusers[8]
+
+Модуль man:pam_ftpusers[8]
+
+[[pam-modules-group]]
+=== man:pam_group[8]
+
+Модуль man:pam_group[8] принимает или отвергает аппликантов в зависимости от их членства в определённой файловой группе (обычно `wheel` для man:su[1]). В первую очередь предназначен для сохранения традиционного поведения утилиты BSD man:su[1], хотя имеет и много других применений, таких как отключение определённых групп пользователей от некоторого сервиса.
+
+[[pam-modules-guest]]
+=== man:pam_guest[8]
+
+Модуль man:pam_guest[8] позволяет осуществлять гостевые входы с использованием фиксированных имён входа в систему. На пароль могут накладываться различные ограничения, однако действием по умолчанию является ввод любого пароля при использовании имени, соответствующего гостевому входу. Модуль man:pam_guest[8] можно легко использовать для реализации анонимных входов на FTP.
+
+[[pam-modules-krb5]]
+=== man:pam_krb5[8]
+
+Модуль man:pam_krb5[8]
+
+[[pam-modules-ksu]]
+=== man:pam_ksu[8]
+
+Модуль man:pam_ksu[8]
+
+[[pam-modules-lastlog]]
+=== man:pam_lastlog[8]
+
+Модуль man:pam_lastlog[8]
+
+[[pam-modules-login-access]]
+=== man:pam_login_access[8]
+
+Модуль man:pam_login_access[8] предоставляет реализацию примитива для управления учётными записями, который вводит в действие ограничения на вход, задаваемые в таблице man:login.access[5].
+
+[[pam-modules-nologin]]
+=== man:pam_nologin[8]
+
+Модуль man:pam_nologin[8] отвергает любые входы не пользователем root, если существует файл [.filename]#/var/run/nologin#. Обычно этот файл создаётся утилитой man:shutdown[8], когда до запланированного завершения работы системы остаётся менее пяти минут.
+
+[[pam-modules-opie]]
+=== man:pam_opie[8]
+
+Модуль man:pam_opie[8] реализует метод аутентификации man:opie[4]. Система man:opie[4] является механизмом работы по схеме запрос-ответ, при котором ответ на каждый запрос является прямой функцией от запроса и ключевой фразы, так что ответ может быть легко и "вовремя" вычислен любым, знающим ключевую фразу, что избавляет от необходимости передавать пароль. Кроме того, так как в man:opie[4] никогда повторно не используется запрос, ответ на который был корректно получен, эта схема является устойчивой к атакам, основанным на повторе действий.
+
+[[pam-modules-opieaccess]]
+=== man:pam_opieaccess[8]
+
+Модуль man:pam_opieaccess[8] дополняет модуль man:pam_opie[8]. Его работа заключается в выполнении ограничений, задаваемых файлом man:opieaccess[5], который определяет условия, при которых пользователь, нормально прошедший аутентификацию посредством man:opie[4], может использовать альтернативные методы. Чаще всего он используется для запрета использования аутентификации на основе паролей с непроверенных хостов.
+
+Для эффективности модуль man:pam_opieaccess[8] должен быть определён в цепочке `auth` как `requisite` сразу же после записи `sufficient` для man:pam_opie[8], но перед любыми другими модулями.
+
+[[pam-modules-passwdqc]]
+=== man:pam_passwdqc[8]
+
+Модуль man:pam_passwdqc[8]
+
+[[pam-modules-permit]]
+=== man:pam_permit[8]
+
+Модуль man:pam_permit[8] является одним из самых простым из имеющихся; на любой запрос он отвечает `PAM_SUCCESS`. Он полезен в качестве замены пустого места для сервисов, когда одна или большее количество цепочек в противном случае останутся пустыми.
+
+[[pam-modules-radius]]
+=== man:pam_radius[8]
+
+Модуль man:pam_radius[8]
+
+[[pam-modules-rhosts]]
+=== man:pam_rhosts[8]
+
+Модуль man:pam_rhosts[8]
+
+[[pam-modules-rootok]]
+=== man:pam_rootok[8]
+
+Модуль man:pam_rootok[8] возвращает положительный результат в том и только в том случае, если реальный id пользователя процесса, его вызвавшего (предполагается, что его запускает аппликант) равен 0. Это полезно для несетевых сервисов, таких как man:su[1] или man:passwd[1], к которым пользователь `root` должен иметь автоматический доступ.
+
+[[pam-modules-securetty]]
+=== man:pam_securetty[8]
+
+Модуль man:pam_securetty[8]
+
+[[pam-modules-self]]
+=== man:pam_self[8]
+
+Модуль man:pam_self[8] возвращает положительный результат тогда и только тогда, когда имена аппликанта соответствуют целевой учётной записи. Больше всего это пригодится в несетевых сервисах, таких как man:su[1], в которых идентификация аппликанта может быть с лёгкостью проверена.
+
+[[pam-modules-ssh]]
+=== man:pam_ssh[8]
+
+Модуль man:pam_ssh[8] предоставляет как сервис аутентификации, так и сеанса. Сервис аутентификации позволяет пользователям, имеющим секретные ключи SSH, защищённые паролями, в своих каталогах [.filename]#~/.ssh#, аутентифицироваться посредством этих паролей. Сеансовый сервис запускает man:ssh-agent[1] и загружает ключи, которые были расшифрованы на фазе аутентификации. Такая возможность, в частности, полезна для локальных входов в систему, как в систему X (посредством man:xdm[1] или другого X-менеджера входов, умеющего работать с PAM), так и на консоль.
+
+[[pam-modules-tacplus]]
+=== man:pam_tacplus[8]
+
+Модуль man:pam_tacplus[8]
+
+[[pam-modules-unix]]
+=== man:pam_unix[8]
+
+Модуль man:pam_unix[8] реализует традиционную аутентификацию UNIX(R) на основе паролей, использующую функцию man:getpwnam[3] для получения пароля целевой учётной записи и сравнивающую её с тем, что представил аппликант. Он также предоставляет средства управления учётными записями (отслеживая время действия учётной записи и пароля) и смены паролей. Наверное, это самый полезный модуль, так как подавляющее большинство администраторов хотят сохранить исторически сложившееся поведение по крайней мере некоторых сервисов.
+
+[[pam-appl-prog]]
+== Программирование приложений с PAM
+
+Этот раздел ещё не написан.
+
+[[pam-module-prog]]
+== Программирование модуля PAM
+
+Этот раздел ещё не написан.
+
+:sectnums!:
+
+[appendix]
+[[pam-sample-appl]]
+== Пример PAM-приложения
+
+Далее следует минимальная реализация программы man:su[1] с использованием PAM. Заметьте, что в ней используется специфичная для OpenPAM функция взаимодействия man:openpam_ttyconv[3], объявление которой расположено в файле [.filename]#security/openpam.h#. Если вы собираетесь строить это приложение в системе с другой библиотекой PAM, вам необходимо будет создать собственную функцию взаимодействия. Надёжную функцию взаимодействия неожиданно трудно написать; та, что находится в <<pam-sample-conv>>, хороша в качестве отправной точки, но в реальных приложениях использоваться не может.
+
+[.programlisting]
+....
+include::static/source/articles/pam/su.c[]
+....
+
+:sectnums!:
+
+[appendix]
+[[pam-sample-module]]
+== Пример PAM-модуля
+
+Далее приведена минимальная реализация man:pam_unix[8], предоставляющая только сервисы аутентификации. Она должна строиться и работать с большинством из реализаций PAM, но использует возможности расширений OpenPAM, если они присутствуют: отметьте использование функции man:pam_get_authtok[3], которая кардинально упрощает организацию ввода пароля пользователем.
+
+[.programlisting]
+....
+include::static/source/articles/pam/pam_unix.c[]
+....
+
+:sectnums!:
+
+[appendix]
+[[pam-sample-conv]]
+== Пример функции взаимодействия PAM
+
+Функция взаимодействия, приводимая ниже, является значительно упрощённой версией функции man:openpam_ttyconv[3] из OpenPAM. Она полнофункциональна, и должна послужить источником идей о том, как должна себя вести функция взаимодействия, однако она слишком проста для реальных приложений. Даже если вы не используете OpenPAM, можете сгрузить исходный код и использовать man:openpam_ttyconv[3] в своих целях; мы надеемся, что она достаточно надёжна в качестве функции для взаимодействия с терминальными устройствами.
+
+[.programlisting]
+....
+include::static/source/articles/pam/converse.c[]
+....
+
+:sectnums!:
+
+[[pam-further]]
+== Lectures complémentaires
+
+=== Publications
+
+_link:http://www.sun.com/software/solaris/pam/pam.external.pdf[Rendre les services de connexion indépendants des technologies d'authentification]_. Vipin Samar et Charlie Lai. Sun Microsystems.
+
+_link:http://www.opengroup.org/pubs/catalog/p702.htm[X/Open Single Sign-on Preliminary Specification]_. The Open Group. 1-85912-144-6. June 1997.
+
+_link:http://www.kernel.org/pub/linux/libs/pam/pre/doc/current-draft.txt[Pluggable Authentication Modules]_. Andrew G. Morgan. 1999-10-06.
+
+=== Guides utilisateur
+
+_link:http://www.sun.com/software/solaris/pam/pam.admin.pdf[Administration de PAM]_. Sun Microsystems.
+
+=== Page internet liées
+
+_link:http://openpam.sourceforge.net/[La page d'OpenPAM]_. Dag-Erling Smørgrav. ThinkSec AS.
+
+_link:http://www.kernel.org/pub/linux/libs/pam/[La page de Linux-PAM]_. Andrew G. Morgan.
+
+_link:http://wwws.sun.com/software/solaris/pam/[La page de Solaris PAM]_. Sun Microsystems.
diff --git a/documentation/content/ru/articles/pr-guidelines/_index.adoc b/documentation/content/ru/articles/pr-guidelines/_index.adoc
new file mode 100644
index 0000000000..54ba8550ea
--- /dev/null
+++ b/documentation/content/ru/articles/pr-guidelines/_index.adoc
@@ -0,0 +1,573 @@
+---
+title: Рекомендации по работе с сообщениями о проблемах
+authors:
+ - author: Dag-Erling Smørgrav
+ - author: Hiten Pandya
+releaseinfo: "$FreeBSD$"
+trademarks: ["freebsd", "opengroup", "general"]
+---
+
+= Рекомендации по работе с сообщениями о проблемах
+:doctype: article
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:toc-title: Содержание
+:part-signifier: Часть
+:chapter-signifier: Глава
+:appendix-caption: Приложение
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+
+include::shared/ru/mailing-lists.adoc[lines=9..-1]
+include::shared/ru/urls.adoc[]
+
+[.abstract-title]
+Аннотация
+
+Это руководство описывает рекомендуемую практику обработки сообщений об ошибках FreeBSD (Problem Reports - PR). Хотя эти рекомендации предназначены для Группы поддержки базы данных сообщений о проблемах FreeBSD (PR Database Maintenance Team) mailto:freebsd-bugbusters@FreeBSD.org[freebsd-bugbusters@FreeBSD.org], им должны следовать все, кто работает с этими сообщениями.
+
+'''
+
+toc::[]
+
+[[intro]]
+== Введение
+
+GNATS является системой управления неисправностями (сообщениями об ошибках), которая используется в Проекте FreeBSD. Так как тщательное отслеживание заметных изъянов в программном обеспечении важно для обеспечения качества FreeBSD, правильное использование GNATS необходимо для дальнейшего развития Проекта.
+
+Доступ к GNATS даётся разработчикам FreeBSD, а также более широкому сообществу. Для того, чтобы поддерживать целостность базы данных и единства работы с пользователями, были выработаны рекомендации, покрывающие общие вопросы управления проблемами, такие, как написание отклика, обработку уже закрытых вопросов и так далее.
+
+[[pr-lifecycle]]
+== Жизненный цикл сообщения о проблеме
+
+* Респондент посылает PR при помощи утилиты man:send-pr[1] и получает подтверждающее сообщение.
+* Среднестатистический коммиттер (Вася) проявляет интерес к PR и назначает его самому себе, или другой любитель ошибок (Петя) решает, что лучше всех с описанной проблемой справится именно Вася, и назначает её Васе.
+* Вася связывается с Респондентом (при этом вся переписка должна фиксироваться) и выясняет причину появления проблемы. Затем он документирует причину в журнале аудита, и переводит PR в состояние "analyzed" (проанализировано).
+* Вася проводит бессонную ночь и выпускает патч, который, по его мнению, решает означенную проблему, и затем посылает её ответом, прося Респондента протестировать его. Затем он переводит PR в состояние "feedback".
+* Через несколько таких итераций Вася и Респондент удовлетворяются получающимся патчем, и Вася переносит его в дерево `-CURRENT` (или непосредственно в `-STABLE`, если этой проблемы в `-CURRENT` не наблюдается), при этом при выполнении коммита в сопутствующем сообщении делается ссылка на сообщение о проблеме (а также упоминается Респондент, если он предоставил весь или часть патча), и, если это нужно, начинается отсчёт для MFC.
+* Если патчу не нужно выполнение MFC, Вася закрывает PR.
+* Если патч требует выполнения MFC, Вася оставляет Сообщение о проблеме в состоянии "patched" до выполнения операции MFC, а затем закрывает его.
+
+[NOTE]
+====
+Многие PR присылаются с очень слабым описанием проблемы, а некоторые из них либо очень сложно решить, либо являются вершиной айсберга другой, более широкой проблемы; в этих случаях очень важно получить всю информацию, требуемую для решения проблемы. Если описанная проблема не может быть решена, или проявится снова, необходимо повторно открыть PR.
+====
+
+[NOTE]
+====
+Адрес "электронной почты" может оказаться недоступным. В этом случае ответьте на PR обычным образом и попросите Респондента (в своём сообщении) предоставить рабочий адрес электронной почты. Обычно это происходит в случаях использования man:send-pr[1] в системах с выключенной или неустановленной почтовой системой.
+====
+
+[[pr-states]]
+== Состояние сообщений о проблемах
+
+При выполнении некоторых действий очень важно обновлять состояние PR. Это состояние должно в точности отражать текущее состояние работы над PR.
+
+.Маленький пример того, когда именно нужно менять состояние PR
+[example]
+====
+
+Когда PR находится в работе и ответственный разработчик(и) удовлетворён получающимся решением, то он отвечает на PR и меняет его состояние на "feedback". В этот момент Респондент должен изучить исправление в своей ситуации и ответить, действительно ли был устранён дефект.
+====
+
+Сообщение о проблеме может находится в одном из следующих состояний:
+
+[.glosslist]
+open::
+ Начальное состояние; проблема была поставлена и её необходимо рассмотреть.
+
+analyzed::
+ Проблема была рассмотрена, ищется её решение.
+
+feedback::
+ Дальнейшая работа требует дополнительной информации от Респондента или сообщества; возможно помещение информации о предлагаемом решении.
+
+patched::
+ Патч был перенесён в дерево исходных текстов, но что-то (выполнение MFC или, возможно, подтверждение Респондента) ещё требуется доделать.
+
+suspended::
+ Работа над проблемой была остановлена из-за отсутствия информации или необходимых ресурсов. Это первый кандидат для тех, кто ищет проект для работы над ним. Если проблема вообще не может быть решена, она будет закрыта, а не приостановлена. Проект создания документации использует suspended для желательных нововведений, которые требуют значительной работы, для которой ни у кого пока нет времени.
+
+repocopy (устаревшее)::
+ Решение проблемы зависит от завершения операции копирования репозитория (внутренние операции репозитория CVS).
+
+closed::
+ Сообщение о проблеме было закрыто, когда все изменения были перенесены, задокументированы и протестированы, либо когда исправление проблемы было отвергнуто.
+
+[NOTE]
+====
+Состояние "patched" напрямую связано с предлагаемыми решениями, так что вы можете перейти сразу к состоянию "closed", если Респондент не может протестировать патч, либо на ваших тестовых прогонах он работает.
+====
+
+[[pr-types]]
+== Типы сообщений о проблемах
+
+При обработке сообщений об ошибках, либо в качестве разработчика, имеющего непосредственный доступ к базе данных GNATS, либо в качестве контрибутора, который просматривает базу данных и посылает свои отклики с патчами, комментариями, пожеланиями или запросами на изменение, вы будете иметь дело с несколькими различными типами PR.
+
+* <<pr-unassigned>>
+* <<pr-assigned>>
+* <<pr-dups>>
+* <<pr-stale>>
+* <<pr-misfiled>>
+
+В последующих разделах описывается, для чего предназначены те или иные типы PR, условия отнесения PR к одному из этих типов, и какую обработку требует каждый из этих типов.
+
+[[pr-unassigned]]
+== Неназначенные PR
+
+По прибытии сообщениям о проблемах устанавливаются общие назначения (generic assignee). Они всегда предваряются префиксом `freebsd-`. Точное название назначения (assignee) зависит от категории и в большинстве случаев оно соответствует определенному списку рассылки FreeBSD. Далее следует текущий перечень назначений (assignee), составленный в порядке от общих к частным:
+[[default-assignees-common]]
+.Назначения по умолчанию - наиболее общие
+[cols="1,1,1", options="header"]
+|===
+| Тип
+| Категория
+| Назначение по умолчанию
+
+|базовая система
+|bin, conf, gnu, kern, misc
+|freebsd-bugs
+
+|специфичные для архитектуры
+|alpha, amd64, arm, i386, ia64, powerpc, sparc64
+|freebsd-_arch_
+
+|коллекция портов
+|ports
+|freebsd-ports-bugs
+
+|документация, поставляемая с системой
+|docs
+|freebsd-doc
+
+|страницы сайта FreeBSD (за исключением документации)
+|www
+|freebsd-www
+|===
+
+[[default-assignees-other]]
+.Назначения по умолчанию - остальные
+[cols="1,1,1", options="header"]
+|===
+| Тип
+| Категория
+| Назначение по умолчанию
+
+|в защиту FreeBSD (advocacy efforts)
+|advocacy
+|freebsd-advocacy
+
+|проблемы с Java Virtual Machine(TM)
+|java
+|freebsd-java
+
+|соответствие стандартам
+|standards
+|freebsd-standards
+
+|тредовые библиотеки
+|threads
+|freebsd-threads
+
+|подсистема man:usb[4]
+|usb
+|freebsd-usb
+|===
+
+Не удивляйтесь, если обнаружите, что автор PR присвоил ему неправильную категорию. Если вы исправите категорию, то не забудьте также подправить и назначение. (В частности, для посылающих PR является трудностью понять, что если проблема возникает на системе с архитектурой i386, то она также может быть общей для всех архитектур FreeBSD, и поэтому более подходящей будет категория `kern`. Несомненно, обратное также справедливо).
+
+Назначения некоторых PR могут быть переопределены из общих любым лицом, имеющим соответствующие привилегии. Существует несколько типов назначений: специализированные списки рассылки; почтовые алиасы (расширяемые в списки электронных адресов заинтересованных людей) и назначения отдельным лицам.
+
+Если назначением является список рассылки, пожалуйста, выполняя переназначение, используйте длинную форму (например, `freebsd-foo` вместо `foo`); благодаря этому сообщение, посылаемое в список рассылки, не будет дублироваться.
+
+[NOTE]
+====
+Так как список лиц добровольно согласившихся принимать назначения для некоторых типов PR изменяется часто, то наиболее подходящим местом для его размещения является http://wiki.freebsd.org/AssigningPRs[FreeBSD wiki].
+====
+
+Ниже приведен (возможно, неполный) перечень назначений.
+
+[[common-assignees-base]]
+.Общие назначения - базовая система
+[cols="1,1,1,1", options="header"]
+|===
+| Тип
+| Предполагаемая категория
+| Предполагаемое назначение
+| Тип назначения
+
+|проблема, специфичная для архитектуры ARM(R)
+|arm
+|freebsd-arm
+|список рассылки
+
+|проблема, специфичная для архитектуры MIPS(R)
+|kern
+|freebsd-mips
+|список рассылки
+
+|проблема, специфичная для архитектуры PowerPC(R)
+|kern
+|freebsd-ppc
+|список рассылки
+
+|проблема с Advanced Configuration and Power Management (man:acpi[4])
+|kern
+|freebsd-acpi
+|список рассылки
+
+|проблема с драйверами ATM
+|kern
+|freebsd-atm
+|список рассылки
+
+|проблема с встраиваемой системой или минимальным дистрибутивом FreeBSD (например, NanoBSD/PicoBSD/FreeBSD-arm)
+|kern
+|freebsd-embedded
+|список рассылки
+
+|проблема с драйверами FireWire(R)
+|kern
+|freebsd-firewire
+|список рассылки
+
+|проблема в исходном коде файловой системы
+|kern
+|freebsd-fs
+|список рассылки
+
+|проблема с подсистемой man:geom[4]
+|kern
+|freebsd-geom
+|список рассылки
+
+|проблема с подсистемой man:ipfw[4]
+|kern
+|freebsd-ipfw
+|список рассылки
+
+|проблема с драйверами ISDN
+|kern
+|freebsd-isdn
+|список рассылки
+
+|подсистема man:jail[8]
+|kern
+|freebsd-jail
+|список рассылки
+
+|проблема с эмуляцией Linux(R) или SVR4
+|kern
+|freebsd-emulation
+|список рассылки
+
+|проблема с сетевым стеком
+|kern
+|freebsd-net
+|список рассылки
+
+|проблема с подсистемой man:pf[4]
+|kern
+|freebsd-pf
+|список рассылки
+
+|проблема с подсистемой man:scsi[4]
+|kern
+|freebsd-scsi
+|список рассылки
+
+|проблема с звуковой подсистемой (man:sound[4])
+|kern
+|freebsd-multimedia
+|список рассылки
+
+|проблема с подсистемой man:wlan[4] или с драйвером беспроводного устройства
+|kern
+|freebsd-wireless
+|список рассылки
+
+|проблема с man:sysinstall[8] или с man:bsdinstall[8]
+|bin
+|freebsd-sysinstall
+|список рассылки
+
+|проблема с системными стартовыми скриптами (man:rc[8])
+|kern
+|freebsd-rc
+|список рассылки
+
+|проблемы в работе VIMAGE, VNET, или проблемы в их коде
+|kern
+|freebsd-virtualization
+|список рассылки
+
+|проблема с эмуляцией Xen
+|kern
+|freebsd-xen
+|список рассылки
+|===
+
+[[common-assignees-ports]]
+.Общие назначения - коллекция портов
+[cols="1,1,1,1", options="header"]
+|===
+| Тип
+| Предполагаемая категория
+| Предполагаемое назначение
+| Тип назначения
+
+|проблема с инфраструктурой системы портов (__не__ с конкретным портом!)
+|ports
+|portmgr
+|алиас
+
+|порт, у которого мейнтейнер apache@FreeBSD.org
+|ports
+|apache
+|список рассылки
+
+|порт, у которого мейнтейнер autotools@FreeBSD.org
+|ports
+|autotools
+|алиас
+
+|порт, у которого мейнтейнер doceng@FreeBSD.org
+|ports
+|doceng
+|алиас
+
+|порт, у которого мейнтейнер eclipse@FreeBSD.org
+|ports
+|freebsd-eclipse
+|список рассылки
+
+|порт, у которого мейнтейнер gecko@FreeBSD.org
+|ports
+|gecko
+|список рассылки
+
+|порт, у которого мейнтейнер gnome@FreeBSD.org
+|ports
+|gnome
+|список рассылки
+
+|порт, у которого мейнтейнер hamradio@FreeBSD.org
+|ports
+|hamradio
+|алиас
+
+|порт, у которого мейнтейнер haskell@FreeBSD.org
+|ports
+|haskell
+|алиас
+
+|порт, у которого мейнтейнер java@FreeBSD.org
+|ports
+|freebsd-java
+|список рассылки
+
+|порт, у которого мейнтейнер kde@FreeBSD.org
+|ports
+|kde
+|список рассылки
+
+|порт, у которого мейнтейнер mono@FreeBSD.org
+|ports
+|mono
+|список рассылки
+
+|порт, у которого мейнтейнер office@FreeBSD.org
+|ports
+|freebsd-office
+|список рассылки
+
+|порт, у которого мейнтейнер perl@FreeBSD.org
+|ports
+|perl
+|список рассылки
+
+|порт, у которого мейнтейнер python@FreeBSD.org
+|ports
+|freebsd-python
+|список рассылки
+
+|порт, у которого мейнтейнер ruby@FreeBSD.org
+|ports
+|freebsd-ruby
+|список рассылки
+
+|порт, у которого мейнтейнер secteam@FreeBSD.org
+|ports
+|secteam
+|алиас
+
+|порт, у которого мейнтейнер box@FreeBSD.org
+|ports
+|vbox
+|алиас
+
+|порт, у которого мейнтейнер x11@FreeBSD.org
+|ports
+|freebsd-x11
+|список рассылки
+|===
+
+PR для портов, у которых мейнтейнером является коммиттер порта, могут быть переназначены любым лицом (только учтите, что не каждый FreeBSD коммиттер в обязательном порядке является коммиттером портов, поэтому вы не должны судить только по почтовому адресу).
+
+Для остальных PR, пожалуйста не переназначайте их другим людям (за исключением себя), если вы не уверены, что человек действительно будет работать над ними. Это поможет избежать ситуации, когда решение проблемы игнорируется другими людьми, так как подразумевается, что некто уже над ней работает.
+[[common-assignees-other]]
+.Общие назначения - остальные
+[cols="1,1,1,1", options="header"]
+|===
+| Тип
+| Предполагаемая категория
+| Предполагаемое назначение
+| Тип назначения
+
+|неполадки с самой GNATS(man:send-pr[1])
+|bin
+|bugmeister
+|алиас
+
+|неполадки с веб интерфейсом GNATS
+|www
+|bugmeister
+|алиас
+|===
+
+[[pr-assigned]]
+== Назначение PR
+
+Если в PR в заполненном поле `responsible` указано имя разработчика FreeBSD, это значит, что PR взята этим человеком для дальнейшей работы.
+
+Уже назначенное PR не должно трогаться никем, кроме администраторов GNATS (bugmeister) и того, кому эта проблема назначена. Если у вас есть комментарии, напишите отклик. Если по какой-то причине вы думаете, что PR должна изменить своё состояние или её необходимо назначить кому-то другому, пошлите сообщение тому, кто назначен ответственным. Если этот человек не ответит в течение двух недель, смените назначение PR, а дальше действуйте по своему усмотрению.
+
+[[pr-dups]]
+== Повторные PR
+
+Если вы обнаружите, что один и тот же вопрос описывается более чем в одном PR, выберите то, что содержит максимальный объём полезной информации и закройте все остальные, чётко указав номер более полного PR. Если несколько PR содержат не пересекающуюся информацию, перенесите всю недостающую информацию в какой-либо отклик, включая ссылки на остальные PR; затем закройте другие PR (которые теперь полностью перекрыты).
+
+[[pr-stale]]
+== Просроченные PR
+
+PR считается простроченным, если оно не модифицировалось в течение более полугода. При обработке просроченных PR используйте следующую процедуру:
+
+* Если PR достаточно подробна, попытайтесь воспроизвести проблему в дереве `-CURRENT` и `-STABLE`. Если вам это удалось, напишите отклик, описывающий ваши изыскания и попытайтесь найти кого-то, кому эту проблему можно назначить. Если это подходит, измените состояние на "analyzed".
+* Если PR описывает проблему, которая, как вы знаете, является результатом неправильного использования (некорректная настройка или что-то ещё), напишите отклик, в котором опишите, что автор исходного сделал не так, а затем закройте PR с описанием "User error" или "Configuration error".
+* Если в PR описывается ошибка, которая, как вы знаете, была исправлена как в `-CURRENT`, так и `-STABLE`, закройте его с сообщением, указывающим на даты исправлений в каждой ветке.
+* Если PR описывает ошибку, которая, по вашим данным, была исправлена в `-CURRENT`, но не в `-STABLE`, попытайтесь выяснить, когда человек, исправивший эту ошибку, планирует выполнить MFC, либо попробуйте найти для этого кого-то ещё (может, это будете вы сами?). Измените состояние сообщения на "patched" и переназначьте его кому-либо, кто будет делать MFC.
+* В остальных случаях запросите у автора исходного сообщения подтверждения того, что проблема всё ещё присутствует в новых версиях. Если автор не отвечает в течение месяца, закройте PR с пометкой "Feedback timeout".
+
+[[pr-misfiled]]
+== Незаполненные PR
+
+GNATS требовательно подходит к формату присылаемых сообщений об ошибках. Вот почему много PR заканчивают жизнь в состоянии "misfiled", если посылающий забыл заполнить поле или ввёл неправильные данные в некоторые поля PR. Этот раздел поможет предоставить основной объём необходимых подробностей для разработчиков FreeBSD, который может помочь им закрыть или повторно заполнить эти PR.
+
+Если система GNATS не может понять, что делать с сообщением об ошибке, которое достигло базы данных, она определяет `gnats-admin` в качестве ответственного за PR и помещает сообщение в категорию `pending`. Теперь это PR в состоянии "misfiled" и оно не будет появляться в списках сообщений об ошибках, если только кто-то специально не запросит перечень всех незаполненных PR. Если у вас есть доступ к машинам в кластере FreeBSD, можете воспользоваться командой `query-pr` для просмотра списка PR, которые были некорректно сформированы:
+
+[source,bash]
+....
+% query-pr -x -q -r gnats-admin
+52458 gnats-ad open serious medium Re: declaration clash f
+ 52510 gnats-ad open serious medium Re: lots of sockets in
+ 52557 gnats-ad open serious medium
+ 52570 gnats-ad open serious medium Jigdo maintainer update
+....
+
+Как правило, PR вроде перечисленных выше оказываются незаполненными по одной из следующих причин:
+
+* Отклик на существующее PR, посланный по электронной почте, имеет неверный формат заголовка `Subject:`.
+* Автор PR отправил копию (Cc:) в список рассылки, а кто-нибудь ответил на этот пост вместо сообщения, сформированного GNATS. В копии, отосланной в список рассылки, нету тега категория/PRномер. (Вот почему мы рекомендуем посылающим _не_ делать подобных движений).
+* При заполнении шаблона man:send-pr[1] посылающий забыл указать правильное значение для категории или класса PR.
+* При заполнении шаблона man:send-pr[1] посылающий установил значение поля Confidential в `yes`. (Так как мы позволяем каждому зеркалировать GNATS при помощи rsync, информация о PR-ах является общедоступной. Сообщения, касающиеся безопасности, не следует слать через GNATS, их необходимо отправлять на адрес команды офицеров безопасности).
+* Это не реальное PR, а какое-то случайное сообщение, посланное на адрес mailto:bug-followup@FreeBSD.org[bug-followup@FreeBSD.org] или mailto:freebsd-gnats-submit@FreeBSD.org[freebsd-gnats-submit@FreeBSD.org].
+
+[[pr-misfiled-followups]]
+== Отклики неправильно оформлены как новые PR
+
+К наиболее массовой категории неправильно оформленных PR относятся те, у которых неверна тема письма, и именно они на самом деле требует самых больших усилий от разработчиков. Это не настоящие PR, описывающие отдельные ошибки. Когда по одному из адресов, который "прослушивает" GNATS на предмет обработки входящих сообщений, принимается ответ на существующее PR, то тема ответа должна быть всегда в таком виде:
+
+[.programlisting]
+....
+Subject: Re: category/number: старая тема
+....
+
+Большинство почтовых программ, когда вы отвечаете на оригинальное почтовое сообщение с PR, будут добавлять часть "`Re:`". Часть "`category/number:`" является соглашением, специфичным для GNATS, которое вы должны выполнить, вручную поставив его в тему письма с откликом.
+
+Все разработчики FreeBSD, имеющие прямой доступ к базе данных GNATS, могут регулярно проверять наличие таких PR и перемещать заинтересовавшие их в отклики к оригинальному PR (послав корректный отклик на сообщение об ошибке на адрес {bugfollowup}). Затем неправильно оформленное PR может быть закрыто с примерно таким пояснением:
+
+[.programlisting]
+....
+Your problem report was misfiled. Please use the format
+"Subject: category/number: original text" when following
+up to older, existing PRs. I've added the relevant bits
+from the body of this PR to kern/12345
+....
+
+Поиск по команде `query-pr` оригинального PR, на которое отвечает неправильно оформленный отклик, легко выполняется следующим образом:
+
+[source,bash]
+....
+% query-pr -q -y "some text"
+....
+
+После того, как вы обнаружили оригинальное PR и неправильно оформленный отклик на него, воспользуйтесь параметром `-F` команды `query-pr` для сохранения полного текста всех относящихся к делу PR в файле формата почтового ящика UNIX(R), то есть:
+
+[source,bash]
+....
+% query-pr -F 52458 52474 > mbox
+....
+
+Теперь вы можете использовать любую почтовую программу для просмотра всех PR, которые вы сохранили в файле [.filename]#mbox#. Скопируйте текст всех неверно оформленных PR в отклике на оригинальное сообщение о проблеме, и обязательно включите правильный заголовок `Subject:`. После этого закройте неверно оформленное PR. Когда вы закрываете такие PR, помните, что автор получает оповещение по почте о том, что его PR сменило состояние на "closed". В пояснении обязательно описывайте в подробностях, почему это состояние изменилось. Обычно подойдёт примерно следующий текст:
+
+[.programlisting]
+....
+Followup to ports/45364 misfiled as a new PR.
+This was misfiled because the subject did not have the format:
+
+ Re: ports/45364: ...
+....
+
+В этом случае автор неправильно оформленного PR будет знать, чего необходимо избегать при отправке отклика на существующее PR.
+
+[[pr-misfiled-format]]
+== Некорректные PR с отсутствующими полями
+
+Ко второму типу неправильно оформленных PR обычно относят те, что являются результатом забывчивости авторов, которые не заполнили все необходимые поля при написании первоначального PR.
+
+Отсутствие или ошибочное задание полей "category" или "class" может привести к появлению некорректного сообщения. Разработчики могут использовать man:edit-pr[1] для смены значений категории или класса этих неправильно оформленных PR на более подходящие и сохранить PR.
+
+Другой распространённой причиной появления неправильно оформленных PR являются вопросы форматирования, квотирование, изменение или удаление шаблона `send-pr`, как по вине пользователя, редактирующего шаблон, так и почтовых программ, которые проделывают странные вещи с обычными текстовыми сообщениями. Это изредка случается и может быть исправлено программой `edit-pr`, что требует некоторых усилий со стороны разработчика, корректирующего PR, однако в большинстве случаев это можно сделать относительно легко.
+
+[[pr-misfiled-notpr]]
+== Неправильные PR, которые на самом деле не являются сообщениями об ошибках
+
+Иногда пользователь желает сообщить об ошибке и посылает GNATS по электронной почте обычное сообщение. Скрипты GNATS работает с сообщениями об ошибках, которые форматированы при помощи шаблона man:send-pr[1]. Они не могут обрабатывать любые сообщения электронной почты. Вот почему сообщения об ошибках, посылаемые на адрес mailto:freebsd-gnats-submit@FreeBSD.org[freebsd-gnats-submit@FreeBSD.org], должны быть оформлены по шаблону команды `send-pr`, хотя сообщения по электронной почте можно послать на {freebsd-bugs}.
+
+Разработчики, которые видят PR, выглядящие так, будто они должны были быть посланы в адрес {freebsd-bugs} или какого-то другого списка рассылки, должны закрыть PR, проинформировав его автора в протоколе изменения состояния о причинах, по которых это не является настоящим PR и куда следует посылать сообщения.
+
+Электронный адрес, который использует GNATS для приёма поступающих PR, опубликован в документации к FreeBSD, объявлялся и указан на Web-сайте. Это значит, что спамеры его увидели. Спам-сообщения, достигшие GNATS, немедленно определяются в категорию "pending" и остаются там до тех пор, пока кто-нибудь их не пересмотрит. Закрытие любого из таких сообщений при помощи man:edit-pr[1] весьма раздражает, потому что GNATS отвечает автору, а адрес отправителя спам-почты никогда не бывает настоящим. Для каждого закрытого PR будут приходить сообщения о невозможности доставки.
+
+На данный момент с установкой некоторых фильтров против спама, проверяющих все добавления в базу данных GNATS, количество спама, достигающего состояния "pending", весьма мало.
+
+Все разработчики, имеющие доступ к машинам кластера FreeBSD.org, приглашаются к проверке неправильно оформленных PR и немедленному закрытию тех, что являются почтовым спамом. Когда вы закрываете такое PR, пожалуйста, сделайте следующее:
+
+* Выставьте Category в `junk`.
+* Установите Confidential в `no`.
+* Установите Responsible в `gnats-admin`.
+* Смените State в `closed`.
+
+Для PR категории junk не выполняется резервное копирование, следовательно, перевод спам сообщений в эту категорию обозначает, что мы не желаем хранить их или тратить дисковое пространство на них. Если вы просто закрываете их без смены категории, они остаются как в главной базе, так и во всех копиях базы, зеркалируемых через CVSup.
+
+[[references]]
+== Дополнительная литература
+
+Это перечень ресурсов, относящихся к качественному написанию и обработке сообщений об ошибках. Несомненно, этот список не является полным.
+
+* link:{problem-reports}[Как писать Сообщения об ошибках FreeBSD]-руководство для авторов PR.
diff --git a/documentation/content/ru/articles/problem-reports/_index.adoc b/documentation/content/ru/articles/problem-reports/_index.adoc
new file mode 100644
index 0000000000..80bdb09ab3
--- /dev/null
+++ b/documentation/content/ru/articles/problem-reports/_index.adoc
@@ -0,0 +1,367 @@
+---
+title: Составление сообщений о проблеме во FreeBSD
+authors:
+ - author: Dag-Erling Smørgrav
+ - author: Mark Linimon
+releaseinfo: "$FreeBSD$"
+trademarks: ["freebsd", "ibm", "intel", "sparc", "sun", "general"]
+---
+
+= Составление сообщений о проблеме во FreeBSD
+:doctype: article
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:toc-title: Содержание
+:part-signifier: Часть
+:chapter-signifier: Глава
+:appendix-caption: Приложение
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+
+include::shared/ru/teams.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/urls.adoc[]
+
+[.abstract-title]
+Аннотация
+
+Эта статья описывает, как наилучшим образом сформулировать и отправить сообщение о проблеме в Проект FreeBSD.
+
+'''
+
+toc::[]
+
+[[pr-intro]]
+== Введение
+
+Одной из самых разочаровывающих практик, которую можно получить в качестве пользователя программного обеспечения, является отправка сообщения о проблеме, которое вскоре закрывается с кратким и ничему не помогающим объяснением типа "это не проблема" или "неправильное PR". Подобным же образом одной из самых разочаровывающих практик, которую можно получить в качестве разработчика программного обеспечения, является получение массы сообщений о проблемах, которые на самом деле не являются сообщениями о проблемах, а запросами на получение поддержки, или которые содержат мало или вообще не содержат никакой информации о сути проблемы или способе ее воспроизведения.
+
+В этом документе делается попытка описать то, как составлять хорошие сообщения о проблемах. Что же, спросите вы, является хорошим сообщением о проблеме? Ну, если перейти прямо к сути, то хорошим сообщением об проблеме является то, которое может быть быстро проанализировано и отработано, к обоюдному удовлетворению как пользователя, так и разработчика.
+
+Хотя в основном статья фокусируется на сообщениях о проблемах во FreeBSD, большей частью она должна хорошо подходить и другим программным проектам.
+
+Заметьте, что эта статья организована по тематическому принципу, а не хронологически, так что вы должны прочесть документ целиком прежде, чем посылать сообщение о проблеме, и не воспринимать статью как пошаговое руководство.
+
+[[pr-when]]
+== Когда нужно отправлять сообщение о проблеме
+
+Имеется много классов ошибок, и не все они должны приводить к появлению сообщения о проблеме. Конечно же, нет идеальных людей, и будут моменты, когда вы решите, что нашли ошибку в программе, а на самом деле вы неправильно поняли синтаксис команды или сделали опечатку в конфигурационном файле (хотя само по себе это иногда говорит о плохой документации или неправильной обработке ошибок в прикладной программе). Есть еще много случаев, когда посылка сообщения о проблеме явно _не_ является правильным действием, а только приводит к разочарованию вас и разработчиков. И наоборот, есть случаи, когда может быть нужно послать сообщение о чем-то, не являющемся ошибкой - к примеру, запрос на доработку или расширение функциональности.
+
+Но как же определить, что является ошибкой, а что нет? Простым правилом, которому нужно следовать, является следующее - ваша проблема _не_ является ошибкой, если она формулируется как вопрос (обычно в форме "Как сделать X?" или "Где можно найти Y?"). Не всегда это так однозначно, но правило вопроса покрывает большинство случаев. Если Вам нужен ответ, лучше всего задать свой вопрос в {freebsd-questions}.
+
+Вот некоторые случаи, в которых может оказаться полезным отправить сообщение о чем-то, что не является ошибкой:
+
+* Уведомление об обновлении программного обеспечения, которое поддерживается сторонними разработчиками (в основном порты, но также и компоненты базовой системы, разрабатываемые сторонними организациями, такие, как BIND или различные утилиты GNU).
++
+Для не поддерживаемых никем портов (переменная `MAINTAINER` содержит `ports@FreeBSD.org`), такие уведомления о обновлении будут замечены заинтересовавшимся коммиттером и вас могут попросить предоставить патч для обновления порта; предоставление патча до того, как вас попросят об этом сильно увеличит шансы того, что порт будет обновлён вовремя.
++
+Если порт поддерживается, PR-ы, указывающие о появлении новых улучшенных (upstream) релизов обычно не очень полезны, так как они прибавляют много вспомогательной работы для коммиттеров, а мэйнтейнер наверняка уже знает о новой версии. Они уже наверняка работали с разработчиками над ней или они возможно тестируют её, чтобы убедиться в отсутствии регрессии и т.п.
++
+В любом случае, следование процессу, описанному в link:{porters-handbook}#port-upgrading[Руководстве по созданию портов] даст наилучшие результаты. (Также можно ознакомиться с статьей link:{contributing-ports}[Контрибуция в коллекцию портов FreeBSD].)
+
+Ошибка, которую нельзя воспроизвести, вряд ли будет исправлена. Если ошибка возникла только единожды, и вы не можете ее воспроизвести, к тому же никто с ней больше не сталкивался, нет никаких шансов, что разработчики смогут ее воспроизвести или понять, что делается неправильно. Это не значит, что такого не случается, но это значит, что шансов у вашего сообщения дойти когда-либо до стадии исправления ошибки очень малы. Часто эти виды ошибок возникают из-за неудовлетворительной работы жёстких дисков, перегревшихся процессоров. Всегда, когда это возможно вы должны отслеживать такие случаи перед посылкой сообщения об ошибке.
+
+Теперь, чтобы определить кому вы должны отправить ваше сообщение об ошибке, вы должны понимать, что программное обеспечение, которое входит во FreeBSD, составляется из нескольких различных частей:
+
+* Код в базовой системе, который пишется и поддерживается контрибьюторами FreeBSD. Такой, как ядро, библиотека C, драйвера устройств (входят в категорию `kern`); утилиты (`bin`); страницы справочника и документация (`docs`); веб-страницы (`www`). Все ошибки в этих областях должны быть сообщены разработчикам FreeBSD.
+* Код в базовой системе, который пишется и поддерживается другим, импортируется во FreeBSD и адаптируется. Примеры включают в себя: bind, man:gcc[1] и man:sendmail[8]. Большинство ошибок, попадающие в данные области должны быть сообщены разработчикам FreeBSD, но в некоторых случаях они должны быть отправлены изначальным разработчикам, если проблемы не являются специфичными для FreeBSD. Обычно ошибки такого рода попадают под категории `bin` или `gnu`.
+* Отдельные приложения, не входящие в базовую систему, но являющиеся частью Коллекции Портов FreeBSD (категория `ports`). Большинство этих приложений не пишется разработчиками FreeBSD; что предоставляет FreeBSD, так это только лишь инфраструктуру для установки приложения. Следовательно, вы должны отправлять сообщение об ошибке разработчикам FreeBSD только тогда, когда вы уверены в том, что проблема специфична для FreeBSD - иначе отправляйте её авторам программного обеспечения.
+
+Затем вы должны убедиться, действительно ли проблема существует. Существует всего несколько вещей, которые раздражают разработчика больше, чем получение сообщения об ошибке, которую он уже исправил.
+
+Если проблема в базовой системе, то вам нужно сначала прочесть раздел link:{faq}#LATEST-VERSION[версии FreeBSD] из FAQ, если вы ещё не знакомы с данной темой. Для FreeBSD возможно исправлять проблемы только для некоторых недавних веток базовой системы, поэтому отправка сообщения об ошибке для более старой версии приведёт к тому, что разработчик посоветует вам обновиться до поддерживаемой версии, чтобы посмотреть присутствует ли в ней проблема. Команда офицеров безопасности поддерживает link:https://www.FreeBSD.org/security/[список поддерживаемых версий.].
+
+Если проблема связана с портами, помните, что вы сначала должны обновиться до самой последней версии Коллекции Портов и проверить, существует ли в ней проблема. Из-за быстрых внесений изменений в эти приложения, неосуществимым для FreeBSD является поддержка чего-либо, кроме самых последних версий, и проблемы со устаревшими версиями приложений просто не могут быть исправлены.
+
+[[pr-prep]]
+== Подготовка
+
+Нужно следовать хорошему правилу всегда сначала выполнять дополнительные исследования перед тем, как послать сообщение о проблеме. Может быть, о вашей проблеме уже сообщено; может быть, она недавно обсуждалась или обсуждается в списках рассылки; она может быть уже исправлена в более новой версии, чем та, что вы используете. Поэтому вы должны проверить все обычные места до того, как послать ваше сообщение о проблеме. Для FreeBSD это значит:
+
+* FreeBSD link:{faq}[FAQ] (Ответы на часто задаваемые вопросы). FAQ содержит ответы на вопросы из самых разных категорий, в частности, link:{faq}#hardware[аппаратной совместимости], link:{faq}#applications[пользовательских программ] и link:{faq}#kernelconfig[конфигурации ядра].
+* link:{handbook}[Списки рассылки]-если Вы не подписаны на них, воспользуйтесь http://www.FreeBSD.org/search/#mailinglists[поиском в архивах] на сайте FreeBSD. Если ваша проблема не обсуждалась в списках рассылки, вы можете попытаться опубликовать сообщение о ней и подождать несколько дней, пока кто-нибудь не сможет увидеть то, что вы не заметили.
+* Как вариант, весь веб-используйте вашу любимую поисковую систему для поиска каких-либо ссылок по вашей проблеме. Вы можете даже увидеть ссылки на архивы списков рассылки или телеконференций, о которых вы не знали или не думали там искать.
+* Следующим пунктом должна быть http://www.FreeBSD.org/cgi/query-pr-summary.cgi?query[ база данных PR FreeBSD] (GNATS). Если только ваша проблема не нова или редка, есть некоторый шанс, что о ней уже сообщено.
+* И самое важное, вы должны посмотреть не затрагивает ли документация в базовой системе вашу проблему.
++
+Для основного кода FreeBSD вы должны тщательно изучить содержимое файла [.filename]#/usr/src/UPDATING# или его текущую версию по адресу http://svnweb.freebsd.org/base/head/UPDATING?view=log[http://svnweb.freebsd.org/base/head/UPDATING?view=log]. (Если вы переходите с одной версии на другую, особенно если вы обновляетесь до FreeBSD-CURRENT, то в этом файле вы можете найти много важной информации).
++
+Если же ваша проблема связана с коллекцией портов FreeBSD, вы должны обратиться к файлу [.filename]#/usr/ports/UPDATING# (изменения, касающиеся индивидуальных портов) или к [.filename]#/usr/ports/CHANGES# (изменения, касающиеся всей коллекции портов). Они также доступны через интерфейс svnweb: http://svnweb.freebsd.org/ports/head/UPDATING?view=log[http://svnweb.freebsd.org/ports/head/UPDATING?view=log] и http://svnweb.freebsd.org/ports/head/CHANGES?view=log[http://svnweb.freebsd.org/ports/head/CHANGES?view=log].
+
+[[pr-writing]]
+== Написание сообщения о проблеме
+
+Теперь, после того, как вы решили, что ваш вопрос подпадает под категорию сообщения о проблеме, и это проблема FreeBSD, самое время написать собственно сообщение о проблеме (PR). Прежде чем мы углубимся в частности использования программы для создания и отправки PR, вот несколько советов, которые помогут вам сделать PR более эффективным.
+
+== Как писать хорошие сообщения о проблемах
+
+* Основным языком общения разработчиков FreeBSD является английский. База данных по проблемам также ведется на английском. Если вы испытываете проблемы с формулировкой описания проблемы по-английски, свяжитесь со своими соотечественниками, которые помогут вам составить PR.
++
+* _Не оставляйте поле "Synopsis" (краткое описание) пустым._ Сообщения о проблемах попадают как в списки рассылки, которые затем расходятся по всему миру (в них поле "Synopsis" определяет тему письма), так и в базу данных. Просматривающий эту базу, как правило, пройдет мимо PR с пустым кратким описанием. Не забудьте, что PR остается в базе до тех пор, пока кто-либо не закроет его; сообщение-аноним, скорее всего, просто потеряется на общем фоне.
+* __Избегайте туманных описаний в поле "Synopsis"__. Не стоит предполагать, что читающий ваше сообщение владеет контекстом; поэтому, чем подробнее вы опишете ситуацию, тем лучше. В частности, к какой части системы относится ваша проблема? Проявляется ли она на этапе установки или во время нормальной работы? Например, вместо строки `Synopsis: portupgrade is broken` следовало бы написать что-то вроде `Synopsis: port ports-mgmt/portupgrade coredumps on -current`. В случае портированных приложений в поле "Synopsis" полезно указывать не только имя порта, но и категорию.
+* _Если у вас есть готовый патч, скажите об этом._ PR, содержащий патч, имеет куда больше шансов быть рассмотренным. В этом случае добавьте строку `[patch]` (включая квадратные скобки) в начало поля "Synopsis" (хотя использование именно этой формы необязательно, она является стандартом де-факто).
+* _Если вы отвечаете за исходные тексты, сообщите об этом._ Если вы отвечаете за часть исходных текстов (например, порт), вы можете добавить в начало поля "Synopsis" строку `[maintainer update]` (включая квадратные скобки), а также установить класс вашего PR (поле "Class") в `maintainer-update`. В этом случае коммиттеру, обрабатывающему ваш PR, не придётся лишний раз проверять.
+* _Будьте точны в формулировках._ Чем больше информации вы можете предоставить о проблеме, тем больше у вас шансов получить ответ.
+** Включите информацию о версии FreeBSD, которую вы используйте (существует специальное поле для его включения, смотрите ниже) и на какой архитектуре. Сообщите, используете ли вы release версию (установили с компакт-диска либо загрузили) или скачали её с помощью Subversion (и если так, то сообщите номер ревизии). Если вы используете FreeBSD-CURRENT, то первый вопрос, который вам могут задать, будет про номер ревизии, так как исправления для этой ветки (особенно в случае серьёзных проблем) имеют тенденцию появляться слишком быстро.
+** Включите информацию о том, какие глобальные опции вы указали в [.filename]#make.conf#. На заметку: Объявление опций наподобие `-02` и других, описанных в man:gcc[1] во многих случаях может быть причиной ошибок. Хотя и разработчики FreeBSD будут принимать патчи, у них не будет желания исследовать такие случаи из-за отсутствия времени и добровольцев, и вместо этого они могут ответить, что это не поддерживается.
+** Если проблему можно легко повторить, включите необходимую информацию, чтобы разработчик смог воспроизвести ее самостоятельно. Если проблема проявляется при некоторых вводимых данных, то, по возможности, приведите их вместе с получаемым и ожидаемым выводом. Если же вводимых данных много или же их нельзя разглашать, то попробуйте выделить из них лишь небольшой фрагмент, приводящий к возникновению проблемы, и включите его в PR.
+** Если ваша проблема связана с ядром, будьте готовы предоставить следующую информацию (вам не обязательно включать её всю, она пойдёт лишь на заполнение базы данных, но вы должны включить информацию, которая по вашему мнению актуальна):
+
+*** Вашу конфигурацию ядра, включая то, какие устройства у вас установлены
+*** Включены ли у вас опции отладки (например, `WITNESS`), и если так, то существует ли проблема после изменения значения этой опции
+*** Полный вывод обратной трассировки (backtrace), паники или иного консольного вывода, или же записи из [.filename]#/var/log/messages#, если они были сгенерированы
+*** Вывод команды `pciconf -l`, а также соответствующие части вывода `dmesg`, в случае, если проблема связана с конкретным оборудованием
+*** Прочли ли вы [.filename]#src/UPDATING#, описана ли там ваша проблема (кто-нибудь спросит обязательно)
+*** Запускается ли другое ядро (это для тех случаев, когда причиной сбоя стало оборудование, например отказывающие винчестеры или перегревшиеся процессоры, что может маскировать проблемы ядра)
+
+** Если же ваша проблема связана с портами, то предоставьте следующую информацию (вам не обязательно включать её всю, она пойдет лишь на заполнение базы данных, но вы должны включить информацию, которая по вашему мнению актуальна):
+
+*** Какие порты вы устанавливали
+*** Имеются ли какие-либо переменные окружения, которые переписывают первоначально-установленные в [.filename]#bsd.port.mk#, такие как, `PORTSDIR`)
+*** Прочли ли вы [.filename]#ports/UPDATING#, и описана ли там ваша проблема (кто-нибудь спросит обязательно)
+
+* _Избегайте нечетких запросов о новых возможностях._ Сообщение типа "кто-то обязательно должен сделать так, чтобы такая-то утилита вела себя так-то" имеет куда меньше шансов встретить позитивный отклик, чем более четко сформулированный запрос. Помните, что исходные тексты доступны всем, так что если вам нужна реализация какого-то нового свойства, лучший способ- взяться за работу самому! Не забудьте также, что такие моменты лучше обсуждать в списках рассылки, таких как `freebsd-questions`, чем делать это посредством базы данных PR.
+* _Убедитесь, что ваша проблема еще никем не описана._ Мы уже говорили об этом, но стоит повториться. Потратьте пару минут на составление запросов к базе PR: http://www.FreeBSD.org/cgi/query-pr-summary.cgi?query[http://www.FreeBSD.org/cgi/query-pr-summary.cgi?query]. (Несмотря на повторы, об этом постоянно забывают)
+* _Сообщайте об одной проблеме в одном PR._ Избегайте описания двух и более проблем в одном сообщении (исключением являются взаимосвязанные проблемы). Оформляя патчи, не пытайтесь в них добавлять множество функциональных возможностей или исправлять ими несколько ошибок в одном и том же сообщении о проблеме (опять же, за исключением взаимосвязанных проблем) - для таких PR-ов потребуется значительно больше времени на обработку.
+* _Избегайте полемики._ Если ваше сообщение касается области или способов реализации, которые ранее вызвали разногласия, вам стоит быть готовым предоставить не только патчи, но и внятные аргументы, почему следует поступать именно так (то есть, это "Правильный Путь"). Как отмечалось выше, аккуратный поиск по архиву списков рассылки http://www.FreeBSD.org/search/#mailinglists[http://www.FreeBSD.org/search#mailinglists] никогда не помешает.
+* _Будьте вежливы._ Почти каждый из тех, кто может заниматься вашим сообщением, является добровольцем. Никому не понравятся указания, как и что делать, когда он и так занимается этим, да еще и по каким-либо причинам, отличным от финансовых. Вообще говоря, этого подхода следует придерживаться, имея дело с любым проектом с Открытыми Исходными текстами (Open Source).
+
+== Прежде всего
+
+Если вы используйте утилиту man:send-pr[1] проверьте, что переменная вашего окружения `VISUAL` (или `EDITOR`, если `VISUAL` не задана) задана подходящим образом.
+
+Следует также проверить работоспособность системы электронной почты. Утилита man:send-pr[1] использует почтовую систему для отправки и отслеживания сообщения о проблеме. Если с машины, на которой вы запускаете man:send-pr[1], нельзя отправить почту, сообщение не попадёт в базу данных GNATS. О настройке электронной почты во FreeBSD можно прочитать в главе "Электронная почта" Руководства по FreeBSD по адресу link:{handbook}#mail[Electronic Mail].
+
+Убедитесь, что ваш почтовый клиент не исказит сообщение по пути в GNATS. В частности, если ваш почтовый клиент автоматически переносит строки, изменяет символы табуляции на пробелы или предотвращает интерпретацию символов новой строки, любой патч, который вы пришлёте окажется непригодным. Для текста мы хотели бы, чтобы вы делали строчки размером примерно в 70 символов для читабельности PR на веб странице.
+
+Примерные соображения должны учитываться при отправке сообщения об ошибке через link:https://www.FreeBSD.org/send-pr/[веб-форму] вместо man:send-pr[1]. Помните, что операции копирования-вставки могут иметь сторонние эффекты в форматировании текста. В определённых случаях может быть необходимо использовать man:uuencode[1] для гарантии того, что патчи придут не изменёнными.
+
+И наконец, если ваше сообщение будет объёмным, вы должны приготовить его в offline, чтобы ничего не потерялось в случае, если будет проблема при его отправке. Это особенно касается link:https://www.FreeBSD.org/send-pr/[веб-формы].
+
+== Вложение патчей или файлов
+
+Нижеследующее применимо к передаче сообщения о проблеме посредством электронной почты:
+
+Программа man:send-pr[1] предусматривает присоединение файлов к сообщению о проблеме. Вы можете вложить сколько угодно файлов, но каждый с уникальным именем (имеется в виду имя файла без маршрута). Просто используйте параметр командной строки `-a` для задания имен файлов, которые вы хотите присоединить:
+
+[source,bash]
+....
+% send-pr -a /var/run/dmesg -a /tmp/errors
+....
+
+Не беспокойтесь о бинарных файлах, они будут автоматически перекодированы для того, чтобы не повредить работе вашей почтовой программы.
+
+Если вы вкладываете патч, обязательно используйте параметр `-c` или `-u` вместе с командой man:diff[1] для создания контекстного или унифицированного diff-файла (унифицированный формат предпочтителен), и обязательно укажите точные номера SVN ревизий файлов, которые вы изменяли, чтобы разработчики, которые будут читать ваше сообщение, смогли легко его применить. Для проблем, связанных с ядром или с базовыми утилитами, предпочтительнее будет патч относительно ветки FreeBSD-CURRENT (или Subversion-ветки HEAD), так как весь новый код должен быть сначала протестирован в ней. После завершения тестирования код будет интегрирован в ветвь FreeBSD-STABLE.
+
+Если вы вставляете патч в тело сообщения, учтите, что некоторые почтовые программы имеют тенденцию заменять табуляции серией пробелов, что полностью разрушит, например, часть файла сборки (Makefile).
+
+Не отсылайте патчи в виде вложений, используя `Content-Transfer-Encoding: quoted-printable`. Это выполнит экранирование (escaping) символов и весь патч будет бесполезным.
+
+Следует также заметить, что включение небольших патчей в сообщение о проблеме является приемлемой практикой, в особенности если они решают проблему, описанную в сообщении, большие же патчи, а в особенности новый код, который может требовать значительного просмотра перед тем, как он будет внесен в дерево исходных текстов, должны быть размещены на web- или ftp-сервере, а в сообщение о проблеме должен быть включён только URL указывающий на этот патч. Очень часто патчи, пересылаемые по электронной почте, а в особенности если задействована GNATS, бывают искажены, и, как следствие, чем больше патч, тем труднее будет для заинтересованных людей привести его к нормальному виду. Также то, что патч будет размещён отдельно от сообщения о проблеме, даёт возможность изменять его не отсылая полный патч в дополнение к изначальному сообщению о проблеме. И наконец, большие патчи просто увеличивают размер базы данных, так как закрытые сообщения об ошибках на самом деле не удаляются, а сохраняются и помечаются, как `closed`.
+
+Вы должны также помнить, что пока вы явно не укажете обратного в вашем сообщении о проблеме или в самих патчах, будет предполагаться, что они подпадают под те же условия лицензирования, что и оригинальный файл, измененный вами.
+
+== Заполнение шаблона
+
+Следующие несколько абзацев применимы только к способу подачи PR через электронную почту:
+
+После запуска утилиты man:send-pr[1] вам будет представлен шаблон сообщения о проблеме. Шаблон состоит из списка полей, некоторые из которых уже заполнены, а некоторые содержат комментарии, объясняющие назначение поля или перечисляющие подходящие значения. Не беспокойтесь о комментариях; они будут автоматически удалены, если вы их не изменяли (или удалите их сами).
+
+Вверху шаблона, ниже строк `SEND-PR:` находятся заголовки почтового сообщения. Вам обычно не нужно их изменять, если только вы не посылаете сообщение о проблеме с машины или от учетной записи, которая может посылать, но не может получать электронную почту, в случае чего вы можете задать в полях `From:` и `Reply-To:` ваши реальные адреса электронной почты. Вы можете также послать самому себе (или кому-то еще) копию сообщения о проблеме, добавив один или большее количество адресов к заголовку `Cc:`.
+
+В шаблоне вы найдете два однострочных поля:
+
+* _Submitter-Id:_ Не меняйте его. Значение по умолчанию `current-users` правильно, даже если вы используете FreeBSD-STABLE.
+* _Confidential:_ Предварительно заполнено как `no`, его изменение не имеет значения, так как нет такого понятия, как конфиденциальное сообщение о проблеме - база данных PR распространяется по всему миру.
+
+Далее описаны общие поля для почтового и link:https://www.FreeBSD.org/send-pr/[веб интерфейса]:
+
+* _Originator:_ Пожалуйста, укажите ваше реальное имя, за которым опционально следует адрес вашей электронной почты в угловых скобках. Обычно, man:send-pr[1] заполняет поле Originator содержимым поля `gecos` из учетной записи текущего пользователя.
++
+[NOTE]
+====
+Предоставленный вами адрес электронной почты станет публичной информацией и может стать доступным спамерам. Поэтому совсем не лишними будут меры по борьбе со спамом на вашей стороне, или же можно воспользоваться временным адресом электронной почты. Однако, если вы укажете несуществующий почтовый адрес, то у нас не будет возможности уточнять детали по вашему PR.
+====
+* _Organization:_ Все, что вы захотите здесь указать. Это поле не содержит значительной информации.
+* _Synopsis:_ Заполняется кратким и точным описанием проблемы. Краткое описание используется в качестве темы сообщения электронной почты о проблеме, и используется при выдаче списков и выборках сообщений о проблемах; сообщения о проблемах с непонятными краткими описаниями чаще всего игнорируются.
++
+Повторим: если к вашему сообщению о проблеме приложен патч, то, пожалуйста, начните краткое описание с `[patch]` (включая квадратные скобки); если PR принадлежит к категории ports и вы являетесь его мейнтейнером, то начните описание с `[maintainer update]` (включая квадратные скобки) и установите класс проблемы (поле "Class") в `maintainer-update`.
+* _Severity:_ Одно из `non-critical`, `serious` или `critical`. Не переусердствуйте; избегайте пометки вашей проблемы как `critical`, если только это не действительно критичная проблема (повреждение данных, существенная потеря функциональности в -CURRENT), или `serious`, если только это не касается многих пользователей (паники ядра, блокировки (freezes), проблемы с конкретными драйверами устройств или с системными утилитами). Разработчики FreeBSD не обязательно будут работать над вашей проблемой быстрее, если вы установите слишком высокий уровень важности, т.к. существует много других людей, которые сделали тоже самое - некоторые разработчики всё же уделят этому полю немного внимания и перейдут к следующему сообщению именно из-за этого поля.
++
+[NOTE]
+====
+Большинство проблем с безопасностью _не_ следует отправлять в GNATS, потому что вся эта информация становится публичной. Пожалуйста, направляйте подобные отчеты на электронный адрес `{security-officer}`.
+====
+* _Priority:_ Одно из `low`, `medium` или `high`. `high` должен использоваться для проблем, которые затронут конкретно каждого пользователя FreeBSD, а `medium` для чего-то, что затронет многих пользователей.
++
+[NOTE]
+====
+Ввиду массовых злоупотреблений это поле потеряло свое значение.
+====
+* _Category:_ Выберите соответствующую категорию.
++
+Первым делом необходимо решить, к какой части системы относится ваша проблема. Помните: FreeBSD - завершенная операционная система, которая устанавливает ядро, стандартные библиотеки, множество драйверов периферийного оборудования, а также - большой набор системных утилит ("базовая система"). В дополнение к этому, в коллекции портов имеются тысячи приложений. Следовательно, определитесь: обнаруженная вами проблема находится в базовой системе или в чем-то, установленным через коллекцию портов.
++
+Вот описание основных категорий:
+
+** Если проблема в ядре, в библиотеках (таких как стандартная библиотека С `libc`) или в драйвере из базовой системы, то используйте категорию `kern`. (Есть несколько исключений, описанных ниже). В общем, это всё, что описано в разделах 2, 3 или 4 справочника.
+** Если проблема с бинарной программой, например с man:sh[1] или man:mount[8], то вам прежде всего необходимо определить принадлежность программы к базовой системе или к установке из коллекции портов. Если вы не уверены, выполните команду `whereis _имя программы_`. В FreeBSD для коллекции портов существует договоренность: установка ведется в [.filename]#/usr/local#, однако это может быть переопределено системным администратором. Для таких программ следует использовать категорию `ports` (даже если категория порта `www`; см. ниже). Если программа располагается в [.filename]#/bin#, [.filename]#/usr/bin#, [.filename]#/sbin# или в [.filename]#/usr/sbin#, то это часть базовой системы, и вам следует использовать категорию `bin`. (Несколько программ, например man:gcc[1], на самом деле используют категорию `gnu`, но не беспокойтесь об этом сейчас.) Программы этой категории описаны в разделах 1 и 8 справочной системы.
+** Если вы уверены, что в стартовых скриптах `(rc)` или в каком-то ином неисполняемом конфигурационном файле присутствует ошибка, тогда верной категорией будет `conf` (configuration). Эти сущности описываются в разделе 5 справочной системы.
+** Если вы нашли проблему в наборе документации (статьи, книги, страницы справочной системы), правильным выбором будет `docs`.
+** Если вы наблюдаете проблему на страницах http://www.FreeBSD.org[сайта FreeBSD], то правильным выбором будет `www`.
++
+[NOTE]
+====
+Если проблема с чем-то из порта, называемого `www/_someportname_`, то она все же принадлежит к категории `ports`.
+====
++
+Далее представлены более специализированные категории.
+
+** Если проблема принадлежит к `kern`, но в то же время имеет дело с подсистемой USB, то правильным выбором будет `usb`.
+** Если проблема принадлежит к `kern` и найдена в потоковых библиотеках, правильным выбором будет `threads`.
+** Если проблема принадлежит к базовой системе и касается соблюдения стандартов, таких как POSIX(R), правильным выбором будет `standards`.
+** Если проблема связана с ошибками внутри Java Virtual Machine(TM) (JVM(TM)), даже если Java(TM) была установлена из коллекции портов, вам следует выбрать категорию `java`. Более общие проблемы с портами Java(TM) попадают под категорию `ports`.
++
+Далее перечислены остальные категории.
+
+** Если вы уверены, что проблема проявляется только на используемой вами процессорной архитектуре, выберите одну из архитектурно-специфичных категорий: это `i386` для Intel-совместимых машин в 32-битном режиме; `amd64` для AMD машин в 64-битном режиме (сюда также входят Intel-совместимые машины работающие в режиме EMT64); и менее распространенные `arm`, `ia64`, `powerpc` и `sparc64`.
++
+[NOTE]
+====
+Люди часто ошибаются в выборе категории. Если вы не уверены в правильности выбора, то лучше не гадать, а выбрать `misc`.
+====
++
+.Правильное использование категории
+[example]
+====
+
+У вас простой ПК, и вы подозреваете, что столкнулись с проблемой, специфичной для конкретного чипсета или материнской платы: верная категория - `i386`.
+====
++
+.Неправильное использование категории
+[example]
+====
+
+Если вы наблюдаете проблему с периферийной картой расширения на распространенной шине или неполадки с конкретного типа жестким диском: в этом случае возможно, что неисправность наблюдается на более чем одной архитектуре, и верным выбором будет `kern`.
+====
+** Если вы не знаете в чем проблема (или вам кажется, что описание не попадает ни под какую из вышеобозначенных), используйте категорию `misc`. Перед тем, как написать PR, можно для начала спросить помощи в {freebsd-questions}. Возможно, там вам подскажут, какую из существующих категорий следует выбрать.
++
+Вот текущий перечень категорий (взят из http://svnweb.freebsd.org/base/head/gnu/usr.bin/send-pr/categories[http://svnweb.freebsd.org/base/head/gnu/usr.bin/send-pr/categories]):
+
+** `advocacy:` проблемы, связанные с общественным мнением о FreeBSD. Вышло из употребления.
+** `amd64:` проблемы, специфичные для платформы AMD64.
+** `arm:` проблемы, специфичные для платформы ARM.
+** `bin:` проблемы с пользовательскими программами из базовой системы.
+** `conf:` проблемы с файлами настройки, используемыми по умолчанию значениями и прочее.
+** `docs:` проблемы со страницами справочной системы или онлайновой документацией.
+** `gnu:` проблемы с портированным программным обеспечением GNU, таким как man:gcc[1] или man:grep[1].
+** `i386:` проблемы, специфичные для платформы i386(TM).
+** `ia64:` проблемы, специфичные для платформы ia64.
+** `java:` проблемы, связанные с виртуальной машиной Java(TM).
+** `kern:` проблемы с ядром или с библиотеками в базовой системе, или с драйверами устройств, не связанными с какой-либо конкретной платформой.
+** `misc:` все, что не подпадает ни под какую другую категорию. (Надо отметить, что нет почти ничего, чтобы действительно соответствовало этой категории, за исключением проблем с релизами и с инфраструктурой сборки. Временные отказы при построении ветки `HEAD` не принадлежат к данной категории. Также надо отметить, что проблемы этой категории имеют тенденцию теряться легче всего).
+** `ports:` проблемы, связанные с коллекцией портов.
+** `powerpc:` проблемы, специфичные для платформы PowerPC(R).
+** `sparc64:` проблемы, специфичные для платформы Sparc64(R).
+** `standards:` проблемы, связанные с соответствием стандартам.
+** `threads:` проблемы, касающиеся реализации тредов во FreeBSD (особенно во FreeBSD-CURRENT).
+** `usb:` проблемы, относящиеся к реализации USB во FreeBSD.
+** `www:` изменения или улучшения сайта FreeBSD
+
+* _Class:_ Выберите одно из следующего:
+
+** `sw-bug:` ошибки в программном обеспечении.
+** `doc-bug:` ошибки в документации.
+** `change-request:` запросы на расширение функций или изменение в существующих.
+** `update:` обновления портов или другого программного обеспечения сторонних разработчиков.
+** `maintainer-update:` обновления в портах, для которых вы являетесь ответственной персоной.
+
+* _Release:_ Используемая вами версия FreeBSD. Оно заполняется автоматически программой man:send-pr[1] и требует изменения, если только вы отсылаете сообщение о проблеме с системы, отличающейся от той, где вы столкнулись с проблемой.
+
+И наконец, последовательность многострочных полей:
+
+* _Environment:_ Оно должно максимально точно описывать окружение, в котором встречается проблема. Сюда включается версия операционной системы, версия конкретной программы или файла, содержащего проблему, и любая другая информация, такая, как конфигурация системы, другое программное обеспечение, которое влияет на проблему, и так далее-просто все, что разработчик должен знать для создания условий появления проблемы.
+* _Description:_ Полное и точное описание проблемы, с которой вы столкнулись. Попытайтесь избежать своих предположений о причинах проблемы, если только вы не уверены, что правы, так как вы можете привести разработчика к неправильным предположениям о проблеме.
+* _How-To-Repeat:_ Последовательность действий, которые должны быть выполнены для повторения проблемы.
+* _Fix:_ Предпочтителен патч, или по крайней мере обходной путь (который не только поможет другим людям обойти ту же самую проблему, но также поможет разработчику понять ее причины), однако если у вас нет никаких здравых идей, то лучше оставить это поле пустым, чем строит догадки.
+
+== Отправка сообщения о проблеме
+
+Если вы используете man:send-pr[1]:
+
+Как только вы заполните шаблон, сохраните его и выйдете из редактора, man:send-pr[1] запросит вас `s)end, e)dit or a)bort?`. Вы можете нажать `s` для продолжения и отправки сообщения о проблеме, `e` для повторного запуска редактора и выполнения дальнейших изменений, или `a` для отказа от вашего сообщения. Если вы выберете последнее, то ваше сообщение о проблеме останется на диске (man:send-pr[1] укажет вам имя файла перед завершением работы), так что вы сможете отредактировать его на свой вкус или передать в систему с лучшим подключением к сети, перед тем, как послать его при помощи параметра `-F` программы man:send-pr[1]:
+
+[source,bash]
+....
+% send-pr -f ~/my-problem-report
+....
+
+При этом будет прочитан указанный файл, будет проверено содержимое, убраны комментарии и сообщение будет отослано.
+
+Если вы используете link:https://www.FreeBSD.org/send-pr/[веб форму]:
+
+Перед нажатием `submit` вам потребуется заполнить проверочное поле текстом, представленным на картинке рядом. Эта непопулярная мера была принята в связи со злоупотреблениями со стороны роботов и некоторых неверно сориентированных индивидуумов. Это необходимая мера, которая никому не нравится, и, пожалуйста, не просите нас убрать её.
+
+Отметим, что вам `настоятельно рекомендуется` сохранить вашу работу (PR) куда-нибудь перед нажатием кнопки `submit`. Распространенная пользовательская ошибка: отображение браузером устаревшей проверочной картинки из его кэша. Если это произойдет в вашем случае, ваше сообщение будет отвергнуто и ваши труды пропадут.
+
+Если по какой-либо причине вы не имеете возможности видеть проверочную картинку, а также не можете воспользоваться man:send-pr[1], пожалуйста примите наши извинения за неудобства и пришлите ваш PR электронной почтой команде mailto:freebsd-bugbusters@FreeBSD.org[freebsd-bugbusters@FreeBSD.org].
+
+[[pr-followup]]
+== Отслеживание
+
+После того, как ваше сообщение будет принято, вы получите по электронной почте уведомление, в котором будет указан номер для отслеживания, который был назначен вашему сообщению о проблеме и URL, который вы можете использовать для проверки его состояния. В случае удачи кто-нибудь проявит интерес к вашей проблеме и попытается ее решить, или, как это бывает, описать, почему это не является проблемой. Вы будете автоматически оповещаться о любом изменении состояния и получать копии всех комментариев или патчей, которые будут присоединяться в процессе отработки вашего сообщения о проблеме.
+
+Если кто-то запросит дополнительную информацию от вас, или вы вспомните или обнаружите нечто, что не указали в начальном сообщении, пожалуйста пошлите ваше дополнение (отклик) с помощью одного из этих способов:
+
+* Самый простой путь это использовать соответствующую ссылку (followup) на индивидуальной веб страничке сообщения об ошибки, к которой можно перейти, используя http://www.FreeBSD.org/cgi/query-pr-summary.cgi?query[страничку поиска PR]. Кликнув на этой ссылке откроется окно для отправки email с уже корректно заполненными полями To: и Subject: (если ваш браузер сконфигурирован для этого).
+* Или просто пошлите письмо на адрес {bugfollowup}, включив отслеживаемый номер в теме письма, чтобы система отслеживания сообщений могла знать, к какому сообщению о проблеме его присоединить.
++
+[NOTE]
+====
+Если вы _не_ включите отслеживаемый номер, GNATS растеряется и создаст совершенно новое PR, которое будет закреплено за администратором GNATS. В результате ваш отклик затеряется до тех пор пока кто-нибудь не начнёт разгребать скопившийся мусор, что может произойти спустя дни или даже недели.
+
+Неправильно:
+
+[.programlisting]
+....
+Subject: that PR I sent
+....
+
+Правильно:
+
+[.programlisting]
+....
+Subject: Re: ports/12345: compilation problem with foo/bar
+....
+
+====
+
+Если сообщение о проблеме остается открытым после того, как проблема была решена, просто отправьте сообщение (так, как это описано выше), с указанием, что сообщение о проблеме может быть закрыто, и если это возможно, объясните, как и когда проблема была устранена.
+
+[[pr-problems]]
+== Проблемы взаимодействия с GNATS
+
+Большинство PR проходят сквозь систему и принимаются быстро; однако, во время загруженности GNATS, подтверждение на ваше сообщение о проблеме может задержаться на 10 и более минут. Пожалуйста, сохраняйте спокойствие.
+
+Помимо всего прочего, так как GNATS получает все данные через электронную почту, становится понятным, почему FreeBSD пропускает все сообщения через спамфильтры. Если подтверждение не приходит на протяжении часа-двух, то, возможно, что ваше сообщение попало под них; если так, то, пожалуйста, свяжитесь с администраторами GNATS по адресу mailto:bugmeister@FreeBSD.org[bugmeister@FreeBSD.org] и попросите помощи.
+
+[NOTE]
+====
+Среди антиспам мер есть одна, которая сопоставляет сообщения с множеством злоупотреблений, наблюдаемых в электронной почте с HTML-форматированием текста (однако, сюда не относится простое включение HTML в PR). Мы настоятельно рекомендуем не использовать HTML-форматированный текст при посылке PR: не только из-за вероятности попадания в спамфильтры, но и из-за загромождения базы данных. Отдайте предпочтение простому старому текстовому формату.
+====
+
+В редких случаях вы можете столкнуться с ошибкой GNATS, когда PR принят и ему присвоен номер, но он не отображается в списках PR ни на одной из страниц веб поиска PR. Вероятно, что рассинхронизировался индекс базы с самой базой. Этот случай можно проверить, обратившись к страничке http://www.FreeBSD.org/cgi/query-pr.cgi[Query PR Database] и проконтролировав наличие вашего PR. Если он есть, пожалуйста, известите администраторов GNATS (mailto:bugmeister@FreeBSD.org[bugmeister@FreeBSD.org]). Следует отметить, что перестройка базы выполняется периодически по `cron`, и если вам не к спеху, то не предпринимайте никаких шагов.
+
+[[pr-further]]
+== Дополнительная литература
+
+Это список информационных ресурсов, относящихся к правильному написанию и обработке сообщений о проблемах. Он, без сомнения, не полон.
+
+* http://www.chiark.greenend.org.uk/~sgtatham/bugs.html[How to Report Bugs Effectively]-прекрасное эссе, которое написал Simon G. Tatham о составлении полезных (не специфичных для FreeBSD) сообщений о проблемах.
+* link:{pr-guidelines}[Problem Report Handling Guidelines]-интересный взгляд на обработку сообщений о проблемах самими разработчиками FreeBSD.
diff --git a/documentation/content/ru/articles/releng/_index.adoc b/documentation/content/ru/articles/releng/_index.adoc
new file mode 100644
index 0000000000..fba781c691
--- /dev/null
+++ b/documentation/content/ru/articles/releng/_index.adoc
@@ -0,0 +1,413 @@
+---
+title: Подготовка релизов FreeBSD
+authors:
+ - author: Murray Stokely
+ email: murray@FreeBSD.org
+ webpage: https://people.FreeBSD.org/~murray/
+releaseinfo: "$FreeBSD$"
+trademarks: ["freebsd", "cvsup", "intel", "general"]
+---
+
+= Подготовка релизов FreeBSD
+:doctype: article
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:xrefstyle: full
+:toc-title: Содержание
+:part-signifier: Часть
+:chapter-signifier: Глава
+:appendix-caption: Приложение
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/urls.adoc[]
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/articles/releng/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/articles/releng/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/articles/releng/
+endif::[]
+
+[.abstract-title]
+Аннотация
+
+В этой статье описывается подход, который используется группой подготовки релизов FreeBSD для создания качественных версий Операционной Системы FreeBSD. В ней детально описывается методология, используемая для официальных релизов FreeBSD и рассказывается об инструментах, доступных тем, кто интересуется созданием модифицированных релизов FreeBSD для тиражирования внутри организации или в коммерческих целях.
+
+'''
+
+toc::[]
+
+[[introduction]]
+== Введение
+
+Разработка FreeBSD представляет собой весьма открытый процесс. FreeBSD составляется в результате общих усилий тысяч людей по всему миру. Проект FreeBSD предоставляет анонимный публичный доступ по протоколу CVS[1], так что любой может получить доступ к журналу изменений, разницам (патчам) между ветками разработки и другим продвинутым возможностям, которые даёт строгое управление исходным кодом. Это сильно помогает в привлечении к FreeBSD всё большего количества талантливых разработчиков. Однако, и я думаю, что все со мной согласятся, наступит хаос, если доступ по записи будет открыт всем в Internet. Поэтому только "избранная" группа примерно из 300 человек имеет доступ по записи в CVS-хранилище. Эти _коммиттеры[5]_ отвечают в целом за разработку FreeBSD. Выбираемая из самых заслуженных разработчиков _группа правления[6]_ обеспечивает некоторый уровень управления проектом.
+
+Темп разработок, ведущихся во `FreeBSD`, оставляет мало времени на тщательную доводку системы до качества продуктивного релиза. Для решения этой проблемы разработка ведётся в два параллельных потока. Основной веткой разработки является __HEAD__, она же _основная линия_ нашего дерева CVS, известная также под именем "FreeBSD-CURRENT" или, для краткости, "-CURRENT".
+
+Поддерживается и более стабильная ветка, известная как "FreeBSD-STABLE" или, для краткости, "-STABLE". Обе ветки находятся в основном CVS-хранилище в Калифорнии и реплицируются при помощи CVSup[2] на зеркала по всему миру. FreeBSD-CURRENT[7] является "передним краем" работ над FreeBSD, через который попадают все изменения в системе. FreeBSD-STABLE является веткой разработки, из которой создаются основные релизы. В эту ветку изменения попадают разными путями, и предполагается, что сначала они попали в FreeBSD-CURRENT, где были тщательно протестированы сообществом наших пользователей.
+
+В промежутке между релизами машинами Проекта FreeBSD, выделенными для построения системы, ежемесячно автоматически собираются снэпшоты, которые доступны для закачки по адресу `ftp://ftp.FreeBSD.org/pub/FreeBSD/snapshots/`. Общедоступность снэпшотов бинарных релизов, а также желание сообщества наших пользователей отслеживать работу над -STABLE при помощи CVSup и "`make world`"[7] помогает поддержать весьма хорошее качество FreeBSD-STABLE, даже до выполнения мероприятий проверки качества, предваряющих выпуск основных релизов.
+
+В процессе выпуска релиза пользователи постоянно присылают сообщения об ошибках и пожелания по расширению функциональности. Сообщения о проблемах попадают в нашу базу данных GNATS[8] по электронной почте, посредством утилиты man:send-pr[1] или через Web-интерфейс, доступный по адресу http://www.FreeBSD.org/send-pr/[http://www.FreeBSD.org/send-pr/].
+
+Для удовлетворения наших самых консервативно настроенных пользователей, начиная с FreeBSD 4.3, появились ветки для отдельных релизов. Эти ветки создаются вскоре после того, как выпускается окончательный релиз. После его выхода в ветку релиза помещаются только самые критичные исправления и добавления, касающиеся безопасности. Кроме обновлений исходных текстов посредством CVS, для систем веток RELENG_``__X_Y__`` имеются и бинарные наборы патчей.
+
+=== Что обсуждается в данном документе?
+
+В последующих главах этой статьи обсуждаются:
+
+<<release-proc>>::
+Различные этапы процесса подготовки релиза вплоть до построения актуальной системы.
+
+<<release-build>>::
+Процесс сборки.
+
+<<extensibility>>::
+Как базовый релиз может быть расширен третьими сторонами.
+
+<<lessons-learned>>::
+Некоторые из уроков, полученных при выпуске релиза FreeBSD 4.4.
+
+<<future>>::
+Направления будущих работ.
+
+[[release-proc]]
+== Процесс выпуска релиза
+
+Новые релизы FreeBSD выпускаются из ветки -STABLE с интервалом примерно в четыре месяца. Процесс выпуска релизов FreeBSD начинается за 45 дней до предполагаемой даты релиза с того, что ответственный за релиз посылает сообщение по электронной почте в адрес списков рассылки для разработчиков, чтобы напомнить последним о наличии всего лишь 15 дней на внесение новых изменений до момента заморозки кода. В этот период многие разработчики выполняют действия, известные как "MFC-переносы". MFC означает "Merge From CURRENT" (перенос из CURRENT) и описывает процесс переноса протестированных изменений из нашего дерева разработки -CURRENT в наше дерево -STABLE.
+
+=== Просмотр кода
+
+За тридцать дней до предполагаемого релиза хранилище исходных текстов переводится в режим "стабилизации кода". В этот период все изменения в дереве -STABLE должны подтверждаться `{re}`. В первый 15-дневный период разрешены следующие типы изменений:
+
+* Исправления ошибок.
+* Обновление документации.
+* Исправления любого характера, касающиеся безопасности.
+* Незначительные исправления в драйверах устройств, такие, как, например, добавление новых ID устройств.
+* Любые другие изменения, которые одобряет группа подготовки релиза, с учётом потенциального риска.
+
+После первых 15 дней стабилизации кода выпускается __предварительный релиз__, предназначенный для широкого тестирования, а код переводится в состояние "заморозки", когда становится гораздо труднее доказывать необходимость внесения новых изменений в систему, если они не касаются исправления серьёзных ошибок или информационной безопасности. Во время заморозки кода каждую неделю выпускается не менее одной предварительной версии релиза, до тех пор, пока не будет готов окончательный вариант релиза. В дни, предшествующие выпуску окончательного релиза, группа его подготовки работает в постоянном контакте со службой безопасности и людьми, поддерживающими документацию и порты, чтобы обеспечить доступность всех компонентов, необходимых для успешного выпуска релиза.
+
+=== Контрольный список для проверки окончательного релиза
+
+После того, как для широкого тестирования было выпущено несколько предварительных релизов и все основные проблемы были решены, может начаться процесс "шлифовки" окончательного релиза.
+
+[[rel-branch]]
+==== Создание ветки релиза
+
+Как сказано во вводной части, ветка `RELENG_X_Y` является сравнительно новым добавлением в нашей методологии подготовки релизов. Первым шагом в создании этой ветки является проверка того, что вы работаете с самой последней версией исходных текстов `RELENG_X`, из _которой_ вы хотите создать новую ветку.
+
+[source,bash]
+....
+/usr/src# cvs update -rRELENG_4 -P -d
+....
+
+Следующим шагом является создание _тэга_ точки ответвления, чтобы диффы облегчили работу с началом ветки в CVS:
+
+[source,bash]
+....
+/usr/src# cvs rtag -rRELENG_4 RELENG_4_8_BP src
+....
+
+После этого создаётся тэг новой ветки по команде:
+
+[source,bash]
+....
+/usr/src# cvs rtag -b -rRELENG_4_8_BP RELENG_4_8 src
+....
+
+[NOTE]
+====
+__Использование тэгов `RELENG_*` разрешено только менеджерам CVS и участникам группы по выпуску релизов.__
+====
+
+"_Тэгом_ " в понятии CVS называют метку, которая идентифицирует исходный текст в некоторый момент времени. Вводя тэг в дерево, мы обеспечиваем то, что в будущем тот, кто строит релиз, всегда сможет воспользоваться тем же самым кодом, что использовался нами для создания официальных релизов Проекта FreeBSD.
+
+image::branches-head.png[Ветви разработки FreeBSD]
+
+image::branches-releng3.png[Ветка FreeBSD 3.x STABLE]
+
+image::branches-releng4.png[Ветка FreeBSD 4.x STABLE]
+
+image::branches-releng5.png[Ветка FreeBSD 5.x STABLE]
+
+image::branches-releng6.png[Ветка FreeBSD 6.x STABLE]
+
+image::branches-releng7.png[Ветка FreeBSD 7.x STABLE]
+
+image::branches-releng8.png[Ветка FreeBSD 8.x STABLE]
+
+image::branches-releng9.png[Ветка FreeBSD 9.x STABLE]
+
+[[versionbump]]
+==== Увеличение номера версии
+
+Перед тем, как окончательный релиз будет помечен, построен и выпущен, необходимо модифицировать следующие файлы, отразив в них корректную версию FreeBSD:
+
+* [.filename]#doc/ru_RU.KOI8-R/books/handbook/mirrors/chapter.xml#
+* [.filename]#doc/en_US.ISO8859-1/books/porters-handbook/book.xml#
+* [.filename]#doc/shared/xml/freebsd.ent#
+* [.filename]#src/Makefile.inc1#
+* [.filename]#src/UPDATING#
+* [.filename]#src/gnu/usr.bin/groff/tmac/mdoc.local#
+* [.filename]#src/release/Makefile#
+* [.filename]#src/release/doc/en_US.ISO8859-1/shared/xml/release.dsl#
+* [.filename]#src/release/doc/shared/examples/Makefile.relnotesng#
+* [.filename]#src/release/doc/shared/xml/release.ent#
+* [.filename]#src/shared/examples/cvsup/standard-supfile#
+* [.filename]#src/sys/conf/newvers.sh#
+* [.filename]#src/sys/sys/param.h#
+* [.filename]#src/usr.sbin/pkg_install/add/main.c#
+* [.filename]#www/en/docs/man.xml#
+* [.filename]#www/en/cgi/ports.cgi#
+* [.filename]#ports/Tools/scripts/release/config#
+
+Новый релиз должен быть также отражён в файлах замечаний к релизу и информации о замеченных ошибках (в ветке релиза), а файлы соответствующим образом обрезаны (в ветке stable/current):
+
+* [.filename]#src/release/doc/en_US.ISO8859-1/relnotes/common/new.xml#
+* [.filename]#src/release/doc/en_US.ISO8859-1/errata/article.xml#
+
+Утилита Sysinstall должна быть обновлена и указывать количество доступных портов и объём дискового пространства, требуемого для Коллекции Портов[4]. На данный момент эта информация хранится в файле [.filename]#src/usr.sbin/sysinstall/dist.c#.
+
+После построения релиза для оповещения мирового сообщества о выпуске релиза необходимо обновить некоторые файлы.
+
+* [.filename]#doc/shared/images/articles/releng/branches-relengX.pic#
+* [.filename]#www/shared/xml/advisories.xml#
+* [.filename]#www/shared/xml/includes.release.xml#
+* [.filename]#www/shared/xml/includes.release.xsl#
+* [.filename]#www/en/releases/*#
+* [.filename]#www/en/releng/index.xml#
+* [.filename]#www/en/news/news.xml#
+* [.filename]#www/en/search/web.atoz#
+* [.filename]#src/shared/misc/bsd-family-tree#
+
+[[versionbump-major]]
+==== Подготовка новой старшей релиз ветки (RELENG_X)
+
+Когда новая старшая релиз ветка, такая как `RELENG_6` ответвляется из HEAD, некоторые дополнительные файлы должны быть обновлены перед тем, как релизы будут созданы из этой новой ветки.
+
+* [.filename]#src/shared/examples/cvsup/stable-supfile# - когда применимо, должен быть обновлен, чтобы указывать на новую -STABLE ветку.
+
+==== Создание тэгов релиза
+
+При готовности окончательного релиза следующая команда создаст тэг `RELENG_4_8_0_RELEASE`.
+
+[source,bash]
+....
+/usr/src# cvs rtag -rRELENG_4_8 RELENG_4_8_0_RELEASE src
+....
+
+Менеджеры документации и портов отвечают за внесение тэга в соответствующие ветки с тэгом `RELEASE_4_8_0`.
+
+Иногда в последний момент, уже _после_ создания последних тэгов может потребоваться внесение исправлений. На практике это не является проблемой, так как CVS позволяет выполнять манипуляции с тэгами по команде `cvs tag -d _tagname filename_`. Очень важно, чтобы все последние изменения были помечены соответствующим тэгом, как часть релиза. Релизы FreeBSD должны быть всегда повторяемыми. Локальные изменения в параметры окружения выпускающего релиз недопустимы.
+
+[[release-build]]
+== Построение релизов
+
+"Релизы" FreeBSD могут быть построены любым человеком, имеющим быстродействующую машину и доступ к хранилищу исходных текстов. (Это должен быть любой, так как мы предоставляем анонимный доступ к CVS! Обратитесь к Руководству для прояснения деталей.) _Единственным_ особым требованием является наличие устройства man:md[4]. Если устройство в вашем ядре не подгружено, то модуль ядра должен быть подгружен автоматически при выполнении команды man:mdconfig[8] на этапе создания носителя для загрузки. Все инструменты, необходимые для построения релиза, доступны из хранилища CVS в каталоге [.filename]#src/release#. Эти инструменты предоставляют единый метод построения релизов FreeBSD. Полный релиз может быть реально построен при помощи лишь одной команды, включая создание ISO-образов, подходящих для записи на CDROM, установочных дискет и установочного каталога FTP. Эта команда называется соответствующим образом: `make release`.
+
+=== `make release`
+
+Для успешного построения релиза вы должны сначала заполнить каталог [.filename]#/usr/obj#, запустив команду `make world` или просто `make buildworld`. Цель, выполняемая для построения релиза, требует корректного задания нескольких переменных, используемых при его сборке:
+
+* `CHROOTDIR` - Каталог, используемый в среде с изменённой корневой файловой системой при построении полного релиза.
+* `BUILDNAME` - Наименование строящегося релиза.
+* `CVSROOT` - Местонахождение CVS-хранилища.
+* `RELEASETAG` - Тэг CVS, соответствующий релизу, который вы собираетесь строить.
+
+Если у вас ещё нет доступа к локальному CVS-хранилищу, то вы можете зеркалировать одно из них при помощи link:{handbook}#CVSUP[CVSup]. Поставляемый sup-файл, [.filename]#/usr/shared/examples/cvsup/cvs-supfile#, может служить хорошей отправной точкой для зеркалирования хранилища CVS.
+
+Если `RELEASETAG` опущен, то релиз будет строиться из ветки `HEAD` (известной как -CURRENT). Релизы, строящиеся из этой ветки обычно называют "снэпшотами -CURRENT".
+
+Для настройки построения релиза существует много других переменных Большинство из этих переменных описаны в начале файла [.filename]#src/release/Makefile#. Точная команда, служащая для построения официального релиза FreeBSD 4.7 (x86) такова:
+
+[source,bash]
+....
+make release CHROOTDIR=/local3/release \
+ BUILDNAME=4.7-RELEASE \
+ CVSROOT=/host/cvs/usr/home/ncvs \
+ RELEASETAG=RELENG_4_7_0_RELEASE
+....
+
+[.filename]#Makefile# для релиза может быть разбит на несколько различных шагов.
+
+* Создание чистого системного окружения в отдельной иерархии каталогов по команде "`make installworld`".
+* Выгрузка из CVS чистой версии исходных текстов системы, документации и портов в иерархию для построения релиза.
+* Создание копии [.filename]#/etc# и [.filename]#/dev# в окружении с изменённым корнем файловой системы.
+* Смена корневой файловой системы на иерархию построения релиза, чтобы избежать влияния внешнего окружения на построение.
+* Выполнение `make world` в окружении с изменённой корневой файловой системой.
+* Построение бинарных файлов для работы с Kerberos.
+* Построение ядра [.filename]#GENERIC#.
+* Создание промежуточного дерева каталогов, где будут строиться бинарные файлы и формироваться дистрибутивы.
+* Построение и установка инструментов для работы с документацией, необходимых для преобразования исходных текстов документации (SGML) в формат HTML и текстовые документы, которые сопутствуют релиз.
+* Построение и установка актуальной документации (руководства пользователей, учебники, замечания к релизу, перечень аппаратной совместимости и так далее.)
+* Построение "свёрнутых" бинарных файлов, используемых на установочных дискетах.
+* Подготовка дистрибутивных архивов бинарных файлов и исходных текстов.
+* Создание загрузочного носителя и "fixit"-дискеты.
+* Создание иерархии для установки при помощи FTP.
+* _(опционально)_ Создание образов ISO для носителей CDROM/DVD.
+
+Для получения более полной информации об инфраструктуре построения релизов, пожалуйста, обратитесь к справочной странице по man:release[7].
+
+[NOTE]
+====
+Важно, чтобы из файла [.filename]#/etc/make.conf# были удалены все установки, специфичные для конкретного хоста. К примеру, будет глупо распространять бинарные файлы, построенные на системе с переменной `CPUTYPE`, указывающей на определённый тип процессора.
+====
+
+=== Программное обеспечение третьих лиц ("ports")
+
+http://www.FreeBSD.org/ports[Коллекция портов FreeBSD] содержит более {numports} программных пакетов сторонних разработчиков, которые доступны для FreeBSD. За поддержку целостности дерева портов, которое может использоваться для создания бинарных пакетов, поставляемых с официальными релизами FreeBSD, отвечает `{portmgr}`.
+
+Рассмотрение работ с нашей коллекцией пакетов сторонних разработчиков при подготовке релизов выходит за рамки этого документа. Этот вопрос глубоко рассмотрен в отдельной статье, link:{releng-packages}[The Release Engineering of Third Party Packages].
+
+=== ISO с релизами
+
+Начиная с FreeBSD 4.4, Проект FreeBSD принял решение распространять все четыре образа ISO, ранее продаваемые через _BSDi/Wind River Systems/FreeBSD Mall_ как "официальные" дистрибутивы на CDROM. Каждый из четырёх дисков должен содержать файл [.filename]#README.TXT#, описывающий содержимое диска, файл [.filename]#CDROM.INF#, в котором находятся мета-данные о диске для того, чтобы man:sysinstall[8] мог проверять и использовать содержимое, а также файл [.filename]#filename.txt#, содержащий перечень содержимого на диске. Этот _перечень_ может быть создан простой командой:
+
+[source,bash]
+....
+/stage/cdrom# find . -type f | sed -e 's/^\.\///' | sort > filename.txt
+....
+
+Специфичные требования для каждого CD описываются ниже.
+
+==== Диск 1
+
+Первый диск практически полностью создаётся командой `make release`. Единственным изменением, которое нужно внести в каталог [.filename]#disc1#, является добавление подкаталога [.filename]#tools#, а также перенос максимально возможного количества программных пакетов сторонних разработчиков, которые поместятся на диск. Каталог [.filename]#tools# содержит программное обеспечение, позволяющее пользователям создавать установочные дискеты из других операционных систем. Этот диск нужно сделать загрузочным, чтобы пользователям современных ПК не нужно было создавать установочные дискеты.
+
+Если в релиз необходимо включить специализированное ядро, то необходимо модифицировать man:sysinstall[8] и man:release[7], добавив в них инструкции по установке. Соответствующий код находится в [.filename]#src/release# и [.filename]#src/usr.sbin/sysinstall#. В частности, в [.filename]#src/usr.sbin/sysinstall# необходимо будет редактировать [.filename]#src/release/Makefile#, [.filename]#dist.c#, [.filename]#dist.h#, [.filename]#menus.c#, [.filename]#install.c# и [.filename]#Makefile#. Также может потребоваться обновить [.filename]#sysinstall.8#.
+
+==== Диск 2
+
+Второй диск также в основном создаётся по команде `make release`. Он содержит "живую файловую систему", которую можно использовать из man:sysinstall[8] для исправления процесса установки FreeBSD. Этот диск должен быть загрузочным и содержать также упакованную копию хранилища CVS в каталоге [.filename]#CVSROOT# и демонстрационные версии коммерческого программного обеспечения в каталоге [.filename]#commerce#.
+
+==== Диски 3 и 4
+
+Оставшиеся два диска содержат дополнительные программные пакеты для FreeBSD. Они должны быть объединены в группы (кластеры), чтобы отдельный пакет и все его _зависимости_ находились на одном и том же диске. Дополнительная информация о создании этих дисков находится в статье link:{releng-package}[The Release Engineering of Third Party Packages].
+
+==== Поддержка нескольких дисков
+
+Sysinstall поддерживает установку пакетов с нескольких дисков. Для это нужно, чтобы на каждом диске был файл [.filename]#INDEX#, содержащий названия всех пакетов со всех дисков, с дополнительным полем, указывающем на каком диске содержится данный конкретный пакет. Также, на каждом диске, в файле [.filename]#cdrom.inf# должна быть указана переменная `CD_VOLUME` для того, чтобы sysinstall мог определить какой этой диск. Когда пользователь будет пытаться установить пакет, которого нет на текущем диске, sysinstall выдаст запрос на вставку соответствующего диска.
+
+[[distribution]]
+== Распространение
+
+[[dist-ftp]]
+=== Серверы FTP
+
+После того, как релиз был тщательно протестирован и подготовлен к распространению, должен быть обновлён главный FTP-сервер. Все официальные общедоступные серверы FTP-серверы FreeBSD являются зеркалами главного сервера, открытого только другим серверам FTP. Этот сервер известен под именем `ftp-master`. Когда релиз готов, на сервере `ftp-master` должны быть изменены следующие строки:
+
+[.filename]#/pub/FreeBSD/releases/arch/X.Y-RELEASE/#::
+Установочный каталог FTP, получаемый по команде `make release`.
+
+[.filename]#/pub/FreeBSD/ports/arch/packages-X.Y-release/#::
+Полный комплект построенных пакетов для этого релиза.
+
+[.filename]#/pub/FreeBSD/releases/arch/X.Y-RELEASE/tools#::
+Символическая ссылка на [.filename]#../../../tools#.
+
+[.filename]#/pub/FreeBSD/releases/arch/X.Y-RELEASE/packages#::
+Символическая ссылка на [.filename]#../../../ports/arch/packages-X.Y-release#.
+
+[.filename]#/pub/FreeBSD/releases/arch/ISO-IMAGES/X.Y/X.Y-RELEASE-arch-*.iso#::
+ISO-образы. Здесь "*" это [.filename]#disc1#, [.filename]#disc2# и так далее. Только если здесь есть [.filename]#disc1# и альтернативный первый установочный CD (например, обрезанная установка без оконной системы), то здесь может быть также и [.filename]#mini#.
+
+Для получения дополнительной информации о системе зеркальных FTP-серверов FreeBSD, пожалуйста, прочтите статью о link:{hubs}[Зеркалировании FreeBSD].
+
+Может пройти от нескольких часов до двух дней между тем, как обновится `ftp-master`, и на основной массе FTP-серверов 1-го уровня появится новое программное обеспечение, в зависимости от того, в тоже самое ли время пакет был загружен. Обязательно, чтобы выпускающие релиз координировали свои действия с {mirror-announce} до того, как объявлять об общедоступности нового программного обеспечения с серверов FTP. В идеальном случае набор пакетов к релизу должен быть загружен по крайней мере за четыре дня до момента выпуска релиза. Релиз должен быть загружен в промежутке от 24 до 48 часов до момента выхода запланированного релиза с выключенными полномочиями "other". Это позволит зеркалирующим серверам сгрузить его, но никто не сможет получить его с зеркальных серверов. В момент выхода релиза должно быть послано сообщение в адрес {mirror-announce}, говорящее о том, что релиз выпущен и наступило время для открытия доступа на зеркальных серверах. Обязательно вместе со временем укажите и часовой пояс, например, относительно GMT.
+
+[[dist-cdrom]]
+=== Тиражирование CD-ROM
+
+Вскоре появится: Советы по передаче ISO-образов FreeBSD на тиражирование и применяемые меры по контролю качества.
+
+[[extensibility]]
+== Расширяемость
+
+Хотя FreeBSD представляет собой законченную операционную систему, ничего не заставляет вас использовать систему только в том виде, который приготовлен нами для распространения. Мы попытались спроектировать систему максимально расширяемой, чтобы она могла выполнять роль платформы, на основе которой можно строить другие коммерческие продукты. Единственным "правилом", которое мы налагаем, является настоятельная рекомендация документировать улучшения, вносимые вами в дистрибутив FreeBSD с нетривиальными изменениями! Сообщество FreeBSD может помогать только пользователям того программного обеспечения, которое распространяем мы. Мы определённо приветствуем улучшения в форме, например, инструментов установки и администрирования, но не можем отвечать на вопросы о них.
+
+=== Создание модифицированных загрузочных дискет
+
+Во многих местах имеются сложные условия, которые требуют размещения дополнительных модулей ядра или пользовательских инструментов на установочные дискеты. "Быстрым и неаккуратным" способом сделать это является изменение промежуточного каталога в существующей иерархии при выполнении `make release`:
+
+* Примените патчи или добавьте дополнительные файлы в каталог построения релиза с изменённых корнем файловой системы.
+* `rm ${CHROOTDIR}/usr/obj/usr/src/release/release.[59]`
+* перестройте man:sysinstall[8], ядро и остальные части системы, которые коснулись ваши изменения.
+* `chroot ${CHROOTDIR} ./mk floppies`
+
+Дискеты нового релиза будут находиться в [.filename]#${CHROOTDIR}/R/stage/floppies#.
+
+Либо может быть вызвана цель [.filename]#boot.flp# построения или скрипт создания файловой системы, [.filename]#src/release/scripts/doFS.sh#, которые может быть вызван напрямую.
+
+Локальные патчи могут быть также приложены к построению релиза при помощи задания переменной `LOCAL_PATCH` при выполнении `make release`.
+
+=== Скрипты `sysinstall`
+
+Инструмент установки и настройки системы FreeBSD, man:sysinstall[8], может работать по сценарию, полезному для автоматизированной установки в больших компаниях. Эта функциональность может использоваться совместно с технологией Intel(R) PXE[12] для первоначальной установки систем из сети, или с модифицированными загрузочными дискетами со скриптами sysinstall. Пример скрипта для sysinstall доступен в дереве CVS в виде файла [.filename]#src/release/sysinstall/install.cfg#.
+
+[[lessons-learned]]
+== Уроки, извлечённые из FreeBSD 4.4
+
+Формально процесс подготовки релиза для 4.4 начался 1 августа 2001 года. После этой даты все без исключения изменения в ветке `RELENG_4` FreeBSD подтверждались `{re}`. Первый предварительный релиз для архитектуры x86 был выпущен 16 августа, за ним выходило ещё 4 предварительных релиза, и всё закончилось 18 августа выпуском окончательного релиза. Руководитель службы безопасности очень плотно занимался процессом выпуска в последнюю неделю, так как в предыдущих предварительных релизах были найдены проблемы, касающиеся информационной безопасности. Чуть более чем за месяц в адрес `{re}` поступило более _500_ писем.
+
+Сообщество наших пользователей весьма чётко показало, что безопасность и стабильность релиза FreeBSD не должна приноситься в жертву любым назначенным срокам окончания работ или планируемым датам выхода релиза. Проект FreeBSD за время своего существования значительно вырос, и никогда ранее необходимость в стандартизации процедур подготовки релизов не стояла так остро. Это стало ещё более важно, когда FreeBSD была перенесена на новые аппаратные платформы.
+
+[[future]]
+== Направления будущих работ
+
+Нашим работам по подготовке релизов жизненно важно расти вместе с увеличением количества пользователей системы. Вместе с этим мы очень плотно работаем над документированием действий, выполняемых при выпуске релизов FreeBSD.
+
+* _Параллелизм_ - некоторые этапы построения релиза на самом деле выполнять параллельно "затруднительно". Большинство выполняемых задач весьма интенсивно работают с I/O, так что для ускорения процесса `make release` наличие нескольких высокоскоростных дисков гораздо более важно, чем использование нескольких процессоров. Если для различных иерархий в man:chroot[2]-окружении используется несколько дисков, то извлечение из CVS деревьев [.filename]#ports# и [.filename]#doc# может выполняться одновременно с командой `make world` на другом диске. Использование `RAID`-решений (аппаратных или программных) может значительно сократить общее время построения.
+* _Кроссплатформенное построение релизов_ - Построить релиз для IA-64 или Alpha на x86-оборудовании? `make TARGET=ia64 release`.
+* _Тестирование_ - Нам нужна улучшенная автоматизированная система тестирования корректности для FreeBSD.
+* _Инструменты установки_ - Наша программа установки давно пережила свой век. В разработке находятся несколько проектов, которые должны дать улучшенную технологию установки. Одним из таких проектов был libh, целью которого было создание новой интеллектуальной технологии работы с пакетами и программы установки с GUI.
+
+[[ackno]]
+== Благодарности
+
+Я рад поблагодарить Джордана Хаббарда (Jordan Hubbard) за то, что он дал мне возможность взять под свою ответственность некоторые части процесса подготовки релиза FreeBSD 4.4, а также за все годы его работы, сделавшие FreeBSD такой, какой она является сейчас. Конечно, релиз не был бы возможен без той работы, которую проделали `{asami}`, `{steve}`, `{bmah}`, `{nik}`, `{obrien}`, `{kris}`, `{jhb}` и остальные члены сообщества разработчиков FreeBSD. Я также рад выразить благодарность `{rgrimes}` и `{phk}`, а также остальным, работавшим над инструментами подготовки релизов в первые годы существования FreeBSD. Эта статья была также написана под впечатлением документации по подготовке релизов от CSRG[13], NetBSD Project[10] и замечаний Джона Балдвина (John Baldwin) по предлагаемому процессу подготовки релизов[11].
+
+[[biblio]]
+== Справочная литература
+
+(1) CVS - Concurrent Versions System http://www.cvshome.org[http://www.cvshome.org]
+
+(2) CVSup - The CVS-Optimized General Purpose Network File Distribution System http://www.polstra.com/projects/freeware/CVSup[http://www.polstra.com/projects/freeware/CVSup]
+
+(3) http://pointyhat.FreeBSD.org[http://pointyhat.FreeBSD.org]
+
+(4) Коллекция портов FreeBSD http://www.FreeBSD.org/ports[http://www.FreeBSD.org/ports]
+
+(5) link:{contributors}#staff-committers[Коммиттеры FreeBSD]
+
+(6) Правление FreeBSD link:https://www.FreeBSD.org/administration/#t-core[https://www.FreeBSD.org/administration/#t-core]
+
+(7) link:{handbook}[Руководство FreeBSD]
+
+(8) GNATS: The GNU Bug Tracking System http://www.gnu.org/software/gnats[http://www.gnu.org/software/gnats]
+
+(9) Статистика FreeBSD PR FreeBSD PR Statistics http://www.FreeBSD.org/prstats/[http://www.FreeBSD.org/prstats/]
+
+(10) NetBSD Developer Documentation: Release Engineering http://www.NetBSD.org/developers/releng/index.html[http://www.NetBSD.org/developers/releng/index.html]
+
+(11) John Baldwin's FreeBSD Release Engineering Proposal http://people.FreeBSD.org/\~jhb/docs/releng.txt[http://people.FreeBSD.org/~jhb/docs/releng.txt]
+
+(12) PXE Jumpstart Guide link:{pxe}[PXE Guide]
+
+(13) Marshall Kirk McKusick, Michael J. Karels, and Keith Bostic: http://docs.FreeBSD.org/44doc/papers/releng.html[The Release Engineering of 4.3BSD]
diff --git a/documentation/content/ru/articles/solid-state/_index.adoc b/documentation/content/ru/articles/solid-state/_index.adoc
new file mode 100644
index 0000000000..3800c0978f
--- /dev/null
+++ b/documentation/content/ru/articles/solid-state/_index.adoc
@@ -0,0 +1,266 @@
+---
+title: FreeBSD и твердотельные устройства
+authors:
+ - author: John Kozubik
+ email: john@kozubik.com
+copyright: 2001, 2009 The FreeBSD Documentation Project
+releaseinfo: "$FreeBSD$"
+trademarks: ["freebsd", "general"]
+---
+
+= FreeBSD и твердотельные устройства
+:doctype: article
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:toc-title: Содержание
+:part-signifier: Часть
+:chapter-signifier: Глава
+:appendix-caption: Приложение
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+
+[.abstract-title]
+Аннотация
+
+В этой статье описывается использование твердотельных дисковых устройств для создания встраиваемых систем на основе FreeBSD
+
+Встраиваемые системы имеют преимущество в повышенной надежности по причине отсутствия в них движущихся частей (жестких дисков). Однако, следует принять во внимание, что системе, как правило, доступно очень малое дисковое пространство и ограниченный объем запоминающего устройства.
+
+К отдельно рассматриваемым вопросам относятся типы и характеристики твердотельных носителей, подходящих для использования в качестве дисков во FreeBSD, параметры ядра, которые представляют интерес в таких условиях, механизмы [.filename]#rc.initdiskless#, автоматизирующие инициализацию таких систем и удовлетворяющие требованиям файловых систем, доступных только для чтения, а также построение файловых систем с нуля. Статья заканчивается описанием некоторых общих стратегий для случаев малых систем FreeBSD и работ в режиме только для чтения.
+
+'''
+
+toc::[]
+
+[[intro]]
+== Твердотельные дисковые устройства
+
+Эта статья будет ограничиваться рассмотрением твердотельных дисковых устройств, которые делаются на основе флэш-памяти. Флэш-память является твердотельным (здесь нет движущихся частей) запоминающим устройством, которое является энергонезависимым (данные остаются в памяти даже после отключения всех источников питания). Флэш-память может быть нечувствительной к сильным физическим воздействиям и достаточно быстра (решения на основе флэш-памяти, описываемые в этой статье, гораздо медленнее, чем диски EIDE для операций записи, и гораздо быстрее их в случае выполнения операций чтения). Одним из очень важных свойств флэш-памяти, различные варианты которого будут рассмотрены далее в этой статье, является то, что каждый сектор имеет ограниченные возможности по перезаписыванию. Вы можете только записывать, стирать и снова записывать на сектор флэш-памяти определенное количество раз до того, как сектор станет полностью неработоспособным. Хотя многие продукты на основе флэш-памяти автоматически перенаправляют испорченные блоки, а некоторые даже распределяют операции записи по всему модулю, фактом является наличие ограничения на количество операций записи, которые могут выполняться с устройством. Современные модули имеют характеристики от 1,000,000 до 10,000,000 циклов записи на сектор. Эти характеристики могут зависеть от температуры рабочей среды.
+
+В частности, мы обсудим компактные модули флэш-памяти, совместимые со стандартом ATA, которые стали весьма популярными в качестве носителя данных для цифровых камер. Особый интерес представляет тот факт, что они соответствуют шине IDE по контактам и совместимы с набором команд ATA. Таким образом, при помощи очень простого и дешевого адаптера такие устройства могут подключаться непосредственно к шине IDE компьютера. Если поступить таким образом, то такие операционные системы, как FreeBSD, распознают диск как обычный винчестер (весьма маленький).
+
+Существуют и другие решения для твердотельных дисков, но их стоимость, безвестность и сравнительная сложность использования выводят их за рамки этой статьи.
+
+[[kernel]]
+== Параметры ядра
+
+Для тех, кто создает встраиваемую систему FreeBSD, интерес представляют несколько параметров ядра.
+
+Все встраиваемые системы FreeBSD, которые используют флэш-память в качестве системного диска, заинтересованы в использовании дисков в памяти и файловых систем в памяти. Из-за ограниченного количества циклов записи, которые можно выполнить с флэш-памятью, диск и файловые системы на нем будут, скорее всего, монтироваться в режиме доступа только для чтения. В таком случае файловые системы типа [.filename]#/tmp# и [.filename]#/var# монтируются как файловые системы в памяти для того, чтобы позволить системе создать журналы и обновить счетчики и временные файлы. Файловые системы в памяти являются критическим компонентом успешной работы FreeBSD на твердотельных устройствах.
+
+Вы должны удостовериться, что в конфигурационном файле вашего ядра присутствуют следующие строки:
+
+[.programlisting]
+....
+options MFS # Memory Filesystem
+options MD_ROOT # md device usable as a potential root device
+pseudo-device md # memory disk
+....
+
+[[ro-fs]]
+== Подсистема `rc` и файловые системы в режиме только чтения
+
+Инициализация встраиваемой системы FreeBSD после загрузки управляется [.filename]#/etc/rc.initdiskless#.
+
+[.filename]#/etc/rc.d/var# монтирует [.filename]#/var# как файловую систему в памяти, создает указываемый список каталогов в [.filename]#/var# при помощи команды man:mkdir[1], изменяет режимы доступа на некоторые из этих каталогов. В процессе выполнения [.filename]#/etc/rc.d/var# задействуется еще одна переменная [.filename]#rc.conf# - `varsize`. Скрипт [.filename]#/etc/rc.d/var# создает раздел [.filename]#/var# на основе значения этой переменной из [.filename]#rc.conf#:
+
+[.programlisting]
+....
+varsize=8192
+....
+
+Запомните, что по умолчанию это значение указано в секторах.
+
+Факт использования файловой системы [.filename]#/var# в режиме чтения и записи является важным признаком, так как раздел [.filename]#/# (и любые другие разделы, которые могут находиться на флэш-носителе) должен монтироваться в режиме только для чтения. Вспомните, что в <<intro>> мы касались ограничений флэш-памяти - особенно ограничений, касающихся возможностей записи. Важно не монтировать файловые системы на флэш-носителях в режимах чтения и записи, и важность отказа от файла подкачки не может быть переоценена. Файл подкачки на загруженной системе может пережечь кусок флэш-носителя менее чем за год. Частое журналирование и создание временных файлов приводят к тому же результату. Поэтому, кроме удаления записи `swap` из вашего файла [.filename]#/etc/fstab#, вы должны также изменить поле параметров каждой файловой системы на `ro` таким образом:
+
+[.programlisting]
+....
+# Device Mountpoint FStype Options Dump Pass#
+/dev/ad0s1a / ufs ro 1 1
+....
+
+В результате этих изменений в среднестатистической системе несколько приложений немедленно перестанут работать. Например, cron не будет нормально запускаться в результате отсутствия таблиц для него в каталоге [.filename]#/var#, созданном [.filename]#/etc/rc.d/var#, а syslog и dhcp будут испытывать проблемы из-за доступа файловой системы только для чтения, а также отсутствия записей в [.filename]#/var#, который был создан скриптом [.filename]#/etc/rc.d/var#. Хотя эти проблемы являются временными и обсуждаются вместе с решением проблем с запуском распространенных программных пакетов, в <<strategies>>.
+
+Важно помнить, что файловая система, которая была смонтирована только для чтения при помощи файла [.filename]#/etc/fstab#, в любой момент может быть сделана доступной по чтению и записи выдачей команды:
+
+[source,bash]
+....
+# /sbin/mount -uw partition
+....
+
+и может быть возвращена к режиму доступа только для чтения по такой команде:
+
+[source,bash]
+....
+# /sbin/mount -ur partition
+....
+
+== Создание файловой системы с нуля
+
+Так как совместимые с ATA компактные флэш-карты распознаются во FreeBSD как обычные жесткие диски IDE, то теоретически вы можете установить FreeBSD по сети при помощи дискет kern и mfsroot или с компакт-диска.
+
+Однако даже маленькая установка FreeBSD при помощи обычных процедур установки может привести к созданию системы размером, превышающим 200 мегабайт. Так как большинство людей используют устройства флэш-памяти меньшего размера (128 мегабайт считается весьма большим - 32 или даже 16 мегабайт используются гораздо чаще), то установка обычным образом не подходит-просто на диске нет места даже для самой минимальной установки.
+
+Самым простым способом обойти это ограничение на объем является установка FreeBSD обычным образом на обычный жесткий диск. После окончания установки, обрежьте операционную систему до размера, который помещается на ваш флэш-носитель, а затем полностью заархивируйте файловую систему. Следующие шаги поведут вас через процесс подготовки части флэш-памяти для вашей заархивированной файловой системы. Запомните, что из-за того, что обычная установка не выполнялась, такие операции, как разбиение на разделы, разметка, создание файловой системы и так далее должны быть выполнены вручную. Кроме дискет kern и mfsroot вам также нужно воспользоваться дискетой fixit.
+
+[.procedure]
+. Разбиение вашего флэш-носителя на разделы
++
+После загрузки при помощи дискет kern и mfsroot, выберите пункт `custom` из меню установки. Из следующего пункта меню выберите `partition`. В меню работы с разделами вы должны удалить все существующие разделы при помощи клавиши kbd:[d]. После удаления всех имеющихся разделов создайте раздел при помощи клавиши kbd:[c] и согласитесь с предлагаемым по умолчанию размером раздела. Когда вы будете опрошены на предмет типа раздела, удостоверьтесь, что значение типа равно `165`. Теперь запишите эту таблицу разделов на диск, нажав клавишу kbd:[w] (на этом экране эта опция скрыта). Если вы используете компактную флэш-карту, совместимую с ATA, вы должны выбрать FreeBSD Boot Manager. Теперь нажмите клавишу kbd:[q] для выхода из меню работы с разделами. Должно быть выдано еще раз меню для выбора менеджера загрузки - повторите то, что вы выбирали ранее.
+. Создание файловых систем на вашем устройстве флэш-памяти
++
+Выйдите из меню установки custom, и из главного меню установки выберите пункт `fixit`. После входа в режим работы fixit, введите следующую команду:
++
+
+[source,bash]
+....
+# disklabel -e /dev/ad0c
+....
+
++
+В этот момент вы войдете в редактор vi из-под команды disklabel. Затем, вам нужно добавить строку `a:` в конце файла. Эта строка `a:` должна выглядеть примерно так:
++
+[.programlisting]
+....
+a: 123456 0 4.2BSD 0 0
+....
+
++
+Здесь _123456_ является числом, в точности совпадающим с тем, что характеризует размер имеющейся записи для `c:`. В общем, вы копируете существующую строку для `c:` для строки `a:`, не забывая определить fstype как `4.2BSD`. Сохраните файл и завершите редактирование.
++
+
+[source,bash]
+....
+# disklabel -B -r /dev/ad0c
+# newfs /dev/ad0a
+....
+
+. Размещение вашей файловой системы на флэш-носителе
++
+Смонтируйте только что подготовленный флэш-носитель:
++
+
+[source,bash]
+....
+# mount /dev/ad0a /flash
+....
+
++
+Подключите эту машину к сети, чтобы можно было перенести наш tar-файл и распаковать его в файловую систему на флэш-носителе. Вот пример того, как это можно сделать:
++
+
+[source,bash]
+....
+# ifconfig xl0 192.168.0.10 netmask 255.255.255.0
+# route add default 192.168.0.1
+....
+
++
+Теперь, когда машина находится в сети, перепишите ваш tar-файл. Здесь вы можете столкнуться с некоторой проблемой - если объем вашей флэш-памяти равен, к примеру, 128 мегабайтам, а ваш tar-файл превышает 64 мегабайта, то вы не можете одновременно разместить tar-файл на флэш-носителе и распаковать его - вам не хватит места. Одним из решений этой проблемы, если вы используете FTP, является распаковка файла во время его передачи по FTP. Если вы передаете файл именно так, то вы никогда не получите на диске одновременно архивный файл и его содержимое:
++
+
+[source,bash]
+....
+
+ftp> get tarfile.tar "| tar xvf -"
+....
+
++
+Если ваш файл обработан утилитой gzip, вы также можете этого добиться:
++
+
+[source,bash]
+....
+
+ftp> get tarfile.tar "| zcat | tar xvf -"
+....
+
++
+После того, как вы получили содержимое вашей заархивированной файловой системы на файловой системе флэш-памяти, вы можете размонтировать флэш-память и выполнить перезагрузку:
++
+
+[source,bash]
+....
+# cd /
+# umount /flash
+# exit
+....
+
++
+Полагая, что вы правильно настроили вашу файловую систему при ее построении на обычном диске (с вашей файловой системой, смонтированной в режиме доступа только для чтения, и необходимыми параметрами, присутствующими в ядре) вы должны успешно загрузить вашу встраиваемую систему на основе FreeBSD.
+
+[[strategies]]
+== Стратегии работы с системой для случаев небольших и доступных только для чтения файловых систем
+
+В <<ro-fs>> было указано, что файловая система [.filename]#/var#, создаваемая скриптом [.filename]#/etc/rc.d/var#, и наличие корневой файловой системы, доступной только для чтения, приводят к проблемам при работе многих распространенных программных пакетов, используемых во FreeBSD. В этой статье будут даны рекомендации по настройке нормальной работы cron и syslog, установке портов и веб-сервера Apache.
+
+=== cron
+
+Во время загрузки содержимое каталогa [.filename]#/var# формируется скриптом [.filename]#/etc/rc.d/var# используя данные из [.filename]#/etc/mtree/BSD.var.dist#, поэтому в нем создается несколько стандартных каталогов, в числе которых - [.filename]#cron#, [.filename]#cron/tabs#, [.filename]#at#.
+
+Однако это не решает проблему с сохранением cron-таблиц между перезагрузками. Когда система перезагружается, то файловая система [.filename]#/var#, которая располагается в памяти, будет уничтожена, вместе со всеми cron-таблицами, которые вы могли там иметь. Поэтому одним из решений может стать создание cron-таблиц для пользователей, которым они нужны, монтирование вашей файловой системы [.filename]#/# в режиме чтения и записи, и копирование этих cron-таблиц в безопасное место, например, в [.filename]#/etc/tabs#, и последующее добавление строки в конец скрипта [.filename]#/etc/rc.initdiskless# для копирования этих cron-таблиц в каталог [.filename]#/var/cron/tabs# после его создания во время инициализации системы. Вам может также потребоваться добавить строку, которая изменяет режимы доступа и права на каталоги, которые вы создали, и на файлы, которые вы скопировали в скрипте [.filename]#/etc/rc.initdiskless#.
+
+=== syslog
+
+В файле [.filename]#syslog.conf# задано местоположение некоторых файлов протоколов, которые имеются в каталоге [.filename]#/var/log#. Эти файлы не создаются скриптом [.filename]#/etc/rc.d/var# во время инициализации системы. Поэтому где-нибудь в скрипте [.filename]#/etc/rc.d/var#, после секции, создающей каталоги в [.filename]#/var#, вам нужно добавить нечто вроде следующего:
+
+[source,bash]
+....
+# touch /var/log/security /var/log/maillog /var/log/cron /var/log/messages
+# chmod 0644 /var/log/*
+....
+
+=== Установка портов
+
+Перед тем, как обсудить изменения, которые нужно сделать для успешного использования дерева портов, необходимо напомнить о том, что ваши файловые системы на флэш-носителях доступны только для чтения. Поэтому вам нужно временно монтировать их в режиме чтения и записи, используя параметры командной строки, как это показано в <<ro-fs>>. Вы всегда должны перемонтировать эти файловые системы в режим только для чтения после окончания работ - излишние записи на флеш носитель могут значительно сократить его срок эксплуатации.
+
+Чтобы можно было войти в каталог с портами и успешно выполнить команду make `install`, необходимо создать каталог для пакаджей в файловой системе, не располагающейся в памяти, где будут храниться пакаджи между перезагрузками. Так как для установки пакаджа в любом случае требуется монтирование ваших файловых систем для чтения и записи, имеет смысл выделить область флэш-носителя также и для записи информации о пакадже.
+
+Прежде всего создайте каталог с базой данных о пакаджах. Обычно это каталог [.filename]#/var/db/pkg#, но мы не можем разместить базу именно здесь, так как она исчезнет после перезагрузки системы.
+
+[source,bash]
+....
+# mkdir /etc/pkg
+....
+
+Теперь в скрипт [.filename]#/etc/rc.d/var# добавьте строку, которая связывает каталог [.filename]#/etc/pkg# с [.filename]#/var/db/pkg#. Например:
+
+[source,bash]
+....
+# ln -s /etc/pkg /var/db/pkg
+....
+
+Теперь каждый раз при монтировании ваших файловых систем для чтения и записи и установки пакаджа, команда make `install` будет работать, а информация о пакадже будет успешно записана в каталог [.filename]#/etc/pkg# (так как файловая система будет в это время смонтирована для чтения и записи), который всегда будет доступным операционной системе как [.filename]#/var/db/pkg#.
+
+=== Веб-сервер Apache
+
+[NOTE]
+====
+Шаги, описанные в этой части статьи, необходимо выполнить лишь в том случае, если Apache настроен сохранять свой pid или лог файл вне каталога [.filename]#/var#. С настройками по умолчанию Apache формирует свой pid файл в [.filename]#/var/run/httpd.pid#, а лог файлы - в [.filename]#/var/log#.
+====
+
+Далее в статье подразумевается, что Apache сохраняет свои лог файлы в каталог [.filename]#apache_log_dir# вне каталога [.filename]#/var#. Когда этот каталог расположен на файловой системе, смонтированной в режиме только для чтения, Apache не сможет сохранять лог файлы, что в свою очередь может вызывать проблемы в работе веб-сервера. В таком случае необходимо добавить новый каталог к списку каталогов из [.filename]#/etc/rc.d/var# для их создания в каталоге [.filename]#/var# и связать [.filename]#apache_log_dir# с [.filename]#/var/log/apache#. Нужно также задать права доступа и владельца нового каталога.
+
+Сначала добавьте каталог `log/apache` к списку каталогов, создаваемых скриптом [.filename]#/etc/rc.d/var#.
+
+Затем добавьте в скрипт [.filename]#/etc/rc.d/var# после секции создания каталогов такие команды:
+
+[source,bash]
+....
+# chmod 0774 /var/log/apache
+# chown nobody:nobody /var/log/apache
+....
+
+И наконец, удалите существующий каталог [.filename]#apache_install/logs# и замените его ссылкой:
+
+[source,bash]
+....
+# rm -rf apache_log_dir
+# ln -s apache_log_dir
+....
diff --git a/documentation/content/ru/articles/vm-design/_index.adoc b/documentation/content/ru/articles/vm-design/_index.adoc
new file mode 100644
index 0000000000..43b616c077
--- /dev/null
+++ b/documentation/content/ru/articles/vm-design/_index.adoc
@@ -0,0 +1,222 @@
+---
+title: Элементы архитектуры системы виртуальной памяти во FreeBSD
+authors:
+ - author: Matthew Dillon
+ email: dillon@apollo.backplane.com
+releaseinfo: "$FreeBSD$"
+trademarks: ["freebsd", "linux", "microsoft", "opengroup", "general"]
+---
+
+= Элементы архитектуры системы виртуальной памяти во FreeBSD
+:doctype: article
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:toc-title: Содержание
+:part-signifier: Часть
+:chapter-signifier: Глава
+:appendix-caption: Приложение
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/articles/vm-design/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/articles/vm-design/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/articles/vm-design/
+endif::[]
+
+[.abstract-title]
+Аннотация
+
+Название статьи говорит лишь о том, что я попытаюсь описать в целом VM-систему понятным языком. Последний год я сосредоточил усилия в работе над несколькими основными подсистемами ядра FreeBSD, среди которых подсистемы VM и подкачки были самыми интересными, а NFS оказалась "необходимой рутиной". Я переписал лишь малую часть кода. Что касается VM, то я единственным большим обновлением, которое я сделал, является переделка подсистемы подкачки. Основная часть моей работы заключалась в зачистке и поддержке кода, с единственной заметной переделкой кода и без значительной переделки алгоритмов в VM-подсистеме. В основном теоретическая база работы VM-подсистемы осталась неизменной, а большинство благодарностей за современных нововведения за последние несколько лет принадлежат John Dyson и David Greenman. Не являясь историком, как Керк, я не буду пытаться связать различные возможности системы с именами, потому что обязательно ошибусь.
+
+'''
+
+toc::[]
+
+[[introduction]]
+== Введение
+
+Перед тем, как перейти непосредственно к существующей архитектуре, потратим немного времени на рассмотрение вопроса о необходимости поддержки и модернизации любого длительно живущего кода. В мире программирования алгоритмы становятся более важными, чем код, и именно из-за академических корней BSD изначально большое внимание уделялось проработке алгоритмов. Внимание, уделенное архитектуре, в общем отражается на ясности и гибкости кода, который может быть достаточно легко изменен, расширен или с течением времени заменен. Хотя некоторые считают BSD "старой" операционной системой, те их нас, кто работает над ней, видят ее скорее системой со "зрелым" кодом с различными компонентами, которые были заменены, расширены или изменены современным кодом. Он развивается, и FreeBSD остается передовой системой, вне зависимости от того, насколько старой может быть часть кода. Это важное отличие, которое, к сожалению, не всеми понимается. Самой большой ошибкой, которую может допустить программист, является игнорирование истории, и это именно та ошибка, которую сделали многие другие современные операционные системы. Самым ярки примером здесь является Windows NT(R), и последствия ужасны. Linux также в некоторой степени совершил эту ошибку-достаточно, чтобы мы, люди BSD, по крайней мере по разу отпустили по этому поводу шутку. Проблема Linux заключается просто в отсутствии опыта и истории для сравнения идей, проблема, которая легко и быстро решается сообществом Linux точно так же, как она решается в сообществе BSD-постоянной работой над кодом. Разработчики Windows NT(R), с другой стороны, постоянно совершают те же самые ошибки, что были решены в UNIX(R) десятки лет назад, а затем тратят годы на их устранение. Снова и снова. Есть несколько случаев "проработка архитектуры отсутствует" и "мы всегда правы, потому что так говорит наш отдел продаж". Я плохо переношу тех, кого не учит история.
+
+Большинство очевидной сложности архитектуры FreeBSD, особенно в подсистеме VM/Swap, является прямым следствием того, что она решает серьезные проблемы с производительностью, которые проявляются при различных условиях. Эти проблемы вызваны не плохой проработкой алгоритмов, а возникают из окружающих факторов. В любом прямом сравнении между платформами эти проблемы проявляются, когда системные ресурсы начинают истощаться. Так как я описываю подсистему VM/Swap во FreeBSD, то читатель должен всегда иметь в виду два обстоятельства:
+
+. Самым важным аспектом при проектировании производительности является то, что называется "оптимизацией критического маршрута". Часто случается, что оптимизация производительности дает прирост объема кода ради того, чтобы критический маршрут работал быстрее.
+. Четкость общей архитектуры оказывается лучше сильно оптимизированной архитектуры с течением времени. Когда как обобщенная архитектура может быть медленнее, чем оптимизированная архитектура, при первой реализации, при обобщенной архитектуре легче подстраиваться под изменяющиеся условия и чрезмерно оптимизированная архитектура оказывается непригодной.
+
+Любой код, который должен выжить и поддаваться поддержке годы, должен поэтому быть тщательно продуман с самого начала, даже если это стоит потери производительности. Двадцать лет назад были те, кто отстаивал преимущество программирования на языке ассемблера перед программированием на языке высокого уровня, потому что первый генерировал в десять раз более быстрый код. В наши дни ошибочность этого аргумента очевидна - можно провести параллели с построением алгоритмов и обобщением кода.
+
+[[vm-objects]]
+== Объекты VM
+
+Лучше всего начать описание VM-системы FreeBSD с попытки взглянуть на нее с точки зрения пользовательского процесса. Каждый пользовательский процесс имеет единое, принадлежащее только ему и неразрывное адресное пространство VM, содержащее несколько типов объектов памяти. Эти объекты имеют различные характеристики. Код программы и ее данные являются единым файлом, отображаемым в память (это выполняющийся двоичный файл), однако код программы доступен только для чтения, когда как данные программы размещаются в режиме копирования-при-записи. BSS программы представляет собой всего лишь выделенную область памяти, заполненную, если это требовалось, нулями, что называется обнулением страниц памяти по требованию. Отдельные файлы могут также отображаться в адресное пространство, именно так работают динамические библиотеки. Такие отображения требуют изменений, чтобы оставаться принадлежащими процессу, который их выполнил. Системный вызов fork добавляет переводит проблему управления VM полностью в новую плоскость, вдобавок к уже имеющимся сложностям.
+
+Иллюстрирует сложность страница данных двоичной программы (которая является страницей копируемой-при-записи). Двоичная программа содержит секцию предварительно инициализированных данных, которая первоначально отображается непосредственно из файла программы. Когда программа загружается в Vm-пространство процесса, эта область сначала отображается в память и поддерживается бинарным файлом программы, позволяя VM-системе освобождать/повторно использовать страницу, а потом загружать ее снова из бинарного файла. Однако в момент, когда процесс изменяет эти данные, VM-система должна сделать копию страницы, принадлежащую только этому процессу. Так как эта копия была изменена, то VM-система не может больше освобождать эту страницу, так как впоследствии ее невозможно будет восстановить.
+
+Вы тут же заметите, что то, что сначала было простым отображением файла в память, становится гораздо более сложным предметом. Данные могут модифицироваться постранично, когда как отображение файла выполняется для многих страниц за раз. Сложность еще более увеличивается, когда процесс выполняет вызов fork. При этом порождаются два процесса-каждый со с собственным адресным пространством, включающим все изменения, выполненные исходным процессом до вызова функции `fork()`. Было бы глупо для VM-системы делать полную копию данных во время вызова `fork()`, так как весьма вероятно, что один из двух процессов будет нужен только для чтения из той страницы, что позволяет использование исходной страницы. То, что было страницей, принадлежащей только процессу, сделается снова страницей, копируемой при записи, так как каждый из процессов (и родитель, и потомок) полагают, что их собственные изменения после разветвления будут принадлежать только им, и не затронут родственный процесс.
+
+FreeBSD управляет всем этим при помощи многоуровневой модели VM-объектов. Исходный файл с двоичной программой переносится на самый нижний уровень объектов VM. Уровень страниц, копируемых при записи, находится выше него, и хранит те страницы, которые были скопированы из исходного файла. Если программа модифицирует страницы данных, относящиеся к исходному файлу, то система VM обнаруживает это и переносит копию этой страницы на более высокий уровень. Когда процесс разветвляется, добавляются новые уровни VM-объектов. Это можно показать на простом примере. Функция `fork()` является общей операцией для всех систем *BSD, так что в этом примере будет рассматриваться программа, которая запускается, а затем разветвляется. Когда процесс запускается, VM-система создает некоторый уровень объектов, обозначим его A:
+
+image::fig1.png[Рисунок]
+
+A соответствует файлу-по необходимости страницы памяти могут высвобождаться и подгружаться с носителя файла. Подгрузка с диска может потребоваться программе, однако на самом деле мы не хотим, чтобы она записывалась обратно в файл. Поэтому VM-система создает второй уровень, B, который физически поддерживается дисковым пространством подкачки:
+
+image::fig2.png[]
+
+При первой записи в страницу после выполнения этой операции, в B создается новая страница, содержимое которой берется из A. Все страницы в B могут сбрасываться и считываться из устройства подкачки. Когда программа ветвится, VM-система создает два новых уровня объектов-C1 для порождающего процесса и C2 для порожденного-они располагаются поверх B:
+
+image::fig3.png[]
+
+В этом случае, допустим, что страница в B была изменена начальным родительским процессом. В процессе возникнет ситуация копирования при записи и страница скопируется в C1, при этом исходная страница останется в B нетронутой. Теперь допустим, что та же самая страница в B изменяется порожденным процессом. В процессе возникнет ситуация копирования при записи и страница скопируется в C2. Исходная страница в B теперь полностью скрыта, так как и C1, и C2 имеют копии, а B теоретически может быть уничтожена, если она не представляет собой "реального" файла). Однако такую оптимизацию не так уж просто осуществить, потому что она делается на уровне мелких единиц. Во FreeBSD такая оптимизация не выполняется. Теперь положим (а это часто случается), что порожденный процесс выполняет вызов `exec()`. Его текущее адресное пространство обычно заменяется новым адресным пространством, представляющим новый файл. В этом случае уровень C2 уничтожается:
+
+image::fig4.png[]
+
+В этом случае количество потомков B становится равным одному и все обращения к B теперь выполняются через C1. Это означает, что B и C1 могут быть объединены. Все страницы в B, которые также существуют и в C1, во время объединения из B удаляются. Таким образом, хотя оптимизация на предыдущем шаге может не делаться, мы можем восстановить мертвые страницы при окончании работы процессов или при вызове `exec()`.
+
+Такая модель создает некоторое количество потенциальных проблем. Первая, с которой вы можете столкнуться, заключается в сравнительно большой последовательности уровней объектов VM, на сканирование которых тратится время и память. Большое количество уровней может возникнуть, когда процессы разветвляются, а затем разветвляются еще раз (как порожденные, так и порождающие). Вторая проблема заключается в том, что вы можете столкнуться с мертвыми, недоступными страницами глубоко в иерархии объектов VM. В нашем последнем примере если как родитель, так и потомок изменяют одну и ту же страницу, они оба получают собственные копии страницы, а исходная страница в B становится никому не доступной. такая страница в B может быть высвобождена.
+
+FreeBSD решает проблему с глубиной вложенности с помощью приема оптимизации, который называется "All Shadowed Case". Этот случай возникает, если в C1 либо C2 возникает столько случаев копирования страниц при записи, что они полностью закрывают все страницы в B. Допустим, что такое произошло в C1. C1 может теперь полностью заменить B, так что вместо цепочек C1->B->A и C2->B->A мы теперь имеем цепочки C1->A и C2->B->A. Но посмотрите, что получается-теперь B имеет только одну ссылку (C2), так что мы можем объединить B и C2. В конечном итоге B будет полностью удален и мы имеем цепочки C1->A и C2->A. Часто B будет содержать большое количество страниц, и ни C1, ни C2 не смогут полностью их заменить. Если мы снова породим процесс и создадим набор уровней D, при этом, однако, более вероятно, что один из уровней D постепенно сможет полностью заместить гораздо меньший набор данных, представленный C1 и C2. Та же самая оптимизация будет работать в любой точке графа и главным результатом этого является то, что даже на сильно загруженной машине с множеством порождаемых процессов стеки объектов VM не часто бывают глубже четырех уровней. Это так как для порождающего, так и для порожденного процессов, и остается в силе как в случае, когда ветвление делает родитель, так и в случае, когда ветвление выполняет потомок.
+
+Проблема с мертвой страницей все еще имеет место, когда C1 или C2 не полностью перекрывают B. Из-за других применяемых нами методов оптимизации этот случай не представляет большой проблемы и мы просто позволяем таким страницам существовать. Если система испытывает нехватку оперативной памяти, она выполняет их выгрузку в область подкачки, что занимает некоторое пространство в области подкачки, но это все.
+
+Преимущество модели VM-объектов заключается в очень быстром выполнении функции `fork()`, так как при этом не выполняется реального копирования данных. Минусом этого подхода является то, что вы можете построить сравнительно сложную иерархию объектов VM, которая несколько замедляет обработку ситуаций отсутствия страниц памяти, и к тому же тратится память на управление структурами объектов VM. Приемы оптимизации, применяемые во FreeBSD, позволяют снизить значимость этих проблем до степени, когда их можно без особых потерь игнорировать.
+
+[[swap-layers]]
+== Уровни области подкачки
+
+Страницы с собственными данными первоначально являются страницами, копируемыми при записи или заполняемыми нулями. Когда выполняется изменение, и, соответственно, копирование, начальное хранилище объекта (обычно файл) не может больше использоваться для хранения копии страницы, когда VM-системе нужно использовать ее повторно для других целей. В этот момент на помощь приходит область подкачки. Область подкачки выделяется для организации хранилища памяти, которая иначе не может быть доступна. FreeBSD создает структуру управления подкачкой для объекта VM, только когда это действительно нужно. Однако структура управления подкачкой исторически имела некоторые проблемы:
+
+* Во FreeBSD 3.X в структуре управления областью подкачки предварительно выделяется массив, который представляет целый объект, требующий хранения в области подкачки-даже если только несколько страниц этого объекта хранятся в области подкачки. Это создает проблему фрагментации памяти ядра в случае, когда в память отображаются большие объекты или когда ветвятся процессы, занимающие большой объем памяти при работе (RSS).
+* Также для отслеживания памяти подкачки в памяти ядра поддерживается "список дыр", и он также несколько фрагментирован. Так как "список дыр" является последовательным списком, то производительность при распределении и высвобождении памяти в области подкачки неоптимально и ее сложность зависит от количества страниц как O(n).
+* Также в процессе высвобождения памяти в области подкачки требуется выделение памяти в ядре, и это приводит к проблемам блокировки при недостатке памяти.
+* Проблема еще более обостряется из-за дыр, создаваемых по чередующемуся алгоритму.
+* Кроме того, список распределения блоков в области подкачки легко оказывается фрагментированным, что приводит к распределению непоследовательных областей.
+* Память ядра также должна распределяться по ходу работы для дополнительных структур по управлению областью подкачки при выгрузке страниц памяти в эту область.
+
+Очевидно, что мест для усовершенствований предостаточно. Во FreeBSD 4.X подсистема управления областью подкачки была полностью переписана мною:
+
+* Структуры управления областью подкачки распределяются при помощи хэш-таблицы, а не через линейный массив, что дает им фиксированный размер при распределении и работу с гораздо меньшими структурами.
+* Вместо того, чтобы использовать однонаправленный связный список для отслеживания выделения пространства в области подкачки, теперь используется побитовая карта блоков области подкачки, выполненная в основном в виде древовидной структуры с информацией о свободном пространстве, находящейся в узлах структур. Это приводит к тому, что выделение и высвобождение памяти в области подкачки становится операцией сложности O(1).
+* Все дерево также распределяется заранее для того, чтобы избежать распределения памяти ядра во время операций с областью подкачки при критически малом объеме свободной памяти. В конце концов, система обращается к области подкачки при нехватке памяти, так что мы должны избежать распределения памяти ядра в такие моменты для избежания потенциальных блокировок.
+* Для уменьшения фрагментации дерево может распределять большой последовательный кусок за раз, пропуская меньшие фрагментированные области.
+
+Я не сделал последний шаг к заведению "указателя на распределение", который будет передвигаться по участку области подкачки при выделении памяти для обеспечения в будущем распределения последовательных участков, или по крайней мере местоположения ссылки, но я убежден, что это может быть сделано.
+
+[[freeing-pages]]
+== Когда освобождать страницу
+
+Так как система VM использует всю доступную память для кэширования диска, то обычно действительно незанятых страниц очень мало. Система VM зависит от того, как она точно выбирает незанятые страницы для повторного использования для новых распределений. Оптимальный выбор страниц для высвобождения, возможно, является самой важной функцией любой VM-системы, из тех, что она может выполнять, потому что при неправильном выборе система VM вынуждена будет запрашивать страницы с диска, значительно снижая производительность всей системы.
+
+Какую дополнительную нагрузку мы может выделить в критическом пути для избежания высвобождения не той страницы? Каждый неправильный выбор будет стоить нам сотни тысяч тактов работы центрального процессора и заметное замедление работы затронутых процессов, так что мы должны смириться со значительными издержками для того, чтобы была заведомо выбрана правильная страница. Вот почему FreeBSD превосходит другие системы в производительности при нехватке ресурсов памяти.
+
+Алгоритм определения свободной страницы написан на основе истории использования страниц памяти. Для получения этой истории система использует возможности бита использования памяти, которые имеются в большинстве аппаратных таблицах страниц памяти.
+
+В любом случае, бит использования страницы очищается, и в некоторый более поздний момент VM-система обращается к странице снова и обнаруживает, что этот бит установлен. Это указывает на то, что страница активно используется. Периодически проверяя этот бит, накапливается история использования (в виде счетчика) физической страницы. Когда позже VM-системе требуется высвободить некоторые страницы, проверка истории выступает указателем при определении наиболее вероятной кандидатуры для повторного использования.
+
+Для тех платформ, что не имеют этой возможности, система эмулирует этот бит. Она снимает отображение или защищает страницу, что приводит к ошибке доступа к странице, если к странице выполняется повторное обращение. При возникновении этой ошибки система просто помечает страницу как используемую и снимает защиту со страницы, так что она может использоваться. Хотя использование такого приема только для определения использования страницы весьма накладно, это выгоднее, чем повторно использовать страницу для других целей и обнаружить, что она снова нужна процессу и подгружать ее с диска.
+
+FreeBSD использует несколько очередей страниц для обновления выбора страниц для повторного использования, а также для определения того, когда же грязные страницы должны быть сброшены в хранилище. Так как таблицы страниц во FreeBSD являются динамическими объектами, практически ничего не стоит вырезать страницу из адресного пространства любого использующего ее процесса. После того, как подходящая страница, на основе счетчика использования, выбрана, именно это и выполняется. Система должна отличать между чистыми страницами, которые теоретически могут быть высвобождены в любое время, и грязными страницами, которые сначала должны быть переписаны в хранилище перед тем, как их можно будет использовать повторно. После нахождения подходящей страницы она перемещается в неактивную очередь, если она является грязной, или в очередь кэша, если она чистая. Отдельный алгоритм, основывающийся на отношении количества грязных страниц к чистым, определяет, когда грязные страницы в неактивной очереди должны быть сброшены на диск. Когда это выполнится, сброшенные страницы перемещаются из неактивной очереди в очередь кэша. В этот момент страницы в очереди кэша могут быть повторно активизированы VM со сравнительно малыми накладными расходами. Однако страницы в очереди кэша предполагается "высвобождать немедленно" и повторно использовать в LRU-порядке (меньше всего используемый), когда системе потребуется выделение дополнительной памяти.
+
+Стоит отметить, что во FreeBSD VM-система пытается разделить чистые и грязные страницы во избежание срочной необходимости в ненужных сбросах грязных страниц (что отражается на пропускной способности ввода/вывода) и не перемещает беспричинно страницы между разными очередями, когда подсистема управления памятью не испытывает нехватку ресурсов. Вот почему вы можете видеть, что при выполнении команды `systat -vm` в некоторых системах значение счетчика очереди кэша мало, а счетчик активной очереди большой. При повышении нагрузки на VM-систему она прилагает большие усилия на поддержку различных очередей страниц в соотношениях, которые являются наиболее эффективными.
+
+Годами ходили современные легенды, что Linux выполняет работу по предотвращению выгрузки на диск лучше, чем FreeBSD, но это не так. На самом деле FreeBSD старается сбросить на диск неиспользуемые страницы для освобождения места под дисковый кэш, когда как Linux хранит неиспользуемые страницы в памяти и оставляет под кэш и страницы процессов меньше памяти. Я не знаю, остается ли это правдой на сегодняшний день.
+
+[[prefault-optimizations]]
+== Оптимизация ошибок доступа к страницам и их обнуления
+
+Полагая, что ошибка доступа к странице памяти в VM не является операцией с большими накладными расходами, если страница уже находится в основной памяти и может быть просто отображена в адресное пространство процесса, может оказаться, что это станет весьма накладно, если их будет оказываться регулярно много. Хорошим примером этой ситуации является запуск таких программ, как man:ls[1] или man:ps[1], снова и снова. Если бинарный файл программы отображен в память, но не отображен в таблицу страниц, то все страницы, к которым обращалась программа, окажутся недоступными при каждом запуске программы. Это не так уж необходимо, если эти страницы уже присутствуют в кэше VM, так что FreeBSD будет пытаться восстанавливать таблицы страниц процесса из тех страниц, что уже располагаются в VM-кэше. Однако во FreeBSD пока не выполняется предварительное копирование при записи определенных страниц при выполнении вызова exec. Например, если вы запускаете программу man:ls[1] одновременно с работающей `vmstat 1`, то заметите, что она всегда выдает некоторое количество ошибок доступа к страницам, даже когда вы запускаете ее снова и снова. Это ошибки заполнения нулями, а не ошибки кода программы (которые уже были обработаны). Предварительное копирование страниц при выполнении вызовов exec или fork находятся в области, требующей более тщательного изучения.
+
+Большой процент ошибок доступа к страницам, относится к ошибкам при заполнении нулями. Вы можете обычно видеть это, просматривая вывод команды `vmstat -s`. Это происходит, когда процесс обращается к страницам в своей области BSS. Область BSS предполагается изначально заполненной нулями, но VM-система не заботится о выделении памяти до тех пор, пока процесс реально к ней не обратится. При возникновении ошибки VM-система должна не только выделить новую страницу, но и заполнить ее нулями. Для оптимизации операции по заполнению нулями в системе VM имеется возможность предварительно обнулять страницы и помечать их, и запрашивать уже обнуленные страницы при возникновении ошибок заполнения нулями. Предварительное заполнение нулями происходит, когда CPU простаивает, однако количество страниц, которые система заранее заполняет нулями, ограничено, для того, чтобы не переполнить кэши памяти. Это прекрасный пример добавления сложности в VM-систему ради оптимизации критического пути.
+
+[[pre-table-optimizations]]
+== Оптимизация таблицы страниц
+
+Оптимизация таблицы страниц составляет самую содержательную часть архитектуры VM во FreeBSD и она проявляется при появлении нагрузки при значительном использовании `mmap()`. Я думаю, что это на самом деле особенность работы большинства BSD-систем, хотя я не уверен, когда это проявилось впервые. Есть два основных подхода к оптимизации. Первый заключается в том, что аппаратные таблицы страниц не содержат постоянного состояния, а вместо этого могут быть сброшены в любой момент с малыми накладными расходами. Второй подход состоит в том, что каждая активная таблица страниц в системе имеет управляющую структуру `pv_entry`, которая связана в структуру `vm_page`. FreeBSD может просто просматривать эти отображения, которые существуют, когда как в Linux должны проверяться все таблицы страниц, которые _могут_ содержать нужное отображение, что в некоторых ситуация дает увеличение сложности O(n^2). Из-за того, что FreeBSD стремится выбрать наиболее подходящую к повторному использованию или сбросу в область подкачки страницу, когда ощущается нехватка памяти, система дает лучшую производительность при нагрузке. Однако во FreeBSD требуется тонкая настройка ядра для соответствия ситуациям с большим совместно используемым адресным пространством, которые могут случиться в системе, обслуживающей сервер телеконференций, потому что структуры `pv_entry` могут оказаться исчерпанными.
+
+И в Linux, и во FreeBSD требуются доработки в этой области. FreeBSD пытается максимизировать преимущества от потенциально редко применяемой модели активного отображения (к примеру, не всем процессам нужно отображать все страницы динамической библиотеки), когда как Linux пытается упростить свои алгоритмы. FreeBSD имеет здесь общее преимущество в производительности за счет использования дополнительной памяти, но FreeBSD выглядит хуже в случае, когда большой файл совместно используется сотнями процессов. Linux, с другой стороны, выглядит хуже в случае, когда много процессов частично используют одну и ту же динамическую библиотеку, а также работает неоптимально при попытке определить, может ли страница повторно использоваться, или нет.
+
+[[page-coloring-optimizations]]
+== Подгонка страниц
+
+Мы закончим рассмотрением метода оптимизации подгонкой страниц. Подгонка является методом оптимизации, разработанным для того, чтобы доступ в последовательные страницы виртуальной памяти максимально использовал кэш процессора. В далеком прошлом (то есть больше 10 лет назад) процессорные кэши предпочитали отображать виртуальную память, а не физическую. Это приводило к огромному количеству проблем, включая необходимость очистки кэша в некоторых случаях при каждом переключении контекста и проблемы с замещением данных в кэше. В современных процессорах кэши отображают физическую память именно для решения этих проблем. Это означает, что две соседние страницы в адресном пространстве процессов могут не соответствовать двух соседним страницам в кэше. Фактически, если вы об этом не позаботились, то соседние страницы в виртуальной памяти могут использовать ту же самую страницу в кэше процессора-это приводит к сбросу кэшируемых данных и снижению производительности CPU. Это так даже с множественными ассоциативными кэшами (хотя здесь эффект несколько сглажен).
+
+Код выделения памяти во FreeBSD выполняет оптимизацию с применением подгонки страниц, означающую то, что код выделения памяти будет пытаться найти свободные страницы, которые являются последовательными с точки зрения кэша. Например, если страница 16 физической памяти назначается странице 0 виртуальной памяти процесса, а в кэш помещается 4 страницы, то код подгонки страниц не будет назначать страницу 20 физической памяти странице 1 виртуальной памяти процесса. Вместо этого будет назначена страница 21 физической памяти. Код подгонки страниц попытается избежать назначение страницы 20, потому что такое отображение перекрывается в той же самой памяти кэша как страница 16, и приведет к неоптимальному кэшированию. Как вы можете предположить, такой код значительно добавляет сложности в подсистему выделения памяти VM, но результат стоит того. Подгонка страниц делает память VM предсказуемой, как и обычная физическая память, относительно производительности кэша.
+
+[[conclusion]]
+== Заключение
+
+Виртуальная память в современных операционных системах должна решать несколько различных задач эффективно и при разных условиях. Модульный и алгоритмический подход, которому исторически следует BSD, позволяет нам изучить и понять существующую реализацию, а также сравнительно легко изменить большие блоки кода. За несколько последних лет в VM-системе FreeBSD было сделано некоторое количество усовершенствований, и работа над ними продолжается.
+
+[[allen-briggs-qa]]
+== Дополнительный сеанс вопросов и ответов от Аллена Бриггса (Allen Briggs)
+
+=== Что это за алгоритм чередования, который вы упоминали в списке недостатков подсистемы управления разделом подкачки во FreeBSD 3.X?
+
+FreeBSD использует в области подкачки механизм чередования, с индексом по умолчанию, равным четырем. Это означает, что FreeBSD резервирует пространство для четырех областей подкачки, даже если у вас имеется всего лишь одна, две или три области. Так как в области подкачки имеется чередование, то линейное адресное пространство, представляющее "четыре области подкачки", будет фрагментироваться, если у вас нет на самом деле четырех областей подкачки. Например, если у вас две области A и B, то представление адресного пространства для этой области подкачки во FreeBSD будет организовано с чередованием блоков из 16 страниц:
+
+....
+A B C D A B C D A B C D A B C D
+....
+
+FreeBSD 3.X использует "последовательный список свободных областей" для управления свободными областями в разделе подкачки. Идея состоит в том, что большие последовательные блоки свободного пространства могут быть представлены при помощи узла односвязного списка ([.filename]#kern/subr_rlist.c#). Но из-за фрагментации последовательный список сам становится фрагментированным. В примере выше полностью неиспользуемое пространство в A и B будет показано как "свободное", а C и D как "полностью занятое". Каждой последовательности A-B требуется для учета узел списка, потому что C и D являются дырами, так что узел списка не может быть связан со следующей последовательностью A-B.
+
+Почему мы организуем чередование в области подкачки вместо того, чтобы просто объединить области подкачки в одно целое и придумать что-то более умное? Потому что гораздо легче выделять последовательные полосы адресного пространства и получать в результате автоматическое чередование между несколькими дисками, чем пытаться выдумывать сложности в другом месте.
+
+Фрагментация вызывает другие проблемы. Являясь последовательным списком в 3.X и имея такое огромную фрагментацию, выделение и освобождение в области подкачки становится алгоритмом сложности O(N), а не O(1). Вместе с другими факторами (частое обращение к области подкачки) вы получаете сложность уровней O(N^2) и O(N^3), что плохо. В системе 3.X также может потребоваться выделение KVM во время работы с областью подкачки для создания нового узла списка, что в условии нехватки памяти может привести к блокировке, если система попытается сбросить страницы в область подкачки.
+
+В 4.X мы не используем последовательный список. Вместо этого мы используем базисное дерево и битовые карты блоков области подкачки, а не ограниченный список узлов. Мы принимаем предварительное выделение всех битовых карт, требуемых для всей области подкачки, но при этом тратится меньше памяти, потому что мы используем битовые карты (один бит на блок), а не связанный список узлов. Использование базисного дерева вместо последовательного списка дает нам производительность O(1) вне зависимости от фрагментации дерева.
+
+=== Как разделение чистых и грязных (неактивных) страниц связано с ситуацией, когда вы видите маленький счетчик очереди кэша и большой счетчик активной очереди в выдаче команды systat -vm? Разве системная статистика не считает активные и грязные страницы вместе за счетчик активной очереди?
+
+Да, это запутывает. Связь заключается в "желаемом" и "действительном". Мы желаем разделить страницы, но реальность такова, что пока у нас нет проблем с памятью, нам это на самом деле не нужно.
+
+Это означает, что FreeBSD не будет очень сильно стараться над отделением грязных страниц (неактивная очередь) от чистых страниц (очередь кэша), когда система не находится под нагрузкой, и не будет деактивировать страницы (активная очередь -> неактивная очередь), когда система не нагружена, даже если они не используются.
+
+=== В примере с / vmstat 1 могут ли некоторые ошибки доступа к странице быть ошибками страниц данных (COW из выполнимого файла в приватные страницы)? То есть я полагаю, что ошибки доступа к страницам являются частично ошибками при заполнении нулями, а частично данных программы. Или вы гарантируете, что FreeBSD выполняет предварительно COW для данных программы?
+
+Ошибка COW может быть ошибкой при заполнении нулями или данных программы. Механизм в любом случае один и тот же, потому что хранилище данных программы уже в кэше. Я на самом деле не рад ни тому, ни другому. FreeBSD не выполняет предварительное COW данных программы и заполнение нулями, но она _выполняет_ предварительно отображение страниц, которые имеются в ее кэше.
+
+=== В вашем разделе об оптимизации таблицы страниц, не могли бы вы более подробно рассказать о pv_entry и vm_page (или vm_page должна быть vm_pmap-как в 4.4, cf. pp. 180-181 of McKusick, Bostic, Karel, Quarterman)? А именно какое действие/реакцию должно потребоваться для сканирования отображений?
+
+`vm_page` представляет собой пару (object,index#). `pv_entry` является записью из аппаратной таблицы страниц (pte). Если у вас имеется пять процессов, совместно использующих одну и ту же физическую страницу, и в трех таблицах страниц этих процессов на самом деле отображается страница, то страница будет представляться одной структурой `vm_page` и тремя структурами `pv_entry`.
+
+Структуры `pv_entry` представляют страницы, отображаемые MMU (одна структура `pv_entry` соответствует одной pte). Это означает, что, когда нам нужно убрать все аппаратные ссылки на `vm_page` (для того, чтобы повторно использовать страницу для чего-то еще, выгрузить ее, очистить, пометить как грязную и так далее), мы можем просто просмотреть связный список структур `pv_entry`, связанных с этой `vm_page`, для того, чтобы удалить или изменить pte из их таблиц страниц.
+
+В Linux нет такого связного списка. Для того, чтобы удалить все отображения аппаратной таблицы страниц для `vm_page`, linux должен пройти по индексу каждого объекта VM, который _может_ отображать страницу. К примеру, если у вас имеется 50 процессов, которые все отображают ту же самую динамическую библиотеку и хотите избавиться от страницы X в этой библиотеке, то вам нужно пройтись по индексу всей таблицы страниц для каждого из этих 50 процессов, даже если только 10 из них на самом деле отображают страницу. Так что Linux использует простоту подхода за счет производительности. Многие алгоритмы VM, которые имеют сложность O(1) или (N малое) во FreeBSD, в Linux приобретают сложность O(N), O(N^2) или хуже. Так как pte, представляющий конкретную страницу в объекте, скорее всего, будет с тем же смещением во всех таблицах страниц, в которых они отображаются, то уменьшение количества обращений в таблицы страниц по тому же самому смещению часто позволяет избежать разрастания кэша L1 для этого смещения, что приводит к улучшению производительности.
+
+Во FreeBSD введены дополнительные сложности (схема с `pv_entry`) для увеличения производительности (уменьшая количество обращений _только_ к тем pte, которые нужно модифицировать).
+
+Но во FreeBSD имеется проблема масштабирования, которой нет в Linux, потому что имеется ограниченное число структур `pv_entry`, и это приводит к возникновению проблем при большом объеме совместно используемых данных. В этом случае у вас может возникнуть нехватка структур `pv_entry`, даже если свободной памяти хватает. Это может быть достаточно легко исправлено увеличением количества структур `pv_entry` при настройке, но на самом деле нам нужно найти лучший способ делать это.
+
+Что касается использования памяти под таблицу страниц против схемы с `pv_entry`: Linux использует "постоянные" таблицы страниц, которые не сбрасываются, но ему не нужны `pv_entry` для каждого потенциально отображаемого pte. FreeBSD использует "сбрасываемые" таблицы страниц, но для каждого реально отображаемого pte добавляется структура `pv_entry`. Я думаю, что использование памяти будет примерно одинакова, тем более что у FreeBSD есть алгоритмическое преимущество, заключающееся в способности сбрасывать таблицы страниц с очень малыми накладными расходами.
+
+=== Наконец, в разделе о подгонке страниц хорошо бы было иметь краткое описание того, что это значит. Я не совсем это понял.
+
+Знаете ли вы, как работает аппаратный кэш памяти L1? Объясняю: Представьте машину с 16МБ основной памяти и только со 128К памяти кэша L1. В общем, этот кэш работает так, что каждый блок по 128К основной памяти использует _те же самые_ 128К кэша. Если вы обращаетесь к основной памяти по смещению 0, а затем к основной памяти по смещению 128К, вы перезаписываете данные кэша, прочтенные по смещению 0!
+
+Я очень сильно все упрощаю. То, что я только что описал, называется "напрямую отображаемым" аппаратным кэшем памяти. Большинство современных кэшей являются так называемыми 2-сторонними множественными ассоциативными или 4-сторонними множественными ассоциативными кэшами. Множественная ассоциативность позволяет вам обращаться к вплоть до N различным областям памяти, которые используют одну и ту же память кэша без уничтожения ранее помещенных в кэш данных. Но только N.
+
+Так что если у меня имеется 4-сторонний ассоциативный кэш, я могу обратиться к памяти по смещению 0, смещению 128К, 256К и смещению 384K, затем снова обратиться к памяти по смещению 0 и получу ее из кэша L1. Однако, если после этого я обращусь к памяти по смещению 512К, один из ранее помещенных в кэш объектов данных будет из кэша удален.
+
+Это чрезвычайно важно... для большинства обращений к памяти процессора _чрезвычайно_ важно, чтобы данные находились в кэше L1, так как кэш L1 работает на тактовой частоте работы процессора. В случае, если данных в кэше L1 не обнаруживается, и они ищутся в кэше L2 или в основной памяти, процессор будет простаивать, или, скорее, сидеть, сложив ручки, в ожидании окончания чтения из основной памяти, хотя за это время можно было выполнить _сотни_ операций. Основная память (динамическое ОЗУ, которое установлено в компьютере) работает по сравнению со скоростью работы ядра современных процессоров __медленно__.
+
+Хорошо, а теперь рассмотрим подгонку страниц: Все современные кэши памяти являются так называемыми _физическими_ кэшами. Они кэшируют адреса физической памяти, а не виртуальной. Это позволяет кэшу не принимать во внимание переключение контекстов процессов, что очень важно.
+
+Но в мире UNIX(R) вы работаете с виртуальными адресными пространствами, а не с физическими. Любая программа, вами написанная, имеет дело с виртуальным адресным пространством, ей предоставленным. Реальные _физические_ страницы, соответствующие виртуальному адресному пространству, не обязательно расположены физически последовательно! На самом деле у вас могут оказаться две страницы, которые в адресном пространстве процессов являются граничащими, но располагающимися по смещению 0 и по смещению 128К в _физической_ памяти.
+
+Обычно программа полагает, что две граничащие страницы будут кэшироваться оптимально. То есть вы можете обращаться к объектам данных в обеих страницах без замещений в кэше данных друг друга. Но это имеет место, если только физические страницы, соответствующие виртуальному адресному пространству, располагаются рядом (в такой мере, что попадают в кэш).
+
+Это именно то, что выполняет подгонка. Вместо того, чтобы назначать _случайные_ физические страницы виртуальным адресам, что может привести к неоптимальной работе кэша, при подгонке страниц виртуальным адресам назначаются _примерно подходящие по порядку_ физические страницы. Таким образом, программы могут писаться в предположении, что характеристики низлежащего аппаратного кэша для виртуального адресного пространства будут такими же, как если бы программа работала непосредственно в физическом адресном пространстве.
+
+Заметьте, что я сказал "примерно" подходящие, а не просто "последовательные". С точки зрения напрямую отображаемого кэша в 128К, физический адрес 0 одинаков с физическим адресом 128К. Так что две граничащие страницы в вашем виртуальном адресном пространстве могут располагаться по смещению 128К и 132К физической памяти, но могут легко находиться по смещению 128К и по смещению 4К физической памяти, и иметь те же самые характеристики работы кэша. Так что при подгонке _не нужно_ назначать в действительности последовательные страницы физической памяти последовательным страницам виртуальной памяти, достаточно просто добиться расположения страниц по соседству друг с другом с точки зрения работы кэша.
diff --git a/documentation/content/ru/books/_index.adoc b/documentation/content/ru/books/_index.adoc
new file mode 100644
index 0000000000..17572a88c5
--- /dev/null
+++ b/documentation/content/ru/books/_index.adoc
@@ -0,0 +1,7 @@
+---
+title: Books
+---
+
+= Books
+
+{{< list-books-directories >}}
diff --git a/documentation/content/ru/books/arch-handbook/driverbasics/chapter.adoc b/documentation/content/ru/books/arch-handbook/driverbasics/chapter.adoc
new file mode 100644
index 0000000000..0e6788c93f
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/driverbasics/chapter.adoc
@@ -0,0 +1,493 @@
+---
+title: Глава 9. Написание драйверов устройств для FreeBSD
+authors:
+---
+
+[[driverbasics]]
+= Написание драйверов устройств для FreeBSD
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+
+Эту главу написал {murray} на основе множества источников, включая справочную страницу intro(4), которую создал {joerg}.
+
+[[driverbasics-intro]]
+== Введение
+
+Эта глава является кратким введением в процесс написания драйверов устройств для FreeBSD. В этом контексте термин устройство используется в основном для вещей, связанных с оборудованием, относящимся к системе, таких, как диски, печатающие устройства или графические дисплеи с клавиатурами. Драйвер устройства является программной компонентой операционной системы, управляющей некоторым устройством. Имеются также так называемые псевдо-устройства, в случае которых драйвер устройства эмулирует поведение устройства программно, без наличия какой-либо соответствующей аппаратуры. Драйверы устройств могут быть вкомпилированы в систему статически или могут загружаться по требованию при помощи механизма динамического компоновщика ядра `kld`.
+
+Большинство устройств в Unix-подобной операционной системе доступны через файлы устройств (device-nodes), иногда также называемые специальными файлами. В иерархии файловой системы эти файлы обычно находятся в каталоге [.filename]#/dev#. В версиях FreeBSD, более старых, чем 5.0-RELEASE, в которых поддержка man:devfs[5] не интегрирована в систему, каждый файл устройства должен создаваться статически и вне зависимости от наличия соответствующего драйвера устройства. Большинство файлов устройств в системе создаются при помощи команды `MAKEDEV`.
+
+Драйверы устройств могут быть условно разделены на две категории; драйверы символьных и сетевых устройств.
+
+[[driverbasics-kld]]
+== Механизм динамического компоновщика ядра - KLD
+
+Интерфейс kld позволяет системным администраторам динамически добавлять и убирать функциональность из работающей системы. Это позволяет разработчикам драйверов устройств загружать собственные изменения в работающее ядро без постоянных перезагрузок для тестирования изменений.
+
+Для работы с интерфейсом kld используются следующие команды привилегированного режима:
+
+* `kldload` - загружает новый модуль ядра
+* `kldunload` - выгружает модуль ядра
+* `kldstat` - выводит список загруженных в данный момент модулей
+
+Скелет модуля ядра
+
+[.programlisting]
+....
+/*
+ * KLD Skeleton
+ * Inspired by Andrew Reiter's Daemonnews article
+ */
+
+#include <sys/types.h>
+#include <sys/module.h>
+#include <sys/systm.h> /* uprintf */
+#include <sys/errno.h>
+#include <sys/param.h> /* defines used in kernel.h */
+#include <sys/kernel.h> /* types used in module initialization */
+
+/*
+ * Load handler that deals with the loading and unloading of a KLD.
+ */
+
+static int
+skel_loader(struct module *m, int what, void *arg)
+{
+ int err = 0;
+
+ switch (what) {
+ case MOD_LOAD: /* kldload */
+ uprintf("Skeleton KLD loaded.\n");
+ break;
+ case MOD_UNLOAD:
+ uprintf("Skeleton KLD unloaded.\n");
+ break;
+ default:
+ err = EINVAL;
+ break;
+ }
+ return(err);
+}
+
+/* Declare this module to the rest of the kernel */
+
+static moduledata_t skel_mod = {
+ "skel",
+ skel_loader,
+ NULL
+};
+
+DECLARE_MODULE(skeleton, skel_mod, SI_SUB_KLD, SI_ORDER_ANY);
+....
+
+=== Makefile
+
+Во FreeBSD имеются заготовки для включения в make-файлы, которые вы можете использовать для быстрой компиляции собственных дополнений к ядру.
+
+[.programlisting]
+....
+SRCS=skeleton.c
+KMOD=skeleton
+
+.include <bsd.kmod.mk>
+....
+
+Простой запуск команды `make` с этим make-файлом приведет к созданию файла [.filename]#skeleton.ko#, который можно загрузить в вашу систему, набрав:
+
+[source,bash]
+....
+# kldload -v ./skeleton.ko
+....
+
+[[driverbasics-access]]
+== Обращение к драйверу устройства
+
+Unix дает некоторый общий набор системных вызовов для использования в пользовательских приложениях. Когда пользователь обращается к файлу устройства, высокие уровни ядра перенаправляют эти обращения к соответствующему драйверу устройства. Скрипт `/dev/MAKEDEV` создает большинство файлов устройств в вашей системе, однако если вы ведете разработку своего собственного драйвера, то может появиться необходимость в создании собственных файлов устройств при помощи команды `mknod`.
+
+=== Создание статических файлов устройств
+
+Для создания файла устройства команде `mknod` требуется указать четыре аргумента. Вы должны указать имя файла устройства, тип устройства, старшее число устройства и младшее число устройства.
+
+=== Динамические файлы устройств
+
+Файловая система устройств, devfs, предоставляет доступ к пространству имен устройств ядра из глобального пространства имен файловой системы. Это устраняет потенциальную проблемы наличия драйвера без статического файла устройства или файла устройства без установленного драйвера устройства. Devfs все еще находится в разработке, однако она уже достаточно хорошо работает.
+
+[[driverbasics-char]]
+== Символьные устройства
+
+Драйвер символьного устройства передает данные непосредственно в или из процесса пользователя. Это самый распространенный тип драйвера устройства и в дереве исходных текстов имеется достаточно простых примеров таких драйверов.
+
+В этом простом примере псевдо-устройство запоминает какие угодно значения, которые вы в него записываете, и затем может выдавать их назад при чтении из этого устройства. Приведены две версии, одна для FreeBSD 4.X, а другая для FreeBSD 5.X.
+
+.Пример драйвера псевдо-устройства Echo для FreeBSD 4.X
+[example]
+====
+[.programlisting]
+....
+/*
+ * Simple `echo' pseudo-device KLD
+ *
+ * Murray Stokely
+ */
+
+#define MIN(a,b) (((a) (b)) ? (a) : (b))
+
+#include sys/types.h
+#include sys/module.h
+#include sys/systm.h /* uprintf */
+#include sys/errno.h
+#include sys/param.h /* defines used in kernel.h */
+#include sys/kernel.h /* types used in module initialization */
+#include sys/conf.h /* cdevsw struct */
+#include sys/uio.h /* uio struct */
+#include sys/malloc.h
+
+#define BUFFERSIZE 256
+
+/* Function prototypes */
+d_open_t echo_open;
+d_close_t echo_close;
+d_read_t echo_read;
+d_write_t echo_write;
+
+/* Character device entry points */
+static struct cdevsw echo_cdevsw = {
+ echo_open,
+ echo_close,
+ echo_read,
+ echo_write,
+ noioctl,
+ nopoll,
+ nommap,
+ nostrategy,
+ "echo",
+ 33, /* reserved for lkms - /usr/src/sys/conf/majors */
+ nodump,
+ nopsize,
+ D_TTY,
+ -1
+};
+
+struct s_echo {
+ char msg[BUFFERSIZE];
+ int len;
+} t_echo;
+
+/* vars */
+static dev_t sdev;
+static int len;
+static int count;
+static t_echo *echomsg;
+
+MALLOC_DECLARE(M_ECHOBUF);
+MALLOC_DEFINE(M_ECHOBUF, "echobuffer", "buffer for echo module");
+
+/*
+ * This function is called by the kld[un]load(2) system calls to
+ * determine what actions to take when a module is loaded or unloaded.
+ */
+
+static int
+echo_loader(struct module *m, int what, void *arg)
+{
+ int err = 0;
+
+ switch (what) {
+ case MOD_LOAD: /* kldload */
+ sdev = make_dev(echo_cdevsw,
+ 0,
+ UID_ROOT,
+ GID_WHEEL,
+ 0600,
+ "echo");
+ /* kmalloc memory for use by this driver */
+ MALLOC(echomsg, t_echo *, sizeof(t_echo), M_ECHOBUF, M_WAITOK);
+ printf("Echo device loaded.\n");
+ break;
+ case MOD_UNLOAD:
+ destroy_dev(sdev);
+ FREE(echomsg,M_ECHOBUF);
+ printf("Echo device unloaded.\n");
+ break;
+ default:
+ err = EINVAL;
+ break;
+ }
+ return(err);
+}
+
+int
+echo_open(dev_t dev, int oflags, int devtype, struct proc *p)
+{
+ int err = 0;
+
+ uprintf("Opened device \"echo\" successfully.\n");
+ return(err);
+}
+
+int
+echo_close(dev_t dev, int fflag, int devtype, struct proc *p)
+{
+ uprintf("Closing device \"echo.\"\n");
+ return(0);
+}
+
+/*
+ * The read function just takes the buf that was saved via
+ * echo_write() and returns it to userland for accessing.
+ * uio(9)
+ */
+
+int
+echo_read(dev_t dev, struct uio *uio, int ioflag)
+{
+ int err = 0;
+ int amt;
+
+ /* How big is this read operation? Either as big as the user wants,
+ or as big as the remaining data */
+ amt = MIN(uio->uio_resid, (echomsg->len - uio->uio_offset > 0) ? echomsg->len - uio->uio_offset : 0);
+ if ((err = uiomove(echomsg->msg + uio->uio_offset,amt,uio)) != 0) {
+ uprintf("uiomove failed!\n");
+ }
+
+ return err;
+}
+
+/*
+ * echo_write takes in a character string and saves it
+ * to buf for later accessing.
+ */
+
+int
+echo_write(dev_t dev, struct uio *uio, int ioflag)
+{
+ int err = 0;
+
+ /* Copy the string in from user memory to kernel memory */
+ err = copyin(uio->uio_iov->iov_base, echomsg->msg, MIN(uio->uio_iov->iov_len,BUFFERSIZE));
+
+ /* Now we need to null terminate */
+ *(echomsg->msg + MIN(uio->uio_iov->iov_len,BUFFERSIZE)) = 0;
+ /* Record the length */
+ echomsg->len = MIN(uio->uio_iov->iov_len,BUFFERSIZE);
+
+ if (err != 0) {
+ uprintf("Write failed: bad address!\n");
+ }
+
+ count++;
+ return(err);
+}
+
+DEV_MODULE(echo,echo_loader,NULL);
+....
+
+====
+
+.Пример драйвера псевдо-устройства Echo для FreeBSD 5.X
+[example]
+====
+[.programlisting]
+....
+/*
+ * Simple `echo' pseudo-device KLD
+ *
+ * Murray Stokely
+ *
+ * Converted to 5.X by Sren (Xride) Straarup
+ */
+
+#include sys/types.h
+#include sys/module.h
+#include sys/systm.h /* uprintf */
+#include sys/errno.h
+#include sys/param.h /* defines used in kernel.h */
+#include sys/kernel.h /* types used in module initialization */
+#include sys/conf.h /* cdevsw struct */
+#include sys/uio.h /* uio struct */
+#include sys/malloc.h
+
+#define BUFFERSIZE 256
+#define CDEV_MAJOR 33
+
+/* Function prototypes */
+static d_open_t echo_open;
+static d_close_t echo_close;
+static d_read_t echo_read;
+static d_write_t echo_write;
+
+/* Character device entry points */
+static struct cdevsw echo_cdevsw = {
+ .d_open = echo_open,
+ .d_close = echo_close,
+ .d_maj = CDEV_MAJOR,
+ .d_name = "echo",
+ .d_read = echo_read,
+ .d_write = echo_write
+};
+
+typedef struct s_echo {
+ char msg[BUFFERSIZE];
+ int len;
+} t_echo;
+
+/* vars */
+static dev_t echo_dev;
+static int count;
+static t_echo *echomsg;
+
+MALLOC_DECLARE(M_ECHOBUF);
+MALLOC_DEFINE(M_ECHOBUF, "echobuffer", "buffer for echo module");
+
+/*
+ * This function is called by the kld[un]load(2) system calls to
+ * determine what actions to take when a module is loaded or unloaded.
+ */
+
+static int
+echo_loader(struct module *m, int what, void *arg)
+{
+ int err = 0;
+
+ switch (what) {
+ case MOD_LOAD: /* kldload */
+ echo_dev = make_dev(echo_cdevsw,
+ 0,
+ UID_ROOT,
+ GID_WHEEL,
+ 0600,
+ "echo");
+ /* kmalloc memory for use by this driver */
+ MALLOC(echomsg, t_echo *, sizeof(t_echo), M_ECHOBUF, M_WAITOK);
+ printf("Echo device loaded.\n");
+ break;
+ case MOD_UNLOAD:
+ destroy_dev(echo_dev);
+ FREE(echomsg,M_ECHOBUF);
+ printf("Echo device unloaded.\n");
+ break;
+ default:
+ err = EINVAL;
+ break;
+ }
+ return(err);
+}
+
+static int
+echo_open(dev_t dev, int oflags, int devtype, struct thread *p)
+{
+ int err = 0;
+
+ uprintf("Opened device \"echo\" successfully.\n");
+ return(err);
+}
+
+static int
+echo_close(dev_t dev, int fflag, int devtype, struct thread *p)
+{
+ uprintf("Closing device \"echo.\"\n");
+ return(0);
+}
+
+/*
+ * The read function just takes the buf that was saved via
+ * echo_write() and returns it to userland for accessing.
+ * uio(9)
+ */
+
+static int
+echo_read(dev_t dev, struct uio *uio, int ioflag)
+{
+ int err = 0;
+ int amt;
+
+ /*
+ * How big is this read operation? Either as big as the user wants,
+ * or as big as the remaining data
+ */
+ amt = MIN(uio->uio_resid, (echomsg->len - uio->uio_offset > 0) ?
+ echomsg->len - uio->uio_offset : 0);
+ if ((err = uiomove(echomsg->msg + uio->uio_offset,amt,uio)) != 0) {
+ uprintf("uiomove failed!\n");
+ }
+ return(err);
+}
+
+/*
+ * echo_write takes in a character string and saves it
+ * to buf for later accessing.
+ */
+
+static int
+echo_write(dev_t dev, struct uio *uio, int ioflag)
+{
+ int err = 0;
+
+ /* Copy the string in from user memory to kernel memory */
+ err = copyin(uio->uio_iov->iov_base, echomsg->msg,
+ MIN(uio->uio_iov->iov_len,BUFFERSIZE - 1));
+
+ /* Now we need to null terminate, then record the length */
+ *(echomsg->msg + MIN(uio->uio_iov->iov_len,BUFFERSIZE - 1)) = 0;
+ echomsg->len = MIN(uio->uio_iov->iov_len,BUFFERSIZE);
+
+ if (err != 0) {
+ uprintf("Write failed: bad address!\n");
+ }
+ count++;
+ return(err);
+}
+
+DEV_MODULE(echo,echo_loader,NULL);
+....
+
+====
+
+Для установки этого драйвера во FreeBSD 4.X сначала вам нужно создать файл устройства в вашей файловой системе по команде типа следующей:
+
+[source,bash]
+....
+# mknod /dev/echo c 33 0
+....
+
+Когда этот драйвер загружен, вы можете выполнять следующие действия:
+
+[source,bash]
+....
+# echo -n "Test Data" > /dev/echo
+# cat /dev/echo
+Test Data
+....
+
+Устройства, обслуживающие реальное оборудование, описываются в следующей главе.
+
+Дополнительные источники информации
+
+* http://www.daemonnews.org/200010/blueprints.html[Учебник по программированию механизма динамического компоновщика ядра (KLD)] - http://www.daemonnews.org/[Daemonnews] Октябрь 2000
+* http://www.daemonnews.org/200007/newbus-intro.html[Как писать драйверы ядра в парадигме NEWBUS] - http://www.daemonnews.org/[Daemonnews] Июль 2000
+
+[[driverbasics-block]]
+== Блочные устройства (которых больше нет)
+
+Другие UNIX(R)-системы могут поддерживать со вторым типом дисковых устройств, так называемых устройств с блочной организацией. Блочные устройства являются дисковыми устройствами, для которых ядро организует кэширование. Такое кэширование делает блочные устройства практически бесполезными, или по крайней мере ненадёжными. Кэширование изменяет последовательность операций записи, лишая приложение возможности узнать реальное содержимое диска в любой момент времени. Это делает предсказуемое и надежное восстановление данных на диске (файловые системы, базы данных и прочее) после сбоя невозможным. Так как запись может быть отложенной, то нет способа сообщить приложению, при выполнении какой именно операции записи ядро встретилось с ошибкой, что таким образом осложняет проблему целостности данных. По этой причине серьёзные приложения не полагаются на блочные устройства, и, на самом деле практически во всех приложениях, которые работают с диском напрямую, имеется большая проблема выбора устройств с последовательным доступом (или "raw"), которые должны использоваться. Из-за реализации отображения каждого диска (раздела) в два устройства с разными смыслами, которая усложняет соответствующий код ядра, во FreeBSD поддержка дисковых устройств с кэшированием была отброшена в процессе модернизации инфраструктуры I/O-операций с дисками.
+
+[[driverbasics-net]]
+== Сетевые драйверы
+
+В случае драйверов сетевых устройств файлы устройств для доступа к ним не используются. Их выбор основан на другом механизме, работающем в ядре, и не использующем вызов open(); об использование сетевых устройств в общем случае рассказано в описании системного вызова socket(2).
+
+Почитайте справочную информацию о вызове ifnet(), устройстве loopback, почитайте драйверы Билла Пола (Bill Paul), и так далее..
diff --git a/documentation/content/ru/books/arch-handbook/locking/chapter.adoc b/documentation/content/ru/books/arch-handbook/locking/chapter.adoc
new file mode 100644
index 0000000000..be6faecad7
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/locking/chapter.adoc
@@ -0,0 +1,118 @@
+---
+title: Глава 2. Замечания по блокировке
+authors:
+---
+
+[[locking]]
+= Замечания по блокировке
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+
+_Эта глава поддерживается проектом FreeBSD SMP Next Generation Project. Комментарии и пожелания направляйте в link:{freebsd-smp}._
+
+Этот документ описывает механизм блокировки, используемый в ядре FreeBSD для обеспечения эффективной поддержки нескольких процессоров в ядре. Блокировку можно рассматривать с нескольких точек зрения. Структуры данных могут быть защищены с помощью блокировок mutex или man:lockmgr[9]. Несколько переменных защищены просто в силу атомарности используемых для доступа к ним операций.
+
+[[locking-mutexes]]
+== Мьютексы
+
+Мьютекс (mutex) - это просто блокировка, используемая для реализации гарантированной исключительности. В частности, в каждый момент времени мьютексом может владеть только один объект. Если какой-то объект хочет получить мьютекс, который уже кто-то занял, он должен дождаться момента его освобождения. В ядре FreeBSD владельцами мьютексов являются процессы.
+
+Мьютексы могут быть затребованы рекурсивно, но предполагается, что они занимаются на короткое время. В частности, владельцу мьютекса нельзя выдерживать паузу. Если вам нужно выполнить блокировку на время паузы, используйте блокировку через man:lockmgr[9].
+
+Каждый мьютекс имеет несколько представляющих интерес характеристик:
+
+Имя переменной::
+Имя переменной [type]#struct mtx# в исходных текстах ядра.
+
+Логическое имя::
+Имя мьютекса, назначенное ему через `mtx_init`. Это имя выводится в сообщениях трассировки KTR и диагностических предупреждающих и ошибочных сообщениях и используется для идентификации мьютексов в отладочном коде.
+
+Тип::
+Тип мьютекса в терминах флагов [constant]#MTX_*#. Значение каждого флага связано с его смыслом так, как это описано в man:mutex[9].
+
+[constant]#MTX_DEF#:::
+Sleep-мьютекс
+
+[constant]#MTX_SPIN#:::
+Spin-мьютекс
+
+[constant]#MTX_RECURSE#:::
+Этому мьютексу разрешается блокировать рекурсивно.
+
+Защиты::
+Список структур данных или членов структур данных, которые защищает этот мьютекс. Для членов структур данных имя будет в форме . члена структуры/.
+
+Зависимые функции::
+Функции, которые можно вызвать, если этот мьютекс занят.
+
+.Список мьютексов
+[cols="15%,10%,10%,55%,20%", frame="all", options="header"]
+|===
+| Variable Name
+| Logical Name
+| Type
+| Protectees
+| Dependent Functions
+
+|sched_lock
+|"sched lock"
+|`MTX_SPIN` \| `MTX_RECURSE`
+|`_gmonparam`, `cnt.v_swtch`, `cp_time`, `curpriority`, `mtx`.`mtx_blocked`, `mtx`.`mtx_contested`, `proc`.`p_procq`, `proc`.`p_slpq`, `proc`.`p_sflag`, `proc`.`p_stat`, `proc`.`p_estcpu`, `proc`.`p_cpticks` `proc`.`p_pctcpu`, `proc`.`p_wchan`, `proc`.`p_wmesg`, `proc`.`p_swtime`, `proc`.`p_slptime`, `proc`.`p_runtime`, `proc`.`p_uu`, `proc`.`p_su`, `proc`.`p_iu`, `proc`.`p_uticks`, `proc`.`p_sticks`, `proc`.`p_iticks`, `proc`.`p_oncpu`, `proc`.`p_lastcpu`, `proc`.`p_rqindex`, `proc`.`p_heldmtx`, `proc`.`p_blocked`, `proc`.`p_mtxname`, `proc`.`p_contested`, `proc`.`p_priority`, `proc`.`p_usrpri`, `proc`.`p_nativepri`, `proc`.`p_nice`, `proc`.`p_rtprio`, `pscnt`, `slpque`, `itqueuebits`, `itqueues`, `rtqueuebits`, `rtqueues`, `queuebits`, `queues`, `idqueuebits`, `idqueues`, `switchtime`, `switchticks`
+|`setrunqueue`, `remrunqueue`, `mi_switch`, `chooseproc`, `schedclock`, `resetpriority`, `updatepri`, `maybe_resched`, `cpu_switch`, `cpu_throw`, `need_resched`, `resched_wanted`, `clear_resched`, `aston`, `astoff`, `astpending`, `calcru`, `proc_compare`
+
+|vm86pcb_lock
+|"vm86pcb lock"
+|`MTX_DEF`
+|`vm86pcb`
+|`vm86_bioscall`
+
+|Giant
+|"Giant"
+|`MTX_DEF` \| `MTX_RECURSE`
+|nearly everything
+|lots
+
+|callout_lock
+|"callout lock"
+|`MTX_SPIN` \| `MTX_RECURSE`
+|`callfree`, `callwheel`, `nextsoftcheck`, `proc`.`p_itcallout`, `proc`.`p_slpcallout`, `softticks`, `ticks`
+|
+|===
+
+[[locking-sx]]
+== Разделяемые эксклюзивные блокировки
+
+Эти блокировки обеспечивают базовый тип функциональности - на чтение/запись и могут поддерживаться процессами, находящимся в состоянии ожидания. На текущий момент они реализованы в man:lockmgr[9].
+
+.Список разделяемых эксклюзивных блокировок
+[cols="1,1", options="header"]
+|===
+| Имя переменной
+| Защиты
+
+|`allproc_lock`
+|`allproc` `zombproc` `pidhashtbl` `proc`.`p_list` `proc`.`p_hash` `nextpid`
+
+|`proctree_lock`
+|`proc`.`p_children` `proc`.`p_sibling`
+|===
+
+[[locking-atomic]]
+== Атомарно защищенные переменные
+
+Переменной, защищенной атомарно, является особая переменная, которая не защищается явной блокировкой. Вместо этого для доступа к данным переменных используются специальные атомарные операции, как описано в man:atomic[9]. Лишь несколько переменных используются таким образом, хотя другие примитивы синхронизации, такие как мьютексы, реализованы с атомарно защищенными переменными.
+
+* `mtx`.`mtx_lock`
diff --git a/documentation/content/ru/books/arch-handbook/sound/chapter.adoc b/documentation/content/ru/books/arch-handbook/sound/chapter.adoc
new file mode 100644
index 0000000000..bce3a61d3e
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/sound/chapter.adoc
@@ -0,0 +1,413 @@
+---
+title: Глава 15. Подсистема звука
+authors:
+---
+
+[[oss]]
+= Подсистема звука
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+
+[[oss-intro]]
+== Введение
+
+Перевод на русский язык: Виталий Богданов (mailto:gad@gad.glazov.net[gad@gad.glazov.net])
+
+В подсистеме звука FreeBSD существует чёткое разделение между частью, поддерживающей общие звуковые возможности и аппаратно зависимой частью. Данная особенность делает более простым добавление поддержки новых устройств.
+
+man:pcm[4] занимает центральное место в подсистеме звука. Его основными элементами являются:
+
+* Интерфейс системных вызовов (read, write, ioctls) к функциям оцифрованного звука и микшера. Командный набор ioctl совместим с интерфейсом _OSS_ или _Voxware_, позволяя тем самым портирование мультимедиа приложений без дополнительной модификации.
+* Общий код обработки звуковых данных (преобразования форматов, виртуальные каналы).
+* Единый программный интерфейс к аппаратно-зависимым модулям звукового интерфейса.
+* Дополнительная поддержка нескольких общих аппаратных интерфейсов (ac97) или разделяемого аппаратно-специфичного кода (например: функции ISA DMA).
+
+Поддержка отдельных звуковых карт осуществляется с помощью аппаратно-специфичных драйверов, обеспечивающих канальные и микшерные интерфейсы, включаемые в общий код.
+
+В этой главе термином мы будем называть центральную, общую часть звукового драйвера, как противопоставление аппаратно-специфичным модулям.
+
+Человек, решающий написать драйвер наверняка захочет использовать в качестве шаблона уже существующий код. Но, если звуковой код хорош и чист, он также в основном лишён комментариев. Этот документ - попытка рассмотрения базового интерфейса и попытка ответить на вопросы, возникшие при адаптировании существующего кода.
+
+Для старта с рабочего примера, вы можете найти шаблон драйвера, оснащенного комментариями на http://people.FreeBSD.org/\~cg/template.c[ http://people.FreeBSD.org/~cg/template.c]
+
+[[oss-files]]
+== Файлы
+
+Весь исходный код, на сегодняшний момент (FreeBSD 4.4), содержится в каталоге [.filename]#/usr/src/sys/dev/sound/#, за исключением публичных определений интерфейса ioctl, находящихся в [.filename]#/usr/src/sys/sys/soundcard.h#
+
+В подкаталоге [.filename]#pcm/# родительского каталога [.filename]#/usr/src/sys/dev/sound/# находится главный код, а в каталогах [.filename]#isa/# и [.filename]#pci/# содержатся драйвера для ISA и PCI карт.
+
+[[pcm-probe-and-attach]]
+== Обнаружение, подключение, и т.д.
+
+Обнаружение и подключение звуковых драйверов во многом схоже с драйвером любого другого устройства. За дополнительной информацией вы можете обратиться к главам <<isa-driver, ISA>> или <<pci,PCI>> данного руководства.
+
+Но всё же, звуковые драйвера немного отличаются:
+
+* Они объявляют сами себя, как устройства класса , с частной структурой устройства :
++
+[.programlisting]
+....
+ static driver_t xxx_driver = {
+ "pcm",
+ xxx_methods,
+ sizeof(struct snddev_info)
+ };
+
+ DRIVER_MODULE(snd_xxxpci, pci, xxx_driver, pcm_devclass, 0, 0);
+ MODULE_DEPEND(snd_xxxpci, snd_pcm, PCM_MINVER, PCM_PREFVER,PCM_MAXVER);
+....
++
+Большинство звуковых драйверов нуждаются в сохранении личной информации, касающейся их устройства. Структура с личными данными обычно выделяется при вызове функции attach. Её адрес передаётся посредством вызовов `pcm_register()` и `mixer_init()`. Позже передаёт назад этот адрес, в качестве параметра в вызовах к интерфейсам звукового драйвера.
+* Функция подключения звукового драйвера должна объявлять её микшерный или AC97 интерфейс посредством вызова `mixer_init()`. Для микшерного интерфейса это взамен вернёт вызов <<xxxmixer-init,`xxxmixer_init()`>>.
+* Функция подключения звукового драйвера передаёт общие настройки каналов посредством вызова `pcm_register(dev, sc, nplay, nrec)`, где `sc` - адрес структуры данных устройства, используемой в дальнейших вызовах от , а `nplay` и `nrec` - количество каналов проигрывания и записи.
+* Функция подключения звукового драйвера объявляет каждый из её каналов с помощью вызовов `pcm_addchan()`. Это установит занятость канала в и вызовет взамен вызов <<xxxchannel-init,`xxxchannel_init()`>>.
+* Функция отключения должна вызывать `pcm_unregister()` перед объявлением её ресурсов свободными.
+
+Существует два метода работы с не PnP устройствами:
+
+* Использование метода `device_identify()` (пример смотрите в: [.filename]#sound/isa/es1888.c#). `device_identify()` пытается обнаружить оборудование, использующее известные адреса, и если найдёт поддерживаемое устройство, то создаст новое pcm устройство, которое затем будет передано процессу обнаружения/подключения.
+* Использование выборочной конфигурации ядра с соответствующими хинтами для pcm устройств (пример: [.filename]#sound/isa/mss.c#).
+
+драйверы должны поддерживать `device_suspend`, `device_resume` и `device_shutdown` функции, для корректного функционирования управления питанием и процесса выгрузки модуля.
+
+[[oss-interfaces]]
+== Интерфейсы
+
+Интерфейс между и звуковыми драйверами определён в терминах <<kernel-objects,объектов ядра>>.
+
+Есть 2 основных интерфейса, которые обычно обеспечивает звуковой драйвер: _канальный_ и, либо _микшерный_ либо _AC97_.
+
+Интерфейс _AC97_ довольно мало использует доступ к ресурсам оборудования (чтение/запись регистров). Данный интерфейс реализован в драйверах для карт с кодеком AC97. В этом случае фактический микшерный интерфейс обеспечивается разделяемым кодом AC97 в .
+
+=== Канальный интерфейс
+
+==== Общие заметки о параметрах функций
+
+Звуковые драйверы обычно имеют структуру с личными данными для описания их устройства и по одной структуре на каждый поддерживаемый канал проигрывания или записи данных.
+
+Для всех функций канального интерфейса первый параметр - непрозрачный указатель.
+
+Второй параметр это указатель на структуру с данными канала. Исключение: У ``channel_init()`` это указатель на частную структуру устройства (данная функция возвращает указатель на канал для дальнейшего использования в ).
+
+==== Обзор операций передачи данных
+
+Для передачи данных, и звуковые драйвера используют разделяемую область памяти, описанную в .
+
+принадлежит , и звуковые драйверы получают нужные значения с помощью вызовов функций (`sndbuf_getxxx()`).
+
+Область разделяемой памяти имеет размер, определяемый с помощью `sndbuf_getsize()` и разделён на блоки фиксированного размера, определённого в `sndbuf_getblksz()` количества байт.
+
+При проигрывании, общий механизм передачи данных примерно следующий (обратный механизму, используемому при записи):
+
+* В начале, заполняет буфер, затем вызывает функцию звукового драйвера <<channel-trigger,``xxxchannel_trigger()``>> с параметром PCMTRIG_START.
+* Затем звуковой драйвер многократно передаёт всю область памяти (`sndbuf_getbuf()`, `sndbuf_getsize()`) устройству, с количеством байт, определённым в `sndbuf_getblksz()` . Взамен это вызовет `chn_intr()` функцию для каждого переданного блока (это обычно происходит во время прерывания).
+* `chn_intr()` копирует новые данные в область, которая была передана устройству (сейчас свободная) и вносит соответствующие изменения в структуру .
+
+[[xxxchannel-init]]
+=== channel_init
+
+`xxxchannel_init()` вызывается для инициализации каждого из каналов проигрывания или записи. Вызовы инициируются функцией подключения звукового драйвера. (Подробнее в главе <<pcm-probe-and-attach, Обнаружение и подключение>>).
+
+[.programlisting]
+....
+ static void *
+ xxxchannel_init(kobj_t obj, void *data,
+ struct snd_dbuf *b, struct pcm_channel *c, int dir)
+ {
+ struct xxx_info *sc = data;
+ struct xxx_chinfo *ch;
+ ...
+ return ch;
+ }
+
+ b - это адрес канальной
+ struct snd_dbuf. Она должна
+ быть инициализирована в функции посредством
+ вызова sndbuf_alloc(). Нормальный
+ размер буфера для использования - наименьшее кратное
+ размера передаваемого блока данных для вашего устройства.
+
+ c - это
+ указатель на структуру
+ контроля pcm канала. Это не прозрачный
+ объект. Функция должна хранить его в локальной структуре
+ канала, для дальнейшего использования в вызовах к
+ pcm (например в:
+ chn_intr(c)).
+
+ dir определяет для каких целей
+ используется канал
+ (PCMDIR_PLAY или
+ PCMDIR_REC).
+
+ Функция должна возвращать указатель на личную,
+ область, используемую для контроля этого
+ канала. Он будет передаваться в качестве параметра в
+ других вызовах канального интерфейса.
+
+ channel_setformat
+
+ xxxchannel_setformat() настраивает
+ устройство на конкретный канал определённого формата звука.
+
+ static int
+ xxxchannel_setformat(kobj_t obj, void *data, u_int32_t format)
+ {
+ struct xxx_chinfo *ch = data;
+ ...
+ return 0;
+ }
+
+ format используется, как
+ AFMT_XXX значение
+ (soundcard.h).
+
+ channel_setspeed
+
+ xxxchannel_setspeed() устанавливает
+ оборудование канала на определённую шаблонную скорость и возвращает
+ возможную корректирующую скорость.
+
+ static int
+ xxxchannel_setspeed(kobj_t obj, void *data, u_int32_t speed)
+ {
+ struct xxx_chinfo *ch = data;
+ ...
+ return speed;
+ }
+
+ channel_setblocksize
+
+ xxxchannel_setblocksize() устанавливает
+ размер передаваемого блока между
+ pcm и звуковым драйвером, и между
+ звуковым драйвером и устройством. Обычно это будет количество
+ переданных байт перед прерыванием. Во время трансфера звуковой
+ драйвер должен должен вызывать
+ pcm функцию chn_intr() каждый
+ раз при передаче блока данных такого размера.
+
+ Большинство звуковых драйверов только берут на заметку
+ размер блока для использования во время передачи данных.
+
+ static int
+ xxxchannel_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
+ {
+ struct xxx_chinfo *ch = data;
+ ...
+ return blocksize;
+ }
+
+ Функция возвращает возможно согласованный размер
+ блока. В случае, если размер блока действительно
+ изменился должен быть произведён вызов
+ sndbuf_resize() для корректирования
+ буфера.
+
+ channel_trigger
+
+ xxxchannel_trigger() вызывается
+ pcm для контроля над трансферными
+ операциями в драйвере.
+
+ static int
+ xxxchannel_trigger(kobj_t obj, void *data, int go)
+ {
+ struct xxx_chinfo *ch = data;
+ ...
+ return 0;
+ }
+
+ go определяет действие для
+ текущего вызова. Возможные значения:
+
+ PCMTRIG_START: драйвер
+ должен начать передачу данных из или в канальный
+ буфер. Буфер и его размер могут быть получены через
+ вызов sndbuf_getbuf() и
+ sndbuf_getsize().
+
+ PCMTRIG_EMLDMAWR /
+ PCMTRIG_EMLDMARD: говорит
+ драйверу, что входной или выходной буфер возможно
+ был обновлён. Большинство драйверов игнорируют
+ эти вызовы.
+
+ PCMTRIG_STOP /
+ PCMTRIG_ABORT: драйвер должен
+ остановить текущую передачу данных.
+
+ Если драйвер использует ISA DMA,
+ sndbuf_isadma() должна вызываться
+ перед выполнением действий над устройством, она также
+ позаботится о вещах со стороны DMA чипа.
+
+ channel_getptr
+
+ xxxchannel_getptr() возвращает
+ текущее смещение в передаваемом буфере. Обычно вызывается
+ в chn_intr(), и так
+ pcm узнаёт, где брать данные для
+ новой передачи.
+
+ channel_free
+
+ xxxchannel_free() вызывается для
+ освобождения ресурсов канала. Например: должна вызываться,
+ при выгрузке драйвера, если структуры данных канала
+ распределялись динамично или, если
+ sndbuf_alloc() не использовалась
+ для выделения памяти под буфер.
+
+ channel_getcaps
+
+ struct pcmchan_caps *
+ xxxchannel_getcaps(kobj_t obj, void *data)
+ {
+ return xxx_caps;
+ }
+
+ Подпрограмма возвращает указатель на (обычно
+ статически-определяемую) структуру
+ pcmchan_caps (описанную в
+ sound/pcm/channel.h. Структура содержит
+ данные о минимуме и максимуме шаблонных частот и
+ воспринимаемых звуковых форматах. Для примера смотрите
+ исходный код любого звукового драйвера.
+
+ Другие функции
+
+ channel_reset(),
+ channel_resetdone(), и
+ channel_notify() предназначены для
+ специальных целей и не должны употребляться в драйвере
+ без обсуждения с авторами ({cg}).
+
+ channel_setdir() is deprecated.
+
+ Микшерный интерфейс
+
+ mixer_init
+
+ xxxmixer_init() инициализирует
+ оборудование и говорит pcm какие микшерные
+ устройства доступны для проигрывания и записи
+
+ static int
+ xxxmixer_init(struct snd_mixer *m)
+ {
+ struct xxx_info *sc = mix_getdevinfo(m);
+ u_int32_t v;
+
+ [Initialize hardware]
+
+ [Set appropriate bits in v for play mixers]
+ mix_setdevs(m, v);
+ [Set appropriate bits in v for record mixers]
+ mix_setrecdevs(m, v)
+
+ return 0;
+ }
+
+ Устанавливает биты в целом значении и вызывает
+ mix_setdevs() и
+ mix_setrecdevs() чтобы сообщить
+ pcm какие устройства существуют.
+
+ Определения битов микшера могут быть найдены в
+ soundcard.h
+ (SOUND_MASK_XXX значения и
+ SOUND_MIXER_XXX битовые сдвиги).
+
+ mixer_set
+
+ xxxmixer_set() устанавливает уровень
+ громкости для одного микшерного устройства.
+
+ static int
+ xxxmixer_set(struct snd_mixer *m, unsigned dev,
+ unsigned left, unsigned right)
+ {
+ struct sc_info *sc = mix_getdevinfo(m);
+ [set volume level]
+ return left | (right 8);
+ }
+
+ Устройство определяется, как SOUND_MIXER_XXX
+ значение Допустимые значения уровней громкости лежат
+ в пределах [0-100]. Равное нулю значение должно выключать звук
+ устройства.
+
+ Вероятно уровни оборудования не будут совпадать с
+ входной шкалой, и будет происходить некоторое округление, подпрограмма
+ будет возвращает точные значения (в промежутке 0-100), как уже
+ было сказано.
+
+ mixer_setrecsrc
+
+ xxxmixer_setrecsrc() устанавливает
+ исходное записывающее устройство.
+
+ static int
+ xxxmixer_setrecsrc(struct snd_mixer *m, u_int32_t src)
+ {
+ struct xxx_info *sc = mix_getdevinfo(m);
+
+ [look for non zero bit(s) in src, set up hardware]
+
+ [update src to reflect actual action]
+ return src;
+ }
+
+ Желаемые записывающие устройства указываются в битовом поле
+
+ Возвращается фактический набор устройств для записи.
+ Некоторые драйверы могут устанавливать только одно устройство для
+ записи. Функция должна возвращать -1, в случае возникновения
+ ошибки.
+
+ mixer_uninit, mixer_reinit
+
+ xxxmixer_uninit() должна проверить,
+ что все звуки выключены (mute), и, если возможно выключить
+ оборудование микшера
+
+ xxxmixer_reinit() должна удостовериться,
+ что оборудование микшера включено и все установки, неконтролируемые
+ mixer_set() или
+ mixer_setrecsrc() восстановлены.
+
+ Интерфейс AC97
+
+ AC97
+
+ Поддержка интерфейса AC97 осуществляется
+ драйверами с кодеком AC97. Он поддерживает только три метода:
+
+ xxxac97_init() возвращает
+ количество найденных ac97 кодеков.
+
+ ac97_read() и
+ ac97_write() читают или записывают
+ данные определенного регистра.
+
+ Интерфейс AC97 используется кодом
+ AC97 в pcm для выполнения операций
+ более высокого уровня. За примером обращайтесь к
+ sound/pci/maestro3.c или к другим
+ файлам из каталога sound/pci/.
+....
diff --git a/documentation/content/ru/books/books.adoc b/documentation/content/ru/books/books.adoc
new file mode 100644
index 0000000000..089c1cae96
--- /dev/null
+++ b/documentation/content/ru/books/books.adoc
@@ -0,0 +1,4 @@
+handbook
+design-44bsd
+faq
+porters-handbook
diff --git a/documentation/content/ru/books/design-44bsd/_index.adoc b/documentation/content/ru/books/design-44bsd/_index.adoc
new file mode 100644
index 0000000000..40d9ee8b05
--- /dev/null
+++ b/documentation/content/ru/books/design-44bsd/_index.adoc
@@ -0,0 +1,604 @@
+---
+title: Архитектура и реализация операционной системы 4.4BSD
+authors:
+ - author: Marshall Kirk McKusick
+ - author: Keith Bostic
+ - author: Michael J. Karels
+ - author: John S. Quarterman
+copyright: 1996 Addison-Wesley Longman, Inc
+releaseinfo: "$FreeBSD$"
+trademarks: ["design-44bsd"]
+---
+
+= Архитектура и реализация операционной системы 4.4BSD
+:doctype: book
+:toc: macro
+:toclevels: 2
+:icons: font
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnums:
+:sectnumlevels: 6
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:sectnumoffset: 2
+
+ifeval::["{backend}" == "html5"]
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+:imagesdir: ../../../images/books/design-44bsd/
+:chapters-path: content/ru/books/design-44bsd/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+include::../../../../shared/mirrors.adoc[]
+include::../../../../shared/authors.adoc[]
+include::../../../../shared/releases.adoc[]
+include::../../../../shared/ru/mailing-lists.adoc[]
+include::../../../../shared/ru/teams.adoc[]
+include::../../../../shared/ru/urls.adoc[]
+:imagesdir: ../../../static/images/books/design-44bsd/
+:chapters-path:
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+include::../../../../shared/mirrors.adoc[]
+include::../../../../shared/authors.adoc[]
+include::../../../../shared/releases.adoc[]
+include::../../../../shared/ru/mailing-lists.adoc[]
+include::../../../../shared/ru/teams.adoc[]
+include::../../../../shared/ru/urls.adoc[]
+:imagesdir: ../../../static/images/books/design-44bsd/
+:chapters-path:
+endif::[]
+
+'''
+
+toc::[]
+
+include::{chapters-path}toc-figures.adoc[]
+
+include::{chapters-path}toc-tables.adoc[]
+
+[[overview]]
+== Обзор архитектуры 4.4BSD
+
+[[overview-facilities]]
+=== Системные сервисы 4.4BSD и ядро
+
+Ядро 4.4BSD предоставляет четыре основных системных сервиса: процессы, файловую систему, коммуникации и запуск системы. Этот раздел перечисляет, в каком месте этой книги описана каждая из этих служб.
+
+. Процессы образуют поток управления в адресном пространстве. Механизмы создания, завершения и другие управляющие процессы описаны в Главе 4. Для каждого процесса система мультиплексирует отдельное виртуальное адресное пространство; такое управление памятью обсуждается в Главе 5.
+. Механизм доступа пользователя к файловой системе и устройствам один и тот же; общие аспекты обсуждаются в Главе 6. Файловая система является набором именованных файлов, организованных в древовидную иерархию каталогов, а операции по управлению ими представлены в Главе 7. Файлы располагаются на таких физических носителях, как диски. 4.4BSD поддерживает несколько типов организации данных на диске, как описано далее в Главе 8. Доступ к файлам на удаленных машинах является предметом обсуждения в Главе 9. Для доступа к системе Терминалы используются терминалы; их функционированию посвящена глава 10.
+. Механизмы коммуникаций, предоставляемые традиционными UNIX-системами, включают однонаправленные потоки байтов между связанными процессами (смотрите материал о конвейерах в Разделе 11.1) и извещение об исключительных событиях (смотрите материал о сигналах в Разделе 4.7). В 4.4BSD имеется также механизм межпроцессного взаимодействия между процессами. Этот механизм, описываемый в Главе 11, использует способы доступа, отличающиеся от тех, что используются в файловой системе, но, как только соединение установлено, процесс может работать с ним, как будто это конвейер. Имеется и механизм работы с сетью, описываемый в Главе 12, который обычно используется как слой ниже механизма IPC. В Главе 13 дается детальное описание конкретной реализации механизма работы с сетью.
+. В любой операционной системе присутствуют вопросы управления, такие, как ее запуск. Запуск и вопросы управления обсуждаются в Главе 14.
+
+Разделы с 2.3 по 2.14 представляют собой вводный материал, относящийся к главам с 3 по 14. Мы определим понятия, коснемся основных системных вызовов и рассмотрим исторические разработки. Наконец, мы расскажем о причинах многих ключевых архитектурных решений.
+
+==== Ядро
+
+_Ядро_ является частью системы, которая работает в защищенном режиме и управляет доступом всех пользовательских программ к низкоуровнему аппаратному обеспечению (к примеру, ЦПУ, дискам, терминалам, сетевым связям) и программным компонентам (к примеру, файловой системе, сетевым протоколам). Ядро предоставляет основные системные услуги; оно создает процессы и управляет ими, предоставляет функции для доступа к файловой системе и службам связи. Такие функции, называемые _системными вызовами_, доступны процессам пользователей в виде библиотечных подпрограмм. Эти системные вызовы являются единственным способом доступа к таким услугам. Подробно механизм работы системных вызовов дается в Главе 3, вместе с описанием некоторых механизмов ядра, работа которых не является прямым результатом процесса, выполняющего системный вызов.
+
+_Ядро_, по традиционной терминологии операционных систем, является маленьким куском программного обеспечения, которое предоставляет только минимальный набор услуг, необходимый для реализации дополнительных служб операционной системы. В современных исследовательских операционных системах - таких, как Chorus <<biblio-rozier, [Rozier et al, 1988]>>, Mach <<biblio-accetta, [Accetta et al, 1986]>>, Tunis <<biblio-ewens, [Ewens et al, 1985]>>, и V Kernel <<biblio-cheriton, [Cheriton, 1988]>> - такое разделение функциональности выполнено не только логически. Такие службы, как файловые системы и сетевые протоколы, выполнены в виде прикладных процессов клиентов ядра или микроядра.
+
+Ядро 4.4BSD не разбивается на несколько процессов. Это основополагающее архитектурное решение было сделано в самых ранних версиях UNIX. В первых двух реализациях Кена Томпсона (Ken Thompson) не было отображаемой памяти, и поэтому не было аппаратного различия между адресным пространством пользователя и ядра <<biblio-ritchie, [Ritchie, 1988]>>. Могла бы быть придумана система обмена сообщениями как реально реализуемая модель процессов ядра и пользователя. Для простоты и увеличения производительности было выбрано монолитное ядро. К тому же ранние ядра были маленькими; включение таких служб, как сетевые коммуникации, в ядро увеличило его размер. Современные тенденции в области операционных систем сводятся к уменьшению размера ядра за счет перевода таких служб в пользовательское адресное пространство.
+
+Пользователи обычно общаются с системой через интерпретатор языка команд, называемый оболочкой (_shell_), и, может быть, через дополнительные прикладные пользовательские программы. Такие программы и оболочка реализованы в виде процессов. Подробное описание таких программ выходит за рамки этой книги, которая практически полностью посвящена работе ядра.
+
+В разделах 2.3 и 2.4 описываются сервисы, предоставляемые ядром 4.4BSD, и дается обзор их архитектуры. Последующие главы описывают подробности архитектуры и реализации этих сервисов в 4.4BSD.
+
+[[overview-kernel-organization]]
+=== Организация ядра
+
+В этом разделе мы рассматриваем организацию ядра 4.4BSD с двух точек зрения:
+
+. Как статический блок программного обеспечения, категоризуемый по функциональности модулей, составляющих ядро
+. В его динамике, категоризуемой по услугам, предоставляемым пользователям
+
+Самая большая часть ядра реализует системные услуги, к которым приложения обращаются через системные вызовы. В 4.4BSD это программное обеспечение организуется по следующим принципам:
+
+* Базовые услуги ядра: обработка таймеров и системного таймера, управление дескрипторами и процессами
+* Поддержка управления памятью: подкачка и выгрузка
+* Общесистемные интерфейсы: ввод/вывод, управление и мультиплексирование операций, выполняемых над дескрипторами
+* Файловая система: файлы, каталоги, преобразование маршрутов, блокировка файлов и управление буфером ввода/вывода
+* Поддержка работы с терминалами: драйвер терминального интерфейса и режимы работы терминального канала
+* Службы межпроцессного взаимодействия: сокеты
+* Поддержка сетевых коммуникаций: коммуникационные протоколы и общесетевые службы, такие, как маршрутизация
+
+[[table-mach-indep]]
+.Машинно-независимое программное обеспечение в ядре 4.4BSD
+[cols="1,1,1", frame="none", options="header,footer"]
+|===
+| Категория
+| Количество строк кода
+| Процент от всего ядра
+
+|файлы заголовков
+|9,393
+|4.6
+
+|инициализация
+|1,107
+|0.6
+
+|службы ядра
+|8,793
+|4.4
+
+|общесистемные интерфейсы
+|4,782
+|2.4
+
+|межпроцессное взаимодействие
+|4,540
+|2.2
+
+|работа с терминалами
+|3,911
+|1.9
+
+|виртуальная память
+|11,813
+|5.8
+
+|управление vnode
+|7,954
+|3.9
+
+|именование файловой системы
+|6,550
+|3.2
+
+|хранение файлов
+|4,365
+|2.2
+
+|хранение log-структур
+|4,337
+|2.1
+
+|хранение на основе памяти
+|645
+|0.3
+
+|файловая система cd9660
+|4,177
+|2.1
+
+|различные файловые системы (10)
+|12,695
+|6.3
+
+|сетевая файловая система
+|17,199
+|8.5
+
+|сетевое взаимодействие
+|8,630
+|4.3
+
+|протоколы internet
+|11,984
+|5.9
+
+|протоколы ISO
+|23,924
+|11.8
+
+|протоколы X.25
+|10,626
+|5.3
+
+|протоколы XNS
+|5,192
+|2.6
+| всего машинно-независимая часть
+| 162,617
+| 80.4
+|===
+
+Большая часть программного обеспечения в этих категориях является машинно-независимой и переносима между различными аппаратными архитектурами.
+
+Машинно-зависимые аспекты ядра отделены от основного кода. В частности, ни в одной части машинно-независимого кода не содержится кода, зависимого от конкретной архитектуры. Когда требуется произвести действия, зависимые от архитектуры, машинно-независимый код вызывает функцию, зависимую от архитектуры машины, которая находится в машинно-зависимой части кода. Машинно-зависимое программное обеспечение включает в себя
+
+* Низкоуровневые действия по запуску системы
+* Обработка исключительных ситуаций и прерываний
+* Низкоуровневые манипуляции процессом во время работы
+* Конфигурация и инициализация аппаратных устройств
+* Поддержка устройств ввода/вывода во время работы
+
+[[table-mach-dep]]
+.Машинно-зависимое программное обеспечение для HP300 в ядре 4.4BSD
+[cols="1,1,1", frame="none", options="header,footer"]
+|===
+| Категория
+| Количество строк кода
+| Процент от всего ядра
+
+|машинно-зависимые заголовки
+|1,562
+|0.8
+
+|заголовки драйверов устройств
+|3,495
+|1.7
+
+|исходные тексты драйверов устройств
+|17,506
+|8.7
+
+|виртуальная память
+|3,087
+|1.5
+
+|остальная машинно-зависимая часть
+|6,287
+|3.1
+
+|процедуры на ассемблере
+|3,014
+|1.5
+
+|совместимость с HP/UX
+|4,683
+|2.3
+| всего машинно-зависимая часть
+| 39,634
+| 19.6
+|===
+
+<<table-mach-indep>> суммаризует машинно-независимый код, который составляет ядро 4.4BSD для HP300. Числа во второй колонке обозначают количество строк исходного кода на языке C, заголовочных файлов и ассемблерного кода. Практически весь код ядра написан на языке программирования C; менее двух процентов написано на языке ассемблера. Как показывает статистика в <<table-mach-dep>>, машинно-зависимый код, не включающий поддержку HP/UX и устройств, составляет менее 6.9 процента ядра.
+
+Лишь малая часть ядра отвечает за инициализацию системы. Этот код используется при _начальной загрузке_ системы для перехода в рабочий режим и отвечает за настройку аппаратного и программного окружения ядра (обратитесь к Главе 14). Некоторые операционные системы (особенно те, что ограничены объемом физической памяти) выполняют действия по выгрузке или _перекрытию_ программного кода, выполняющего эти функции, после окончания его работы. Ядро 4.4BSD не работает повторно с памятью, использованной начальным кодом, потому что этот объем памяти составляет менее 0.5 процентов ресурсов ядра, используемых на типичной машине. Также начальный код не находится только в одном месте ядра - он рассредоточен везде, и обычно появляется там, где логически связан с объектом инициализации.
+
+[[overview-kernel-service]]
+=== Службы ядра
+
+Разграничение между кодом уровней ядра и пользователя обеспечивается аппаратными методами, предоставляемыми оборудованием. Ядро работает в отдельном адресном пространстве, которое недоступно процессам пользователя. Привилегированные операции - такие, как осуществление ввода/вывода и остановка модуля центрального процессора (CPU) - доступны только ядру. Приложения делают запросы ядру на доступ к его сервисам при помощи _системных вызовов_. Системные вызовы используются для указания ядру на выполнение как сложных операций, таких, как запись данных во вторичный носитель, так и простых, таких, как получение текущего времени. Все системные вызовы выполняются _синхронно_ с приложением: Приложение не будет продолжать работу, пока ядро не выполнит действия, соответствующие системному вызову. Ядро может завершить некоторые операции, связанные с системным вызовом, после его окончания. Например, системный вызов _write_ будет копировать записываемые данные от пользовательского процесса в буфер ядра, пока процесс находится в ожидании, но, как правило, будет немедленно завершаться до того, как буфер ядра реально будет записан на диск.
+
+Системный вызов обычно реализуется как аппаратное прерывание, которое изменяет режим работы CPU и текущее отображение адресного пространства. Параметры, передаваемые пользователями системным вызовам, перед использованием проверяются ядром. Такая проверка обеспечивает целостность системы. Все параметры, передаваемые в ядро, копируются в адресное пространство ядра, для того, чтобы проверенные параметры не могли быть изменены в результате побочного действия системного вызова. Результаты выполнения системного вызова возвращаются ядром либо в аппаратных регистрах, либо копированием их значений в области памяти, указанные пользователем. Как и параметры, переданные в ядро, адреса, используемые для возвращения результатов, должны быть проверены на то, что они являются частью адресного пространства приложения. Если при обработке системного вызова ядром возникает ошибка, код ошибки возвращается пользователю. В случае языка программирования C код этой ошибки сохраняется в глобальной переменной _errno_, а функция, соответствующая системному вызову, возвращает в качестве результата значение -1.
+
+Пользовательские приложения и ядро работают независимо друг от друга. 4.4BSD не хранит управляющие блоки ввода/вывода и другие связанные с операционной системой структуры данных в адресном пространстве приложения. Каждому пользовательскому приложению предоставляется независимое адресное пространство, в котором оно и выполняется. Ядро выполняет большинство управляющих действий, таких, как приостановка процесса на время выполнения другого, незаметно для участвующих процессов.
+
+[[overview-process-management]]
+=== Управление процессами
+
+4.4BSD поддерживает многозадачность. Каждая задача или выполняющийся поток называется _процессом_. _Контекст_ процесса 4.4BSD состоит из состояния пользовательского уровня, включая содержимое его адресного пространства и окружения времени выполнения, и состояния уровня ядра, в который включаются параметры планировщика задач, управляющие ресурсы и идентифицирующая информация. В контекст включается все, что используется ядром при предоставлении своих сервисов процессу. Пользователи могут создавать процессы, управлять их выполнением и получать уведомления при изменении состояния выполнения процессов. Каждому процессу назначается уникальное число, называемое _идентификатором процесса_ (PID). Это число используется ядром для идентификации процесса при сообщении пользователю об изменении его состояния, и пользователем для указания процесса в системном вызове.
+
+Ядро создает процесс, дублируя контекст другого процесса. Новый процесс считается _порожденным процессом_ исходного _родительского процесса_. Контекст, копируемый в ходе создания процесса, включает как состояние выполнения процесса уровня пользователя, так и системное состояние процесса, управляемое ядром. Важные компоненты состояния ядра описаны в Главе 4.
+
+[[fig-process-lifecycle]]
+.Жизненный цикл процесса
+image::fig1.png[Системные вызовы управления процессами]
+
+Жизненный цикл процесса изображен на <<fig-process-lifecycle>>. Процесс может создать новый процесс, который является копией исходного процесса с помощью системного вызова _fork_. Возврат из вызова _fork_ происходит два раза: один раз в родительском процессе, в котором возвращаемое значение является идентификатором порожденного процесса, и второй раз в порожденном процессе, в котором возвращаемое значение равно 0. Связь родитель-потомок порождает иерархическую структуру процессов в системе. Новый процесс имеет доступ ко всем ресурсам его родителя, таким, как файловые дескрипторы, состояние обработки сигналов и распределение памяти.
+
+Хотя есть ситуации, когда процесс должен быть копией своего родителя, наиболее типичным и полезным действием является загрузка и выполнение другой программы. Процесс может заместить себя образом памяти другой программы, передавая вновь созданному образу набор параметров, при помощи системного вызова _execve_. Одним из параметров является имя файла, содержимое которого имеет формате, распознаваемый системой - это либо двоичный выполняемый файл, либо файл, который приводит к запуску указанной программы интерпретации для обработки его содержимого.
+
+Процесс может завершить работу, выполнив системный вызов _exit_, посылающий 8-битовое значение состояния завершения своему родителю. Если процесс хочет передать родительскому процессу информацию, превышающую один байт, он должен либо создать канал межпроцессных коммуникаций при помощи конвейеров или сокетов, или при помощи промежуточного файла. Коммуникации между процессами подробно обсуждаются в Главе 11.
+
+Процесс может приостановить выполнение до тех пор, пока не завершит работу любой из порожденных им процессов, при помощи системного вызова _wait_, который возвращает PID и статус завершения выполненного дочернего процесса. Родительский процесс может быть настроен на получение сигнала в случае, когда порожденный процесс завершает работу или аварийно прекращает выполнение. При помощи системного вызова _wait4_ родитель может получить информацию о событии, приведшем к завершению порожденного процесса и о ресурсах, использованных процессом за время его работы. Если процесс становится сиротой из-за того, что процесс, его породивший, завершил работу до окончания работы потомка, то ядро перенаправляет состояние завершения порожденного процесса особому системному процессу _init_: обратитесь к разделам 3.1 и 14.6).
+
+Подробное описание того, как ядро создает и уничтожает процессы, дается в Главе 5.
+
+Планирование выполнения процессов осуществляется согласно параметру _приоритетности процесса_. Этот приоритет управляется алгоритмом планирования задач в ядре. Пользователи могут влиять на выполнение процесса, задавая этот параметр (_nice_), который влияет на суммарный приоритет, но но ограничен использованием ресурсов CPU согласно алгоритму планировщика задач ядра.
+
+==== Сигналы
+
+В системе определен набор _сигналов_, которые могут быть отправлены процессу. Сигналы в 4.4BSD сделаны по образу аппаратных прерываний. Процесс может определить пользовательскую подпрограмму, которая будет являться _обработчиком_, и которой должен будет перенаправляться сигнал. Когда сигнал генерируется, он блокируется от повторного появления до тех пор, пока не будет _перехвачен_ обработчиком. Перехват сигнала включает в себя сохранение контекста текущего процесса и построение нового, в котором запускается обработчик. Затем сигнал направляется обработчику, который может либо прервать процесс, либо передать управление обратно выполняемому процессу (может быть, после установки значения глобальной переменной). Если обработчик возвратил управление, сигнал разблокировывается и может быть сгенерирован (и получен) снова.
+
+Либо процесс может определить, что сигнал будет _игнорироваться_ или будет выполняться действие по умолчанию, определяемое ядром. Действием по умолчанию для некоторых сигналов является прекращение процесса. Это завершение работы может сопровождаться созданием _файла дампа_, содержащего текущий образ памяти процесса для использования в последующей отладке.
+
+Некоторые сигналы не могут быть перехвачены или проигнорированы. К таким сигналам относятся _SIGKILL_, прерывающий неуправляемый процесс, и сигнал управления заданиями _SIGSTOP_.
+
+Процесс может выбрать получение сигналов в специальный стек для выполнения хитроумных программных манипуляций стеком. Например, подпрограммам поддержки языка нужно иметь стек для каждой подпрограммы. Система времени выполнения языка может выделять эти стеки, разделяя единственный стек, предоставляемый в 4.4BSD. Если ядро не поддерживает отдельный стек сигналов, то пространство, выделяемое каждой подпрограмме, должно быть расширено на объем, требуемый для перехвата сигнала.
+
+Все сигналы имеют один и тот же _приоритет_. Если обработки ожидают несколько сигналов, то порядок их направления процессу зависит от реализации. Обработчики сигналов, выполняемые по сигналу, который их вызвал, блокируются, но при этом могут быть сгенерированы дополнительные сигналы. Имеется механизм, позволяющий защитить критический участок кода от появления заданных сигналов.
+
+Подробное описание архитектуры и реализации механизма сигналов дается в Разделе 4.7.
+
+==== Группы управления и сеансы
+
+Процессы организованы в _группы управления_. Группы управления используются для управления доступом к терминалам и для обеспечения передачи сигналов наборам связанных процессов. Процесс наследует группу управления от своего родительского процесса. Ядром обеспечиваются механизмы, позволяющие процессу изменять свою группу управления или группу управления своих наследников. Создание новой группы управления просто; значение, соответствующее новой группе управления, обычно является идентификатором создающего ее процесса.
+
+Группу процессов в группе управления иногда называют _заданием_ и оно управляется высокоуровневым системным программным обеспечением, таким, как командный процессор. Типичным примером задания, созданного командным процессором, является _конвейер_ из нескольких связанных процессов, так что выходной поток первого процесса является входным потоком для второго, выходной поток второго процесса является входным потоком для третьего, и так далее. Командный процессор создает такое задание, порождая процесс для каждого участка конвейера, а затем помещая все эти процессы в отдельную группу обработки.
+
+Пользовательский процесс может послать сигнал как всем процессам в группе управления, так и конкретному процессу. Процесс в заданной группе управления может получать программные прерывания, отражающиеся на группе, приводящие к приостановке или продолжению выполнения, или к прерыванию или завершению работы.
+
+Терминалу ставится в соответствие идентификатор группы управления. Этот идентификатор обычно равен идентификатору группы управления, соответствующей терминалу. Управляющий заданиями командный процессор может создать несколько групп управления, связанных с одним и тем же терминалом; терминал является _управляющим терминалом_ для каждого процесса в этих группах. Процесс может выполнять чтение из дескриптора своего управляющего терминала, если только идентификатор группы управления соответствует идентификатору группы этого процесса. Если идентификаторы не совпадают, процесс будет блокирован при попытке чтения с терминала. Изменяя идентификатор группы управления терминала, командный процессор может распределять терминал между несколькими различными заданиями. Такое распределение называется _управлением заданиями_ и описывается вместе с группами управления в Разделе 4.8.
+
+Так же, как и наборы связанных процессов могут объединяться в группы управления, набор групп управления может быть объединен в _сеанс_. Основное назначение сеансов заключается создании изолированного окружения для процесса-даемона и порожденных им процессов, а также для объединения начального командного процессора пользователя и заданий, которые он порождает.
+
+[[overview-memory-management]]
+=== Управление памятью
+
+Каждый процесс имеет собственное адресное пространство. Адресное пространство изначально разделяется на три логических сегмента: _код_, _данные_ и _стек_. Сегмент кода доступен только для чтения и содержит машинные коды программы. Сегменты данных и стека оба доступны как для чтения, так и для записи. Сегмент данных содержит как инициализированные, так и неинициализированные области данных программы, когда как стековый сегмент представляет собой стек программы на этапе выполнения. На большинстве машин сегмент стека автоматически расширяется ядром в процессе работы программы. Процесс может расширять или уменьшать свой сегмент данных, выполняя системный вызов, когда как размер сегмента кода процесс может изменить только когда содержимое сегмента перекрывается данными файловой системы или в процессе отладки. Начальное содержимое сегментов порожденного процесса копируется из сегментов родительского процесса.
+
+Для выполнения процесса вовсе не обязательно постоянно хранить в памяти полное содержимое его адресного пространства. Если процесс обращается к области адресного пространства, которая не присутствует в оперативной памяти, то система _подгружает страницу_ с необходимой информацией в память. Когда возникает нехватка системных ресурсов, то система использует двухуровневый подход к управлению имеющимися ресурсами. Если не хватает памяти, то система будет забирать ресурсы памяти от процессов, если они давно не использовались. Если ресурсов не хватает очень сильно, то система будет прибегать к _выгрузке_ всего контекста процесса во вторичную подсистему хранения данных. _Постраничная подгрузка по требованию_ и _выгрузка_ выполняются системой абсолютно незаметно для процессов. Процесс может, однако, указать системе объем памяти, который будет использоваться, в качестве помощи.
+
+==== Решения BSD по архитектуре управления памятью
+
+В 4.2BSD требовалось реализовать поддержку больших несвязанных адресных пространств, отображаемых в память файлов и совместно используемой памяти. Был спроектирован интерфейс, который назвали _mmap_, позволяющий несвязанным процессам запрашивать отображение в их адресное пространство файла в режиме совместного использования. Если несколько процессов отображают в свое адресное пространство один и тот же файл, то изменение адресного пространства процесса, соответствующего файлу, в одном процессе, будет отображено в области отображения этого файла в другом процессе, а также и в самом файле. Однако в конце концов 4.2BSD была выпущена без интерфейса _mmap_ из-за необходимости сделать в первую очередь другие возможности, такие, как работа с сетью.
+
+Затем разработка интерфейса _mmap_ продолжалась во время работы над 4.3BSD. Более 40 компаний и исследовательских групп принимали участие в обсуждениях, которые привели к появлению обновленной концепции, описанной в Berkeley Software Architecture Manual <<biblio-mckusick-1, [McKusick et al, 1994]>>. Несколько компаний реализовали этот обновленный интерфейс <<biblio-gingell, [Gingell et al, 1987]>>.
+
+И снова сроки разработки не позволили включить в 4.3BSD реализацию этого интерфейса. Хотя позже она могла быть встроена в имеющуюся подсистему виртуальной памяти 4.3BSD, разработчики решили не включать ее сюда. потому что этой реализации было уже более 10 лет. Более того, оригинальная архитектура виртуальной памяти была основана на предположении, что компьютерная память мала и дорога, а диски подключены непосредственно к компьютеру, быстры и дешевы. Поэтому подсистема виртуальной памяти была разработана с упором на бережное использование памяти ценой более частых обращений к диску. Вдобавок реализация в 4.3BSD была пронизана зависимостями от аппаратной системы управления памятью машин VAX, что препятствовало ее переносу на другие аппаратные платформы. И наконец, подсистема виртуальной памяти не была предназначена для поддержки связных многопроцессорных систем, которые сейчас становятся все более распространенными и необходимыми.
+
+Попытки постепенно усовершенствовать старую реализацию заведомо были обречены на неудачу. Полностью новая архитектура, с другой стороны, могла бы использовать большие объемы памяти, уменьшить дисковые операции и обеспечивать работу с несколькими процессорами. Наконец, система виртуальной памяти в 4.4BSD была полностью изменена. Система виртуальной памяти 4.4BSD основана на системе виртуальной памяти (VM) Mach 2.0 <<biblio-tevanian, [Tevanian, 1987]>> с заимствованиями из Mach 2.5 и Mach 3.0. В ней была эффективная поддержка совместного использования, полное разделение машинно-зависимой и машинно-независимой частей, а также (сейчас не используемая) поддержка работы с несколькими процессорами. Процессы могут отображать файлы в любую область своего адресного пространства. Они могут совместно использовать части своих адресных пространств посредством отображения в память одного и того же файла. Изменения, сделанные одним процессом, видны в адресном пространстве другого процесса, а также записываются и в сам файл. Процессы могут также запрашивать эксклюзивное отображение файла в память, при котором любые изменения, сделанные процессом, не видны другим процессам, которые отображают файл в память и не записываются обратно в файл.
+
+Еще одной проблемой с системой виртуальной памяти является способ, которым информация передается ядру при выполнении системного вызова. 4.4BSD всегда копирует данные из адресного пространства процесса в буфер ядра. Для операций чтения и записи, при которых передаются большие объемы данных, выполнение копирования может оказаться занимающим время процессом. Альтернативным способом является манипуляции с адресным пространством процесса в ядре. Ядро 4.4BSD всегда копирует данные о нескольким причинам:
+
+* Зачастую пользовательские данные не выравнены по границе страницы памяти и их объем не кратен размеру аппаратной страницы памяти.
+* Если страница памяти забирается от процесса, он не может больше ссылаться на эту страницу. Некоторые программы зависят от данных, остающихся в буфере, даже после записи этих данных.
+* Если процесс позволяет хранить копию страницы памяти (как это делается в существующей 4.4BSD), то страница должна иметь атрибут _копирования-при-записи_. Такая страница является одной из таковых, что защищается от записи при помощи атрибута только-для-чтения. Если процесс пытается модифицировать страницу памяти, в ядре возникает ситуация ошибки записи. После этого ядро делает копию страницы, которую процесс может изменять. К несчастью, большинство процессов будет немедленно пытаться записать новые данные в свой буфер вывода, что приводит в любом случае к копированию данных.
+* Когда страницы переносятся в новые адреса виртуальной памяти, большинство аппаратных менеджеров памяти требуют, чтобы кэш аппаратного переназначения адресов был выборочно очищен. Очистка кэша зачастую выполняется медленно. В итоге получается, что переназначение адресов оказывается медленнее, чем копирование блоков данных, не превышающих 4 или 8 килобайт.
+
+Больше всего отображение памяти нужно для работы к большими файлами и передачи больших объемов данных между процессами. Интерфейс _mmap_ дает методы для выполнения обеих этих операций без копирования.
+
+==== Управление памятью внутри ядра
+
+Ядро часто выполняет выделение памяти, которое нужно только для выполнения единственного системного вызова. В пользовательском процессе такая кратковременно используемая память будет выделяться в стеке во время выполнения. Так как ядро имеет ограниченный объем стека времени выполнения, то неэффективно выделять в нем даже блоки памяти среднего размера. Таким образом, такая память должна выделяться посредством более гибкого механизма. Например, когда системный вызов должен преобразовать имя каталога, он должен выделить буфер размером 1 Кбайт для хранения имени. Другие блоки памяти должны выделяться на более продолжительный срок, чем один системный вызов, и поэтому не могут выделяться в стеке, даже если там есть место. В качестве примера можно взять блоки управления протоколами, которые существуют на всем протяжении сетевого соединения.
+
+Необходимость в динамическом выделении памяти в ядре становилась все более острой вместе с добавлением количества сервисов. Общий механизм выделения памяти уменьшает сложность написания кода в ядре. Поэтому в 4.4BSD ядро имеет единый механизм выделения памяти, который может использоваться в любой части системы. У него есть интерфейс, похожий на функции библиотеки языка C _malloc_ и _free_, которые обеспечивают выделение памяти в прикладных программах <<biblio-mckusick-2, [McKusick & Karels, 1988]>>. Как интерфейс библиотеки языка C, функция выделения памяти получает параметр, указывающий на размер памяти, который необходим. Диапазон запрашиваемых объемов выделяемой памяти не ограничен; однако выделяемая физическая память не подвергается постраничной подгрузке. Функции освобождения памяти передается указатель на освобождаемый участок памяти, но указывать размер освобождаемого участка памяти не нужно.
+
+[[overview-io-system]]
+=== Система ввода/вывода
+
+Базовой моделью системы ввода/вывода UNIX является последовательность байт, доступ к которым может осуществляться как последовательно, так и в в произвольном порядке. В типичном пользовательском процессе UNIX нет таких понятий, как _методы доступа_ или _управляющие блоки_.
+
+Различные программы используют разнообразные структуры данных, но ядро не связывает ввод/вывод с используемыми структурами. Например, текстовым файлом считается файл из строк символов набора ASCII, которые разделены одним символом новой строки (символ ASCII перевода строки), но ядро не знает ничего об этом соглашении. Для удовлетворения потребностей большинства программ модель еще более упрощена и сводится к потоку байт данных, или _потоку ввода/вывода_. Такое единое представление данных позволяет работать характерному для UNIX подходу на основе инструментов <<biblio-kernighan, [Kernighan & Pike, 1984]>>. Поток ввода/вывода одной программы может быть подан в качестве входной информации практически любой другой программе. (Этот тип традиционных для UNIX потоков ввода/выводы не нужно путать с потоковой системой ввода/вывода из Eighth Edition или с потоками из System V, Release 3 (STREAMS), оба из которых доступны как обычные потоки ввода/вывода.)
+
+==== Дескрипторы и ввод/вывод
+
+Процессы UNIX для работы с потоками ввода/вывода используют _дескрипторы_. Дескрипторы представляют собой беззнаковые целые числа, получаемые после выполнения системных вызовов _open_ и _socket_. Системный вызов _open_ получает в качестве аргументов имя файла и режим доступа, который определяет, должен ли файл открываться для чтения, для записи или для обеих операций. Этот системный вызов может также использоваться для создания нового пустого файла. Системные вызовы _read_ и _write_ могут применяться к дескриптору для переноса данных. Системный вызов _close_ может использоваться для уничтожения любого дескриптора.
+
+Дескрипторы представляют низкоуровневые объекты, поддерживаемые ядром, и создаваемые системными вызовами, специфичными для каждого типа объектов. В 4.4BSD дескрипторы могут представлять три типа таких объектов: файлы, каналы и сокеты.
+
+* _Файл_ представляет собой линейную последовательность байт, имеющую по крайней мере одно имя. Файл существует, пока все его имена не удалены и ни один из процессов не хранит его дескриптор. Процесс получает дескриптор файла, открывая имя файла посредством системного вызова _open_. Работа с устройствами ввода/вывода осуществляется как с файлами.
+* _Каналом_ является линейная последовательность байт, такая же, как файл, но используемая исключительно как поток ввода/вывода, причем однонаправленный. У канала нет имени, и поэтому он не может быть открыт при помощи _open_. Вместо этого он создается посредством системного вызова _pipe_, который возвращает два дескриптора, один из которых принимает входные данные, без искажений, без повторений и в той же самой последовательности посылаемый на другой дескриптор. Система также поддерживает именованный канал, или FIFO. FIFO имеет те же самые свойства, что и канал, за исключением того, что он располагается в файловой системе; поэтому он может быть открыт системным вызовом _open_. Процессы, которые хотят обмениваться данными, открывают FIFO: Один процесс открывает его для чтения, а другой для записи.
+* _Сокет_ является промежуточным объектом, который используется для межпроцессных коммуникаций; он существует, пока какой-либо процесс хранит дескриптор, ссылающийся на него. Сокет создается системным вызовом _socket_, который возвращает его дескриптор. Имеется несколько типов сокетов, которые поддерживают различные коммуникационные возможности, такие, как надежную доставку данных, сохранение последовательности передаваемых сообщений, и сохранение границ сообщений.
+
+В системах, предшествующих 4.2BSD, каналы были реализованы в файловой системе, когда в 4.2BSD появились сокеты, то каналы были повторно реализованы как сокеты.
+
+Для каждого процесса ядро хранит _таблицу дескрипторов_, которая является таблицей, используемой ядром для преобразования внешнего представления дескриптора в его внутреннее представление. (Дескриптор является просто индексом в этой таблице.) Таблица дескрипторов процесса наследуется от родительского процесса, и вместе с ней наследуется и доступ к объектам, на которые ссылаются дескрипторы. Основными способами, при помощи которых процесс может получить дескриптор, является открытие или создание объекта, а также наследование от родительского процесса. Кроме того, межпроцессные коммуникации при помощи сокетов позволяют передавать дескрипторы в сообщениях между несвязанными процессами на одной и той же машине.
+
+Любой рабочий дескриптор имеет связанное с ним _смещение в файле_ в байтах от начала объекта. Операции чтения и записи начинаются от этого смещения, который обновляется после каждой передачи данных. Для объектов, к которым разрешен произвольный доступ, смещение в файле может быть установлено посредством системного вызова _lseek_. Обычные файлы, а также некоторые устройства, разрешают произвольный доступ к ним. Каналы и сокеты этого делать не позволяют.
+
+Когда процесс завершается, ядро освобождает все дескрипторы, которые использовались этим процессом. Если процесс хранил последнюю ссылку на объект, то менеджер объектов уведомляется для выполнения всех необходимых действий, таких, как окончательное удаление файла или уничтожение сокета.
+
+==== Управление дескрипторами
+
+Большинство процессов ожидают, что перед началом их работы уже будут открыты три дескриптора. Это дескрипторы 0, 1 и 2, больше известные как _стандартный ввод_, _стандартный вывод_ и _стандартный поток диагностических сообщений_, соответственно. Как правило, все они связываются с пользовательским терминалом по время входа в систему (смотри Раздел 14.6) и наследуются через вызовы _fork_ и _exec_ процессами, запускаемыми пользователем. Таким образом, программа может считывать то, что набирает пользователь, из стандартного ввода, и программа может выдавать результат на экран пользователя, осуществляя запись в стандартный вывод. Дескриптор потока диагностических сообщений также открыт для записи и используется для вывода ошибок, когда как стандартный вывод используется для обычного вывода.
+
+Эти (и другие) дескрипторы могут отображаться на объекты, отличающиеся от терминала; такое отображение называется _перенаправлением ввода/вывода_, и все стандартные командные процессоры позволяют пользователю это делать. Оболочка может направить вывод программы в файл, закрывая дескриптор 1 (стандартный вывод) и открывая выбранный выходной файл для создания нового дескриптора 1. Подобным же образом стандартный ввод может браться из файла, при этом закрывается дескриптор 0 и открывается файл.
+
+Каналы позволяют выводу одной программы становиться вводом другой программы без переписывания и даже перекомпоновки программ. Вместо того, чтобы дескриптор 1 (стандартный вывод) исходной программы был настроен на запись на терминал, он настраивается на входной дескриптор канала. Аналогично дескриптор 0 (стандартный ввод) принимающей программы настраивается на обращение к выводу канала, а не к клавиатуре терминала. Результирующий набор двух процессов и соединяющий канал называется _конвейером_. Конвейеры могут быть весьма большими последовательностями процессов, соединенных каналами.
+
+Системные вызовы _open_, _pipe_ и _socket_ порождают новые дескрипторы с наименьшим неиспользуемым номером, подходящим для дескриптора. Для того, чтобы конвейеры могли работать, должен существовать механизм для отображения таких дескрипторов в 0 и 1. Системный вызов _dup_ создает копию дескриптора, которая указывает на ту же самую запись в таблице файлов. Новый дескриптор также является наименьшим неиспользуемым, но если нужный дескриптор сначала закрыть, то _dup_ можно использовать для выполнения нужного отображения. Однако здесь требуется некоторая осторожность: если нужен дескриптор 1, а дескриптор 0 уже закрыт, то в результате получится дескриптор 0. Во избежание этой проблемы в системе имеется системный вызов _dup2_; он похож на _dup_, но воспринимает дополнительный аргумент, указывающий номер нужного дескриптора (если нужный дескриптор уже открыт, то _dup2_ его закроет перед повторным использованием).
+
+==== Устройства
+
+Аппаратные устройства имеют связанные с ними имена файлов, и к ним может обращаться пользователь при помощи тех же самых системных вызовов, что используются для обычных файлов. Ядро может различать _специальный файл устройства_ или просто _специальный файл_, и может определять, к какому устройству он относится, но большинство процессов не выполняют такого распознавания. Терминалы, принтеры и стримеры все доступны как последовательности байт, как дисковые файлы 4.4BSD. Таким образом, особенности работы устройств максимально скрываются ядром, и даже в ядре большинство из них отличаются в драйверах.
+
+Аппаратные устройства могут быть разделены на _структурированные_ или _неструктурированные_; они известны под названиями _блочные_ и _посимвольные_, соответственно. Как правило, процессы обращаются к устройствам посредством _специальных файлов_ в файловой системе. Операции ввода/вывода, выполняемые с такими файлами, обрабатываются постоянно находящимися в ядре программными модулями, называемыми _драйверами устройств_. Большинство аппаратных устройств для сетевых коммуникаций доступны только при помощи механизмов межпроцессного взаимодействия, и не имеют специальных устройств в пространстве имен файловой системы, так как интерфейс _низкоуровневых сокетов_ дает более естественный интерфейс, чем специальный файл.
+
+Структурированные или блочные устройства разделяются на диски и магнитные ленты и включают в себя большинство устройств с произвольным доступом. Ядро поддерживает операции буферизации типа чтение-изменение-запись с блочными структурированными устройствами для того, чтобы разрешить последним осуществлять чтение и запись полностью произвольным образом, как с обычными файлами. Файловые системы создаются на блочных устройствах.
+
+Неструктурированными устройствами являются те, что не поддерживают блочную структуру. Типичными неструктурированными устройствами являются линии связи, растровые графопостроители и небуферизируемые магнитные ленты и диски. Неструктурированные устройства, как правило, поддерживают перенос больших объемов данных.
+
+Неструктурированные файлы называют _символьными устройствами_, потому что первые из них являлись драйверами терминальных устройств. Интерфейс ядра к драйверу для этих устройств доказал удобство его использования для других неструктурированных устройств.
+
+Специальные файлы устройств создаются системным вызовом _mknod_. Имеется дополнительный системный вызов, _ioctl_, для управления низкоуровневыми параметрами специальных файлов. Выполняемые операции для каждого устройства различны. Этот системный вызов позволяет осуществлять доступ к специальным характеристикам устройств, не перегружая смысл других системных вызовов. Например, для стримера существует _ioctl_ для записи метки конца ленты, но нет особой или измененной версии функции _write_.
+
+==== Механизм межпроцессных коммуникаций посредством сокетов
+
+В ядре 4.2BSD появился механизм межпроцессного взаимодействия, более гибкий, чем каналы, основанный на _сокетах_. Сокет является конечной точкой коммуникаций, доступный через дескриптор, как файл или канал. Каждый из двух процессов может создать сокет, а затем соединить эти конечные точки для получения надежного канала передачи потока байт. После соединения процесс может выполнять с дескрипторами операции чтения и записи, как это делалось с каналами. Прозрачность сокетов позволяет ядру перенаправить вывод одного процесса на вход другого, работающего на другой машине. Большим различием между каналами и сокетами является то, что каналы требуют наличия общего родительского процесса для установки коммуникации. Соединение между сокетами может быть установлено двумя несвязанными процессами, возможно, работающими на разных машинах.
+
+System V предоставляет механизм локального межпроцессного взаимодействия через FIFO (также называемые _именованными каналами_). FIFO отображаются как объекты файловой системы, которые могут быть открыты несвязанными процессами, и в которые можно открывать и посылать данные так же, как в случае каналов. Таким образом, FIFO не требуют общего родительского процесса для установки соединения; они могут быть соединены после того, как будут запущены два процесса. В отличие от сокетов, FIFO могут быть использованы только на локальной машине; они не могут быть использованы для связи между процессами, работающими на разных машинах. FIFO реализованы в 4.4BSD, потому что это требует стандарт POSIX.1. Их функциональность является подмножеством функций интерфейса сокетов.
+
+Механизм сокетов требует расширения традиционных для UNIX системных вызовов ввода/вывода для обеспечения соответствующих имен и смыслов соединениям. Вместо того, чтобы перегружать существующий интерфейс, разработчики использовали существующие интерфейсы, расширив их так, что они продолжили работать без изменений, и разработали новые интерфейсы для работы с новыми возможностями. Системные вызовы _read_ и _write_ использовались для соединений типа потока байт, и было добавлено шесть новых системных вызовов, что позволило посылать и принимать адресованные сообщения, такие, как сетевые датаграммы. Системные вызовы для записи сообщений включают в себя _send_, _sendto_ и _sendmsg_. Системные вызовы для чтения сообщений включают _recv_, _recvfrom_ и _recvmsg_. В ретроспективе, первые два в каждом классе являются особыми случаями других; _recvfrom_ и _sendto_, наверное, должны были быть добавлены как библиотечные интерфейсы к _recvmsg_ и _sendmsg_, соответственно.
+
+==== Множественный ввод/вывод
+
+Кроме традиционных системных вызовов _read_ и _write_, в 4.2BSD появилась возможность выполнять множественный ввод/вывод. Множественный ввод использует системный вызов _readv_ для размещения результата единственной операции чтения в нескольких различных буферах. Обратно, системный вызов _writev_ позволяет осуществлять запись нескольких различных буферов за одну атомарную операцию записи. Вместо передачи одного буфера и его длины в качестве параметров, как это делается при использовании системных вызовов _read_ и _write_, процесс передает указатель на массив буферов и их длин, а также счетчик, определяющий размер массива.
+
+Такой механизм позволяет буферам в различных областях адресного пространства процесса записываться атомарно, без необходимости копировать их в один буфер. Атомарные операции записи необходимы в случае, когда низкоуровневые абстракции основаны на записях, например, стримеры, которые выводят блок ленты при каждом запросе на запись. Также полезна возможность помещать результат одного запроса на чтение в нескольких различных буферах (например, заголовок записи в одно место, а данные в другое). Хотя приложение может симулировать возможность выполнять множественные операции посредством чтения данных в большой буфер с последующим копированием их частей в нужные области, и накладные расходы на копирование в памяти в таких случаях часто увеличивает время выполнения приложения чуть ли не вдвое.
+
+Так же, как _send_ и _recv_ могут быть реализованы в виде библиотечных интерфейсов к _sendto_ и _recvfrom_, возможно симулирование _read_ через _readv_ и _write_ через _writev_. Однако _read_ и _write_ используются столь часто, что накладные расходы на такую симуляцию не стоят того.
+
+==== Поддержка нескольких файловых систем
+
+Вместе с распространением сетевых вычислений возникла потребность в поддержке как локальных, так и удаленных файловых систем. Для облегчения поддержки нескольких файловых систем разработчики добавили в ядро интерфейс виртуальных узлов файловой системы, или интерфейс _vnode_. Набор операций, экспортируемых через интерфейс vnode, похож на операции файловой системы, ранее поддерживаемые локальной файловой системой. Однако они могут поддерживаться широким спектром типов файловых систем:
+
+* Локальные файловые системы, использующие диск
+* Файлы, импортируемые при помощи разнообразных протоколов удаленных файловых систем
+* Файловые системы CD-ROM, доступные только для чтения
+* Файловые системы, предоставляющие специализированные услуги - к примеру, файловая система [.filename]#/proc#
+
+Некоторые варианты 4.4BSD, такие, как FreeBSD, позволяют выполнять динамическую загрузку файловых систем при первом обращении к ним при помощи системного вызова _mount_. Интерфейс vnode описан в Разделе 6.5; вдобавок он поддерживает функции, описанные в Разделе 6.6; некоторые из файловых систем специального назначения описаны в Разделе 6.7.
+
+[[overview-filesystem]]
+=== Файловые системы
+
+Обычный файл представляет собой массив байтов, и может читаться и записываться, начиная с произвольного байта файла. Ядро не различает в обычных файлах границ записей, хотя многие программы воспринимают символы перевода строки в качестве признаков конца строк, но другие программы могут предполагать наличие других структур. В самом файле не хранится никакой системной информации о файле, но в файловой системе размещается некоторая информация о владельце, правах доступа и об использовании каждого файла.
+
+Компонент под названием _имя файла_ является строкой длиной до 255 символов. Эти имена хранятся в файле особого типа, который называется _каталогом_. Информация о файле в каталоге называется _записью каталога_ и включает, кроме имени файла, указатель на сам файл. Записи каталога могут ссылаться как на другие каталоги, так и на обычные файлы. Таким образом формируется иерархия каталогов и файлов, которая и называется файловой системой _filesystem_;
+
+[[fig-small-fs]]
+.Небольшая файловая система
+image::fig2.png[Дерево небольшой файловой системы]
+
+Одна небольшая файловая система показана на <<fig-small-fs>>. Каталоги могут содержать подкаталоги, и нет ограничений вложенности одного каталога в другой по глубине. Для соблюдения целостности файловой системы, ядро не позволяет процессу производить запись непосредственно в каталоги. Файловая система может хранить не только обычные файлы и каталоги, но также ссылки на другие объекты, такие, как устройства и сокеты.
+
+Файловая система образует дерево, начало которого находится в _корневом каталоге_, иногда называемому по имени _слэш_, которое соответствует символу одинарной наклонной черты (/). Корневой каталог содержит файлы; в нашем примере на Рисунке 2.2, он содержит [.filename]#vmunix#, копию выполнимого объектного файла ядра. В нем также расположены каталоги; в этом примере он содержит каталог [.filename]#usr#. Внутри каталога [.filename]#usr# располагается каталог [.filename]#bin#, который в основном содержит выполнимый объектный код программ, таких, как [.filename]#ls# и [.filename]#vi#.
+
+Процесс обращается к файлу, указывая _путь_ до него, который является строкой, состоящей из нескольких или ни одного имен файлов, разделенных символами слэша (/). С каждым процессом ядро связывает два каталога, при помощи которых можно интерпретировать маршруты до файлов. _Корневой каталог_ процесса является самой верхней точкой файловой системы, которую может достичь процесс; обычно он соответствует корневому каталогу всей файловой системы. Маршрут, начинающийся с символа слэша, называется _абсолютным маршрутом_, и интерпретируется ядром, начиная с корневого каталога процесса.
+
+Имя пути, которое не начинается со слэша, называется _относительным маршрутом_, и интерпретируется относительно _текущего рабочего каталога_ процесса. (Этот каталог кратко также называют _текущим каталогом_ или _рабочим каталогом_.) Текущий каталог сам по себе можно обозначить непосредственно по имени _dot_, что соответствует одной точке ([.filename]#.#). Имя файла _dot-dot_ ([.filename]#..#) обозначает родительский каталог текущего каталога. Корневой каталог является предком самому себе.
+
+Процесс может задать собственный корневой каталог при помощи системного вызова _chroot_, и установить текущий каталог системным вызовом _chdir_. Каждый процесс может в любой момент выполнить вызов _chdir_, но _chroot_ позволено выполнять только процессу с административными привилегиями. _Chroot_ обычно используется для ограничения доступа к системе.
+
+Взяв файловую систему, изображенную на Рисунке 2.2, и полагая, что процесс имеет в качестве корневого каталога корневой каталог файловой системы, и в качестве текущего каталога [.filename]#/usr#, он может обратиться к файлу [.filename]#vi# либо от корня по абсолютному имени [.filename]#/usr/bin/vi#, либо из текущего каталога с относительным именем [.filename]#bin/vi#.
+
+Системные утилиты и базы данных располагаются в нескольких всем известных каталогах. Частью предопределенной иерархии является каталог, содержащий _домашний каталог_ для каждого пользователя - например, [.filename]#/usr/staff/mckusick# и [.filename]#/usr/staff/karels# на Рисунке 2.2. Когда пользователи регистрируются в системе, то рабочий каталог их командного процессора устанавливается в домашний каталог. В своих домашних каталогах пользователи могут создавать каталоги так же легко, как и обычные файлы. Таким образом, пользователь может строить иерархии каталогов произвольной сложности.
+
+Пользователь обычно знает только об одной файловой системе, но система может знать, что одна виртуальная файловая система на самом деле состоит из нескольких физических файловых систем, каждая из которых расположена на отдельном устройстве. Физическая файловая система не может располагаться на нескольких физических устройствах. Так как большинство физических дисковых устройств разбиваются на несколько логических устройств, то на одном физическом устройстве может располагаться более одной файловой системы, но не более одной для каждого логического устройства. Одна из файловых систем - та, с которой начинаются все абсолютные имена - называется _корневой файловой системой_, и она всегда доступна. Другие файловые системы могут монтироваться; это значит, что они могут интегрироваться в иерархию каталогов корневой файловой системы. Ссылки на каталог, в котором находится смонтированная в него файловая системе, прозрачно преобразуются ядром в ссылки на корневой каталог смонтированной файловой системы.
+
+Системный вызов _link_ в качестве параметров принимает имя существующего файла и новое имя, которое будет присвоено файлу. После успешного выполнения вызова _link_, файл может быть доступен по любому из имен. Имя файла может быть удалено при помощи системного вызова _unlink_. Когда удаляется последнее имя для файла (и последний процесс, который держал файл открытым, закрыл его), удаляется и сам файл.
+
+Файлы организованы иерархически в _каталоги_. Каталог является типом файла, но, в отличие от обычных файлов, каталог имеет структуру, определяемую системой. Процесс может читать каталог, как будто это обычный файл, но только ядру разрешено изменять каталог. Каталоги создаются системным вызовом _mkdir_ и удаляются системным вызовом _rmdir_. До 4.2BSD системные вызовы _mkdir_ и _rmdir_ были реализованы как последовательность системных вызовов _link_ и _unlink_. Имелось три причины для добавления системных вызовов специально для создания и удаления каталогов:
+
+. Операция может быть сделана атомарной. Если система завершила работу аварийно, то каталог не может оставаться в промежуточном состоянии, что может случиться при последовательном вызове серии операций.
+. При работе сетевой файловой системы создание и удаление файлов и каталогов должны выполняться атомарно, чтобы могли выполняться последовательно.
+. При реализации поддержки не-UNIX файловых систем, таких, как файловая система MS-DOS, на другом разделе диска, может оказаться, что эта файловая система не поддерживает ссылочных операций. Хотя другие файловые системы могут поддерживать концепцию каталогов, скорее всего, они не будут создавать и удалять каталоги со ссылками, как это делается в файловой системе UNIX. Соответственно они могут создавать и и удалять каталоги только при наличии явных запросов на удаление или создание каталогов.
+
+Системный вызов _chown_ устанавливает владельца и группу файла, а _chmod_ изменяет атрибуты защиты. Вызов _stat_, примененный к имени файла, может использоваться для чтения этих свойств файла. Системные вызовы _fchown_, _fchmod_ и _fstat_ применяются с дескрипторами, а не с именами файлов, для выполнения того же самого набора операций. Системный вызов _rename_ может использоваться для присвоения файлу нового имени в файловой системе с заменой старого имени файла. Как и операции по созданию и удалению каталогов, системный вызов _rename_ был добавлен в 4.2BSD для придания атомарности изменению имен в локальной файловой системе. Позже он оправдал свою исключительную полезность для экспортирования операций по переименованию в сторонних файловых системах и по сети.
+
+Системный вызов _truncate_ был добавлен в 4.2BSD для того, чтобы файлы могли обрезаться по указанному смещению. Вызов был добавлен первоначально для поддержки библиотеки времени выполнения языка Fortran, в котором применялось понятие конца файла с произвольным доступом, который мог устанавливаться в любую позицию, в которой был последний раз доступ к файлу. Без системного вызова _truncate_ единственным способом обрезать файл было копирование нужной части в новый файл, удаление старого и переименование копии в первоначальное имя. Библиотека могла теоретически отказываться работать на заполненной файловой системе, к тому же такой алгоритм оказывался медленным.
+
+После того, как файловая система получила возможность обрезать файлы, ядро применяло эту возможность для уменьшения больших пустых каталогов. Преимущество в уменьшении пустых каталогов заключается в сокращении времени ядра на поиск в них при создании или удалении имен.
+
+Вновь создаваемым файлам присваивается идентификатор пользователя процесса, который их создал, и идентификатор группы каталога, в котором они были созданы. Для защиты файлов применяется трехуровневый механизм управления доступом. Эти три уровня определяют доступность файла для
+
+. Пользователя, который является владельцем файла
+. Группы, которая приписана файлу
+. Всех остальных
+
+Каждый уровень доступа имеет отдельные индикаторы прав для чтения, записи и выполнения.
+
+Файлы создаются с нулевым размером, который может увеличиться при выполнении операций записи. Пока файл открыт, система отслеживает указатель на файл, соответствующий текущему положению в файле, связанном с дескриптором. Этот указатель может перемешаться по файлу в произвольном порядке. Процессы, использующие один и тот же дескриптор файла посредством системных вызовов _fork_ или _dup_, используют одновременно один и тот же указатель текущей позиции. Дескрипторы, созданные различными системными вызовами _open_, имеют различные указатели текущей позиции. В файлах могут присутствовать _дыры_. Дыры представляют собой пустые пространства в теле файла, в которые никаких данных не записывалось. Процесс может создать такие дыры, перемещая указатель за текущий конец файла и производя запись. При чтении дыры интерпретируются системой как заполненные нулевыми байтами.
+
+Ранние версии UNIX имели ограничение в 14 символов на имя файла. Это ограничение зачастую вызывало проблемы. Например, кроме естественного желания пользователей давать файлам длинные описательные имена, распространенным способом формировать имена файлов является использование формата [.filename]#basename.extension#, где расширение (указывающее на тип файла, скажем, `.c` для исходного года на языке C или `.o` для промежуточного двоичного объекта) имеет длину от одного до трех символов, оставляя от 10 до 12 символов на имя файла. Системы управления исходным кодом и редакторы обычно используют дополнительно два символа для своих целей, для префикса или суффикса имени файла, при этом остается от восьми до 10 символов. В качестве имени файла легко использовать от 10 до 12 символов одного английского слова (например, `multiplexer`).
+
+Можно смириться с этими ограничениями, но это непоследовательно и даже опасно, потому что другие системы UNIX могут работать со строками, превышающими этот лимит, при создании файлов, но затем имя будет _обрезано_. Исходный файл с именем [.filename]#multiplexer.c#, содержащий исходный код на языке C, (уже 13 символов) может иметь соответствующий файл из системы управления исходным кодом с префиксом `s.`, при этом получается имя файла [.filename]#s.multiplexer#, которое не не будет отличаться от файла системы управления исходным кодом для файла [.filename]#multiplexer.ms#, содержащего исходный код `troff` для документации программы на языке C. Содержимое двух оригинальных файлов может оказаться перепутанным без каких-либо предупреждений от системы управления исходным кодом. При тщательном кодировании эту проблему можно обнаружить, но поддержка длинных имен файлов, впервые появившаяся в 4.2BSD, практически полностью ликвидировала эту проблему.
+
+[[overview-filestore]]
+=== Размещение файлов
+
+Операции, определенные для локальных файловых систем, делятся на две категории. Общими для всех локальных систем являются иерархический принцип именования, блокировка, квоты, управление атрибутами и защита. Эти механизмы не зависят от того, как хранятся данные. В 4.4BSD имеется единая реализация для предоставления этих сервисов.
+
+Другой частью локальной файловой системы является организация и управление данными на носителях информации. Размещение содержимого файлов на носителях является вопросом хранилища файлов. В 4.4BSD поддерживает три различных типа хранилищ файлов:
+
+* Традиционная файловая система Berkeley Fast Filesystem
+* Журналируемая файловая система, основанная на архитектуре операционной системы Sprite <<biblio-rosenblum, [Rosenblum & Ousterhout, 1992]>>
+* Файловая система в памяти
+
+Хотя организация этих хранилищ совершенно различна, эти различия скрыты от процессов, использующих файловые системы.
+
+В файловой системе Fast Filesystem организует данные в группы дорожек. Файлы, к которым, скорее всего, будет осуществляться доступ одновременно (на основе их расположения в иерархии файловой системы), хранятся на одной и той же группе дорожек. Файлы, к которым не предполагается одновременный доступ, перемещаются на разные группы дорожек. Таким образом, файлы, записываемые в одно и то же время, могут располагаться в абсолютно разных областях диска.
+
+Файловая система с журнальной организацией организует данные в виде журнала. Все данные, записываемые в некоторый момент времени, собираются вместе и записываются в одно и то же место диска. Данные никогда не перезаписываются; вместо этого записывается новая копия файла, которая заменяет старую. Старые файлы уничтожаются процессом-сборщиком мусора, который запускается, когда файловая система переполняется и появляется необходимость в свободном пространстве.
+
+Файловая система в памяти предназначена для хранения данных в виртуальной памяти. Она используется для файловых систем, в которых должны храниться временные данные с обеспечением быстрого доступа к ним, к примеру, [.filename]#/tmp#. При организации файловой системы в памяти преследуется цель организовать максимально компактное хранение данных для минимизации использования ресурсов виртуальной памяти.
+
+[[overview-nfs]]
+=== Сетевая файловая система
+
+Изначально сетевые возможности использовались для передачи данных от одной машины к другой. Позже это получило свое развитие в обеспечении подключения пользователей удаленно к другим машинам. Следующим логическим шагом было предоставление данных пользователю, а не приближение пользователя к данным - так родились сетевые файловые системы. Пользователи, работающие локально, не ощущают сетевых задержек при каждом нажатии клавиши, так что они получают более удобное рабочее окружение.
+
+Подключение файловой системы к локальной машине было одним из первых основных клиент-серверных приложений. _Сервер_ является удаленной машиной, которая экспортирует одну или более своих файловых систем. _Клиентом_ является локальная машина, которая импортирует эти файловые системы. С точки зрения локального клиента, смонтированные удаленные файловые системы появляются в пространстве имен дерева файлов, как любая другая локально смонтированная файловая система. Локальные клиенты могут перемещаться в каталоги на удаленной файловой системе, и могут осуществлять чтение, запись и выполнение двоичных файлов на удаленной файловой системе точно так же, как они выполняют эти операции на локальной файловой системе.
+
+Когда локальный клиент выполняет операцию на удаленной файловой системе, оформляется и посылается запрос к серверу. Сервер выполняет запрошенную операцию и возвращает либо запрошенную информацию, либо ошибку, почему запрос был отклонен. Для получения удовлетворительной производительности, клиент должен кэшировать данные, к которым доступ осуществляется часто. Сложность удаленных файловых систем отражается на поддержке соответствия между сервером и множеством его клиентов.
+
+Хотя за эти годы было разработано множество протоколов работы с удаленными файловыми системами, самой распространенной на системах UNIX является сетевая файловая система Network Filesystem (NFS), которая была спроектирована и реализована в Sun Microsystems. Ядро 4.4BSD поддерживает протокол NFS, хотя его реализация была выполнена независимо от спецификаций протокола <<biblio-macklem, [Macklem, 1994]>>. Протокол NFS описан в Главе 9.
+
+[[overview-terminal]]
+=== Терминалы
+
+Терминалы поддерживают стандартные системные операции ввода/вывода, а также набор операций, специфичных для терминалов, для управления редактированием входных символов и задержек вывода. На самом нижнем уровне находятся драйверы терминальных устройств, которые управляют портами аппаратных терминалов. Терминальный ввод обрабатывается согласно низлежащим характеристикам связи, таким, как скорость передачи, и согласно набору программно контролируемых параметров, таких, как контроль четности.
+
+Выше уровня драйверов терминальных устройств находятся режимы каналов, которые обеспечивают различные уровни обработки символов. По умолчанию режим работы канала выбирается, когда порт используется для интерактивного входа в систему. Режим работы канала устанавливается в _канонический_; входной поток обрабатывается так, что обеспечиваются стандартные функции, ориентированные на редактирование строк, и он представляется процессу в виде целых строк.
+
+Экранные редакторы и программы, которые взаимодействуют с другими машинами, обычно работают в _неканоническом режиме_ (часто называемом _raw-режимом_ или _посимвольным режимом_). В этом режиме входной поток передается в читающий процесс сразу же и без всякой обработки. Выключается вся обработка специальных символов, не выполняется удаление символов и другое редактирование строк, все символы передаются программе, которая выполняет чтение с терминала.
+
+Терминал может быть настроен тысячами различных способов, промежуточных между этими двумя. Например, экранный редактор, которому необходимо получать прерывания от пользователя асинхронно, может разрешить использование специальных символов, которые генерируют сигналы и разрешить управление выходным потоком, в противном случае работать в неканоническом режиме; все остальные символы будут передаваться в процесс необработанными.
+
+Что касается выходного потока, то терминальный обработчик предоставляет простые службы по его форматированию, включая
+
+* Преобразование символа перевода строки на двухсимвольную последовательность из символов возврата каретки и перевода строки
+* Выдерживание пауз после некоторых стандартных управляющих символов
+* Замещение символов табуляции
+* Вывод неграфических символов ASCII в виде двухсимвольных последовательностей вида `^C` (другими словами, вывод знака вставки, за которым следует символ, который находится по смещению от символа `@`, соответствующему значению этого символа).
+
+Каждый из этих сервисов преобразования может быть независимо выключен процессом при помощи управляющих запросов.
+
+[[overview-ipc]]
+=== Коммуникации между процессами
+
+Межпроцессные коммуникации в 4.4BSD организованы в _коммуникационные домены_. К поддерживаемым на данный момент доменам относятся _локальный домен_ для взаимодействия между процессами, выполняющимися на одной и той же машине; _межсетевой домен_ для связи между процессами посредством набора протоколов TCP/IP (возможно, в сети Интернет); семейство протоколов ISO/OSI для взаимодействия между сайтами, которым нужна именно такая связь, и _домен XNS_ для коммуникаций между процессами при помощи протоколов XEROX Network Systems (XNS).
+
+В пределах домена соединения имеют место между конечными точками связи, также называемыми _сокетами_. Как отмечено в Разделе 2.6, системный вызов _socket_ создает сокет и возвращает дескриптор; другие системные вызовы IPC описаны в Главе 11. Каждый сокет имеет тип, определяющий его коммуникационные свойства; к ним относятся такие характеристики, как надежность, сохранение последовательности передаваемой информации и предупреждение дублирования сообщений.
+
+с каждым сокетом связан некоторый _коммуникационный протокол_. Этот протокол обеспечивает выполнение операций, требуемых сокету, согласно его типу. Приложения могут задавать нужный протокол при создании сокета или могут разрешить системе выбрать протокол, который соответствует типу создаваемого сокета.
+
+Сокеты могут иметь адреса, связанные с ними. Формат и смысл адресов сокетов зависят от коммуникационного домена, в котором был создан сокет. Привязка имени к сокету в локальном домене приводит к созданию файла в файловой системе.
+
+Обычные данные, передаваемые и получаемые при помощи сокетов, не имеют типа. Вопросы представления данных зависят от библиотек, которые находятся на верху коммуникационных сервисов. Вдобавок к передаче обычных данных, коммуникационные домены могут поддерживать передачу и прием специальных типов данных, которые называются _правами доступа_. Например, локальный домен использует эту возможность для передачи дескрипторов между процессами.
+
+До 4.2BSD сетевые реализации в UNIX обычно работали через интерфейсы символьных устройств. Одной из целей создания интерфейса сокетов было обеспечение работы простеньким программам без изменения на потоковых соединениях. Такие программы могут работать, если только не меняются системные вызовы _read_ и _write_. Соответственно, оригинальные интерфейсы не трогались, но были исправлены для работы с потоковыми сокетами. Для более сложных сокетов, таких, как те, что используются для посылки датаграмм и в которых при каждом вызове _send_ должен указываться адрес назначения, был добавлен новый интерфейс.
+
+Другим достоинством является то, что новый интерфейс легко переносим. Вскоре после тестового релиза, полученного из Беркли, интерфейс сокетов был перенесен в System III поставщиком UNIX (хотя AT&T не поддерживала интерфейс сокетов до выхода System V Release 4, решив использовать вместо него механизм потоков из Eighth Edition). Интерфейс сокетов был также перенесен для работы на многих адаптерах Ethernet поставщиками, такими, как Excelan и Interlan, который продавался на рынке PC, где компьютеры были слишком слабыми, чтобы обрабатывать сетевой код на основном процессоре. Сравнительно недавно интерфейс сокетов был использован в качестве основы для сетевого интерфейса Winsock от Microsoft для Windows.
+
+[[overview-network-communication]]
+=== Сетевые коммуникации
+
+Некоторые из коммуникационных доменов, поддерживаемых IPC-механизмом _сокетов_ дают доступ к сетевым протоколам. Эти протоколы реализованы как отдельный программный слой, логически находящийся ниже программного обеспечения сокетов в ядре. Ядро предоставляет много вспомогательных сервисов, таких, как управление буферами, маршрутизация сообщений, стандартные интерфейсы к протоколам и интерфейсы к драйверам сетевых интерфейсов для использования в различных сетевых протоколах.
+
+В те времена, когда разрабатывалась 4.2BSD, использовалось или разрабатывалось много сетевых протоколов, каждый со своими сильными и слабыми сторонами. Не существует единственного подходящего на все случаи жизни протокола или набора протоколов. Поддерживая много протоколов, 4.2BSD может обеспечить взаимодействие и обмен ресурсами между различными машинами, которые были доступны в Беркли. Поддержка многих протоколов необходим также для изменений в будущем. Современные протоколы, разработанные для Ethernet со скоростями работы 10 и 100 Mbit в секунду, вряд ли будут соответствовать для завтрашних оптических сетей пропускной способностью 1 и 10 Gbit в секунду. Поэтому уровень сетевых коммуникаций разработан с учетом поддержки многих протоколов. Новые протоколы добавляются к ядру, не затрагивая поддержку старых протоколов. Старые приложения могут продолжать работать с использованием старых протоколов в той же самой физической сети, что использовалась для новых приложений, работающих с новым сетевым протоколом.
+
+[[overview-network-implementation]]
+=== Сетевая реализация
+
+Первым набором протоколов, реализованным в 4.2BSD, был Transmission Control Protocol/Internet Protocol (TCP/IP) от DARPA. CSRG выбрала TCP/IP в качестве первого для включения в набор протоколов IPC, потому что реализация на основе 4.1 была всем доступна из проекта, спонсируемого DARPA, в Bolt, Beranek и Newman (BBN). Это был выбор, повлиявший на многое: Реализация в 4.2BSD стала основной причиной очень широкой распространенности и использования этого набора протоколов. Более поздние усовершенствования производительности и возможностей TCP/IP были также широко приняты. Реализация TCP/IP подробно описана в Главе 13.
+
+В релизе 4.3BSD появился набор протоколов Xerox Network Systems (XNS), частично основанный на работе, выполненной в Университете Мэрилэнда и Университете Корнелла. Этот набор был нужен для объединения отдельных машин, которые не могли работать с протоколом TCP/IP.
+
+В релиз 4.4BSD был добавлен набор протоколов ISO из-за его все большей распространенности как внутри, так и во вне США. По причине использования в протоколах ISO несколько другого подхода к сети, в интерфейсе сокетов потребовалось сделать некоторые небольшие изменения для реализации этого подхода. Изменения были сделаны так, что они были незаметны для клиентов других существующих протоколов. Протоколы ISO требуют также большой работы с двухуровневыми таблицами маршрутизации, имеющимися в 4.3BSD. К значительно расширенным возможностям по маршрутизации в 4.4BSD относятся раздельные уровни маршрутизации с адресами переменной длины и сетевыми масками.
+
+[[overview-operation]]
+=== Работа системы
+
+Механизмы начальной загрузки используются для запуска системы. Сначала ядро 4.4BSD должно быть загружено в основную память процессора. После загрузки оно должно пройти через фазу инициализации для установки аппаратуры в известное состояние. Затем ядро должно выполнить автоконфигурацию, в процессе которой распознаются и настраиваются периферийные устройства, подключенные к процессору. Система начинает работу в однопользовательском режиме, пока начальный скрипт выполняет проверку дисков и включает подсчет статистики и использования квот. Наконец, начальный скрипт запускает общесистемные службы и переводит систему в полностью многопользовательский режим.
+
+При работе в многопользовательском режиме процессы ждут запросов на вход в систему с терминальных линий и сетевых портов, которые были настроены на вход пользователей. После обнаружения запроса на вход, вызывается процесс входа в систему и выполняется аутентификация пользователя. Если она прошла успешно, запускается начальная оболочка, из которой пользователь может запускать дополнительные процессы.
+
+:sectnums!:
+
+[bibliography]
+[[references]]
+== Ссылки
+
+[[biblio-accetta]] Accetta et al, 1986 Mach: A New Kernel Foundation for UNIX Development" M.Accetta R.Baron W.Bolosky D.Golub R.Rashid A.Tevanian M.Young 93-113 USENIX Association Conference Proceedings USENIX Association June 1986
+
+[[biblio-cheriton]] Cheriton, 1988 The V Distributed System D. R.Cheriton 314-333 Comm ACM, 31, 3 March 1988
+
+[[biblio-ewens]] Ewens et al, 1985 Tunis: A Distributed Multiprocessor Operating System P.Ewens D. R.Blythe M.Funkenhauser R. C.Holt 247-254 USENIX Assocation Conference Proceedings USENIX Association June 1985
+
+[[biblio-gingell]] Gingell et al, 1987 Virtual Memory Architecture in SunOS R.Gingell J.Moran W.Shannon 81-94 USENIX Association Conference Proceedings USENIX Association June 1987
+
+[[biblio-kernighan]] Kernighan & Pike, 1984 The UNIX Programming Environment B. W.Kernighan R.Pike Prentice-Hall Englewood Cliffs NJ 1984
+
+[[biblio-macklem]] Macklem, 1994 The 4.4BSD NFS Implementation R.Macklem 6:1-14 4.4BSD System Manager's Manual O'Reilly & Associates, Inc. Sebastopol CA 1994
+
+[[biblio-mckusick-2]] McKusick & Karels, 1988 Design of a General Purpose Memory Allocator for the 4.3BSD UNIX Kernel M. K.McKusick M. J.Karels 295-304 USENIX Assocation Conference Proceedings USENIX Assocation June 1998
+
+[[biblio-mckusick-1]] McKusick et al, 1994 Berkeley Software Architecture Manual, 4.4BSD Edition M. K.McKusick M. J.Karels S. J.Leffler W. N.Joy R. S.Faber 5:1-42 4.4BSD Programmer's Supplementary Documents O'Reilly & Associates, Inc. Sebastopol CA 1994
+
+[[biblio-ritchie]] Ritchie, 1988 Early Kernel Design private communication D. M.Ritchie March 1988
+
+[[biblio-rosenblum]] Rosenblum & Ousterhout, 1992 The Design and Implementation of a Log-Structured File System M.Rosenblum K.Ousterhout 26-52 ACM Transactions on Computer Systems, 10, 1 Association for Computing Machinery February 1992
+
+[[biblio-rozier]] Rozier et al, 1988 Chorus Distributed Operating Systems M.Rozier V.Abrossimov F.Armand I.Boule M.Gien M.Guillemont F.Herrmann C.Kaiser S.Langlois P.Leonard W.Neuhauser 305-370 USENIX Computing Systems, 1, 4 Fall 1988
+
+[[biblio-tevanian]] Tevanian, 1987 Architecture-Independent Virtual Memory Management for Parallel and Distributed Environments: The Mach Approach Technical Report CMU-CS-88-106, A.Tevanian Department of Computer Science, Carnegie-Mellon University Pittsburgh PA December 1987
diff --git a/documentation/content/ru/books/design-44bsd/chapters-order.adoc b/documentation/content/ru/books/design-44bsd/chapters-order.adoc
new file mode 100644
index 0000000000..bb86b134ce
--- /dev/null
+++ b/documentation/content/ru/books/design-44bsd/chapters-order.adoc
@@ -0,0 +1 @@
+_index.adoc
diff --git a/documentation/content/ru/books/developers-handbook/_index.adoc b/documentation/content/ru/books/developers-handbook/_index.adoc
new file mode 100644
index 0000000000..3071e05dfa
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/_index.adoc
@@ -0,0 +1,290 @@
+---
+title: Руководство FreeBSD для разработчиков
+authors:
+ - author: The FreeBSD Documentation Project
+copyright: 1995-2020 The FreeBSD Documentation Project
+releaseinfo: "$FreeBSD$"
+trademarks: ["freebsd", "apple", "ibm", "ieee", "intel", "linux", "microsoft", "opengroup", "sun", "general"]
+---
+
+= Руководство FreeBSD для разработчиков
+:doctype: book
+:toc: macro
+:toclevels: 2
+:icons: font
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnums:
+:sectnumlevels: 6
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+
+ifeval::["{backend}" == "html5"]
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+:imagesdir: ../../images/books/developers-handbook/
+:chapters-path: content/ru/books/developers-handbook/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+include::../../../../shared/mirrors.adoc[]
+include::../../../../shared/authors.adoc[]
+include::../../../../shared/releases.adoc[]
+include::../../../../shared/ru/mailing-lists.adoc[]
+include::../../../../shared/ru/teams.adoc[]
+include::../../../../shared/ru/urls.adoc[]
+:imagesdir: ../../../static/images/books/developers-handbook/
+:chapters-path:
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+include::../../../../shared/mirrors.adoc[]
+include::../../../../shared/authors.adoc[]
+include::../../../../shared/releases.adoc[]
+include::../../../../shared/ru/mailing-lists.adoc[]
+include::../../../../shared/ru/teams.adoc[]
+include::../../../../shared/ru/urls.adoc[]
+:imagesdir: ../../../static/images/books/developers-handbook/
+:chapters-path:
+endif::[]
+
+[.abstract-title]
+Аннотация
+
+Добро пожаловать в руководство FreeBSD для разработчиков.
+
+'''
+
+toc::[]
+
+[[introduction]]
+= Введение
+
+[[developmentplatform]]
+== Разработка во FreeBSD
+
+Здесь необходимо будет обсудить FreeBSD в качестве платформы для разработки, подход к этому BSD, обзор архитектуры, структура /usr/src, история и так далее.
+
+Спасибо вам за выбор FreeBSD в качестве платформы разработки! Надеемся, что она вас не подведет.
+
+[[bsdvision]]
+== Парадигма BSD
+
+[[archoverview]]
+== Обзор архитектуры
+
+[[sourcelayout]]
+== Структура /usr/src
+
+Полный исходный код FreeBSD имеется на нашем общедоступном хранилище CVS. Как правило, исходный код устанавливается в каталог [.filename]#/usr/src#, содержащий следующие подкаталоги.
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Каталог
+| Описание
+
+|[.filename]#bin/#
+|Исходный код файлов из [.filename]#/bin#
+
+|[.filename]#contrib/#
+|Исходный код файлов программного обеспечения, которое предоставлено третьими лицами.
+
+|[.filename]#crypto/#
+|Исходный код DES
+
+|[.filename]#etc/#
+|Исходный код файлов из [.filename]#/etc#
+
+|[.filename]#games/#
+|Исходный код файлов из [.filename]#/usr/games#
+
+|[.filename]#gnu/#
+|Утилиты, подпадающие под условия GNU Public License
+
+|[.filename]#include/#
+|Исходный код файлов из [.filename]#/usr/include#
+
+|[.filename]#kerberosIV/#
+|Исходный код Kerbereros версии IV
+
+|[.filename]#kerberos5/#
+|Исходный код Kerbereros версии 5
+
+|[.filename]#lib/#
+|Исходный код файлов из [.filename]#/usr/lib#
+
+|[.filename]#libexec/#
+|Исходный код файлов из [.filename]#/usr/libexec#
+
+|[.filename]#release/#
+|Файлы, необходимые для выпуска релиза FreeBSD
+
+|[.filename]#sbin/#
+|Исходный код файлов из [.filename]#/sbin#
+
+|[.filename]#secure/#
+|Исходный код FreeSec
+
+|[.filename]#share/#
+|Исходный код файлов из [.filename]#/sbin#
+
+|[.filename]#sys/#
+|Исходные тексты ядра
+
+|[.filename]#tools/#
+|Инструментальные средства, использемые для обслуживания и тестирования FreeBSD
+
+|[.filename]#usr.bin/#
+|Исходный код файлов из [.filename]#/usr/bin#
+
+|[.filename]#usr.sbin/#
+|Исходный код файлов из [.filename]#/usr/sbin#
+|===
+
+[[Basics]]
+= Основы
+include::{chapters-path}secure/chapter.adoc[leveloffset=+1]
+
+[[kernel]]
+= Ядро
+
+[[kernelhistory]]
+== История ядра Unix
+
+Немного истории о ядре Unix/BSD, системных вызовах, как работают процессы, блокировке, планировке задач, нити (ядра), переключение контекста, сигналы, прерывания, модули и так далее.
+
+[[memory]]
+= Память и виртуальная память
+
+[[virtualmemory]]
+== Виртуальная память
+
+VM, постраничная подкачка и свопирование, выделение памяти, тестирование ошибок утечки памяти, mmap, vnode и так далее.
+
+[[iosystem]]
+= Система ввода/вывода
+
+[[ufs]]
+== UFS
+
+UFS, FFS, Ext2FS, JFS, inodes, buffer cache, labeling, locking, metadata, soft-updates, LFS, portalfs, procfs, vnodes, memory sharing, memory objects, TLBs, caching
+
+[[ipc]]
+= Межпроцессное взаимодействие
+
+[[signals]]
+== Сигналы
+
+Сигналы, конвейеры, семафоры, очереди сообщений, совместно используемая память, сокеты, двери
+
+[[networking]]
+= Работа в сети
+
+[[sockets]]
+== Сокеты
+
+Сокеты, bpf, IP, TCP, UDP, ICMP, OSI, bridging, firewalling, NAT, коммутация и так далее
+
+[[networkfs]]
+= Сетевые файловые системы
+
+[[afs]]
+== AFS
+
+AFS, NFS, SANs etc]
+
+[[terminal]]
+= Работа с терминалами
+
+[[syscons]]
+== Системные консоли
+
+Syscons, tty, PCVT, последовательная консоль, хранители экрана и так далее
+
+[[sound]]
+= Звук
+
+[[oss]]
+== OSS
+
+OSS, waveforms, etc
+
+[[devicedrivers]]
+= Драйверы устройств
+
+[[usb]]
+== Устройства USB
+
+Эта глава расскажет о механизмах, используемых во FreeBSD для написания драйверов для устройств на шине USB.
+
+[[newbus]]
+== NewBus
+
+Эта глава расскажет об архитектуре NewBus во FreeBSD.
+
+[[architectures]]
+= Аппаратные платформы
+
+[[ia32]]
+== IA-32
+
+Рассказ об архитектурных особенностях FreeBSD/x86.
+
+[[alpha]]
+== Alpha
+
+Рассказ об архитектурных особенностях FreeBSD/alpha.
+
+Описание ошибок выравнивания, как их исправлять и как игнорировать.
+
+Пример ассемблерного кода для FreeBSD/alpha.
+
+[[ia64]]
+== IA-64
+
+Рассказ об архитектурных особенностях FreeBSD/ia64.
+
+[[debuggingpart]]
+= Отладка
+
+[[truss]]
+== Truss
+
+Различные описания того, как отлаживать отдельные компоненты системы при помощи утилит truss, ktrace, gdb, kgdb, etc
+
+[[compatibility]]
+= Обеспечение совместимости
+
+[[linux]]
+== Linux
+
+Linux, SVR4 и так далее
+
+// Appendices
+[[appendices]]
+[bibliography]
+= Приложения
+
+[[COD,1]] [1] Dave A Patterson and John L Hennessy. Copyright(R) 1998 Morgan Kaufmann Publishers, Inc. 1-55860-428-6. Morgan Kaufmann Publishers, Inc. Computer Organization and Design. The Hardware / Software Interface. 1-2.
+
+[[APUE, 2]] [2] W. Richard Stevens. Copyright(R) 1993 Addison Wesley Longman, Inc. 0-201-56317-7. Addison Wesley Longman, Inc. Advanced Programming in the Unix Environment. 1-2.
+
+[[DIFOS, 3]] [3] Marshall Kirk McKusick and George Neville-Neil. Copyright(R) 2004 Addison-Wesley. 0-201-70245-2. Addison-Wesley. The Design and Implementation of the FreeBSD Operating System. 1-2.
+
+[[Phrack, 4]] [4] Aleph One. Phrack 49; "Smashing the Stack for Fun and Profit".
+
+[[StackGuard, 5]] [5] Chrispin Cowan, Calton Pu, and Dave Maier. StackGuard; Automatic Adaptive Detection and Prevention of Buffer-Overflow Attacks.
+
+[[OpenBSD, 6]] [6] Todd Miller and Theo de Raadt. strlcpy and strlcat -- consistent, safe string copy and concatenation.
diff --git a/documentation/content/ru/books/developers-handbook/introduction/chapter.adoc b/documentation/content/ru/books/developers-handbook/introduction/chapter.adoc
new file mode 100644
index 0000000000..ca3d0c852c
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/introduction/chapter.adoc
@@ -0,0 +1,120 @@
+---
+title: Глава 1. Введение
+authors:
+ - author: Murray Stokely
+ - author: Jeroen Ruigrok van der Werven
+---
+
+[[introduction]]
+= Введение
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+
+[[introduction-devel]]
+== Разработка во FreeBSD
+
+Итак, у нас все есть. Система полностью установлена и вы готовы начать программировать. Но с чего начать? Что предоставляет FreeBSD? Что она может дать мне как программисту?
+
+Вот те из некоторых вопросов, на которые пытается дать ответ эта глава. Конечно, программирование, как и любая другая область деятельности, имеет разные уровни профессионального мастерства. Для некоторых это хобби, для других это профессия. Информация в этой главе может в большей степени пригодиться начинающему программисту, но может также оказаться полезной программисту, делающему первые шаги на платформе FreeBSD.
+
+[[introduction-bsdvision]]
+== Подход BSD
+
+Создать самую лучшую UNIX(R)-подобную операционную систему, благодаря оригинальной идеологии программных средств, а также полезности, производительности и надёжности.
+
+[[introduction-archguide]]
+== Архитектурные концепции
+
+Наша идеология может быть описана в следующих ключевых положениях
+
+* Не добавлять новой функциональности, кроме случаев, когда нельзя выполнить конкретную работу без нее.
+* Решить, чего в системе не будет, так же важно, как и определение того, чего в системе не будет. Не пытайтесь включить в систему все; лучше сделать систему расширяемой так, что дополнительные потребности могут быть реализованы в режиме совместимости.
+* Единственное, что может быть лучше обобщения на основе одного примера, это обобщение вообще без примеров.
+* Если проблема до конца не понята, наверное, лучше вовсе не давать ее решения.
+* Если вы можете сделать 90 процентов результата ценой 10 процентов работы, найдите более простое решение.
+* Старайтесь отделять сложные вещи.
+* Дайте механизм, а не правила. В частности, оставьте соглашения по пользовательскому интерфейсу клиенту.
+
+Из Scheifler Gettys: "X Window System"
+
+[[introduction-layout]]
+== Структура каталога [.filename]#/usr/src#
+
+Полный исходный код FreeBSD располагается в нашем общедоступном хранилище CVS. Исходный код обычно устанавливается в [.filename]#/usr/src#, который содержит следующие подкаталоги:
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Каталог
+| Описание
+
+|[.filename]#bin/#
+|Исходный код файлов из [.filename]#/bin#
+
+|[.filename]#contrib/#
+|Исходный код файлов программного обеспечения сторонних разработчиков.
+
+|[.filename]#crypto/#
+|Исходный код криптографической подсистемы
+
+|[.filename]#etc/#
+|Исходный код файлов из каталога [.filename]#/etc#
+
+|[.filename]#games/#
+|Исходный код файлов из [.filename]#/usr/games#
+
+|[.filename]#gnu/#
+|Утилиты, подпадающие под действие GNU Public License
+
+|[.filename]#include/#
+|Исходный код файлов из [.filename]#/usr/include#
+
+|[.filename]#kerberosIV/#
+|Исходный код Kerberos версии IV
+
+|[.filename]#kerberos5/#
+|Исходный код Kerberos версии 5
+
+|[.filename]#lib/#
+|Исходный код файлов из [.filename]#/usr/lib#
+
+|[.filename]#libexec/#
+|Исходный код файлов из [.filename]#/usr/libexec#
+
+|[.filename]#release/#
+|Файлы, которые требуются для создания релиза FreeBSD
+
+|[.filename]#sbin/#
+|Исходный код файлов из [.filename]#/sbin#
+
+|[.filename]#secure/#
+|Исходный код FreeSec
+
+|[.filename]#share/#
+|Исходный код файлов из [.filename]#/usr/share#
+
+|[.filename]#sys/#
+|Исходный код ядра
+
+|[.filename]#tools/#
+|Утилиты, используемые для поддержки и тестирования FreeBSD
+
+|[.filename]#usr.bin/#
+|Исходный код файлов из [.filename]#/usr/bin#
+
+|[.filename]#usr.sbin/#
+|Исходный код файлов из [.filename]#/usr/sbin#
+|===
diff --git a/documentation/content/ru/books/developers-handbook/kerneldebug/chapter.adoc b/documentation/content/ru/books/developers-handbook/kerneldebug/chapter.adoc
new file mode 100644
index 0000000000..cc8a098360
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/kerneldebug/chapter.adoc
@@ -0,0 +1,658 @@
+---
+title: Глава 10. Отладка ядра
+authors:
+ - author: Paul Richards
+ - author: Jörg Wunsch
+ - author: Robert Watson
+---
+
+[[kerneldebug]]
+= Отладка ядра
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+
+[[kerneldebug-obtain]]
+== Получение аварийного дампа ядра
+
+При работе ядра, находящегося в разработке (например: FreeBSD-CURRENT), при критичных условиях (к примеру: очень высокая средняя нагрузка, десятки тысяч соединений, исключительно большое количество одновременно работающих пользователей, сотни процессов man:jail[8] и так далее) или при использовании новой возможности в драйвере устройства в FreeBSD-STABLE (пример: PAE) оно иногда будет завершать свою работу аварийно. В случае, если это произошло, в этой главе показано, как извлекать полезную информацию из произошедшего сбоя.
+
+При аварийном завершении работы ядра перезагрузка системы неизбежна. После перезагрузки системы содержимое физической памяти системы (RAM) теряется, так же как и всё содержимое раздела подкачки перед сбоем. Для сохранения состояния физической памяти ядро использует устройство подкачки в качестве места временного хранения содержимого оперативной памяти после перезагрузки, следующей за аварийным завершением работы. С этой целью при загрузке FreeBSD после аварийного останова образ ядра может быть извлечён и применяться для отладки.
+
+[NOTE]
+====
+Устройство подкачки, которое было отконфигурировано в качестве устройства для дампа продолжает выступать в роли устройства подкачки. В настоящее время выполнение дампов на устройства, не предназначенные для организации подкачки (например, ленты или CDRW), не поддерживается. Понятие "устройство подкачки" является синонимом "раздела подкачки."
+====
+
+Чтобы суметь извлечь образ, который можно использовать, требуется, чтобы по крайней мере один раздел подкачки был достаточно большим, чтобы разместить на нём весь объём физической памяти. Когда ядро аварийно завершает работу, перед перезагрузкой системы, ядро достаточно умно, чтобы проверить, было ли отконфигурировано устройство подкачки в качестве устройства для хранения дампов. Если оно является устройством, подходящим для сброса дампа, то ядро сбрасывает содержимое физической памяти на устройство подкачки.
+
+[[config-dumpdev]]
+=== Конфигурация устройства хранения дампов
+
+До того, как ядро начнёт сбрасывать содержимое физической памяти на устройство хранения дампов, последнее должно быть отконфигурировано. Устройство хранения дампов задаётся при помощи команды man:dumpon[8], указывающей ядру, куда сохранять аварийные дампы ядра. Программа man:dumpon[8] должна быть вызвана после конфигурации раздела подкачки по команде man:swapon[8]. Обычно это осуществляется установкой переменной `dumpdev` в файле man:rc.conf[5] в значение, соответствующее пути к устройству подкачки (рекомендованный способ извлечения дампа ядра).
+
+Либо устройство для сброса образа памяти может быть задано явно в параметре `dump` строки man:config[5] конфигурационного файла вашего ядра. Такой способ использовать не рекомендуется и он должен использоваться, только если ядро аварийно завершает свою работу до того, как можно было бы запустить man:dumpon[8].
+
+[TIP]
+====
+
+Проверьте содержимое файла [.filename]#/etc/fstab# или выдачу man:swapinfo[8] на предмет наличия устройств подкачки.
+====
+
+[IMPORTANT]
+====
+Удостоверьтесь, что каталог `dumpdir`, указанный в man:rc.conf[5], существует до аварийного останова ядра!
+
+[source,bash]
+....
+# mkdir /var/crash
+# chmod 700 /var/crash
+....
+
+Запомните также, что содержимое [.filename]#/var/crash# является важной информацией, весьма вероятно, содержащей конфиденциальную информацию, в частности, пароли.
+====
+
+[[extract-dump]]
+=== Извлечение дампа ядра
+
+После того, как аварийный образ был записан на соответствующее устройство, его нужно извлечь до момента монтирования устройства подкачки. Для извлечения дампа из устройства его сохранения, воспользуйтесь утилитой man:savecore[8]. Если в файле man:rc.conf[5] было задано устройство `dumpdev`, то man:savecore[8] будет запущена автоматически при первой после аварийного останова загрузке в многопользовательском режиме и до монтирования устройства подкачки. Местоположение извлечённого образа памяти определяется значением переменной `dumpdir` из файла man:rc.conf[5], которое по умолчанию указывает на каталог [.filename]#/var/crash#, а файл будет называться [.filename]#vmcore.0#.
+
+В случае, если в каталоге [.filename]#/var/crash# (или в том, на который указывает `dumpdir`) уже существует файл с именем [.filename]#vmcore.0#, то ядро будет увеличивать порядковый номер для каждого аварийного останова, чтобы избежать перезаписи существующих файлов [.filename]#vmcore# (к примеру, [.filename]#vmcore.1#). В процессе отладки скорее всего, в качестве нужного [.filename]#vmcore# вы будете использовать версию [.filename]#vmcore# с наибольшим номером в [.filename]#/var/crash#.
+
+[TIP]
+====
+
+Если вы тестируете новое ядро, но вам нужно загрузить и работать с другим ядром, чтобы получить нормально функционирующую систему, то загрузите его в однопользовательском режиме при помощи флага `-s`, указываемого при загрузке, а затем выполните такие шаги:
+
+[source,bash]
+....
+# fsck -p
+# mount -a -t ufs
+# доступность /var/crash для записи
+# savecore /var/crash /dev/ad0s1b
+# exit
+....
+
+Эти команды указывают man:savecore[8] извлечь дамп ядра из устройства [.filename]#/dev/ad0s1b# и поместить его содержимое в каталог [.filename]#/var/crash#. Не забудьте проверить, что в целевом каталоге [.filename]#/var/crash# достаточно места для хранения дампа. Кроме того, не забудьте проверить правильность маршрута к вашему устройству подкачки, так как он, скорее всего, отличается от [.filename]#/dev/ad0s1b#!
+====
+
+Рекомендуемым и определённо самым простым способом автоматизации формирования аварийных образов является указание переменной `dumpdev` в файле man:rc.conf[5].
+
+[[kerneldebug-gdb]]
+== Отладка аварийного образа памяти ядра при помощи `kgdb`
+
+[NOTE]
+====
+В этом разделе описывается утилита man:kgdb[1], поставляемая с FreeBSD 5.3 и более поздними версиями. В предыдущих версиях для чтения файла аварийного дампа ядра необходимо использовать команду `gdb -k`.
+====
+
+После извлечения дампа памяти получение из него полезной информации для решения простых проблем является сравнительно лёгкой задачей. Перед тем, как погрузиться во внутренний интерфейс man:kgdb[1] для отладки аварийного образа памяти, найдите отладочную версию вашего ядра (обычно она имеет название [.filename]#kernel.debug#) и выясните маршрут к файлам исходных текстов, использованных для построения вашего ядра (обычно это [.filename]#/usr/obj/usr/src/sys/KERNCONF#), где в качестве _KERNCONF_ выступает значение `ident`, указанное конфигуратору ядра man:config[5]). Имея на руках эти два параметра, начнём отладку!
+
+Чтобы войти в отладчик и начать получать информацию из дампа, как минимум необходимо сделать следующие шаги:
+
+[source,bash]
+....
+# cd /usr/obj/usr/src/sys/KERNCONF
+# kgdb kernel.debug /var/crash/vmcore.0
+....
+
+Вы можете отлаживать аварийный дамп, используя исходные тексты ядра точно также, как вы это делаете с любой другой программой.
+
+Этот первый дамп взят из ядра 5.2-BETA, а сбой произошёл где-то глубоко внутри ядра. Нижеследующая выдача была модифицирована, в неё слева добавлены номера строк. При первой трассировке проверяется указатель команд и выдаётся обратная трассировка. Адрес, используемый в строке 41 для команды `list`, является указателем команд и он может быть найден в строке 17. Большинство разработчиков будут требовать предоставления им по крайней мере этой информации, если вы не можете отследить проблему самостоятельно. Если, однако, вы решите проблему, то обязательно добейтесь включения вашего патча в дерево исходных текстов, прислав его через сообщение об ошибке, списки рассылки или даже его непосредственным коммитом!
+
+[source,bash]
+....
+1:# cd /usr/obj/usr/src/sys/KERNCONF
+ 2:# kgdb kernel.debug /var/crash/vmcore.0
+ 3:GNU gdb 5.2.1 (FreeBSD)
+ 4:Copyright 2002 Free Software Foundation, Inc.
+ 5:GDB is free software, covered by the GNU General Public License, and you are
+ 6:welcome to change it and/or distribute copies of it under certain conditions.
+ 7:Type "show copying" to see the conditions.
+ 8:There is absolutely no warranty for GDB. Type "show warranty" for details.
+ 9:This GDB was configured as "i386-undermydesk-freebsd"...
+10:panic: page fault
+11:panic messages:
+12:---
+13:Fatal trap 12: page fault while in kernel mode
+14:cpuid = 0; apic id = 00
+15:fault virtual address = 0x300
+16:fault code: = supervisor read, page not present
+17:instruction pointer = 0x8:0xc0713860
+18:stack pointer = 0x10:0xdc1d0b70
+19:frame pointer = 0x10:0xdc1d0b7c
+20:code segment = base 0x0, limit 0xfffff, type 0x1b
+21: = DPL 0, pres 1, def32 1, gran 1
+22:processor eflags = resume, IOPL = 0
+23:current process = 14394 (uname)
+24:trap number = 12
+25:panic: page fault
+26 cpuid = 0;
+27:Stack backtrace:
+28
+29:syncing disks, buffers remaining... 2199 2199 panic: mi_switch: switch in a critical section
+30:cpuid = 0;
+31:Uptime: 2h43m19s
+32:Dumping 255 MB
+33: 16 32 48 64 80 96 112 128 144 160 176 192 208 224 240
+34:---
+35:Reading symbols from /boot/kernel/snd_maestro3.ko...done.
+36:Loaded symbols for /boot/kernel/snd_maestro3.ko
+37:Reading symbols from /boot/kernel/snd_pcm.ko...done.
+38:Loaded symbols for /boot/kernel/snd_pcm.ko
+39:#0 doadump () at /usr/src/sys/kern/kern_shutdown.c:240
+40:240 dumping++;
+41:(kgdb) list *0xc0713860
+42:0xc0713860 is in lapic_ipi_wait (/usr/src/sys/i386/i386/local_apic.c:663).
+43:658 incr = 0;
+44:659 delay = 1;
+45:660 } else
+46:661 incr = 1;
+47:662 for (x = 0; x < delay; x += incr) {
+48:663 if ((lapic->icr_lo & APIC_DELSTAT_MASK) == APIC_DELSTAT_IDLE)
+49:664 return (1);
+50:665 ia32_pause();
+51:666 }
+52:667 return (0);
+53:(kgdb) backtrace
+54:#0 doadump () at /usr/src/sys/kern/kern_shutdown.c:240
+55:#1 0xc055fd9b in boot (howto=260) at /usr/src/sys/kern/kern_shutdown.c:372
+56:#2 0xc056019d in panic () at /usr/src/sys/kern/kern_shutdown.c:550
+57:#3 0xc0567ef5 in mi_switch () at /usr/src/sys/kern/kern_synch.c:470
+58:#4 0xc055fa87 in boot (howto=256) at /usr/src/sys/kern/kern_shutdown.c:312
+59:#5 0xc056019d in panic () at /usr/src/sys/kern/kern_shutdown.c:550
+60:#6 0xc0720c66 in trap_fatal (frame=0xdc1d0b30, eva=0)
+61: at /usr/src/sys/i386/i386/trap.c:821
+62:#7 0xc07202b3 in trap (frame=
+63: {tf_fs = -1065484264, tf_es = -1065484272, tf_ds = -1065484272, tf_edi = 1, tf_esi = 0, tf_ebp = -602076292, tf_isp = -602076324, tf_ebx = 0, tf_edx = 0, tf_ecx = 1000000, tf_eax = 243, tf_trapno = 12, tf_err = 0, tf_eip = -1066321824, tf_cs = 8, tf_eflags = 65671, tf_esp = 243, tf_ss = 0})
+64: at /usr/src/sys/i386/i386/trap.c:250
+65:#8 0xc070c9f8 in calltrap () at {standard input}:94
+66:#9 0xc07139f3 in lapic_ipi_vectored (vector=0, dest=0)
+67: at /usr/src/sys/i386/i386/local_apic.c:733
+68:#10 0xc0718b23 in ipi_selected (cpus=1, ipi=1)
+69: at /usr/src/sys/i386/i386/mp_machdep.c:1115
+70:#11 0xc057473e in kseq_notify (ke=0xcc05e360, cpu=0)
+71: at /usr/src/sys/kern/sched_ule.c:520
+72:#12 0xc0575cad in sched_add (td=0xcbcf5c80)
+73: at /usr/src/sys/kern/sched_ule.c:1366
+74:#13 0xc05666c6 in setrunqueue (td=0xcc05e360)
+75: at /usr/src/sys/kern/kern_switch.c:422
+76:#14 0xc05752f4 in sched_wakeup (td=0xcbcf5c80)
+77: at /usr/src/sys/kern/sched_ule.c:999
+78:#15 0xc056816c in setrunnable (td=0xcbcf5c80)
+79: at /usr/src/sys/kern/kern_synch.c:570
+80:#16 0xc0567d53 in wakeup (ident=0xcbcf5c80)
+81: at /usr/src/sys/kern/kern_synch.c:411
+82:#17 0xc05490a8 in exit1 (td=0xcbcf5b40, rv=0)
+83: at /usr/src/sys/kern/kern_exit.c:509
+84:#18 0xc0548011 in sys_exit () at /usr/src/sys/kern/kern_exit.c:102
+85:#19 0xc0720fd0 in syscall (frame=
+86: {tf_fs = 47, tf_es = 47, tf_ds = 47, tf_edi = 0, tf_esi = -1, tf_ebp = -1077940712, tf_isp = -602075788, tf_ebx = 672411944, tf_edx = 10, tf_ecx = 672411600, tf_eax = 1, tf_trapno = 12, tf_err = 2, tf_eip = 671899563, tf_cs = 31, tf_eflags = 642, tf_esp = -1077940740, tf_ss = 47})
+87: at /usr/src/sys/i386/i386/trap.c:1010
+88:#20 0xc070ca4d in Xint0x80_syscall () at {standard input}:136
+89:---Can't read userspace from dump, or kernel process---
+90:(kgdb) quit
+....
+
+Во второй трассировке используется более старый дамп из времён FreeBSD 2, но он более сложный и показывает больше возможностей `gdb`. Длинные строки были усечены ради повышения читабельности, а также пронумерованы для того, чтобы ссылаться на них. Кроме этих отличий, это реальная трассировка ошибки, выполненная в процессе разработки консольного драйвера pcvt.
+
+[source,bash]
+....
+1:Script started on Fri Dec 30 23:15:22 1994
+ 2:# cd /sys/compile/URIAH
+ 3:# gdb -k kernel /var/crash/vmcore.1
+ 4:Reading symbol data from /usr/src/sys/compile/URIAH/kernel
+...done.
+ 5:IdlePTD 1f3000
+ 6:panic: because you said to!
+ 7:current pcb at 1e3f70
+ 8:Reading in symbols for ../../i386/i386/machdep.c...done.
+ 9:(kgdb) backtrace
+10:#0 boot (arghowto=256) (../../i386/i386/machdep.c line 767)
+11:#1 0xf0115159 in panic ()
+12:#2 0xf01955bd in diediedie () (../../i386/i386/machdep.c line 698)
+13:#3 0xf010185e in db_fncall ()
+14:#4 0xf0101586 in db_command (-266509132, -266509516, -267381073)
+15:#5 0xf0101711 in db_command_loop ()
+16:#6 0xf01040a0 in db_trap ()
+17:#7 0xf0192976 in kdb_trap (12, 0, -272630436, -266743723)
+18:#8 0xf019d2eb in trap_fatal (...)
+19:#9 0xf019ce60 in trap_pfault (...)
+20:#10 0xf019cb2f in trap (...)
+21:#11 0xf01932a1 in exception:calltrap ()
+22:#12 0xf0191503 in cnopen (...)
+23:#13 0xf0132c34 in spec_open ()
+24:#14 0xf012d014 in vn_open ()
+25:#15 0xf012a183 in open ()
+26:#16 0xf019d4eb in syscall (...)
+27:(kgdb) up 10
+28:Reading in symbols for ../../i386/i386/trap.c...done.
+29:#10 0xf019cb2f in trap (frame={tf_es = -260440048, tf_ds = 16, tf_\
+30:edi = 3072, tf_esi = -266445372, tf_ebp = -272630356, tf_isp = -27\
+31:2630396, tf_ebx = -266427884, tf_edx = 12, tf_ecx = -266427884, tf\
+32:_eax = 64772224, tf_trapno = 12, tf_err = -272695296, tf_eip = -26\
+33:6672343, tf_cs = -266469368, tf_eflags = 66066, tf_esp = 3072, tf_\
+34:ss = -266427884}) (../../i386/i386/trap.c line 283)
+35:283 (void) trap_pfault(&frame, FALSE);
+36:(kgdb) frame frame-<tf_ebp frame-<tf_eip
+37:Reading in symbols for ../../i386/isa/pcvt/pcvt_drv.c...done.
+38:#0 0xf01ae729 in pcopen (dev=3072, flag=3, mode=8192, p=(struct p\
+39:roc *) 0xf07c0c00) (../../i386/isa/pcvt/pcvt_drv.c line 403)
+40:403 return ((*linesw[tp-<t_line].l_open)(dev, tp));
+41:(kgdb) list
+42:398
+43:399 tp-<t_state |= TS_CARR_ON;
+44:400 tp-<t_cflag |= CLOCAL; /* cannot be a modem (:-) */
+45:401
+46:402 #if PCVT_NETBSD || (PCVT_FREEBSD >= 200)
+47:403 return ((*linesw[tp-<t_line].l_open)(dev, tp));
+48:404 #else
+49:405 return ((*linesw[tp-<t_line].l_open)(dev, tp, flag));
+50:406 #endif /* PCVT_NETBSD || (PCVT_FREEBSD >= 200) */
+51:407 }
+52:(kgdb) print tp
+53:Reading in symbols for ../../i386/i386/cons.c...done.
+54:$1 = (struct tty *) 0x1bae
+55:(kgdb) print tp-<t_line
+56:$2 = 1767990816
+57:(kgdb) up
+58:#1 0xf0191503 in cnopen (dev=0x00000000, flag=3, mode=8192, p=(st\
+59:ruct proc *) 0xf07c0c00) (../../i386/i386/cons.c line 126)
+60: return ((*cdevsw[major(dev)].d_open)(dev, flag, mode, p));
+61:(kgdb) up
+62:#2 0xf0132c34 in spec_open ()
+63:(kgdb) up
+64:#3 0xf012d014 in vn_open ()
+65:(kgdb) up
+66:#4 0xf012a183 in open ()
+67:(kgdb) up
+68:#5 0xf019d4eb in syscall (frame={tf_es = 39, tf_ds = 39, tf_edi =\
+69: 2158592, tf_esi = 0, tf_ebp = -272638436, tf_isp = -272629788, tf\
+70:_ebx = 7086, tf_edx = 1, tf_ecx = 0, tf_eax = 5, tf_trapno = 582, \
+71:tf_err = 582, tf_eip = 75749, tf_cs = 31, tf_eflags = 582, tf_esp \
+72:= -272638456, tf_ss = 39}) (../../i386/i386/trap.c line 673)
+73:673 error = (*callp-<sy_call)(p, args, rval);
+74:(kgdb) up
+75:Initial frame selected; you cannot go up.
+76:(kgdb) quit
+....
+
+Комментарии к вышеприведенному журналу:
+
+строка 6:::
+Это дамп, взятый при помощи DDB (смотри ниже), поэтому комментарий к аварийному останову имеет именно вид "because you said to!" и трассировка стека глубока; однако изначальной причиной перехода в DDB была аварийная остановка при возникновению ошибки страницы памяти.
+
+строка 20:::
+Это местонахождение функции `trap()` в трассировке стека.
+
+строка 36:::
+Принудительное использование новой границы стека; теперь это не нужно. Предполагается, что границы стека указывают на правильное расположение, даже в случае аварийного останова. Глядя на строку исходного кода 403, можно сказать, что весьма вероятно, что либо виноват доступ по указателю "tp", либо был выход за границы массива.
+
+строка 52:::
+Похоже, что виноват указатель, но он является допустимым адресом.
+
+строка 56:::
+Однако, очевидно, что он указывает на мусор, так что мы нашли нашу ошибку! (Для тех, кто не знаком с этой частью кода: `tp->t_line` служит для хранения режима канала консольного устройства, и это должно быть достаточно маленькое целое число.)
+
+[TIP]
+====
+
+Если в вашей системе регулярно происходят аварийные остановы, и вам не хватает места на диске, удаление старых файлов [.filename]#vmcore# в каталоге [.filename]#/var/crash# может сэкономить вам значительный объём дискового пространства!
+====
+
+[[kerneldebug-ddd]]
+== Отладка аварийного дампа с помощью DDD
+
+Возможно также и исследование аварийного дампа ядра при помощи такого графического отладчика, как `ddd` (вам потребуется установить порт [.filename]#devel/ddd#, чтобы использовать отладчик `ddd`). Добавьте флаг `-k` к командной строке `ddd`, которую вы обычно используете для его вызова. Например;
+
+[source,bash]
+....
+# ddd -k /var/crash/kernel.0 /var/crash/vmcore.0
+....
+
+После этого у вас должно получиться исследование аварийного дампа при помощи графического интерфейса `ddd`.
+
+[[kerneldebug-post-mortem]]
+== Посмертный анализ дампа
+
+Что делать, если ядро аварийно завершает работу, хотя этого вы не хотели и поэтому командой `config -g` его не компилировали? Здесь не всё ещё потеряно. Не паникуйте!
+
+Конечно, вам нужно включить создание аварийных дампов. Смотрите выше, что вы должны для этого сделать.
+
+Перейдите в каталог конфигурации ядра ([.filename]#/usr/src/sys/arch/conf#) и отредактируйте ваш конфигурационный файл. Раскомментируйте (или добавьте, если она не существует) такую строку:
+
+[.programlisting]
+....
+makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols
+....
+
+Перестройте ядро. Из-за изменения метки времени в Makefile будут перестроены и некоторые другие объектные файлы, например, [.filename]#trap.o#. К некоторому счастью, добавление опции `-g` не изменит все и вся в генерируемом коде, так что в конце концов вы получите новое ядро с тем же кодом, что и сбоящее ядро, но с отладочной информацией. По крайней мере, вы можете сравнить старый и новый размеры ядер командой man:size[1]. Если они не совпадают, то вам придется отказаться от вашей затеи.
+
+Исследуйте дамп так, как это описано выше. Отладочной информации может не хватать в некоторых местах, как это можно видеть в трассировке стека примера выше, когда некоторые функции выводятся без номеров строк и списка аргументов. Если вам нужно больше отладочной информации, удалите соответствующие объектные файлы, снова перекомпилируйте ядро и повторите сеанс работы `gdb -k`, пока не получите достаточно подробную информацию.
+
+Не гарантируется, что всё это будет работать, однако в большинстве случаев всё работает прекрасно.
+
+[[kerneldebug-online-ddb]]
+== Отладка ядра в режиме реального времени с помощью DDB
+
+Хотя `gdb -k` является отладчиком не реального времени с высокоуровневым пользовательским интерфейсом, есть несколько вещей, которые он сделать не сможет. Самыми важными из них являются точки останова и пошаговое выполнение кода ядра.
+
+Если вам нужно выполнять низкоуровневую отладку вашего ядра, то на этот случай имеется отладчик реального времени, который называется DDB. Он позволяет устанавливать точки останова, выполнять функции ядра по шагам, исследовать и изменять переменные ядра и прочее. Однако он не может использовать исходные тексты ядра и имеет доступ только к глобальным и статическим символам, а не ко всей отладочной информации, как в `gdb`.
+
+Чтобы отконфигурировать ваше ядро для включения DDB, добавьте строчку с параметром
+
+[.programlisting]
+....
+options DDB
+....
+
+в ваш конфигурационный файл, и перестройте ядро. (Обратитесь к link:{handbook}[Руководству по FreeBSD] для выяснения подробностей о конфигурации ядра FreeBSD).
+
+[NOTE]
+====
+Если у вас устаревшая версия загрузочных блоков, то отладочная информация может оказаться не загруженной. Обновите блоки загрузки; самые новые загружают символы для DDB автоматически.
+====
+
+После того, как ядро с DDB запущено, есть несколько способов войти в DDB. Первый, и самый простой, способ заключается в наборе флага загрузки `-d` прямо в приглашении загрузчика. Ядро будет запущено в режиме отладки и войдет в DDB до выполнения процедуры распознавания каких бы то ни было устройств. Поэтому вы можете выполнить отладку даже функций распознавания/присоединения устройств.
+
+Вторым способом является переход в режим отладчика сразу после загрузки системы. Есть два простых способа этого добиться. Если вы хотите перейти в отладчик из командной строки, просто наберите команду:
+
+[source,bash]
+....
+# sysctl debug.enter_debugger=ddb
+....
+
+Либо, если вы работаете за системной консолью, можете воспользоваться определенной комбинацией клавиш. По умолчанию для перехода в отладчик используется комбинация kbd:[Ctrl+Alt+ESC]. Для драйвера syscons эта последовательность может быть изменена, и в некоторых распространяемых раскладках это сделано, так что обязательно выясните правильную комбинацию. Для последовательных консолей имеется параметр, позволяющий использовать последовательность BREAK на канале консоли для входа в DDB (`options BREAK_TO_DEBUGGER` в конфигурационном файле ядра). По умолчанию этого не делается, так как существует множество последовательных адаптеров, которые ошибочно генерируют последовательность BREAK, к примеру, при отключении кабеля.
+
+Третий способ заключается во входе в DDB при возникновении любой аварийной ситуации, если ядро его использует. По этой причине не очень умно конфигурировать ядро с DDB для машины, которая работает без присмотра.
+
+Команды DDB примерно повторяют некоторые команды `gdb`. Первым делом вам, наверное, нужно задать точку останова:
+
+[source,bash]
+....
+ b function-name
+ b address
+....
+
+Значения по умолчанию воспринимаются в шестнадцатеричном виде, но чтобы отличать их от имен символов; шестнадцатеричные числа, начинающиеся с букв `a-f`, должны предваряться символами `0x` (это опционально для других чисел). Разрешены простые выражения, например: `function-name + 0x103`.
+
+Чтобы продолжить работу прерванного ядра, просто наберите:
+
+[source,bash]
+....
+ c
+....
+
+Чтобы получить трассировку стека, задайте:
+
+[source,bash]
+....
+ trace
+....
+
+[NOTE]
+====
+Заметьте, что при входе в DDB по специальной комбинации, ядро в данный момент обслуживает прерывание, так что трассировка стека может не дать вам много информации.
+====
+
+Если вы хотите убрать точку останова, введите
+
+[source,bash]
+....
+ del
+ del address-expression
+....
+
+В первом варианте команда будет исполнена сразу же по достижении точки останова, а текущая точка останова будет удалена. Во второй форме можно удалить любую точку останова, однако вам нужно будет указать ее точный адрес; его можно получить из:
+
+[source,bash]
+....
+ show b
+....
+
+Чтобы выполнить один шаг ядра, попробуйте:
+
+[source,bash]
+....
+ s
+....
+
+При этом будет осуществляться пошаговое выполнение функций, однако вы можете трассировать их с помощью DDB, пока не будет достигнуто соответствие возвращаемому значению:
+
+[source,bash]
+....
+ n
+....
+
+[NOTE]
+====
+Это отличается от команды `next` отладчика `gdb`; это похоже на команду `gdb finish`.
+====
+
+Чтобы выводить значения в памяти, используйте, (к примеру):
+
+[source,bash]
+....
+ x/wx 0xf0133fe0,40
+ x/hd db_symtab_space
+ x/bc termbuf,10
+ x/s stringbuf
+....
+
+для доступа к данным типа слово/полуслово/байт и вывода в шестнадцатеричном/десятичном/символьном виде. Число после запятой означает счетчик объектов. Чтобы вывести следующие 0x10 объектов, просто укажите:
+
+[source,bash]
+....
+ x ,10
+....
+
+Подобным же образом используйте
+
+[source,bash]
+....
+ x/ia foofunc,10
+....
+
+для дизассемблирования и вывода первых 0x10 инструкций функции `foofunc` вместе с их адресом относительно начала `foofunc`.
+
+Чтобы изменить значения в памяти, используйте команду write:
+
+[source,bash]
+....
+ w/b termbuf 0xa 0xb 0
+ w/w 0xf0010030 0 0
+....
+
+Модификатор команды (`b`/`h`/`w`) указывает на размер записываемых данных, первое следующее за ним выражение является адресом для записи, а оставшаяся часть интерпретируется как данные для записи в доступные области памяти.
+
+Если вам нужно узнать текущее содержимое регистров, используйте:
+
+[source,bash]
+....
+ show reg
+....
+
+Альтернативно вы можете вывести содержимое одного регистра по команде, скажем,
+
+[source,bash]
+....
+ p $eax
+....
+
+и изменить его по:
+
+[source,bash]
+....
+ set $eax new-value
+....
+
+Если вам нужно вызвать некоторую функцию ядра из DDB, просто укажите:
+
+[source,bash]
+....
+ call func(arg1, arg2, ...)
+....
+
+Будет выведено возвращаемое значение.
+
+Для вывода суммарной статистики по всем работающим процессам в стиле команды man:ps[1] воспользуйтесь такой командой:
+
+[source,bash]
+....
+ ps
+....
+
+Теперь вы узнали, почему ядро работает с ошибками и хотите выполнить перезагрузку. Запомните, что в зависимости от влияния предыдущих ошибок, не все части ядра могут работать так, как ожидается. Выполните одно из следующих действий для закрытия и перезагрузки вашей системы:
+
+[source,bash]
+....
+ panic
+....
+
+Это приведет к созданию дампа ядра и перезагрузке, так что позже вы можете проанализировать дамп на более высоком уровне при помощи `gdb`. Как правило, эта команда должна следовать за другой командой `continue`.
+
+[source,bash]
+....
+ call boot(0)
+....
+
+Это может оказаться хорошим способом для корректного закрытия работающей системы, `sync()` для всех дисков и напоследок перезагрузка. Пока интерфейсы диска и файловой системы в ядре не повреждены, это может быть самым правильным способом закрытия системы.
+
+[source,bash]
+....
+ call cpu_reset()
+....
+
+Это последнее средство при аварии и практически то же самое, что нажатие Большой Красной Кнопки.
+
+Если вам нужен краткий справочник по командам, просто наберите:
+
+[source,bash]
+....
+ help
+....
+
+Однако настоятельно рекомендуем отпечатать копию страницы справочника по man:ddb[4] при подготовке к сеансу отладки. Помните, что трудно читать онлайновое руководство при пошаговом выполнении ядра.
+
+[[kerneldebug-online-gdb]]
+== Отладка ядра в режиме реального времени при помощи удалённого GDB
+
+Эта возможность поддерживается во FreeBSD начиная с версии 2.2, и она на самом деле очень удобна.
+
+В GDB уже давно имеется поддержка _удаленной отладки_. Это делается при помощи весьма простого протокола по последовательному каналу. В отличие от других методов, описанных выше, для этого вам требуется наличие двух машин. Одна из них является хостом, предоставляющим ресурсы для отладки, включая все исходные тексты и копию ядра со всеми символами в нем, а другая является целевой машиной, на которой запущена та же копия того же ядра (но без отладочной информации).
+
+Вы должны настроить исследуемое ядро при помощи команды `config -g`, включить `DDB` в конфигурацию и откомпилировать его обычным образом. Это даст большой бинарный файл из-за отладочной информации. Скопируйте это ядро на целевую машину, усеките отладочную информацию командой `strip -x` и загрузите это ядро с использованием параметра загрузки `-d`. Подключите последовательный канал целевой машины, имеющий установленные флаги "flags 080" на соответствующем устройстве sio к любому последовательному каналу отладочного хоста. А теперь на отладочной машине перейдите в каталог компиляции целевого ядра и запустите `gdb`:
+
+[source,bash]
+....
+% gdb -k kernel
+GDB is free software and you are welcome to distribute copies of it
+ under certain conditions; type "show copying" to see the conditions.
+There is absolutely no warranty for GDB; type "show warranty" for details.
+GDB 4.16 (i386-unknown-freebsd),
+Copyright 1996 Free Software Foundation, Inc...
+(kgdb)
+....
+
+Проинициализируйте сеанс удаленной отладки (предполагается, что используется первый последовательный порт) такой командой:
+
+[source,bash]
+....
+(kgdb) target remote /dev/cuaa0
+....
+
+Теперь на целевом хосте (тот, который перешел в DDB даже до начала процесса обнаружения устройств) наберите:
+
+[source,bash]
+....
+Debugger("Boot flags requested debugger")
+Stopped at Debugger+0x35: movb $0, edata+0x51bc
+
+db> gdb
+....
+
+DDB ответит следующим:
+
+[source,bash]
+....
+Next trap will enter GDB remote protocol mode
+....
+
+Каждый раз, когда вы будете набирать `gdb`, режим будет меняться между удаленным GDB и локальным DDB. Чтобы немедленно вызвать следующее прерывание, просто наберите `s` (step). Ваш хостирующий GDB получит управление над целевым ядром:
+
+[source,bash]
+....
+Remote debugging using /dev/cuaa0
+Debugger (msg=0xf01b0383 "Boot flags requested debugger")
+ at ../../i386/i386/db_interface.c:257
+(kgdb)
+....
+
+Вы можете работать в этом сеансе точно также, как и в любом другом сеансе GDB, включая полный доступ к исходным текстам, запуск его в режиме gud-mode внутри окна Emacs (что даёт вам автоматический вывод исходного кода в другом окне Emacs) и тому подобное.
+
+[[kerneldebug-kld]]
+== Отладка загружаемых модулей с помощью GDB
+
+При отладке аварийного останова системы, которое произошло в модуле, или при использовании GDB в режиме удаленного доступа к машине, использующей динамические модули, вам нужно указать GDB, как получить информацию о символах в этих модулях.
+
+Первым делом вам нужно построить модуль (или модули) с включением отладочной информации:
+
+[source,bash]
+....
+# cd /sys/modules/linux
+# make clean; make COPTS=-g
+....
+
+Если вы используете GDB в режиме удаленного доступа, то для определения того, куда был загружен модуль, можете запустить команду `kldstat` на целевой машине:
+
+[source,bash]
+....
+# kldstat
+Id Refs Address Size Name
+ 1 4 0xc0100000 1c1678 kernel
+ 2 1 0xc0a9e000 6000 linprocfs.ko
+ 3 1 0xc0ad7000 2000 warp_saver.ko
+ 4 1 0xc0adc000 11000 linux.ko
+....
+
+Если вы отлаживаете аварийный дамп, вам потребуется просмотреть список `linker_files` начиная с `linker_files->tqh_first` и следовать указателям `link.tqe_next` до тех пор, пока не найдете запись с тем `filename`, который вы ищете. Элемент `address` этой записи является адресом загрузки модуля.
+
+Затем вам нужно определить смещение текстового сегмента модуля:
+
+[source,bash]
+....
+# objdump --section-headers /sys/modules/linux/linux.ko | grep text
+3 .rel.text 000016e0 000038e0 000038e0 000038e0 2**2
+ 10 .text 00007f34 000062d0 000062d0 000062d0 2**2
+....
+
+То, что вы ищете, является секцией `.text`, в примере выше это секция 10. Четвертое числовое поле (всего шестое по счёту) является смещением текстовой секции внутри файла. Добавьте это смещение к адресу загрузки, чтобы получить адрес, на который был перемещён код модуля. В нашем примере мы получим 0xc0adc000 + 0x62d0 = c0ae22d0. Воспользуйтесь командой `add-symbol-file` в GDB для указания отладчику на модуль:
+
+[source,bash]
+....
+(kgdb) add-symbol-file /sys/modules/linux/linux.ko 0xc0ae22d0
+add symbol table from file "/sys/modules/linux/linux.ko" at text_addr = 0xc0ae22d0?
+(y or n)
+(kgdb) y
+Reading symbols from /sys/modules/linux/linux.ko...done.
+(kgdb)
+....
+
+Теперь вы должны получить доступ ко всем символам в модуле.
+
+[[kerneldebug-console]]
+== Отладка драйвера консоли
+
+Так как для работы DDB вам требуется драйвер консоли, то в случае неисправностей самого драйвера консоли все становится гораздо сложнее. Вы можете вспомнить об использовании последовательной консоли (либо с исправленными загрузочными блоками, либо при указании флага `-h` в приглашении `Boot:`) и подключить обычный терминал к первому последовательному порту. DDB работает с любым отконфигурированным драйвером консоли, в том числе с последовательной консолью.
diff --git a/documentation/content/ru/books/developers-handbook/policies/chapter.adoc b/documentation/content/ru/books/developers-handbook/policies/chapter.adoc
new file mode 100644
index 0000000000..cf2c5c3594
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/policies/chapter.adoc
@@ -0,0 +1,176 @@
+---
+title: Глава 5. Рекомендации и требования к исходному коду
+authors:
+ - author: Poul-Henning Kamp
+ - author: Giorgos Keramidas
+---
+
+[[policies]]
+= Рекомендации и требования к исходному коду
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+
+В этой главе описываются различные рекомендации и требования, которые должны соблюдаться в дереве исходных текстов FreeBSD.
+
+[[policies-maintainer]]
+== в make-файлах
+
+Если некоторая часть дистрибутива FreeBSD поддерживается некоторым человеком или группой людей, они могут сообщить об этом миру, добавив строчку
+
+[.programlisting]
+....
+MAINTAINER= email-addresses
+....
+
+в файл [.filename]#Makefile#, соответствующий этой части исходного кода.
+
+Смысл этого в следующем:
+
+Сопровождающий владеет кодом и отвечает за него. Это означает, что он несет ответственность за исправление ошибок и закрывает сообщения о проблемах, имеющих отношение к этой части кода, а в случае программного обеспечения, взятого из третьих источников, соответственно отвечает за отслеживание новых версий.
+
+Изменения в каталогах, для которых известен сопровождающий, прежде чем они будут внесены, должны быть посланы ему на рассмотрение. Только если сопровождающий не отвечает в течение достаточно большого периода времени на несколько посланий по электронной почте, разрешается внести изменения без участия сопровождающего. Однако рекомендуется, чтобы вы попытались передать изменения на рассмотрение кому-либо еще, если это вообще возможно.
+
+Конечно же, нельзя назначать человека или группу лиц сопровождающими, если они не согласны выполнять эту работу. С другой стороны, необязательно это должен быть конкретный коммиттер, это может быть и группа людей.
+
+[[policies-contributed]]
+== Программное обеспечение сторонних производителей
+
+Некоторые части дистрибутива FreeBSD состоят из программного обеспечения, которое сопровождается вне проекта FreeBSD. По историческим причинам мы называем такое программное обеспечение _контрибуцированным_ (contributed), или третьих сторон. Примерами этого могут служить утилиты sendmail, gcc и patch.
+
+За последние несколько лет для работы с таким программным обеспечением использовались различные методы, и все они имели свои достоинства и недостатки. Абсолютно подходящего метода так и не нашлось.
+
+По этой причине после некоторых дебатов был выбран и признан "официальным" один из этих методов, который необходимо применять в будущем при импортировании такого рода программного обеспечения. Более того, настоятельно рекомендуется с течением времени перевести существующее программное обеспечение третьих сторон на этот метод, так как он имеет значительные преимущества перед старым методом, включая возможность легкого получения diff-файлов относительно "официальных" версий исходных текстов кем угодно (даже не имеющим доступа к cvs). Это делает данный метод гораздо проще в использовании при необходимости выдачи изменений изначальным разработчикам такого программного обеспечения.
+
+В конце концов, однако, это касается тех, кто делает реальную работу. Если использование этой модели в конкретном случае не подходит для пакета, с которым работает человек, могут быть сделаны и исключения только с согласия основной команды разработчиков и при общем одобрении других разработчиков. Возможность сопровождения пакета в будущем будет являться ключевым моментом при принятии решений.
+
+[NOTE]
+====
+Из-за досадных ограничений в дизайне формата файлов RCS и использовании веток поставщика в CVS, мелкие, тривиальные и/или косметические изменения _сильно не рекомендуется_ в файлах, которые все еще отслеживаются в ветке поставщика. Это касается и "исправления орфографических ошибок" как относящихся к категории "косметических" и избегаемых для файлов с версиями 1.1.x.x. Рост объема хранилища, вызванный изменением в один символ, может оказаться весьма большим.
+====
+
+В качестве примера того, как работает эта модель, будем использовать встраиваемый язык программирования TCL:
+
+Каталог [.filename]#src/contrib/tcl# содержит исходные тексты пакета в том виде, в котором они распространяются его создателями. Части, которые полностью не применимы во FreeBSD, могут быть удалены. В случае Tcl подкаталоги [.filename]#mac#, [.filename]#win# и [.filename]#compat# были удалены перед операцией импортирования
+
+Каталог [.filename]#src/lib/libtcl# содержит только файл [.filename]#Makefile# в стиле bmake, который использует стандартные правила [.filename]#bsd.lib.mk# make-файла для построения библиотеки и установки документации.
+
+В каталоге [.filename]#src/usr.bin/tclsh# размещаются make-файлы в стиле bmake, которые отвечают за построение и установку программы `tclsh` и связанных с ней справочных страниц при помощи стандартных правил из [.filename]#bsd.prog.mk#.
+
+Каталог [.filename]#src/tools/tools/tcl_bmake# содержит несколько shell-скриптов, которые могут помочь при обновлении программного обеспечения tcl. Они не являются частью строящегося и инсталлируемого программного обеспечения.
+
+Здесь важно то, что каталог [.filename]#src/contrib/tcl# создавался в соответствии с правилами: Предполагается, что он содержит исходные тексты в том виде, в котором они распространяются (в соответствующей ветви поставщика CVS и без расширения ключевых слов RCS) с максимально малым количеством изменений, специфичных для FreeBSD. Утилита 'easy-import' на машине поможет в импортировании, но если есть сомнения по поводу выполнения этой операции, то обязательно спросите совета и не действуйте слепо в расчете на то, что "все сработает". CVS не прощает ошибок импортирования и для ликвидации последствий больших ошибок требуются значительные усилия.
+
+Из-за ранее отмеченных ограничений дизайна веток поставщиков в CVS требуется, чтобы "официальные" патчи от разработчика были сначала применены к распространяемым исходным текстам, а затем результат снова импортирован в ветку поставщика. Официальные патчи никогда не должны применяться к версии, извлеченной из хранилища FreeBSD, а затем "коммититься", так как это приведет к рассинхронизации дерева производителя и усложнит импортирование будущих версий, так как возникнут конфликты.
+
+Так как многие пакеты содержат файлы, имеющие значение при обеспечении совместимости с другими, отличными от FreeBSD архитектурами и окружениями, то разрешается удалять части дистрибутивного дерева, не представляющие интереса для FreeBSD в целях уменьшения занимаемого дискового пространства. Файлы, содержащие замечания о юридических правах и информацию о релизе, касающуюся остальных файлов, удаляться _не_ должны.
+
+Если это видится легким, то файлы [.filename]#Makefile# в стиле `bmake` могут быть сгенерированы из дистрибутивного дерева автоматически некоторой утилитой, чем-то, что позволит еще проще обновляться до новой версии. Если это будет сделано, то обязательно поместите эту утилиту (если необходимо) в каталог [.filename]#src/tools# вместе с самим портом, чтобы она была доступна будущим сопровождающим лицам.
+
+В каталог [.filename]#src/contrib/tcl# должен быть добавлен файл [.filename]#FREEBSD-upgrade#, в котором нужно перечислить такие вещи:
+
+* Какие файлы были оставлены
+* Где был взят оригинальный дистрибутив и/или на каком основном официальном сайте он находится.
+* Куда посылать патчи для разработчиков пакета
+* Возможно, обзор сделанных изменений, специфичных для FreeBSD.
+
+Однако, пожалуйста, не импортируйте [.filename]#FREEBSD-upgrade# вместе с исходными текстами этого программного обеспечения. Вместо этого вы должны выполнить команды `cvs add FREEBSD-upgrade ; cvs ci` после первоначального импортирования. Ниже дается пример описания из каталога [.filename]#src/contrib/cpio#:
+
+[.programlisting]
+....
+This directory contains virgin sources of the original distribution files
+on a "vendor" branch. Do not, under any circumstances, attempt to upgrade
+the files in this directory via patches and a cvs commit. New versions or
+official-patch versions must be imported. Please remember to import with
+"-ko" to prevent CVS from corrupting any vendor RCS Ids.
+
+For the import of GNU cpio 2.4.2, the following files were removed:
+
+ INSTALL cpio.info mkdir.c
+ Makefile.in cpio.texi mkinstalldirs
+
+To upgrade to a newer version of cpio, when it is available:
+ 1. Unpack the new version into an empty directory.
+ [Do not make ANY changes to the files.]
+
+ 2. Remove the files listed above and any others that don't apply to
+ FreeBSD.
+
+ 3. Use the command:
+ cvs import -ko -m 'Virgin import of GNU cpio v<version>' \
+ src/contrib/cpio GNU cpio_<version>
+
+ For example, to do the import of version 2.4.2, I typed:
+ cvs import -ko -m 'Virgin import of GNU v2.4.2' \
+ src/contrib/cpio GNU cpio_2_4_2
+
+ 4. Follow the instructions printed out in step 3 to resolve any
+ conflicts between local FreeBSD changes and the newer version.
+
+Do not, under any circumstances, deviate from this procedure.
+
+To make local changes to cpio, simply patch and commit to the main
+branch (aka HEAD). Never make local changes on the GNU branch.
+
+All local changes should be submitted to "cpio@gnu.ai.mit.edu" for
+inclusion in the next vendor release.
+
+obrien@FreeBSD.org - 30 March 1997
+....
+
+[[policies-encumbered]]
+== Нежелательные файлы
+
+Иногда может быть необходимо включить некоторый нежелательный для нас файл в дерево исходных текстов FreeBSD. Например, если устройство требует загрузки в него некоторого маленького двоичного кода перед тем, как устройство заработает, и мы не имеем исходных текстов этого кода, то говорится, что двоичный файл является нежелательным. Для включения нежелательных файлов в дерево исходных текстов FreeBSD имеются следующие соглашения.
+
+. Любой файл, интерпретируемый или выполняемый системным(и) CPU, не в форме исходного кода, является нежелательным.
+. Любой файл с лицензией, ограничивающей более, чем BSD или GNU, является нежелательным.
+. Файл, содержащий загружаемые двоичные данные, используемые аппаратным обеспечением, не являются нежелательными, если только к нему не применимы условия (1) или (2). Он должен быть сохранен в нейтральном к архитектуре формате ASCII (рекомендуется применить утилиты file2c или uuencode).
+. Любой нежелательный файл требует особого одобрения со стороны link:{contributors}#staff-core/[Правления] до того, как он будет добавлен в хранилище CVS.
+. Нежелательные файлы помещаются в каталог [.filename]#src/contrib# или [.filename]#src/sys/contrib#.
+. Части одного модуля должны храниться вместе. Нет необходимости разбивать их, если только нет совместного использования с кодом, не являющимся нежелательным.
+. Объектные файлы именуются [.filename]#arch/filename.o.uu>#.
+. Файлы ядра;
+.. Должны всегда упоминаться в [.filename]#conf/files.*# (для упрощения построения).
+.. Должны всегда присутствовать в [.filename]#LINT#, но link:{contributors}#staff-core/[Правление] решает в каждом конкретном случае, должны ли они быть раскомментированы или нет. Конечно, позже link:{contributors}#staff-core/[Правление] может изменить свое решение.
+.. Вопрос о вхождении в состав релиза решается _Группой Выпусков Релизов_.
+
+. Файлы уровня пользователя:
+.. link:{contributors}#staff-core/[Правление] решает, должен ли код стать частью выполнения команды `make world`.
+.. link:{contributors}#staff-who/[Релиз инженер] решает, войдут ли они в релиз.
+
+[[policies-shlib]]
+== Динамические библиотеки
+
+Если вы добавляете поддержку динамических библиотек к порту или другой части программного обеспечения, которая этой возможностью не обладает, то номера версий должны назначаться по нижеследующим правилам. Как правило, получающиеся номера не имеют ничего общего с номером релиза программного обеспечения.
+
+При построении динамической библиотеки используются три принципа:
+
+* Начинаем с `1.0`
+* Если есть изменение, которое имеет обратную совместимость, увеличиваем младший номер версии (заметьте, что системы ELF его игнорируют)
+* Если есть изменение, не соблюдающее совместимость, увеличиваем старший номер версии
+
+К примеру, добавление функций и исправление ошибок приводит к увеличению младшего номера версии, а удаление функций, изменение синтаксиса вызова функции и тому подобные изменения приводят к изменению старшего номера версии.
+
+Следуйте схеме нумерации версий в форме старший.младший (_x_._y_). Наш динамический загрузчик формата a.out не умеет нормально работать с номерами версий в форме _x_._y_._z_. Любой номер версии после _y_ (то есть третье число) полностью игнорируется при сравнении номеров версий динамических библиотек для определения того, с какой библиотекой осуществлять компоновку. Если есть две динамические библиотеки, отличающиеся только "микро"-номером версии, то `ld.so` будет осуществлять компоновку с наибольшим номером. Другими словами: если вы компонуете с [.filename]#libfoo.so.3.3.3#, то компоновщик запишет в заголовках только `3.3` и будет выполнять компоновку с любой библиотекой, начинающейся с _libfoo.so.3.(все, что >= 3).(наибольшее из доступного)_.
+
+[NOTE]
+====
+`ld.so` всегда будет использовать наибольшую "младшую" версию. Иными словами: он будет предпочитать использовать [.filename]#libc.so.2.2#, а не [.filename]#libc.so.2.0#, даже если программа изначально была скомпонована с [.filename]#libc.so.2.0#.
+====
+
+Вдобавок наш динамический компоновщик ELF совсем не работает с младшими версиями. Однако все же нужно указывать старший и младший номер версии, а наши файлы [.filename]#Makefile#"сделают все как нужно" в зависимости от типа системы.
+
+Для библиотек не в составе портов, имеется наше соглашение на изменение номера версии динамической библиотеки только один раз между релизами. Кроме того, есть договоренность на изменение старшего номера динамической библиотеки только один раз между главными релизами ОС (например c 3.0 к 4.0). Когда вы делаете изменение в системной библиотеке, которое требует увеличения номера версии, посмотрите журналы коммитов изменений в файле [.filename]#Makefile#. Коммиттер отвечает за то, что первое такое изменение с момента релиза приведет к обновлению номера версии динамической библиотеки в файле [.filename]#Makefile#, а при других последующих изменениях этого бы не делалось.
diff --git a/documentation/content/ru/books/developers-handbook/secure/chapter.adoc b/documentation/content/ru/books/developers-handbook/secure/chapter.adoc
new file mode 100644
index 0000000000..0c78e275d2
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/secure/chapter.adoc
@@ -0,0 +1,168 @@
+---
+title: Глава 3. Безопасное программирование
+authors:
+ - author: Murray Stokely
+---
+
+[[secure]]
+= Безопасное программирование
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+
+[[secure-synopsis]]
+== Обзор
+
+Эта глава описывает некоторые из проблем обеспечения безопасности, которые десятилетиями преследовали программистов UNIX(R), а также несколько новых доступных инструментов, помогающих программистам избежать написания небезопасного кода.
+
+[[secure-philosophy]]
+== Методология обеспечения безопасности
+
+Написание безопасных приложений требует весьма критического и пессимистического взгляда на жизнь. Приложения должны работать по принципу "наименьших привилегий", при котором никакой процесс не должен работать с привилегиями, превышающими минимально необходимый для выполнения своих функций минимум. Ранее проверенный код должен использоваться там, где только это возможно для избежания общих ошибок, которые могли быть уже исправлены другими.
+
+Одной из неприятностей в среде UNIX(R) является легкость в предположении безопасности этого окружения. Приложения никогда не должны верить пользовательскому вводу (во всех его формах), ресурсам системы, межпроцессному взаимодействию или времени выполнения событий. Процессы UNIX(R) выполняются не синхронно, так что логические операции редко бывают атомарными.
+
+[[secure-bufferov]]
+== Переполнения буфера
+
+Переполнения буфера появились вместе с появление архитектуры Фон-Неймана <<COD,Впервые широкую известность они получили в 1988 году вместе с Интернет-червем Морриса (Morris). К сожалению, точно такая же атака остаётся эффективной и в наши дни. Из 17 бюллетеней безопасности CERT за 1999 год, 10 были непосредственно вызваны ошибкам в программном обеспечении, связанным с переполнениями буфера. Самые распространенные типы атак с использованием переполнения буфера основаны на разрушении стека.>>
+
+Самые современные вычислительные системы используют стек для передачи аргументов процедурам и сохранения локальных переменных. Стек является буфером типа LIFO (последним вошел первым вышел) в верхней части области памяти процесса. Когда программа вызывает функцию, создается новая "граница стека". Эта граница состоит из аргументов, переданных в функцию, а также динамического количества пространства локальных переменных. "Указатель стека" является регистром, хранящим текущее положение вершины стека. Так как это значение постоянно меняется вместе с помещением новых значений на вершину стека, многие реализации также предусматривают "указатель границы", который расположен около начала стека, так что локальные переменные можно легко адресовать относительно этого значения. <<COD,Адрес возврата из функции также сохраняется в стеке, и это является причиной нарушений безопасности, связанных с переполнением стека, так как перезаписывание локальной переменной в функции может изменить адрес возврата из этой функции, потенциально позволяя злоумышленнику выполнить любой код.>>
+
+Хотя атаки с переполнением стека являются самыми распространенными, стек можно также перезаписать при помощи атаки, основанной на выделении памяти (malloc/free) из "кучи".
+
+Как и во многих других языках программирования, в C не выполняется автоматической проверки границ в массивах или указателях. Кроме того, стандартная библиотека C полна очень опасных функций.
+
+[.informaltable]
+[cols="", frame="none"]
+|===
+|===
+
+== Пример переполнения буфера
+
+В следующем примере кода имеется ошибка переполнения буфера, предназначенная для перезаписи адреса возврата и обхода инструкции, следующей непосредственно за вызовом функции. (По мотивам <<Phrack,)>>
+
+[.programlisting]
+....
+#include stdio.h
+
+void manipulate(char *buffer) {
+ char newbuffer[80];
+ strcpy(newbuffer,buffer);
+}
+
+int main() {
+ char ch,buffer[4096];
+ int i=0;
+
+ while ((buffer[i++] = getchar()) != '\n') {};
+
+ i=1;
+ manipulate(buffer);
+ i=2;
+ printf("The value of i is : %d\n",i);
+ return 0;
+}
+....
+
+Давайте посмотрим, как будет выглядеть образ процесса, если в нашу маленькую программу мы введем 160 пробелов.
+
+[XXX figure here!]
+
+Очевидно, что для выполнения реальных инструкций (таких, как exec(/bin/sh)), может быть придуман более вредоносный ввод.
+
+=== Как избежать переполнений буфера
+
+Самым прямолинейным решением проблемы переполнения стека является использование только памяти фиксированного размера и функций копирования строк. Функции `strncpy` и `strncat` являются частью стандартной библиотеки C. Эти функции будут копировать не более указанного количества байт из исходной строки в целевую. Однако у этих функций есть несколько проблем. Ни одна из них не гарантирует наличие символа NUL, если размер входного буфера больше, чем целевого. Параметр длины также по-разному используется в strncpy и strncat, так что для программистов легко запутаться в правильном использовании. Есть также и значительная потеря производительности по сравнению с `strcpy` при копировании короткой строки в большой буфер, потому что `strncpy` заполняет символами NUL пространство до указанной длины.
+
+Для избежания этих проблем в OpenBSD была сделана другая реализация копирования памяти. Функции `strlcpy` и `strlcat` гарантируют, что они они всегда терминируют целевую строку нулевым символом, если им будет передан аргумент ненулевой длины. Более подробная информация об этом находится здесь <<OpenBSD,Инструкции OpenBSD `strlcpy` и `strlcat` существуют во FreeBSD начиная с версии 3.3.>>
+
+==== Вкомпилированная проверка границ во время выполнения
+
+К сожалению, все еще широко используется очень большой объём кода, который слепо копирует память без использования только что рассмотренных функций с проверкой границ. Однако есть другое решение. Существует несколько расширений к компилятору и библиотек для выполнения контроля границ во время выполнения (C/C++).
+
+Одним из таких добавлений является StackGuard, который реализован как маленький патч к генератору кода gcc. Согласно http://immunix.org/stackguard.html[web сайту StackGuard]:
+
+"StackGuard распознает и защищает стек от атак, не позволяя изменять адрес возврата в стеке. При вызове функции StackGuard помещает вслед за адресом возврата сигнальное слово. Если после возврата из функции оно оказывается измененным, то была попытка выполнить атаку на стек, и программа отвечает на это генерацией сообщения о злоумышленнике в системном журнале, а затем прекращает работу."
+
+"StackGuard реализован в виде маленького патча к генератору кода gcc, а именно процедур function_prolog() и function_epilog(). function_prolog() усовершенствована для создания пометок в стеке при начале работы функции, а function_epilog() проверяет целостность пометки при возврате из функции. Таким образом, любые попытки изменения адреса возврата определяются до возврата из функции."
+
+Перекомпиляция вашего приложения со StackGuard является эффективным способом остановить большинство атак переполнений буфера, но все же полностью это проблемы не решает.
+
+==== Проверка границ во время выполнения с использованием библиотек.
+
+Механизмы на основе компилятора полностью бесполезны для программного обеспечения, поставляемого в двоичном виде, которое вы не можете перекомпилировать. В этих ситуациях имеется некоторое количество библиотек, в которых реализованы небезопасные функции библиотеки C (`strcpy`, `fscanf`, `getwd`, и так далее..), обеспечивающие невозможность записи после указателя стека.
+
+* libsafe
+* libverify
+* libparanoia
+
+К сожалению, эти защиты имеют некоторое количество недостатков. Эти библиотеки могут защитить только против малого количества проблем, и не могут исправить реальные проблемы. Эти защиты могут не сработать, если приложение скомпилировано с параметром -fomit-frame-pointer. К тому же переменные окружения LD_PRELOAD и LD_LIBRARY_PATH могут быть переопределены/сняты пользователем.
+
+[[secure-setuid]]
+== Проблемы с установленным битом UID
+
+Имеется по крайней мере 6 различных идентификаторов (ID), связанных с любым взятым процессом. Поэтому вы должны быть очень осторожны с тем, какие права имеет ваш процесс в каждый момент времени. В частности, все seteuid-приложения должны понижать свои привилегии, как только в них отпадает необходимость.
+
+Реальный ID пользователя может быть изменен только процессом администратора. Программа login устанавливает его, когда пользователь входит в систему, и он редко меняется.
+
+Эффективный ID пользователя устанавливается функциями `exec()`, если у программы установлен бит seteuidt. Приложение может выполнить вызов `seteuid()` в любой момент для установки эффективного ID пользователя в значение реального ID пользователя или сохраняемого set-user-ID. Когда эффективный ID пользователя устанавливается функциями `exec()`, его предыдущее значение сохраняется в сохраняемом set-user-ID.
+
+[[secure-chroot]]
+== Ограничение среды работы вашей программы
+
+Традиционно используемым методом ограничения процесса является использование системного вызова `chroot()`. Этот системный вызов меняет корневой каталог, относительно которого определяются все остальные пути в самом процессе и всех порожденных ими процессах. Для того, чтобы этот вызов был выполнен успешно, процесс должен иметь право на выполнение (поиск) каталога, о котором идет речь. Новая среда реально не вступит в силу, пока вы не выполните вызов `chdir()` в вашей новой среде. Следует также отметить, что процесс может с легкостью выйти из chroot-среды, если он имеет привилегии администратора. Это может быть достигнуто созданием файлов устройств для чтения памяти ядра, подключением отладчика к процессу вне узницы и многими другими способами.
+
+Поведение системного вызова `chroot()` можно некоторым образом контролировать `sysctl`-переменной kern.chroot_allow_open_directories. Когда эта переменная установлена в 0, `chroot()` не сработает с ошибкой EPERM, если есть какие-либо открытые каталоги. Если она установлена в значение по умолчанию, равное 1, то `chroot()` не сработает с ошибкой EPERM, если есть какие-либо открытые каталоги и процесс уже подвергнут вызову `chroot()`. Для всех других значений проверка открытости каталогов будет полностью опущена.
+
+=== Функциональность джейлов (jail) во FreeBSD
+
+Концепция джейлов (Jail) расширяет возможности `chroot()`, ограничивая власть администратора созданием настоящих `виртуальных серверов'. Как только тюремная камера создана, все сетевые коммуникации должны осуществляться через выделенный адрес IP, а сила "привилегий пользователя root" в этой тюрьме довольно ограничена.
+
+При работе внутри тюрьмы, любые проверки силы администратора в ядре при помощи вызова `suser()` будут оканчиваться неудачно. Однако некоторые вызовы к `suser()` были изменены на новый интерфейс `suser_xxx()`. Эта функция отвечает за распознание и разрешение доступа к власти администратора для процессов, не находящихся в неволе.
+
+Процесс администратора внутри среды джейла имеет право:
+
+* Манипулировать привилегиями с помощью `setuid`, `seteuid`, `setgid`, `setegid`, `setgroups`, `setreuid`, `setregid` и `setlogin`
+* Устанавливать ограничения на использование ресурсов при помощи `setrlimit`
+* Модифицировать некоторые sysctl-переменные (kern.hostname)
+* `chroot()`
+* Устанавливать следующие флаги на vnode: `chflags`, `fchflags`
+* Устанавливать такие атрибуты vnode, как права доступа к файлу, изменять его владельца, группу, размер, время доступа и модификации.
+* Осуществлять привязку к привилегированному порту в области портов Интернет (порты с номерами 1024)
+
+`Jail` является очень полезным инструментом для запуска приложений в защищенном окружении, но есть и некоторые недостатки. На текущий момент к формату `suser_xxx` не преобразованы механизмы IPC, так что такие приложения, как MySQL, не могут работать в джейле. Права администратора могут имеет малую силу внутри джейла, но нет способа определить, что значит "малую".
+
+=== POSIX(R).1e возможности процессов
+
+POSIX(R) выпустила рабочий документ, который добавляет аудит событий, списки управления доступом, тонко настраиваемые привилегии, метки информации и жесткое управление доступом.
+
+Этот документ находится в работе и находится в центре внимания проекта http://www.trustedbsd.org/[TrustedBSD]. Некоторая начальная функциональность уже была добавлена во FreeBSD-CURRENT (cap_set_proc(3)).
+
+[[secure-trust]]
+== Доверие
+
+Приложение никогда не должно полагать, что среда пользователя безопасна. Сюда включается (но этим не ограничено): ввод пользователя, сигналы, переменные среды, ресурсы, IPC, отображаемая в файл память (mmap), рабочий каталог файловой системы, дескрипторы файлов, число открытых файлов и прочее.
+
+Никогда не думайте, что сможете предусмотреть все формы неправильного ввода, который может дать пользователь. Вместо этого ваше приложение должно осуществлять позитивную фильтрацию, пропуская только конечное множество возможных вариантов ввода, которые вы считаете безопасными. Неполная проверка данных была причиной многих нарушений защиты, особенно CGI-скриптов на веб-сайтах. Для имен файлов вам нужно уделять особое внимание путям ("../", "/"), символическим ссылкам и экранирующим символам оболочки.
+
+В Perl имеется такая очень полезная вещь, как "безупречный" (taint) режим, который можно использовать для запрещения скриптам использовать данные, порожденные вне программы, не безопасным способом. Этот режим проверяет аргументы командной строки, переменные окружения, информацию локализации, результаты некоторых системных вызовов (`readdir()`, `readlink()`, `getpwxxx()` и весь файловый ввод.
+
+[[secure-race-conditions]]
+== Неожиданное поведение
+
+Неожиданное поведение - это аномальное поведение, вызванное непредусмотренной зависимостью от относительной последовательности событий. Другими словами, программист неправильно предположил, что некоторое событие всегда случается перед другим.
+
+Некоторые из широко распространенных причин возникновения таких проблем являются сигналы, проверки доступа и открытия файлов. Сигналы по своей природе являются асинхронными событиями, так что по отношению к ним нужно проявлять особое внимание. Проверка доступа функцией `access(2)` с последующим вызовом `open(2)` полностью не атомарно. Пользователи могут переместить файлы в промежутке между двумя вызовами. Вместо этого привилегированное приложение должно выполнить `seteuid()`, а затем сразу вызвать `open()`. В тех же строках приложение должно всегда устанавливать явно маску прав доступа (umask) перед вызовом функции `open()` во избежание беспорядочных вызовов `chmod()`.
diff --git a/documentation/content/ru/books/faq/_index.adoc b/documentation/content/ru/books/faq/_index.adoc
new file mode 100644
index 0000000000..a976363626
--- /dev/null
+++ b/documentation/content/ru/books/faq/_index.adoc
@@ -0,0 +1,3076 @@
+---
+title: Часто задаваемые вопросы по FreeBSD 11.X и 12.X
+authors:
+ - author: Проект документации FreeBSD
+copyright: 1995-2020 The FreeBSD Documentation Project
+releaseinfo: "$FreeBSD$"
+trademarks: ["freebsd", "ibm", "ieee", "adobe", "intel", "linux", "microsoft", "opengroup", "sun", "netbsd", "general"]
+---
+
+= Часто задаваемые вопросы по FreeBSD {rel2-relx} и {rel-relx}
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnums:
+:sectnumlevels: 6
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:part-signifier: Часть
+:chapter-signifier: Глава
+:appendix-caption: Приложение
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:rel-numbranch: 3
+:rel-head: 13-CURRENT
+:rel-head-relx: 13.X
+:rel-head-releng: head/
+:rel-relx: 12.X
+:rel-stable: 12-STABLE
+:rel-releng: stable/12/
+:rel-relengdate: December 2018
+:rel2-relx: 11.X
+:rel2-stable: 11-STABLE
+:rel2-releng: stable/11/
+:rel2-relengdate: October 2016
+
+ifeval::["{backend}" == "html5"]
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+include::../../../../shared/mirrors.adoc[]
+include::../../../../shared/authors.adoc[]
+include::../../../../shared/releases.adoc[]
+include::../../../../shared/ru/mailing-lists.adoc[]
+include::../../../../shared/ru/teams.adoc[]
+include::../../../../shared/ru/urls.adoc[]
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+include::../../../../shared/mirrors.adoc[]
+include::../../../../shared/authors.adoc[]
+include::../../../../shared/releases.adoc[]
+include::../../../../shared/ru/mailing-lists.adoc[]
+include::../../../../shared/ru/teams.adoc[]
+include::../../../../shared/ru/urls.adoc[]
+endif::[]
+
+[.abstract-title]
+Аннотация
+
+Этот документ является так называемым FAQ (Frequently Asked Questions), то есть списком Часто Задаваемых Вопросов по FreeBSD версий {rel3-relx}, {rel2-relx} и {rel-relx}. Мы прилагаем все усилия, чтобы сделать этот FAQ максимально информативным; если у вас есть идеи по его усовершенствованию, шлите их на адрес {freebsd-doc}.
+
+Последняя редакция этого документа всегда доступна с link:{faq}[Web-сервера FreeBSD]. Его также можно получить в виде одного большого link:.[ HTML-файла] по HTTP или в ряде других форматов с link:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/[FTP-сервера].
+
+'''
+
+toc::[]
+
+== Вступление
+
+=== FreeBSD - что это такое?
+
+FreeBSD - это современная операционная система для настольных компьютеров, ноутбуков, серверов и встраиваемых систем с поддержкой большого количества http://www.FreeBSD.org/ru/platforms/[платформ].
+
+В основе FreeBSD лежит операционная система "4.4BSD-Lite" Калифорнийского Университета (Беркли) с некоторыми усовершенствованиями из "4.4BSD-Lite2". Также она косвенно базируется на 386BSD (BSD Net/2, перенесённой на платформу i386(TM) Уильямом Джолитцем (William Jolitz)), хотя от того первоначального кода осталось очень мало.
+
+FreeBSD используется компаниями, Интернет-провайдерами, научными работниками, профессионалами в вычислительной технике, студентами и рядовыми пользователями по всему миру для работы, образования и отдыха.
+
+Для более детального знакомства с FreeBSD обратитесь к link:{handbook}/[Руководству по FreeBSD].
+
+[[FreeBSD-goals]]
+=== Какова цель FreeBSD?
+
+Цель проекта FreeBSD - предоставить быструю и стабильную операционную систему общего назначения, которую можно использовать в любых целях без каких-либо ограничений.
+
+=== Есть ли в лицензии FreeBSD какие-то ограничения?
+
+Да. Эти ограничения не касаются аспектов использования кода, но главным образом описывают отношение к Проекту FreeBSD. Текст лицензионного соглашения доступен http://www.FreeBSD.org/ru/copyright/freebsd-license/[здесь], и вкратце он может быть изложен следующим образом:
+
+* Не говорите, что это написано вами.
+* Не судитесь с нами, если что-то не работает.
+* Не удаляйте и не изменяйте лицензию.
+
+Многие из нас вкладывают в проект значительные усилия и определённо были бы не против получения финансовой поддержки, но требовать её мы не будем. Мы надеемся, что наша основная и самая значительная "миссия" - предоставить код всем желающим, для любых целей, так чтобы он нашел самое широкое применение и принёс наибольшую пользу. Это, на наш взгляд, одна из самых фундаментальных целей Free Software, которую мы с энтузиазмом поддерживаем.
+
+Часть исходного кода нашей системы, подпадающая под действие http://www.FreeBSD.org/copyright/COPYING[GNU General Public License (GPL)] или http://www.FreeBSD.org/copyright/COPYING.LIB[GNU Library General Public License (LGPL)], имеет несколько больше ограничений, хотя и представляет собой навязывание доступа к исходным текстам, а не наоборот, как обычно. Из-за дополнительных сложностей, которые могут возникнуть в случае коммерческого использования программного обеспечения GPL, мы стараемся, где только это возможно, заменить подобное программное обеспечение аналогичным, но подпадающим под менее строгую http://www.FreeBSD.org/copyright/freebsd-license/[ лицензию FreeBSD].
+
+=== Может ли FreeBSD заменить операционную систему, используемую мною сейчас?
+
+Для большинства людей, да. Но этот ответ не так уж однозначен.
+
+Большинство пользователей на самом деле не используют операционную систему. Они работают с приложениями. Именно прикладные программы и используют операционную систему. FreeBSD разработана для того, чтобы дать надежное и полнофункциональное окружение для приложений. Она поддерживает широкий спектр Web-браузеров, офисных пакетов, программ для работы с электронной почтой, графических пакетов, программных сред, сетевых серверов и многое другое. Большинство этих приложений могут быть получено из http://www.FreeBSD.org/ports/[Коллекции Портов].
+
+Если приложение доступно только для одной операционной системы, то нельзя всего лишь заменить эту операционную систему. Однако есть вероятность, что похожая программа существует для FreeBSD. В качестве сервера для офиса, или сервера Интернет, или надежной рабочей станции FreeBSD практически всегда справится со всем, что вам нужно. Многие пользователи по всему миру, включая как новичков, так и опытных администраторов UNIX(R), используют FreeBSD в качестве своей единственной настольной операционной системы.
+
+Пользователи при переходе на FreeBSD с другого варианта UNIX(R) найдут для себя FreeBSD очень похожей. Пользователей Windows(R) и Mac OS(R), напротив, может заинтересовать http://www.pcbsd.org/[PC-BSD], дистрибутив на основе FreeBSD. Пользователям, которые не использовали до этого UNIX(R), понадобится затратить дополнительное время на изучение подхода UNIX(R) к работе. Этот FAQ и link:{handbook}[Руководство по FreeBSD] являются прекрасным способом начать это изучение.
+
+=== Почему система называется именно FreeBSD?
+
+* Она может использоваться безо всяческих выплат, даже для извлечения выгоды.
+* Все исходные тексты операционной системы свободно доступны, на её использование в других разработках (как коммерческих, так и некоммерческих) и дальнейшее распространение наложены минимальные ограничения.
+* Любой, у кого есть усовершенствования или исправления, может предоставить свой код и он будет (правда, с парой оговорок) добавлен в исходные тексты системы.
+
+Следует отметить, что слово "free" используется здесь в двух смыслах: один означает "бесплатно", а другой "делать всё, что хотите". За исключением пары вещей, которые вы _не можете_ делать с FreeBSD, например, претендовать на то, что являетесь её разработчиком, на самом деле можно делать с ней всё, что вам заблагорассудится.
+
+=== В чём заключается разница между FreeBSD и NetBSD, OpenBSD и другими операционными системами с открытыми кодами семейства BSD?
+
+Джеймс Ховард (James Howard) создал хорошее описание истории и различий между различными проектами под названием http://www.freebsdworld.gr/freebsd/bsd-family-tree.html[Семейное древо BSD], в котором даётся подробный ответ на этот вопрос. Некоторая информация там устарела, но историческая часть остаётся точной.
+
+Многие из проектов семейства BSD обмениваются изменениями и готовым кодом даже сегодня. Все они происходят от общего предка.
+
+Цели проекта FreeBSD описаны выше в <<FreeBSD-goals>>. Цели других наиболее известных проектов семейства BSD можно кратко описать так:
+
+* OpenBSD в первую очередь ориентируется на безопасность операционной системы. Команда OpenBSD написала man:ssh[1] и man:pf[4], которые затем были портированы во FreeBSD.
+* NetBSD ориентируется на простое портирование на другие аппаратные платформы.
+* DragonFly BSD отделилась от FreeBSD 4.8, и с тех пор в ней были разработаны многие интересные собственные функциональные возможности, включая файловую систему HAMMER и поддержку "vkernels" - запуска ядра в пользовательском режиме.
+
+=== Какова последняя версия FreeBSD?
+
+На любом этапе разработки FreeBSD может существовать несколько параллельных веток. Релизы {rel-relx} выполняются из ветки {rel-stable}, а релизы {rel2-relx} выполняются из {rel2-stable}.
+
+До выпуска 9.0 линейка {rel2-relx} была известна как _-STABLE_. Однако к моменту выхода {rel-head-relx} линейка {rel2-relx} получит статус "extended support" (расширенная поддержка), и исправления будут вноситься только для серьезных проблем, к примеру исправления, связанные с безопасностью.
+
+Версия link:ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/i386/{rel120-current}-RELEASE/[{rel120-current}], дата выхода {rel120-current-date}, является последним релизом в ветке {rel-stable}. Версия link:ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/{rel112-current}-RELEASE/[{rel112-current}], дата выхода {rel112-current-date}, является последним релизом в ветке {rel2-stable}.
+
+Если вкратце, то ветка _-STABLE_ предназначена поставщикам услуг Internet, корпоративным пользователям, а также всем тем, кому в первую очередь нужна надёжность и минимальное количество отличий от последнего релиза по сравнению с новыми (и, возможно, ненадёжно работающими) возможностями последнего снэпшота _-CURRENT_. Релизы можно делать из любой ветки, но _-CURRENT_ предназначен для пользователей, которые готовы к постоянным (по сравнению со _-STABLE_) изменениям в работе системы.
+
+Релизы делаются <<release-freq,раз в несколько месяцев>>. Хотя многие стараются отслеживать актуальное состояние исходных текстов FreeBSD (обратите внимание на вопросы о <<current,FreeBSD-CURRENT>> и <<stable,FreeBSD-STABLE>>), делать это не обязательно, так как исходные тексты постоянно меняются.
+
+Более полную информацию о релизах FreeBSD можно получить на странице http://www.FreeBSD.org/ru/releng/[Информации о подготовке релизов] и на странице Справочника man:release[7].
+
+=== Что такое FreeBSD-CURRENT?
+
+link:{handbook}#current[ FreeBSD-CURRENT] - это версия операционной системы, находящаяся в стадии разработки, которая должна потом стать новой веткой FreeBSD-STABLE. Таким образом, она представляет реальный интерес только для разработчиков системы и её фанатов. Обратитесь к link:{handbook}#current[соответствующему разделу] link:{handbook}[Руководства] для прояснения деталей работы с _-CURRENT_.
+
+Пользователям, не знакомым с FreeBSD, не следует использовать FreeBSD-CURRENT. Эта ветвь зачастую меняется очень быстро и иногда из-за ошибок может быть не работоспособна. Те, кто используют FreeBSD-CURRENT, должны быть в состоянии изучить проблему, найти причину и сообщить о этом.
+
+Из веток _-CURRENT_ и _-STABLE_ выпускаются link:https://www.FreeBSD.org/snapshots/[снэпшоты] FreeBSD. Их предназначение:
+
+* Тестирование самой последней версии программы установки системы.
+* Дать людям, которые хотят работать с _-CURRENT_ или _-STABLE_, но не имеют времени или возможности (пропускной способности) для отслеживания ежедневных изменений, простой способ её установки.
+* Фиксация точки для последующих ссылок в случае, если позже мы что-нибудь очень сильно сломаем. (Хотя Subversion, как правило, не позволяет случиться ничему такому ужасному.)
+* Все новые возможности, которым требуется тестирование, должны иметь как можно больше потенциальных тестеров.
+
+Не утверждается, что всякий снэпшот _-CURRENT_ имеет качество "готового продукта". Если нужна стабильно работающая и полностью оттестированная система, то придерживайтесь использования полных релизов или используйте снэпшоты _-STABLE_.
+
+Снэпшот-релизы доступны непосредственно link:https://www.FreeBSD.org/snapshots/[отсюда].
+
+Официальные снэпшоты постоянно генерируются для всех активно разрабатываемых веток.
+
+=== В чём смысл FreeBSD-STABLE?
+
+После того, как была выпущена FreeBSD 2.0.5, разработка FreeBSD разделилась на две части. Одна ветка получила название link:{handbook}#stable[-STABLE], а другая link:{handbook}#current[-CURRENT]. _FreeBSD-STABLE_ предназначена для провайдеров услуг Интернет и других коммерческих пользователей, для которых неожиданные изменения или экспериментальные возможности весьма нежелательны. В неё вносятся только хорошо оттестированные исправления и другие небольшие последовательные усовершенствования. С другой стороны, _FreeBSD-CURRENT_ являлась единой веткой, не разрываемой с момента выхода версии 2.0 и ведущей к {rel120-current}-RELEASE и последующим релизам. Для получения более подробной информации по веткам обратитесь к разделу статьи "link:{releng}#rel-branch[ Подготовка релизов FreeBSD: Создание ветки релиза]". Статус веток и расписание предстоящих релизов можно получить на странице http://www.FreeBSD.org/releng[Информация о подготовке релизов].
+
+Активно разрабатываемой веткой _-STABLE_ является {rel120-current}-STABLE. Последним релизом в ветке {rel120-current}-STABLE является {rel120-current}-RELEASE, выпущенный {rel120-current-date}.
+
+Активно разрабатываемой веткой _-CURRENT_ является ветка {rel-head}, которая движется к созданию следующего поколения FreeBSD. Прочтите ответ на вопрос <<current,Что такое FreeBSD-CURRENT?>> для получения более подробной информации об этой ветке.
+
+=== В какой момент выпускаются новые версии FreeBSD?
+
+{re} выпускает новую старшую версию FreeBSD в среднем каждые 18 месяцев и младшие версии каждые 8 месяцев. Даты релизов обычно объявляются заранее, так что те, кто работает над системой, знают, когда их проекты должны быть закончены и протестированы. Период тестирования предшествует выходу каждого релиза, для того, чтобы удостовериться в том, что добавление новых возможностей не повлияло на стабильность работы релиза. Многие пользователи расценивают такую осторожность как одну из приятнейших черт FreeBSD, хотя необходимость дожидаться _-STABLE_ для получения всех этих новых возможностей может несколько разочаровывать.
+
+Дополнительная информация о процессе подготовки релиза (в том числе планы выпуска последующих релизов) может быть найдена на страницах Web-сайта FreeBSD, посвящённых http://www.FreeBSD.org/releng/[выпуску релизов].
+
+Для тех, кому нужно или хочется, еженедельно выпускаются бинарные снапшоты, как описано выше.
+
+=== Кто разрабатывает FreeBSD?
+
+Решения, которые касаются ключевых моментов в проекте FreeBSD, такие, как общее направление развития проекта или кто может добавлять код к дереву исходных текстов, принимаются link:https://www.FreeBSD.org/administration/#t-core[основной командой] разработчиков (Core Team), состоящей из 9 человек. Также существует многочисленная группа, состоящая из более чем 350 так называемых link:{contributors}#staff-committers[коммиттеров] (committers), которые могут вносить изменения прямо в дерево исходных текстов FreeBSD.
+
+Однако большинство нетривиальных изменений широко обсуждается в <<mailing,списках рассылки>>, и не существует никаких ограничений на участие в подобных дискуссиях.
+
+=== Где можно найти FreeBSD?
+
+Все основные релизы FreeBSD доступны по FTP с link:ftp://ftp.FreeBSD.org/pub/FreeBSD/[FTP-сервера FreeBSD]:
+
+* Последний релиз {rel-stable}, {rel120-current}-RELEASE, можно найти в link:ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/i386/{rel120-current}-RELEASE[каталоге {rel120-current}-RELEASE].
+* link:https://www.FreeBSD.org/snapshots/[Снэпшот-релизы] для веток <<current,-CURRENT>> и <<stable,-STABLE>> выпускаются ежемесячно, но они нужны исключительно для разработчиков и тех, кто тестирует самые последние наработки.
+* Последний релиз {rel2-stable}, {rel112-current}-RELEASE, можно найти в link:ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/{rel112-current}-RELEASE/[каталоге {rel112-current}-RELEASE].
+
+Информация о получении/приобретении FreeBSD на CD, DVD и других носителях доступна в link:{handbook}#mirrors/[Руководстве].
+
+=== Как можно получить доступ к базе сообщений о проблемах (Problem Report)?
+
+База данных всех сообщений пользователей о проблемах может быть запрошена с помощью нашего https://bugs.FreeBSD.org/search/[Web-интерфейса].
+
+Можно использовать link:https://www.FreeBSD.org/support/bugreports/[Web-интерфейс] для отсылки сообщений об ошибках через браузер.
+
+Перед тем, как посылать сообщение об ошибке, прочтите статью link:{problem-reports}[Составление сообщений о проблеме во FreeBSD] о том, как писать хорошие сообщения об ошибках.
+
+== Документация и поддержка
+
+=== Есть ли хорошие книги по FreeBSD?
+
+В рамках проекта создан широкий спектр документации, которая доступна on-line по следующей ссылке: http://www.FreeBSD.org/docs/[http://www.FreeBSD.org/docs/]. Кроме того, в <<bibliography,Библиографии>> в конце этого FAQ и в link:{handbook}#bibliography/[Руководстве] имеются ссылки на другие рекомендуемые для чтения книги.
+
+=== Есть ли версии документации в другом формате, например, в виде обычного текста ASCII или PostScript(R)?
+
+Да. Документация имеется в нескольких различных форматах и упакованная разными способами на FTP-сервере FreeBSD, и находится она в каталоге link:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/[ /pub/FreeBSD/doc/].
+
+Документация подразделяется на категории различными способами. Это включает:
+
+* Имя документа, например, `faq` или `handbook`.
+* Язык и кодировка документа. Они опираются на имена локализаций, которые находятся в каталоге [.filename]#/usr/shared/locale# в системе FreeBSD. На данный момент поддерживаются следующие языки и кодировки:
++
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Кодировка
+| Язык
+
+|`en_US.ISO8859-1`
+|Английский (США)
+
+|`bn_BD.ISO10646-1`
+|Бенгальский или Бангла (Бангладеш)
+
+|`da_DK.ISO8859-1`
+|Датский (Дания)
+
+|`de_DE.ISO8859-1`
+|Немецкий (Германия)
+
+|`el_GR.ISO8859-7`
+|Греческий (Греция)
+
+|`es_ES.ISO8859-1`
+|Испанский (Испания)
+
+|`fr_FR.ISO8859-1`
+|Французский (Франция)
+
+|`hu_HU.ISO8859-2`
+|Венгерский (Венгрия)
+
+|`it_IT.ISO8859-15`
+|Итальянский (Италия)
+
+|`ja_JP.eucJP`
+|Японский (Япония, кодировка EUC)
+
+|`mn_MN.UTF-8`
+|Монгольский (Монголия, кодировка UTF-8)
+
+|`nl_NL.ISO8859-1`
+|Голландский (Нидерланды)
+
+|`no_NO.ISO8859-1`
+|Норвежский (Норвегия)
+
+|`pl_PL.ISO8859-2`
+|Польский (Польша)
+
+|`pt_BR.ISO8859-1`
+|Португальский (Бразилия)
+
+|`ru_RU.KOI8-R`
+|Русский (Россия, кодировка KOI8-R)
+
+|`sr_YU.ISO8859-2`
+|Сербский (Сербия)
+
+|`tr_TR.ISO8859-9`
+|Турецкий (Турция)
+
+|`zh_CN.UTF-8`
+|Упрощённый китайский (Китай, кодировка UTF-8)
+
+|`zh_TW.UTF-8`
+|Традиционный китайский (Тайвань, кодировка UTF-8)
+|===
++
+[NOTE]
+====
+Некоторые документы могут иметься не на всех языках.
+====
+
+* Формат документа. Мы создаём документацию в нескольких различных форматах. У каждого из форматов имеются свои плюсы и свои минусы. Некоторые форматы лучше подходят для чтения в on-line, когда как другие предназначены для получения эстетично выглядящей на бумаге копии. Наличие документации во всех этих форматах обеспечивает возможность прочтения нашими пользователями любой её части как с экрана монитора, так и на бумаге после вывода на печать. На данный момент поддерживаются следующие форматы;
++
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Формат
+| Значение
+
+|`html-split`
+|Набор маленьких связанных друг с другом HTML-файлов.
+
+|`html`
+|Один большой HTML-файл, полностью содержащий документ.
+
+|`pdf`
+|Adobe's Portable Document Format
+
+|`ps`
+|PostScript(R)
+
+|`rtf`
+|Rich Text Format от Microsoft(R)
+
+|`txt`
+|Обычный текст
+|===
++
+[NOTE]
+====
+Номера страниц при загрузке Rich Text Format в Word автоматически не обновляются. Для обновления нумерации нажмите kbd:[Ctrl+A], kbd:[Ctrl+End], kbd:[F9] после загрузки документа.
+====
+
+* Способ сжатия и создания архива.
+.. В случае формата `html-split`, файлы архивируются с помощью man:tar[1]. Получающийся файл [.filename]#.tar# затем подвергается сжатию по схемам, подробно описываемым далее.
+.. Все другие форматы генерируют один файл. Например, [.filename]#article.pdf#, [.filename]#book.html#, и так далее.
++
+Эти файлы затем сжимаются по двум схемам сжатия, `zip` или `bz2`. Для работы с этими файлами можно использовать man:tar[1].
++
+Таким образом, сжатая в `bzip2` версия Руководства в формате PostScript(R), будет находиться в файле с именем [.filename]#book.ps.bz2# в каталоге [.filename]#handbook/#.
+
+После выбора формата и способа компрессии, сгрузите упакованные файлы, распакуйте их, а затем скопируйте документацию в соответствующие места.
+
+Например, версия FAQ в виде отдельных HTML-файлов, упакованная при помощи man:bzip2[1], находится в файле [.filename]#doc/ru_RU.KOI8-R/books/faq/book.html-split.tar.bz2#. Для сгрузки и распаковки этого файла наберите:
+
+[source,bash]
+....
+# fetch ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/en_US.ISO8859-1/books/faq/book.html-split.tar.bz2
+# tar xvf book.html-split.tar.bz2
+....
+
+Если файл сжат, tar автоматически определит подходящий формат и корректно распакует файл в набор файлов [.filename]#.html#. Главным является [.filename]#index.html#, и в нём находится оглавление, вводный материал и ссылки на остальные части документа.
+
+=== Где найти информацию по спискам рассылки FreeBSD? Какие существуют телеконференции по FreeBSD?
+
+Исчерпывающая информация содержится в link:{handbook}#eresources-mail[разделе] Руководства, который посвящён спискам рассылки, и в link:{handbook}#eresources-news/[разделе] Руководства, касающемся телеконференций.
+
+=== Существуют ли каналы IRC (Internet Relay Chat) по FreeBSD?
+
+Да, большинство сетей IRC имеют канал FreeBSD:
+
+* Канал `#FreeBSDhelp` в сети http://www.efnet.org/index.php[EFNet] предназначен для помощи пользователям FreeBSD.
+* Канал `#FreeBSD` в сети http://freenode.net/[Freenode] предназначен для помощи общего характера, на нём в любое время присутствует много посетителей. Общение в течение уже некоторого времени известно своей тенденцией сводиться к разговорам не по теме, но приоритет отдается пользователям с вопросами по FreeBSD. Другие пользователи помогут разобраться в основах, отсылая к Руководству по мере возможности и предлагая ссылки для более глубокого изучения интересующих тем. Это преимущественно англоговорящий канал, но туда приходят пользователи со всего мира. Тем, для кого английский не является родным, следует сперва задать вопрос на английском и затем перейти на подходящий канал `##freebsd-lang`.
+* Канал `#FreeBSD` в сети http://www.dal.net/[DALNET] доступен на сервере `irc.dal.net` в США и на `irc.eu.dal.net` в Европе.
+* Канал `#FreeBSD` в сети http://www.undernet.org/[UNDERNET] доступен на серверах `us.undernet.org` в США и `eu.undernet.org` в Европе. Так как это канал взаимопомощи, приготовьтесь к чтению документации, к которой вас отошлют.
+* Канал `#FreeBSD` в сети http://www.rusnet.org.ru/[RUSNET] это канал для русскоговорящих посетителей, посвящённый помощи пользователям FreeBSD. Также это хорошее место для нетехнических дискуссий.
+* Канал `#bsdchat` в сети http://freenode.net/[Freenode] это канал для посетителей, говорящих на китайском традиционном языке (кодировка UTF-8), посвящённый помощи пользователям FreeBSD. Также это хорошее место для нетехнических дискуссий.
+
+На FreeBSD wiki имеется http://wiki.freebsd.org/IrcChannels[хороший список] каналов IRC.
+
+Все каналы разные и не имеют отношения друг к другу. Поскольку их стили общения отличаются, попробуйте каждый, пока не найдёте подходящий вашему стилю общения.
+
+=== Есть ли какие-нибудь web-форумы для обсуждения FreeBSD?
+
+Официальные форумы FreeBSD расположены по адресу https://forums.FreeBSD.org/[https://forums.FreeBSD.org/].
+
+=== Где можно пройти платные курсы по FreeBSD и получить поддержку?
+
+http://www.ixsystems.com[iXsystems, Inc.], дочерней компанией которой является http://www.freebsdmall.com/[FreeBSD Mall], предоставляет http://www.ixsystems.com/bsdsupport[поддержку] FreeBSD и программного обеспечения PC-BSD на коммерческой основе, в дополнение к разработке FreeBSD и решениям, требующим тонкой настройки.
+
+BSD Certification Group, Inc. предоставляет сертификацию системного администрирования DragonFly BSD, FreeBSD, NetBSD и OpenBSD. Для получения дополнительной информации посетите http://www.BSDCertification.org[их сайт].
+
+Чтобы попасть в этот список, другие организации, осуществляющие обучение и поддержку, должны обратиться к нам в Проект.
+
+== Установка
+
+=== Какую архитектуру нужно загрузить? У меня есть 64-разрядный процессор Intel(R), но я вижу только amd64.
+
+amd64 - это термин, применяемый во FreeBSD для обозначения 64-разрядной архитектуры x86 (также известна как "x86-64" или "x64"). На большинстве современных компьютеров следует использовать amd64. Для более старых подойдёт i386. При установке системы на отличную от x86 архитектуру, выберите платформу, наиболее подходящую для оборудования.
+
+=== Какой файл нужно скачать для установки FreeBSD?
+
+На странице http://www.freebsd.org/ru/where/[Получение FreeBSD] выберите `[iso]` с соответствующей оборудованию архитектурой.
+
+Можно использовать любой из:
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| файл
+| описание
+
+|[.filename]#disc1.iso#
+|Содержит достаточно для установки FreeBSD и минимальный набор пакетов.
+
+|[.filename]#dvd1.iso#
+|Наподобие [.filename]#disc1.iso#, но с дополнительными пакетами.
+
+|[.filename]#memstick.img#
+|Образ с автозагрузкой для записи на USB флешку.
+
+|[.filename]#bootonly.iso#
+|Минимальный образ, требующий сетевое подключение для завершения установки FreeBSD.
+|===
+
+Пользователям pc98 нужны образы дискет: [.filename]#floppies/boot.flp#, [.filename]#floppies/kern1.flp#, [.filename]#floppies/kern2.flp# и [.filename]#floppies/mfsroot1.flp#. Эти образы нужно перенести на дискеты с помощью таких утилит, как man:dd[1].
+
+Полные инструкции по этой процедуре и об установке вообще можно найти в link:{handbook}#install/[ разделе] Руководства, посвящённом установке FreeBSD.
+
+=== Помогите! Установочный образ не загружается!
+
+Это может быть вызвано тем, что образ был загружен по FTP не в режиме _binary_.
+
+В некоторых клиентских программах FTP по умолчанию используется текстовый (_ascii_) режим передачи, в котором любые последовательности символов "конец строки" заменяются на используемые в системе клиента. В таком случае образ загрузочного диска будет неизбежно испорчен. Проверьте контрольную сумму SHA-256 полученного файла: если он не _точно_ такой же как на FTP-сервере, то ошибка произошла, скорее всего, в процессе передачи.
+
+В случае использования командной строки FTP-клиента введите команду _binary_ в командной строке FTP после подключения к серверу, но перед началом передачи файла.
+
+=== Где инструкции по установке FreeBSD?
+
+Инструкции по установке FreeBSD 9.0 и более поздних версий могут быть найдены в link:{handbook}#bsdinstall/[главе] Руководства, посвящённой установке FreeBSD. Также имеются инструкции по установке link:{handbook}#install/[предыдущих] версий FreeBSD.
+
+=== Какие минимальные требования для запуска FreeBSD?
+
+Для работы FreeBSD необходим ПК класса 486 и выше с оперативной памятью объёмом не менее 64 Мбайт и дисковым пространством не менее 1.1 Гбайт.
+
+=== Как сделать собственный установочный диск?
+
+Индивидуальный установочный носитель FreeBSD можно создать, запустив процедуру построения индивидуального релиза. Следуйте инструкциям в статье о link:{releng}[подготовке релизов FreeBSD].
+
+=== Может ли Windows(R) сосуществовать с FreeBSD?
+
+Да, если Windows(R) установлена первой. Загрузчик FreeBSD будет управлять процессом выбора загрузки Windows(R) или FreeBSD. Если Windows(R) устанавливается следом, то это приведёт к перезаписи загрузчика. Если такое случится, обратитесь к следующему разделу.
+
+=== Другая операционная система уничтожила мой загрузчик операционной системы! Как мне его вернуть?
+
+Способ восстановления зависит от используемого загрузчика. Меню выбора загрузки, используемое во FreeBSD, можно переустановить с помощью man:boot0cfg[8]. Пример для восстановления меню загрузки на диске _ada0_:
+
+[source,bash]
+....
+# boot0cfg -B ada0
+....
+
+Неинтерактивный загрузчик MBR можно установить с помощью man:gpart[8]:
+
+[source,bash]
+....
+# gpart bootcode -b /boot/mbr ada0
+....
+
+Более сложные ситуации, включая использование дисков GPT, рассматриваются в man:gpart[8].
+
+=== Я загрузился с компакт-диска, однако программа установки сообщила, что CD-ROM не найден. Куда он подевался?
+
+Обычной причиной возникновения такой проблемы является неправильно сконфигурированный привод CD-ROM. Теперь зачастую ПК продаются с CD-ROM, установленным как ведомое устройство на втором контроллере IDE, но без ведущего устройства на этом контроллере. Согласно спецификации ATAPI, такая конфигурация неверна, однако Windows(R) в таком случае всё же работает, и BIOS игнорирует это при загрузке. Вот почему BIOS может видеть CD-ROM при загрузке, а FreeBSD для завершения установки - нет.
+
+Переконфигурируйте систему так, чтобы CD-ROM оказался либо основным устройством на том IDE-контроллере, на котором он установлен, либо ведомым устройством на контроллере IDE, который имеет ведущее устройство.
+
+=== Нужно ли устанавливать исходные тексты системы?
+
+В общем случае, нет. Для работы основной системы присутствие исходных текстов не требуется. Некоторые порты наподобие [.filename]#sysutils/lsof# не будут собираться без установленных исходных текстов системы. В частности, если порт собирает модуль ядра или напрямую обращается к структурам ядра, в этом случае исходные тексты должны быть установлены.
+
+=== Нужно ли перекомпилировать ядро?
+
+Обычно нет. Поставляемое ядро `GENERIC` содержит драйвера, необходимые для типичного компьютера. Инструмент man:freebsd-update[8] не может использоваться для обновления FreeBSD с собственным ядром. Поэтому по возможности стоит придерживаться использования ядра `GENERIC`. Для компьютеров с очень небольшим объёмом ОЗУ, таких как встраиваемые системы, может потребоваться собственное небольшое ядро, содержащее только необходимые драйверы.
+
+=== Какой из паролей DES, Blowfish или MD5 я должен использовать, и как указать, какого типа пароли используются пользователями?
+
+Во FreeBSD 9 и выше по умолчанию используется _SHA512_. Пароли DES остаются доступны для обратной совместимости с более старыми операционными системами, в которых используется менее защищённый формат паролей. FreeBSD также поддерживает пароли в форматах Blowfish и MD5. Управление выбором используемого формата для новых паролей осуществляется через параметр входа `passwd_format` в файле [.filename]#/etc/login.conf#, принимающий значения `des`, `blf` (если они есть) или `md5`. Подробная информация о параметрах входа находится на странице Справочника man:login.conf[5].
+
+=== Какие существуют ограничения для файловой системы FFS?
+
+Наибольший размер файловой системы FFS ограничен практически количеством памяти, которая требуется для работы man:fsck[8]. man:fsck[8] использует 1 бит на фрагмент, и для стандартного размера фрагмента 4 Кбайт это эквивалентно использованию 32 Мбайт памяти на терабайт дискового пространства. Это означает, что на архитектурах с ограничением размера пользовательского процесса в 2 Гбайт (например, i386(TM)) максимальный размер файловой системы, доступный для man:fsck[8], составляет ~60 Тбайт.
+
+Без ограничения на память для man:fsck[8] максимальный размер файловой системы составляет 2 ^ 64 (блоков) * 32 Кбайт => 16 экса * 32 Кбайт => 512 зеттабайт.
+
+Максимальный размер файла на FFS приблизительно равен 2 петабайт со стандартным размером блока 32 Кбайт. Каждый 32 Кбайтный блок может адресовать до 4096 блоков. С использованием тройной косвенной адресации это составляет 32 Кбайт * 12 + 32 Кбайт * 4096 + 32 Кбайт * 4096^2 + 32 Кбайт * 4096^3. Увеличение размера блока до 64 Кбайт увеличит максимальный размер файла в 16 раз.
+
+=== Я скомпилировал новое ядро и при загрузке получил сообщение об ошибке readin failed.
+
+Ядро и компоненты системы не синхронизированы. Такая конфигурация не поддерживается. Обязательно используйте команды `make buildworld` и `make buildkernel` для обновления ядра.
+
+Загрузите систему, непосредственно указав ядро на втором этапе загрузки, нажав любую клавишу до запуска загрузчика при появлении символов `|`.
+
+=== Существует ли инструмент для настройки системы после её установки?
+
+Да, bsdconfig предоставляет замечательный интерфейс для пост-установочной настройки FreeBSD.
+
+[[hardware]]
+== Аппаратная совместимость
+
+[[compatibility-general]]
+=== Вопросы общего характера
+
+==== Я хочу приобрести аппаратуру для моей системы FreeBSD. Какая модель/производитель/тип лучше всего?
+
+Это постоянно обсуждается в списках рассылки FreeBSD и является ожидаемым вопросом, так как аппаратура меняется очень быстро. Обратитесь к Hardware Notes для FreeBSD link:{u-rel120-hardware}[{rel120-current}] или link:[{rel112-current}], а также http://www.FreeBSD.org/search/#mailinglists[архивам] списков рассылки перед тем, как задавать вопросы о самом последнем и лучшем оборудовании. Весьма вероятно, что обсуждение касаемо этого типа оборудования велось как раз на прошлой неделе.
+
+Перед приобретением лэптопа посмотрите архивы link:{freebsd-mobile} и {freebsd-questions} или, по возможности, более специфичные списки рассылки по данному типу оборудования.
+
+==== Какие существуют ограничения по памяти? Поддерживает ли FreeBSD больше 4 Гбайт памяти (ОЗУ)? Больше 16 Гбайт? Больше 48 Гбайт?
+
+FreeBSD как операционная система в целом поддерживает столько же физической памяти (ОЗУ), сколько аппаратная платформа, на которой она работает. Имейте в виду, что различные платформы имеют различные ограничения на память; например, i386(TM) без PAE поддерживает максимум 4 Гбайт памяти (и обычно еще меньше из-за адресного пространства PCI), а i386(TM) с PAE поддерживает максимум 64 Гбайт. Для FreeBSD 10 платформы AMD64 поддерживают до 4 Тбайт физической памяти.
+
+==== Почему FreeBSD видит меньше 4 Гбайт памяти, когда система установлена на машину i386(TM)?
+
+Общее адресное пространство для машин i386(TM) является 32-разрядным; это означает, что адресоваться (т.е. быть получено) может не более 4 Гбайт памяти. Более того, некоторые адреса в этом диапазоне зарезервированы для различных целей аппаратным обеспечением, например, для использования и управления устройствами PCI, для доступа к видеопамяти, и так далее. Таким образом, общий объем памяти, используемой операционной системой для ядра и приложений, ограничен размером, значительно меньшим, чем 4 Гбайт. В такой конфигурации максимально доступная физическая память составляет от 3.2 Гбайт до 3.7 Гбайт.
+
+Для преодоления ограничения в 3.2 Гбайт-3.7 Гбайт установленной памяти (т.е. для получения 4 Гбайт, но также более 4 Гбайт) должен использоваться специальный механизм, именуемый PAE. Сокращение PAE расшифровывается как Physical Address Extension (расширение физического адреса) и предоставляет для 32-разрядных x86 процессоров способ адресовать более 4 Гбайт памяти. PAE переназначает память, которая иначе была бы перекрыта адресными резервациями для аппаратных устройств выше диапазона 4 Гбайт, и использует ее как дополнительную физическую память (смотрите man:pae[4]). Использование PAE имеет свои недостатки; такая модель доступа к памяти является чуть более медленной по сравнению с обычным режимом (без PAE), и также не работают динамически загружаемые модули (смотрите man:kld[4]). Это означает, что все драйверы должны присутствовать статически в самом ядре.
+
+Самый общий способ включить PAE - это собрать новое ядро со специальным уже подготовленным файлом конфигурации ядра, именуемым [.filename]#PAE#, который уже сконфигурирован для сборки безопасного ядра. Имейте в виду, что некоторые строки в этом файле конфигурации ядра являются слишком консервативными, и некоторые драйверы, помеченные как неготовые для использования с PAE, на самом деле являются годными. На практике, если драйвер работает на 64-разрядной архитектуре (такой как AMD64), он также работает с PAE. При создании своего собственного файла конфигурации ядра можно включить PAE, добавив следующую строку:
+
+[.programlisting]
+....
+options PAE
+....
+
+PAE не является широко используемым в настоящее время, поскольку большинство нового x86 аппаратного обеспечения также поддерживает работу в 64-разрядном режиме, также известном как AMD64 или Intel(R) 64. Этот режим имеет большее адресное пространство и не нуждается в таких трюках. FreeBSD поддерживает AMD64, и рекомендуется использование этой версии FreeBSD вместо версии i386(TM), если требуется больше 4 Гбайт памяти.
+
+[[compatibility-processors]]
+=== Аппаратные платформы и процессоры
+
+==== Поддерживает ли FreeBSD аппаратные платформы, отличные от x86?
+
+Да. Поддержка FreeBSD подразделяется на множество классов. Архитектуры первого класса, такие как i386 или amd64, полностью поддерживаются. Архитектуры 2 и 3 класса поддерживаются по мере возможности. Полное описание классов доступно в link:{committers-guide}#archs/[справочнике коммиттера].
+
+Полный список поддерживаемых архитектур находится на http://www.FreeBSD.org/ru/platforms/[странице], посвящённой платформам.
+
+==== Поддерживает ли FreeBSD многопроцессорные системы (SMP)?
+
+FreeBSD поддерживает симметричное мультипроцессирование (SMP) на всех невстраиваемых платформах (например, i386, amd64 и так далее). SMP также поддерживается для arm и MIPS, хотя некоторые процессоры могут это не поддерживать. В реализации SMP во FreeBSD используется мелкодисперсная синхронизация, и производительность масштабируется почти линейно с ростом количества процессоров.
+
+За подробной информацией обращайтесь к странице Справочника man:smp[4].
+
+==== Что такое микрокод? Как установить обновления микрокода для процессоров Intel(R)?
+
+Микрокод - это программа, реализующая набор инструкций процессора на аппаратном уровне. Она позволяет исправлять ошибки процессора без замены микросхемы.
+
+Установите [.filename]#sysutils/devcpu-data#, а затем добавьте:
+
+[.programlisting]
+....
+microcode_update_enable="YES"
+....
+
+в [.filename]#/etc/rc.conf#
+
+[[compatibility-drives]]
+=== Жёсткие диски, ленточные устройства и приводы CD и DVD
+
+==== Какие типы винчестеров поддерживает FreeBSD?
+
+FreeBSD работает с дисками стандартов EIDE, SATA, SCSI и SAS (с совместимыми контроллерами; смотрите следующий раздел), и всеми дисками, использующими оригинальный интерфейс "Western Digital" (MFM, RLL, ESDI и, конечно же, IDE). Некоторые контроллеры ESDI, использующие собственные интерфейсы, могут и не работать: к таким относятся WD1002/3/6/7 и их клоны.
+
+==== Какие поддерживаются контроллеры SCSI или SAS?
+
+Полный список приведён в Hardware Notes для FreeBSD link:{u-rel120-hardware}[{rel120-current}] или link:[{rel112-current}].
+
+=== Какие типы стримеров поддерживаются?
+
+FreeBSD поддерживает все стандартные интерфейсы стримеров SCSI.
+
+==== Поддерживает ли FreeBSD роботов для смены лент?
+
+FreeBSD поддерживает роботизированные устройства SCSI через устройство man:ch[4] и команду man:chio[1]. Подробная информация об управлении такими роботами находится на странице Справочника man:chio[1].
+
+В то время как AMANDA и ещё ряд программных продуктов умеют работать с роботами, другие приложения могут только переносить ленты с одного места на другое. В этом случае надо отслеживать, в каком слоте находится нужная лента, и в какой слот нужно вернуть ленту, находящуюся в стримере.
+
+==== Какие приводы CD-ROM и CD-RW поддерживаются во FreeBSD?
+
+Поддерживаются любые SCSI-устройства чтения компакт дисков, подключенные к поддерживаемому контроллеру. Поддерживается большинство ATAPI-совместимых IDE CD-ROM.
+
+FreeBSD поддерживает все ATAPI-совместимые IDE-приводы CD-R или CD-RW. Более полная информация находится на странице Справочника man:burncd[8].
+
+FreeBSD поддерживает также все SCSI-приводы CD-R и CD-RW. Используйте команду `cdrecord` из пакета package:sysutils/cdrtools[].
+
+[[compatibility-kbd-mice]]
+=== Клавиатуры и мыши
+
+[[moused]]
+==== Можно ли использовать мышь вне X Window?
+
+Стандартный драйвер консоли man:syscons[4] предоставляет возможность использования указателя мыши в текстовых консолях для выделения и переноса текста. Запустите демон мыши man:moused[8] и включите отображение указателя мыши в виртуальной консоли:
+
+[source,bash]
+....
+# moused -p /dev/xxxx -t yyyy
+# vidcontrol -m on
+....
+
+Здесь _xxxx_ - это имя устройства мыши, а _yyyy_ - тип протокола, используемого мышью. Даемон мыши может автоматически определять тип протокола большинства мышей, за исключением старых, работающих по последовательному интерфейсу. Для выполнения автоматического определения в качестве протокола укажите `auto`. Если автоматическое определение не работает, то обратитесь к справочным страницам по man:moused[8] для получения списка поддерживаемых типов протоколов.
+
+Для мыши типа PS/2 добавьте строчку `moused_enable="YES"` в файл [.filename]#/etc/rc.conf# для запуска даемона мыши во время загрузки системы. Кроме того, для использования даемона мыши во всех виртуальных терминалах, а не только на консоли, добавьте `allscreens_flags="-m on"` в файле [.filename]#/etc/rc.conf#.
+
+После запуска даемона мыши, доступ к мыши должен согласовываться между даемоном мыши и другими программами типа X Window. Обратитесь к вопросу из FAQ<<x-and-moused, Почему моя мышь не работает с X?>> для получения более полной информации по этому вопросу.
+
+==== Как можно вырезать и копировать текст с помощью мыши в текстовой консоли?
+
+Удалить данные с помощью мыши нельзя. Однако их можно скопировать и вставить. После запуска даемона мыши, как описано в ответе на <<moused,предыдущий вопрос>>, нажмите кнопку 1 (левую) и двигайте мышь для выделения текста. Затем нажмите кнопку 2 (среднюю) для его вставки с позиции текстового курсора. Нажатие кнопки 3 (правой) "расширит" выбранную текстовую область.
+
+Если у вашей мыши отсутствует средняя кнопка, её можно сэмулировать либо переназначить кнопки опциями даемона мыши. Обратитесь к справочным страницам по man:moused[8] для получения полной информации.
+
+==== У моей мыши есть дополнительные колёсико и кнопочки. Можно ли их использовать во FreeBSD?
+
+Ответ, к сожалению, "в зависимости от обстоятельств". Эти мышки с дополнительными возможностями, как правило, требуют наличия специальных драйверов. До тех пор, пока драйвер мыши или прикладная программа не будут иметь отдельную поддержку такой мыши, она будет работать как стандартная двух- или трёхкнопочная мышь.
+
+Возможные способы использования колёсиков мыши при работе в X Window описаны в <<x-and-wheel,другом разделе>>.
+
+==== Как использовать клавишу delete в sh и csh?
+
+Для Bourne Shell добавьте следующие строки в [.filename]#~/.shrc#. Смотрите man:sh[1] и man:editrc[5].
+
+[.programlisting]
+....
+bind ^? ed-delete-next-char # для консоли
+bind ^[[3~ ed-delete-next-char # для xterm
+....
+
+Для C Shell добавьте следующие строки в [.filename]#~/.cshrc#. Смотрите man:csh[1].
+
+[.programlisting]
+....
+bindkey ^? delete-char # для консоли
+bindkey ^[[3~ delete-char # для xterm
+....
+
+За дополнительной информацией обращайтесь к http://www.ibb.net/~anne/keyboard.html[этой странице].
+
+[[compatibility-other]]
+=== Другое оборудование
+
+==== Есть ли решение проблемы отсутствия звука при использовании звуковых адаптеров man:pcm[4]?
+
+Некоторые звуковые адаптеры при каждой загрузке сбрасывают уровень громкости в 0. Выполняйте следующую команду при каждой загрузке машины:
+
+[source,bash]
+....
+# mixer pcm 100 vol 100 cd 100
+....
+
+==== Поддерживает ли FreeBSD управление энергосбережением на лэптопах?
+
+FreeBSD поддерживает функции ACPI, реализованные в современном оборудовании. Дополнительная информация находится на странице Справочника man:acpi[4].
+
+== Устранение некоторых проблем
+
+=== Почему FreeBSD определяет неправильное количество памяти на аппаратуре i386(TM)?
+
+Наиболее вероятная причина заключается в различии между адресами физической и виртуальной памяти.
+
+Существующее соглашение для большинства оборудования ПК заключается в использовании пространства памяти, лежащей в диапазоне между 3.5 ГБ и 4 ГБ для специальных нужд (обычно для нужд PCI). Это пространство адресов используется для доступа к PCI оборудованию. Как результат, реальная физическая память не может быть получена в данном адресном пространстве.
+
+Какие действия выполняются с памятью в данном регионе, зависит от оборудования. К сожалению, некоторое оборудование ничего не выполняет и возможность использовать эти 500 МБ ОЗУ полностью потеряна.
+
+К счастью, большинство оборудования перераспределяет память к более верхней позиции, так что она всё ещё может использоваться. Тем не менее, это может вызвать некоторое замешательство при просмотре сообщений, выдаваемых при загрузке.
+
+На 32-битной версии FreeBSD кажется, что эта память потерялась, поскольку она переназначится в диапазон выше 4 ГБ, который не доступен для 32 битного ядра. В данном случае, решение заключается в сборке ядра с PAE. За дополнительной информацией обращайтесь к статье об ограничениях памяти.
+
+На 64nbsp;битной версии FreeBSD или в случае использования ядра с включённым PAE FreeBSD корректно определит и перераспределит память, так, что она станет годной к использованию. Тем не менее, во время загрузки может показаться, что FreeBSD определяет больше памяти, чем реально имеется в системе из-за описанного перераспределения. Это нормально, и информация о доступной памяти будет скорректирована по окончанию процесса загрузки.
+
+=== Программы аварийно завершают работу с ошибкой Signal 11.
+
+Ошибки выполнения, связанные с сигналом 11, происходят, когда процесс пытается обратиться к области памяти, доступ к которой ему не был дан операционной системой. Если что-то подобное происходит в случайные, казалось бы, промежутки времени, следует начать поиск причины.
+
+Эти проблемы могут быть классифицированы следующим образом:
+
+. Если проблема возникает только в определённом самостоятельно разработанном приложении, то скорее всего это ошибка в коде.
+. Если это проблема в части базового комплекта системы FreeBSD, то это тоже может быть ошибка в программном коде, хотя в большинстве случаев такие проблемы обнаруживаются и ошибки исправляются задолго до того, как обычным читателям FAQ доводится использовать этот код (именно для этого предназначена версия -CURRENT).
+
+Вероятно, это не связано с ошибкой во FreeBSD, если проблема проявляется при компиляции программы, и при этом ошибка компилятора каждый раз разная.
+
+Например, если запуск `make buildworld` завершился неудачей при попытке компиляции [.filename]#ls.c# в [.filename]#ls.o# и при повторном запуске компиляция снова прервалась на том же месте, то это ошибка процесса построения. Обновите исходные тексты и попробуйте снова. Если же компиляция прерывается в каком-то другом месте, то причина наиболее вероятно кроется в оборудовании.
+
+В первом случае воспользуйтесь отладчиком, к примеру, man:gdb[1], для нахождения точки программы, в которой делается попытка доступа к неверному адресу, и исправьте эту ошибку.
+
+Во втором случае проверьте, какой компонент вашего оборудования неисправен.
+
+Среди часто приводящих к этому причин:
+
+. Диски могут перегреваться. Проверьте работу вентиляторов.
+. Процессор перегревается. Это может произойти при разгоне процессора или при поломке процессорного вентилятора. В любом из вариантов убедитесь, что ваше оборудование работает так, как ему положено по крайней мере на момент поиска причин неисправности. В противном случае сбросьте частоту на настройки по умолчанию.
++
+Что касается разгона, дешевле обходится медленная система, чем сгоревшая система, требующая замены! Также общественность не симпатизирует проблемам на таких системах.
+. Хитроумная память. Если установлены различные микросхемы SIMM/DIMM, вытащите их все и попробуйте по одной до локализации проблемы в проблематичной микросхеме DIMM/SIMM, либо их комбинации.
+. Чересчур оптимистичные настройки материнской платы. Настройки BIOS и перемычки на материнской плате предоставляют возможность задавать различные частоты и задержки. Часто бывает достаточно настроек по умолчанию, но иногда установка слишком малых периодов ожидания для ОЗУ или установка параметра "RAM Speed: Turbo" вызывает странное поведение. Возможным решением может стать установка параметров BIOS по умолчанию с предварительной записью текущих значений.
+. Неустойчивое или недостаточное электропитание материнской платы. Уберите неиспользуемые адаптеры ввода/вывода, винчестеры и приводы компакт-дисков или отключите их от кабеля электропитания для проверки, что блок питания может работать с меньшей нагрузкой. Или попробуйте воспользоваться другим блоком питания, желательно большей мощности. Например, если имеющийся блок питания рассчитан на 250 Ватт, попробуйте другой мощностью 300 Ватт).
+
+Прочитайте раздел про <<signal11,Signal 11>> для дальнейшего объяснения и обсуждения, как аппаратура или программное обеспечение для тестирования памяти могут пропускать сбойную память. Подробная информация по этому вопросу содержится в http://www.bitwizard.nl/sig11/[FAQ по проблеме SIG11].
+
+Наконец, если ничего не помогает, то, возможно, это из-за ошибки во FreeBSD. Следуйте <<access-pr,этим инструкциям>> для отправки сообщения о проблеме.
+
+=== Моя система аварийно завершает работу с сообщениями Fatal trap 12: page fault in kernel mode либо panic:, и выдаёт много дополнительной информации. Что мне делать?
+
+Разработчики FreeBSD интересуются такими ошибками, но им нужно больше информации, чем просто текст ошибки. Скопируйте весь текст сообщения. Затем обратитесь к разделу FAQ об <<kernel-panic-troubleshooting,аварийных завершениях работы ядра>>, постройте отладочное ядро и получите трассу вызовов. Это может звучать трудной задачей, зато не требует навыков программирования. Просто следуйте указаниям.
+
+=== Что означает сообщение об ошибке maxproc limit exceeded by uid %i, please see tuning(7) and login.conf(5)?
+
+Ядро FreeBSD позволяет одновременно существовать ограниченному числу процессов. Это зависит от значения переменной man:sysctl[8] `kern.maxusers`. `kern.maxusers` также влияет на другие ограничения ядра, такие как буферы работы с сетью. Если система сильно загружена, поднимите `kern.maxusers`. Кроме максимального числа процессов это также увеличит значения других параметров, ограничивающих систему.
+
+Для корректировки значения `kern.maxusers` обратитесь к разделу link:{handbook}#kern-maxfiles[ Ограничения файлов/процессов] Руководства. В нём говорится об открытых файлах, но те же ограничения касаются процессов.
+
+Если система загружена слабо, но в ней запущено слишком много процессов, поправьте параметр `kern.maxproc`, определив его значение в [.filename]#/boot/loader.conf#. Изменение не вступит в силу до перезагрузки системы. За дополнительной информацией, касающейся настройки параметров, обращайтесь к странице Справочника man:loader.conf[5]. Если эти процессы запущены одним и тем же пользователем, поправьте значение `kern.maxprocperuid`, чтобы оно было на единицу меньше, чем новое значение `kern.maxproc`. Оно должно быть меньше по крайней мере на единицу, потому что системная программа man:init[8] должна работать всегда.
+
+=== Полноэкранные приложения на удалённой машине работают неправильно!
+
+На удалённой машине тип терминала может отличаться от `xterm`, который требуется для использования консоли FreeBSD. Либо же ядро может иметь неправильные значения ширины и высоты терминала.
+
+Проверьте, чтобы переменная окружения `TERM` имела значение `xterm`. Если удалённая машина его не поддерживает, попробуйте `vt100`.
+
+Запустите `stty -a`, чтобы узнать, какие размеры терминала заданы в ядре. Если значения неправильные, их можно поменять командой `stty rows _RR_ cols _CC_`.
+
+Либо же, если на клиентской машине установлен package:x11/xterm[], запуск `resize` позволит узнать у терминала правильные размеры и применить эти значения.
+
+=== Почему подключение через ssh или telnet к моему компьютеру занимает так долго времени?
+
+Симптом: между моментом установления TCP-соединения и выдачей клиентским программным обеспечением запроса на ввод пароля (или, в случае использования man:telnet[1], выдачей приглашения на вход) проходит большой промежуток времени.
+
+Проблема: скорее всего, задержка вызвана программным обеспечением на стороне сервера, которое пытается преобразовать IP-адрес клиента в имя хоста. Многие серверы, включая Telnet и SSH, поставляемые с FreeBSD, делают это для того, чтобы, кроме всего прочего, записать имя хоста в файле журнала для справки администратора.
+
+Лечение: Если проблема возникает при подключении клиента к любому серверу, то причина в клиенте. Если проблема возникает только при чьей-либо попытке подключиться к серверу, то проблема в сервере.
+
+Если проблема с клиентом, то единственным методом ее решения является исправление DNS, чтобы сервер смог распознать вашу машину. Если это происходит в локальной сети, то предположите, что это проблема с сервером, и продолжайте чтение. Если это происходит в сети Интернет, обратитесь к вашему провайдеру.
+
+Если проблема с сервером в локальной сети, настройте сервер для разрешения запросов на преобразование адреса в имя хоста в диапазоне локальных адресов. Обратитесь к страницам Справочника по man:hosts[5] и man:named[8] для получения более подробной информации. Если это происходит в сети Интернет, то проблема может заключаться в некорректной работе ресолвера локального сервера. Для проверки попробуйте получить адрес другого хоста, такого как `www.yahoo.com`. Если это не работает, то в этом и состоит проблема.
+
+Из-за свежей установки FreeBSD, также возможно, что информация о домене и сервере имён отсутствует в [.filename]#/etc/resolv.conf#. Это часто будет вызывать задержку в работе SSH, так как опция `UseDNS` по умолчанию установлена в значение `yes` в [.filename]#/etc/ssh/sshd_config#. Если именно это является причиной проблемы, то добавьте недостающую информацию в [.filename]#/etc/resolv.conf#, либо в качестве временной меры установите `UseDNS` в `no` в файле [.filename]#sshd_config#.
+
+=== Почему в man:dmesg[8] регулярно выводятся сообщения file: table is full?
+
+Такое сообщение об ошибке сигнализирует о том, что в системе закончились доступные файловые дескрипторы. Обратитесь к разделу link:{handbook}#kern-maxfiles[ kern.maxfiles] главы о link:{handbook}#configtuning-kernel-limits/[ Настройке ограничений ядра] Руководства для выяснения всех подробностей и устранения этой проблемы.
+
+=== Почему часы на моем компьютере показывают неправильное время?
+
+На компьютере установлено по меньшей мере два таймера, и FreeBSD выбрала не тот.
+
+Запустите man:dmesg[8] и посмотрите строки, содержащие слово `Timecounter`. FreeBSD выбирает таймер с наибольшим значением качества.
+
+[source,bash]
+....
+# dmesg | grep Timecounter
+Timecounter "i8254" frequency 1193182 Hz quality 0
+Timecounter "ACPI-fast" frequency 3579545 Hz quality 1000
+Timecounter "TSC" frequency 2998570050 Hz quality 800
+Timecounters tick every 1.000 msec
+....
+
+Удостоверьтесь в этом, проверив man:sysctl[3]-переменную `kern.timecounter.hardware`.
+
+[source,bash]
+....
+# sysctl kern.timecounter.hardware
+kern.timecounter.hardware: ACPI-fast
+....
+
+Это может быть неработающий таймер ACPI. Самым простым решением будет отключить таймер ACPI в [.filename]#/boot/loader.conf#:
+
+[.programlisting]
+....
+debug.acpi.disabled="timer"
+....
+
+Либо же BIOS может изменить частоту TSC-может, для изменения скорости работы процессора при работе от батареек или переводя в режим пониженного электропитания, но FreeBSD не отслеживает это и в результате часы начинают спешить или отставать.
+
+В этом примере имеется также и таймер `i8254`, и он может быть выбран записью его имени в man:sysctl[3]-переменную `kern.timecounter.hardware`.
+
+[source,bash]
+....
+# sysctl kern.timecounter.hardware=i8254
+kern.timecounter.hardware: TSC -> i8254
+....
+
+Теперь компьютер должен аккуратнее следить за временем.
+
+Чтобы это изменение вступало в силу во время загрузки системы, добавьте в файл [.filename]#/etc/sysctl.conf# такую строчку:
+
+[.programlisting]
+....
+kern.timecounter.hardware=i8254
+....
+
+=== Что означает сообщение swap_pager: indefinite wait buffer:?
+
+Это значит, что процесс пытается сбросить страницу памяти на диск, и попытка сделать это оканчивается неудачно в течение более 20 секунд. Это может быть вызвано испорченными блоками на диске, кабелями, подключением или другим оборудованием ввода/вывода. Если диск сам по себе испорчен, вы также увидите ошибки работы с диском в [.filename]#/var/log/messages# и в выводе `dmesg`. В противном случае проверьте кабели и подключения.
+
+=== Что означают сообщения lock order reversal?
+
+Ядро FreeBSD использует несколько блокировок для арбитража доступа к соответствующим ресурсам. Когда несколько потоков в ядре пытаются захватить несколько блокировок подряд, всегда существует возможность появления мёртвой блокировки (deadlock), где два потока захватили по одной блокировке и заблокированы в ожидании освобождения другим потоком второй блокировки. Такой проблемы синхронизации можно избежать, если все потоки захватывают блокировки в одинаковом порядке.
+
+Система диагностирования блокировок man:witness[4], которая по умолчанию включена во FreeBSD-CURRENT и выключена для стабильных веток и релизов, определяет возможность появления мёртвых блокировок из-за ошибок их использования, включая захват нескольких блокировок в различном порядке в разных частях ядра. Инфраструктура man:witness[4] пытается обнаруживать эту проблему по мере её появления и сообщает о ней на системную консоль в сообщении `lock order reversal` (которое также часто называют LOR).
+
+В силу консервативности man:witness[4] возможны ложные срабатывания. При правильном срабатывании такое сообщение _не_ означает, что система находится в состоянии мёртвой блокировки; его следует рассматривать как предупреждение о том, что в этом месте могла бы произойти мёртвая блокировка.
+
+[NOTE]
+====
+Плохие LOR обычно быстро исправляют, поэтому перед написанием сообщения в списки рассылки следует проверить архивы link:{freebsd-current}.
+====
+
+=== Что означают сообщения Called ... with the following non-sleepable locks held?
+
+Это означает, что функция, которая может находиться в "спящем" состоянии была вызвана во время использования мьютекс (или другого не "засыпающего") блокирования.
+
+Причина этого - ошибка, потому что мьютексы не предполагают находиться в удерживаемом состоянии длительные промежутки времени, а блокировать только на короткие периоды синхронизации. Это правило позволяет драйверам устройств использовать мьютексы для синхронизации с остальной частью ядра во время прерываний. Прерывания (во FreeBSD) могут находиться не в "спящем состоянии". Следовательно необходимо, чтобы не было подсистем в ядре, которые бы занимались блокировкой длительный период, используя мьютекс.
+
+Для нахождения таких ошибок в ядро могут быть добавлены assertions, которые будут взаимодействовать с подсистемой man:witness[4] для генерирования предупреждения или фатальной ошибки (в зависимости от системной конфигурации) в случаях когда производится потенциально блокирующий вызов с удержанием мьютекса.
+
+В общем, такие предупреждения не критичны, но тем не менее, с неудачной синхронизацией (timing) они могут вызвать нежелательные эффекты, начиная от незначительной задержки в ответной реакции системы до полной блокировки системы.
+
+Дополнительная информация о синхронизации во FreeBSD находится на странице Справочника man:locking[9].
+
+=== Почему процесс buildworld/installworld завершается с сообщением touch: not found?
+
+Эта ошибка не означает, что не найдена утилита man:touch[1]. Ошибка наверняка появляется из-за того, что даты модификации файлов установлены в будущем. Если CMOS часы установлены на локальное время, отрегулируйте часовой механизм ядра, запустив команду `adjkerntz -i` в однопользовательском режиме.
+
+== Прикладные программы
+
+=== Где находятся все прикладные программы?
+
+Обратитесь на link:https://www.FreeBSD.org/ports/[страницу портов], содержащую информацию о программных продуктах, перенесённых во FreeBSD. На данный момент в этом списке находится более {numports} приложений и он ежедневно увеличивается, так что почаще туда заглядывайте или подпишитесь на {freebsd-announce}, в котором публикуется информация о появлении новых приложений.
+
+Большинство портов должно нормально работать во всех поддерживаемых версиях FreeBSD. Неработающие порты специально помечаются соответствующим образом. При выходе нового релиза FreeBSD в него в каталог [.filename]#ports/# включается актуальная на момент выхода Коллекция Портов.
+
+FreeBSD умеет работать со сжатыми двоичными пакетами для упрощения установки и удаления портов. Используйте man:pkg[7] для управления процессом установки пакетов.
+
+=== Как загрузить дерево Портов? Следует ли использовать SVN?
+
+Любым из указанных способов:
+
+* Используйте portsnap в большинстве случаев. Обратитесь к разделу link:{handbook}#ports-using/[Использование Коллекции Портов] для получения инструкций по использованию этого инструмента.
+* Используйте SVN, если нужны собственные патчи для дерева портов. Обратитесь к разделу link:{handbook}#svn/[Использование Subversion] для получения дополнительной информации.
+* Используйте CTM как это описано в разделе link:{handbook}#ctm/[Использование CTM] для получения изменений по почте при нестабильном соединении.
+
+=== Поддерживает ли FreeBSD среду Java(TM)?
+
+Да. Для получения дополнительной информации посетите страницу link:https://www.FreeBSD.org/java/[http://www.FreeBSD.org/java/].
+
+=== Почему этот порт не компилируется на моей машине с {rel2-relx} - или {rel-relx} -STABLE?
+
+Если установленная версия FreeBSD, значительно отстаёт от _-CURRENT_ или _-STABLE_, обновите Коллекцию Портов с использованием указаний в разделе link:{handbook}#ports-using/[Использование Коллекции Портов]. Если система в актуальном состоянии, значит кто-то мог внести изменение в порт, с которым он работает в _-CURRENT_, но не работает в _-STABLE_. https://bugs.FreeBSD.org/submit/[Пошлите] сообщение об ошибке, так как Коллекция Портов должна работать как в _-CURRENT_, так и в ветках _-STABLE_.
+
+=== Я попытался сформировать файл INDEX командой make index, однако попытка окончилась неудачей. Почему?
+
+Первым делом убедитесь, что Коллекция Портов находится в актуальном состоянии. Ошибки, которые отражаются на построении файла [.filename]#INDEX# из актуальной копии Коллекции Портов, бросаются в глаза и поэтому практически всегда исправляются немедленно.
+
+В редких случаях [.filename]#INDEX# не перестраивается из-за странных комбинаций значений переменных `WITH__*_` или `WITHOUT__*_`, заданных в файле [.filename]#make.conf#. Если вы думаете, что это ваш случай, прежде чем сообщать об этом в {freebsd-ports}, попытайтесь сформировать [.filename]#INDEX# с отключенными значениями этих переменных.
+
+=== Я обновил исходные тексты. Как теперь обновить установленные порты?
+
+С FreeBSD не поставляется инструмент обновления портов, но есть несколько инструментов, немного облегчающих этот процесс. Кроме того, для упрощения работы с портами доступны дополнительные инструменты; смотрите раздел Руководства FreeBSD link:{handbook}#ports-using/[Использование Коллекции Портов].
+
+=== Нужно ли мне перекомпилировать все порты каждый раз, когда я выполняю мажорное обновление (со сменой старшей версии FreeBSD)?
+
+Да! На свежеобновленной системе программное обеспечение, скомпилированное под более старый релиз, будет по прежнему работать, но только до тех пор, пока вы не начнете устанавливать другие порты или обновлять существующие.
+
+Когда система обновлена, различные совместно используемые библиотеки, загружаемые модули и другие части системы замещаются более новыми версиями. Приложения, скомпонованные с более старыми версиями, могут перестать запускаться либо начнут функционировать неправильно.
+
+Для получения дополнительной информации обращайтесь к link:{handbook.en}#freebsdupdate-upgrade[разделу, посвящённому обновлениям,] руководства FreeBSD.
+
+=== Нужно ли мне перекомпилировать все порты каждый раз, когда я выполняю минорное обновление (без изменения старшей версии FreeBSD)?
+
+В общем случае, нет. Разработчики FreeBSD делают всё возможное для сохранения двоичной совместимости между всеми релизами в пределах одной старшей версии. Любые исключения из этого правила документируются в "Примечаниях к релизу", и там же даются советы, которых следует придерживаться.
+
+=== Почему возможности /bin/sh так малы? Почему бы во FreeBSD не использовать bash или какой-либо другой командный процессор?
+
+Многим требуется, чтобы разрабатываемые скрипты для командного процессора были переносимы между многими системами. Именно поэтому в POSIX(R) очень подробно описан командный процессор и набор утилит. Большинство скриптов пишутся на языке процессора Bourne shell (man:sh[1]), к тому же некоторые важные программные вызовы (man:make[1], man:system[3], man:popen[3] и их аналоги на языках скриптов высокого уровня, таких как Perl или Tcl) предполагают для интерпретации команд использование именно Bourne shell. Так как Bourne shell используется столь широко и часто, то очень важно, чтобы он стартовал очень быстро, его поведение было строго регламентировано и при этом потребности в оперативной памяти были малы.
+
+В имеющейся реализации мы приложили максимум усилий для воплощения в жизнь всех этих требований одновременно. Для того, чтобы сохранить `/bin/sh` небольшим по размеру, мы не включили многие из обычных возможностей, которые имеются в других командных процессорах. Для этого имеются в наличии командные процессоры, обладающие гораздо большими возможностями, такие как `bash`, `scsh`, man:tcsh[1] и `zsh`. Сравните использование памяти этими оболочками, посмотрев в колонки "VSZ" и "RSS" вывода команды `ps -u`.
+
+=== Как создать аудио-CD из файлов MIDI?
+
+Для создания аудио-CD из MIDI-файлов сначала установите из портов программу package:audio/timidity[], затем установите набор патчей GUS от Эрика Уэлша (Eric A. Welsh), доступный по адресу http://alleg.sourceforge.net/digmid.html[http://alleg.sourceforge.net/digmid.html]. После корректной установки TiMidity++ MIDI-файлы могут быть преобразованы в WAV-файлы следующей командой:
+
+[source,bash]
+....
+% timidity -Ow -s 44100 -o /tmp/juke/01.wav 01.mid
+....
+
+WAV-файлы затем могут быть преобразованы в другие форматы или записаны как аудио-CD, что описано в link:{handbook}#creating-cds/[Руководстве FreeBSD].
+
+== Конфигурирование ядра
+
+[[make-kernel]]
+=== Я хочу изменить настройки ядра. Это сложно?
+
+Вовсе нет! Обратитесь к link:{handbook}#kernelconfig/[соответствующему разделу] Руководства, который посвящён этому вопросу.
+
+[NOTE]
+====
+Новый файл [.filename]#kernel# будет установлен в каталог [.filename]#/boot/kernel# вместе со своими модулями, а старое ядро и его модули будут сдвинуты в каталог [.filename]#/boot/kernel.old#. Если сделана ошибка в конфигурации, просто загрузите предыдущую версию ядра.
+====
+
+=== Почему моё ядро такое большое?
+
+Конфигурация ядра `GENERIC`, которая содержится в дистрибутиве FreeBSD, компилируется в _отладочном режиме_. В таком режиме ядра содержат много символьной информации в разных файлах, которая используется для отладки и сильно увеличивает размер [.filename]#/boot/kernel/#. Заметьте, что уменьшения производительности при использовании отладочного ядра нет или оно незначительно, однако отладочное ядро полезно иметь под рукой на случай аварийного завершения работы системы.
+
+Однако при нехватке дискового пространства существует несколько вариантов уменьшения размера [.filename]#>/boot/kernel/#.
+
+Чтобы не устанавливать файлы с символьной информацией, убедитесь в наличии следующей строки в [.filename]#/etc/src.conf#:
+
+[.programlisting]
+....
+WITHOUT_KERNEL_SYMBOLS=yes
+....
+
+Для получения дополнительной информации смотрите страницу Справочника man:src.conf[5].
+
+Если вы не хотите компилировать отладочное ядро, убедитесь в выполнении следующих условий:
+
+* В конфигурационном файле ядра нет такой строчки:
++
+[.programlisting]
+....
+makeoptions DEBUG=-g
+....
+
+* Вы не запускали утилиту man:config[8] с опцией `-g`.
+
+В любой из вышеописанных ситуаций ядро будет построено с отладочным режимом.
+
+Чтобы скомпилировать и установить только нужные модули, укажите их в [.filename]#/etc/make.conf#:
+
+[.programlisting]
+....
+MODULES_OVERRIDE= accf_http ipfw
+....
+
+Замените _accf_httpd ipfw_ на нужный список модулей. Это уменьшит размер каталога с ядром, а также время сборки. Для получения дополнительной информации почитайте [.filename]#/usr/shared/examples/etc/make.conf#.
+
+Для дальнейшего уменьшения размера также можно удалить ненужные устройства из ядра. Для получения дополнительной информации смотрите <<make-kernel>>.
+
+Для вступления любого из этих действий в силу следуйте указаниям по link:{handbook}#kernelconfig-building/[сборке и установке] нового ядра.
+
+Большинство ядер ([.filename]#/boot/kernel/kernel#), как правило, занимают от 12 до 16 Мбайт.
+
+=== Почему мне не удаётся откомпилировать ни один вариант ядра, даже GENERIC?
+
+Есть несколько причин, приводящих к возникновению этой проблемы:
+
+* Дерево исходных текстов отличается от того, что использовалось для построения работающей в данный момент системы. Перед обновлением прочитайте файл [.filename]#/usr/src/UPDATING#, обращая особое внимание на раздел "COMMON ITEMS" в его конце.
+* Команда `make buildkernel` не завершилась успешно. Корректное выполнение цели `make buildkernel` зависит от файлов, полученных после выполнения `make buildworld`.
+* Даже при построении <<stable,FreeBSD-STABLE>> возможно, что дерево исходных текстов было загружено в тот момент, когда оно модифицировалось или было неработоспособно. Построение гарантируется только для релизов, хотя в большинстве случаев <<stable,FreeBSD-STABLE>> строится без проблем. Попробуйте сгрузить дерево исходных текстов повторно и посмотрите, разрешилась ли проблема. Если с сервером есть проблемы, попробуйте другое зеркало.
+
+=== Какой планировщик используется в работающей системе?
+
+Название используемого планировщика доступно напрямую в виде значения sysctl-параметра `kern.sched.name`:
+
+[source,bash]
+....
+% sysctl kern.sched.name
+kern.sched.name: ULE
+....
+
+=== Что такое kern.sched.quantum?
+
+`kern.sched.quantum` определяет максимальное количество тактов, которое процесс может выполняться, не будучи прерванным.
+
+== Диски, файловые системы и начальные загрузчики
+
+=== Как добавить в систему новый диск?
+
+Обратитесь к разделу link:{handbook}#disks-adding/[Добавление дисков] Руководства FreeBSD.
+
+=== Как перенести систему на большой новый диск?
+
+Самый лучший способ заключается в переустановке операционной системы на новый диск с последующим переносом пользовательских данных. Это настоятельно рекомендуется при отслеживании ветки _-STABLE_ в течение более одного релиза или при обновлении релиза вместо установки нового. Установите booteasy на оба диска с помощью man:boot0cfg[8] и выполняйте загрузку с любого из них, пока не будете довольны новой конфигурацией. Пропустите следующий абзац, чтобы перейти к вопросу переноса данных после этой операции.
+
+Либо разбейте на разделы и разметьте новый диск с помощью man:sade[8] или man:gpart[8]. Если диски отформатированы в MBR, то booteasy можно установить на оба диска с помощью man:boot0cfg[8] для того, чтобы иметь возможность выполнять загрузку как старой, так и новой системы после выполнения копирования.
+
+После подготовки диска данные нельзя просто так взять и перенести. Используйте для этого инструменты, которые учитывают файлы устройств и системные флаги, например, man:dump[8]. И хотя рекомендуется выполнять перенос данных в однопользовательском режиме, это не является обязательным условием.
+
+Если на дисках стоит UFS, никогда не используйте ничего, кроме man:dump[8] и man:restore[8] для переноса корневой файловой системы. Эти команды также следует использовать при переносе отдельного раздела на другой пустой раздел. Последовательность шагов при использовании `dump` для переноса данных с раздела UFS на новый раздел:
+
+[.procedure]
+====
+. выполните команду `newfs` над новым разделом.
+. командой `mount` смонтируйте его во временный каталог.
+. командой `cd` перейдите в этот каталог.
+. выполните команду `dump` над старым разделом, направив вывод в новый раздел.
+====
+
+Например, чтобы перенести корневую файловую систему на устройство [.filename]#/dev/ada1s1a# с использованием каталога [.filename]#/mnt# в качестве временной точки монтирования, наберите:
+
+[source,bash]
+....
+# newfs /dev/ad1as1a
+# mount /dev/ad1as1a /mnt
+# cd /mnt
+# dump 0af - / | restore rf -
+....
+
+Переразбиение разделов с использованием `dump` требует несколько больше усилий. Для объединения раздела типа [.filename]#/var# с его вышестоящим разделом, создайте новый раздел, достаточно большой для размещения их обоих, переместите вышестоящий раздел так, как это описано выше, а затем переместите нижестоящий раздел в пустой каталог, созданный при первом перемещении:
+
+[source,bash]
+....
+# newfs /dev/ada1s1a
+# mount /dev/ad1as1a /mnt
+# cd /mnt
+# dump 0af - / | restore rf -
+# cd var
+# dump 0af - /var | restore rf -
+....
+
+Для отделения каталога от вышестоящего, скажем, для размещения [.filename]#/var# в собственном разделе, которого не было, создайте оба раздела, затем смонтируйте нижестоящий раздел в подходящий каталог во временную точку монтирования, а затем переместите старый единый раздел:
+
+[source,bash]
+....
+# newfs /dev/ada1s1a
+# newfs /dev/ada1s1d
+# mount /dev/ada1s1a /mnt
+# mkdir /mnt/var
+# mount /dev/ada1s1d /mnt/var
+# cd /mnt
+# dump 0af - / | restore rf -
+....
+
+Для перемещения пользовательских данных также имеются программы man:cpio[1] и man:pax[1]. Известно, что они теряют информацию о флагах файлов, так что используйте их с осторожностью.
+
+=== На каких разделах можно без опаски использовать механизм Soft Updates? Я слышал, что использование Soft Updates на / могут приводить к проблемам. Что насчёт журналируемых Soft Updates?
+
+Краткий ответ: обычно Soft Updates можно использовать без опаски на всех разделах.
+
+Подробный ответ: Soft Updates имеют две характеристики, которые могут быть нежелательны на некоторых разделах. Во-первых, раздел с Soft Updates имеет небольшой шанс потери данных по время аварийного останова системы. Раздел не будет попорчен, поскольку данные будет просто потеряны. Во-вторых, Soft Updates могут приводить к временной нехватке дискового пространства.
+
+При использовании Soft Updates ядро может задерживать до тридцати секунд запись изменений на физический диск. При удалении большого файла он остается на диске, пока ядро не выполнит фактическое удаление. Это может привести к очень простой гонке. Предположим, удаляется один большой файл и тут же создаётся другой большой файл. Первый файл на самом деле ещё не удалён с диска, поэтому для второго файла на диске может не хватить места. Это приведёт к ошибке о том, что на разделе нет достаточного пространства, несмотря на то, что только что освободилось много места. Через пару секунд создание файла сработает, как и ожидалось.
+
+Если система может аварийно остановиться после того, как ядро примет набор данных для записи на диск, но перед тем, как данные реально запишутся, то данные могут потеряться. Такой риск чрезвычайно мал, но в целом управляем.
+
+Эти проблемы влияют на все разделы, использующие Soft Updates. Итак, что это означает для корневого раздела?
+
+Жизненно важная информация на корневом разделе меняется очень редко. Если в системе произойдет сбой в период тридцатисекундного окна после выполнения такого изменения, возможно, что данные окажутся потерянными. Этот риск незначителен для большинства применений, но его нужно учитывать. Если система не может принять такой риск, не используйте Soft Updates с корневой файловой системой!
+
+[.filename]#/# традиционно является одним из самых маленьких разделов. Если каталог [.filename]#/tmp# размещён в [.filename]#/# и у вас заполнен [.filename]#/tmp#, то могут периодически возникать проблемы с дисковым пространством. Создание символической ссылки [.filename]#/tmp#, указывающей на [.filename]#/var/tmp# решит эту проблему.
+
+В заключение, man:dump[8] не работает в режиме реального времени (-L) с файловой системой, для которой включены журналируемые Soft Updates (SU+J).
+
+=== Можно ли смонтировать другие файловые системы?
+
+FreeBSD поддерживает ряд других файловых систем.
+
+UFS::
+Компакт-диски с файловой системой UFS могут быть смонтированы без всяких проблем. Монтирование файловых систем Digital UNIX или других систем, поддерживающих UFS, может быть более сложным, в зависимости от особенностей разбиения диска конкретной операционной системой.
+
+ext2/ext3::
+FreeBSD поддерживает разделы `ext2fs` и `ext3fs`. За дополнительной информацией обратитесь к странице Справочника man:ext2fs[5].
+
+NTFS::
+Поддержка NTFS через FUSE доступна через порт package:sysutils/fusefs-ntfs[]. Для получения более полной информации смотрите документацию к http://www.tuxera.com/community/ntfs-3g-manual/[ntfs-3g].
+
+FAT::
+Во FreeBSD имеется драйвер для работы с FAT в режиме чтения-записи. Для получения дополнительной информации обратитесь к странице справочника man:mount_msdosfs[8].
+
+ZFS::
+FreeBSD включает в себя портированную из Sun(TM) реализацию файловой системы ZFS. В настоящее время рекомендуется использовать её только на платформе amd64 с достаточным объемом памяти. Для получения более полной информации обратитесь к странице Справочника man:zfs[8].
+
+FreeBSD включает сетевую файловую систему NFS. В Коллекции портов FreeBSD имеется несколько приложений FUSE для поддержки многих других файловых систем.
+
+=== Как смонтировать вторичный раздел DOS?
+
+Вторичные разделы DOS находятся после _всех_ первичных разделов. Например, если "E" является вторым разделом DOS на втором диске SCSI, то здесь будет файл устройства для пятого "слайса" в каталоге [.filename]#/dev#. Чтобы смонтировать:
+
+[source,bash]
+....
+# mount -t msdosfs /dev/da1s5 /dos/e
+....
+
+=== Существует ли криптографическая файловая система для FreeBSD?
+
+Да, man:gbde[8] и man:geli[8]. Смотрите раздел link:{handbook}#disks-encrypting/[Шифрование дисковых разделов] Руководства FreeBSD.
+
+=== Как загрузить FreeBSD и Linux(R) с помощью GRUB?
+
+Для загрузки FreeBSD с использованием GRUB добавьте следующие строки в [.filename]#/boot/grub/menu.lst# или [.filename]#/boot/grub/grub.conf#, в зависимости от используемого дистрибутива Linux(R).
+
+[.programlisting]
+....
+title FreeBSD 9.1
+root (hd0,a)
+kernel /boot/loader
+....
+
+Где _hd0,a_ указывает на корневой раздел на первом диске. Чтобы указать номер слайса, напишите что-то вроде _(hd0,2,a)_. По умолчанию, если номер слайса не указан, GRUB ищет первый слайс c разделом `a`.
+
+=== Как загрузить FreeBSD и Linux(R) с помощью BootEasy?
+
+Установите LILO в начало загрузочного раздела Linux(R), а не в Master Boot Record. После этого LILO можно будет запустить LILO из BootEasy.
+
+Это рекомендуется делать при одновременном использовании Windows(R) и Linux(R), чтобы упростить восстановление работоспособности Linux(R) в случае переустановки Windows(R).
+
+=== Как сменить приглашение загрузчика с ??? на что-нибудь более значащее?
+
+Этого нельзя сделать со стандартным загрузчиком, не переписав его. В категории [.filename]#sysutils# Коллекции Портов есть ряд других менеджеров загрузки.
+
+=== Как использовать устройство для чтения сменных дисков?
+
+Если у вас уже есть файловая система на устройстве, то используйте такую команду:
+
+[source,bash]
+....
+# mount -t msdosfs /dev/da0s1 /mnt
+....
+
+Если это устройство будет использоваться только на системах FreeBSD, то разбейте его на разделы UFS или ZFS. Это обеспечит поддержку длинных имён файлов, увеличение производительности и надёжность. Если устройство будет использоваться с другими операционными системами, то лучше сделать более совместимый выбор, например, msdosfs.
+
+[source,bash]
+....
+# dd if=/dev/zero of=/dev/da0 count=2
+# gpart create -s GPT /dev/da0
+# gpart add -t freebsd-ufs /dev/da0
+....
+
+Наконец, остаётся создать новую файловую систему:
+
+[source,bash]
+....
+# newfs /dev/da0p1
+....
+
+и смонтировать её:
+
+[source,bash]
+....
+# mount /dev/da0s1 /mnt
+....
+
+Хорошо ещё добавить строку в файл [.filename]#/etc/fstab# (прочтите справку по man:fstab[5]), чтобы в будущем можно было просто давать команду `mount /mnt`:
+
+[.programlisting]
+....
+/dev/da0p1 /mnt ufs rw,noauto 0 0
+....
+
+=== При монтировании компакт-диска выдаётся сообщение Incorrect super block.
+
+Необходимо указать тип монтируемого устройства. Это описано в в разделе Руководства link:{handbook}#creating-cds/#mounting-cd[Использование CD с данными].
+
+=== При монтировании компакт-диска выдаётся сообщение Device not configured.
+
+Обычно это означает, что в приводе нет компакт-диска либо устройство не обнаружено на шине. Обратитесь к разделу link:{handbook}#mounting-cd[Использование CD с данными] в Руководстве, где подробно обсуждается этот вопрос.
+
+=== Когда я монтирую CD-ROM, все неанглийские символы в именах файлов выводятся как ?.
+
+Скорее всего, на компакт-диске для хранения информации о файлах и каталогах используется расширение "Joliet". Это описано в разделе Руководства об link:{handbook}#mounting-cd[использовании CD с данными].
+
+=== Записанный во FreeBSD CD не читается ни в какой другой операционной системой. Почему?
+
+Это означает, что на CD был записан непосредственно необработанный файл без создания файловой системы ISO 9660. Прочтите раздел Руководства о link:{handbook}#rawdata-cd[записи данных непосредственно на компакт-диски].
+
+=== Как создать образ CD с данными?
+
+Это описано в разделе Руководства о link:{handbook}#imaging-cd[копировании CD с данными]. Более полную информацию о работе с компакт-дисками можно найти в разделе о link:{handbook}#creating-cds/[создании компакт-дисков] в главе Руководства об устройствах хранения данных.
+
+=== Почему я не могу смонтировать (командой mount аудио CD?
+
+Попытка смонтировать аудио CD приведёт к сообщению об ошибке вида: `cd9660: /dev/acd0c: Invalid argument`. Причина этого заключается в том, что команда `mount` работает только с файловыми системами. На аудио CD файловых систем нет; они содержат только данные. Используйте вместо этого программу, которая умеет читать аудио CD, например, порт package:audio/xmcd[].
+
+=== Как выполнить mount для многосеансового CD?
+
+По умолчанию man:mount[8] будет пытаться смонтировать последнюю дорожку (сеанс) CD с данными. Для загрузки более раннего сеанса используйте параметр командной строки `-s`. За конкретными примерами обращайтесь к странице Справочника man:mount_cd9660[8].
+
+=== Как разрешить обычным пользователям монтировать компакт-диски, DVD, USB-диски и другие сменные носители?
+
+Как пользователь `root`, установите системную переменную `vfs.usermount` в значение `1`.
+
+[source,bash]
+....
+# sysctl vfs.usermount=1
+....
+
+Чтобы это срабатывало во время загрузки системы, добавьте строчку `vfs.usermount=1` в файл [.filename]#/etc/sysctl.conf#.
+
+Пользователи могут монтировать только те устройства, к которым у них имеется доступ на чтение. Чтобы разрешить пользователям монтировать устройство, должны быть заданы разрешения в [.filename]#/etc/devfs.conf#.
+
+Например, чтобы разрешить пользователям монтировать первое устройство USB, добавьте такую строчку:
+
+[.programlisting]
+....
+# Allow all users to mount a USB drive.
+ own /dev/da0 root:operator
+ perm /dev/da0 0666
+....
+
+Теперь все пользователи могут монтировать устройства с правами доступа на чтение в собственные каталоги:
+
+[source,bash]
+....
+% mkdir ~/my-mount-point
+% mount -t msdosfs /dev/da0 ~/my-mount-point
+....
+
+Размонтирование устройства осуществляется просто:
+
+[source,bash]
+....
+% umount ~/my-mount-point
+....
+
+Использование `vfs.usermount`, однако, имеет некоторые негативные стороны, связанные с вопросами безопасности. Более правильным способом работы с носителями в формате MS-DOS(R) является использование пакета package:emulators/mtools[] из Коллекции Портов.
+
+[NOTE]
+====
+Имя устройства, использованное в предыдущих примерах, должно быть изменено в соответствии с конфигурацией.
+====
+
+=== Команды du и df показывают разный объем доступного дискового пространства. Что происходит?
+
+Это связано с тем, как эти команды на самом деле работают. `du` проходит по дереву каталогов, замеряя, насколько большой объем занимает каждый файл, и выдает общий объем. `df` просто запрашивает файловую систему об оставшемся объеме. Это выглядит как одно и то же, однако файл без записи в каталоге затронет `df`, но не повлияет на `du`.
+
+Когда программа использует файл и этот файл удаляется, то на самом деле он не удаляется из файловой системы, пока программа не прекратит его использовать. Однако файл тут же удаляется из списка каталога. Представим себе файл достаточно большого размера, чтобы его присутствие влияло на вывод `du` и `df`. Если файл удаляется в процессе работы с ним команды `more`, команда `more` не сообщает сразу же, что не может просматривать файл. Запись о файле просто удалена из каталога, так что другие программы или пользователи не смогут к нему обратиться. Тем не менее, `du` покажет, что файл исчез, поскольку она просматривает дерево каталогов, а файла там нет. `df` показывает, что файл всё ещё здесь, так как файловая система знает, что `more` всё ещё использует это пространство. Как только закончится работа с `more`, команды `du` и `df` придут в соответствие.
+
+Такая ситуация часта на Web-серверах. Многие устанавливают Web-сервер на FreeBSD и забывают обновлять файлы протоколов. Журнал доступа заполняет [.filename]#/var#. Новый администратор удаляет файл, но система все еще сообщает о том, что раздел заполнен. Остановка и перезапуск программы Web-сервера освободит файл, позволяя системе освободить дисковое пространство. Для предотвращения этого настройте man:newsyslog[8].
+
+Заметьте, что подсистема отложенных обновлений (Soft Updates) может задерживать освобождение дискового пространства, и может потребоваться до 30 секунд, чтобы изменения стали заметны.
+
+=== Как добавить дополнительную виртуальную память?
+
+В этом разделе link:{handbook}#adding-swap-space/[Руководства] описывается, как это сделать.
+
+=== Почему FreeBSD считает, что размер моего диска меньше, чем заявляет его производитель?
+
+Производители дисков считают гигабайт равным миллиарду байт, а FreeBSD приравнивает его к 1073741824 байт. Это объясняет, почему, к примеру, в сообщениях при загрузке FreeBSD указывается, что ёмкость диска, объём которого должен быть равным 80 Гбайт, составляет 76319 Мбайт.
+
+Заметьте также, что FreeBSD будет (по умолчанию) <<disk-more-than-full,резервировать>> 8% ёмкости диска.
+
+=== Почему возможно заполнение раздела больше чем на 100%?
+
+Часть каждого раздела UFS (по умолчанию 8%) зарезервировано для использования операционной системой и пользователем `root`. Утилита man:df[1] не учитывает это при подсчёте значения в колонке `Capacity`, так что оно может превышать 100%. Обратите внимание, что колонка `Blocks` всегда больше, чем сумма значений в колонках `Used` и `Avail`, обычно на 8%.
+
+Для получения более подробной информации обратитесь к описанию опции `-m` в справке по man:tunefs[8].
+
+=== Почему загрузка FreeBSD задерживается на длительное время на системах с большим объёмом ОЗУ?
+
+FreeBSD выполняет короткую проверку памяти на раннем этапе загрузки. Обычно эта проверка занимает всего несколько секунд, но если система имеет много десятков или сотен Гбайт памяти, это можно занять до нескольких минут. Эту проверку можно отключить, установив `hw.memtest.tests` в значение `0` в [.filename]#/boot/loader.conf#.
+
+Для получения дополнительной информации смотрите страницу Справочника man:loader.conf[5].
+
+== ZFS
+
+=== Какой минимальный объём ОЗУ нужно иметь для ZFS?
+
+Для комфортного использования требуется 4 Гбайт ОЗУ, но конкретная нагрузка может сильно различаться.
+
+=== Что такое ZIL и когда оно используется?
+
+ZIL ((ZFS intent log) - это журнал записи, используемый для фиксации операций записи. Обычно операции собираются в группу транзакций и при заполнении группы пишутся на диск ("Transaction Group Commit"). Однако системные вызовы типа man:fsync[2] требуют фиксацию записи данных на устройстве перед возвратом управления. ZIL нужен для подтверждения такой записи, но когда данные ещё не находятся на диске. Группа транзакций помечается временной меткой. В случае системного сбоя ищется последняя неповреждённая метка и из ZIL извлекаются недостающие данные.
+
+=== Нужен ли мне SSD для ZIL?
+
+По умолчанию ZFS хранит ZIL в пуле со всеми данными. Если приложение имеет большой процент записи, вынос ZIL на отдельное устройство с очень быстрой синхронной последовательной записью может улучшить общую производительность. В остальных случаях SSD вряд ли сможет что-то сильно улучшить.
+
+=== Что такое L2ARC?
+
+L2ARC - это кеш на чтение, хранимый на быстром устройстве, таком как SSD. Этот кеш не сохраняется между перезагрузками. Следует заметить, что ОЗУ выступает как кеш первого уровня, а L2ARC задействуется только при нехватке ОЗУ.
+
+Для L2ARC нужно пространство в ARC для его индексации. Таким образом, рабочий набор, который идеально помещается в ARC, не будет помещаться при использовании L2ARC, потому что часть ARC будет отведена под индекс L2ARC с вытеснением части рабочего набора в L2ARC, более медленный, чем ОЗУ.
+
+=== Целесообразно ли включение дедупликации?
+
+В общем случае нет.
+
+Дедупликация занимает значительный объём ОЗУ и может увеличить задержки операций ввода/вывода. Если данные не являются сильно дублированными (образы виртуальных машин или пользовательские бекапы), то, возможно, дедупликация даст больше вреда. Другое соображение касается невозможности отменить статус дедупликации. Если данные записаны при включённой дедупликации, её выключение не приведёт к обратной репликации объединённых блоков до момента следующей перезаписи.
+
+Дедупликация также может приводить к некоторым неожиданным ситуациям. В частности, удаление файлов может сильно замедлиться.
+
+=== Я не могу создать или удалить файлы на пуле ZFS. Как я могу это исправить?
+
+Такое может произойти при 100% заполненности пула. ZFS требуется свободное место на диске для записи метаданных транзакций. Для восстановления работоспособного состояния пула обрежьте файл перед его удалением.
+
+[source,bash]
+....
+% truncate -s 0 unimportant-file
+....
+
+Обрезание файла работает по той причине, что новая транзакция при этом не запускается; вместо этого создаются новые свободные блоки.
+
+[NOTE]
+====
+На системах с дополнительной настройкой ZFS dataset, такой как дедупликация, свободное место может не быть доступно сразу.
+====
+
+=== Поддерживается ли TRIM в ZFS для твердотельных накопителей?
+
+Поддержка ZFS TRIM была добавлена во FreeBSD 10-CURRENT в ревизии rlink:https://svnweb.freebsd.org/changeset/base/240868[r240868] и стала доступна в ветках -STABLE в rlink:https://svnweb.freebsd.org/changeset/base/252162[r252162] и rlink:https://svnweb.freebsd.org/changeset/base/251419[r251419].
+
+ZFS TRIM включена по умолчанию и может быть отключена посредством добавления такой строки в [.filename]#/etc/sysctl.conf#:
+
+[.programlisting]
+....
+vfs.zfs.trim_disable=1
+....
+
+[NOTE]
+====
+ZFS TRIM может не работать на всех конфигурациях, в частности для файловой системы ZFS на устройствах с использованием GELI.
+====
+
+== Системное администрирование
+
+=== Где расположены файлы конфигурации системы?
+
+Основным конфигурационным файлом является [.filename]#/etc/defaults/rc.conf#, который описан в man:rc.conf[5]). Этот файл подключают системные скрипты запуска, такие как [.filename]#/etc/rc# и [.filename]#/etc/rc.d#, которые описаны в man:rc[8]. _Не редактируйте этот файл!_ Вместо изменения параметра в [.filename]#/etc/defaults/rc.conf# скопируйте эту строку в [.filename]#/etc/rc.conf# и поменяйте значение там.
+
+Пример запуска man:named[8], поставляемого с системой сервера DNS:
+
+[source,bash]
+....
+# echo 'named_enable="YES"' >> /etc/rc.conf
+....
+
+Чтобы запустить местные сервисы, поместите скрипты в каталог [.filename]#/usr/local/etc/rc.d#. У этих скриптов должен быть выставлен бит выполнимости, по умолчанию используются права доступа `555`.
+
+=== Как проще всего добавить пользователя?
+
+Используйте команду man:adduser[8] или man:pw[8] в случае выполнения более сложных операций.
+
+Чтобы удалить пользователя, используйте команду man:rmuser[8] или, если это будет необходимо, man:pw[8].
+
+=== Почему после редактирования моего файла crontab я получаю сообщения вида root: not found?
+
+Обычно это случается при редактировании системного файла crontab.
+
+Это неправильный подход, потому что системный crontab имеет формат, отличный от пользовательских crontab. Системный crontab имеет дополнительное поле, указывающее, под каким пользователем запускать команду. man:cron[8] полагает, что имя пользователя является первым словом в команде на выполнение. Поскольку такой команды не существует, отображается это сообщение об ошибке.
+
+Чтобы удалить лишний неправильный crontab:
+
+[source,bash]
+....
+# crontab -r
+....
+
+=== Команда su выдает ошибку you are not in the correct group to su root, когда я пытаюсь сменить привилегии на root.
+
+Это особенность работы системы защиты. Для того, чтобы сменить пользовательский идентификатор с помощью `su` на пользователя `root` или любого другого с привилегиями суперпользователя, учётная запись должна являться членом группы `wheel`. Если бы этого не было, то любой, имеющий доступ к системе и узнавший пароль пользователя `root`, смог бы получить в системе уровень доступа суперпользователя.
+
+Чтобы разрешить кому-либо менять привилегии на `root`, включите его в группу `wheel` с помощью `pw`.
+
+[source,bash]
+....
+# pw groupmod wheel -m lisa
+....
+
+В примере выше пользователь `lisa` будет добавлен в группу `wheel`.
+
+=== Я сделал ошибку в файле rc.conf или в каком-то другом файле начальной загрузки, и теперь не могу его отредактировать из-за того, что файловая система находится в режиме только для чтения. Что мне делать?
+
+Перезапустите систему, используя в приглашении загрузчика команду `boot -s` для входа в однопользовательский режим. При получении приглашения на ввод полного пути до командного процессора нажмите `Enter`, а затем выполните команду `mount -urw /` для повторного монтирования корневой файловой системы в режиме чтения/записи. Вам может также потребоваться выполнить команду `mount -a -t ufs` для монтирования файловой системы, в которой расположен ваш любимый текстовый редактор. Если редактор расположен на сетевой файловой системе, либо выполните сетевые настройки вручную до монтирования сетевой файловой системы, либо воспользоваться редактором, находящимся в локальной файловой системе, таким, как man:ed[1].
+
+Чтобы использовать полноэкранный редактор, такой как man:vi[1] или man:emacs[1], выполните команду `export TERM=xterm` во FreeBSD 9.0+ или `export TERM=cons25` во FreeBSD 8.X, чтобы такие редакторы смогли корректно взять данные из базы данных man:termcap[5].
+
+После выполнения этих шагов отредактируйте файл [.filename]#/etc/rc.conf# для исправления ошибки. Сообщение об ошибке, выводимое сразу же после сообщений при загрузке ядра, должно указать на номер строки в файле, которая содержит ошибку.
+
+=== У меня проблемы с установкой принтера.
+
+Обратитесь к соответствующему link:{handbook}#printing/[разделу] Руководства, посвящённому печати, за советами по разрешению проблем.
+
+=== Раскладка клавиатуры неверна.
+
+Обратитесь к разделу Руководства, посвящённому link:{handbook}#using-localization/[использованию локализации], а именно к части, описывающей link:{handbook}#setting-console[ настройку консоли].
+
+=== Почему не получается заставить работать дисковые квоты?
+
+. Возможно, что ядро не сконфигурировано должным образом для работы с квотами. В этом случае добавьте следующую строчку в конфигурационный файл ядра и пересоберите ядро:
++
+[.programlisting]
+....
+options QUOTA
+....
+
++
+Прочтите link:{handbook}#quotas/[главу руководства по квотам] для полной информации.
+. Не включайте квотирование на разделе [.filename]#/#.
+. Помещайте файл с квотами в ту файловую систему, которую он обслуживает:
++
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Файловая система
+| Файл квот
+
+|[.filename]#/usr#
+|[.filename]#/usr/admin/quotas#
+
+|[.filename]#/home#
+|[.filename]#/home/admin/quotas#
+
+|...
+|...
+|===
+
+=== Поддерживает ли FreeBSD вызовы IPC из System V?
+
+Да, во FreeBSD в ядро [.filename]#GENERIC# включена поддержка IPC в стиле System V, в том числе совместно используемой памяти, сообщений и семафоров. В вашем собственном ядре поддержка может быть включена посредством загрузки модулей ядра [.filename]#sysvshm.ko#, [.filename]#sysvsem.ko# и [.filename]#sysvmsg.ko# или добавлением в конфигурационный файл ядра следующих строк:
+
+[.programlisting]
+....
+options SYSVSHM # enable shared memory
+options SYSVSEM # enable for semaphores
+options SYSVMSG # enable for messaging
+....
+
+Перекомпилируйте и переустановите ядро.
+
+=== Какое другое программное обеспечение для почтового сервера можно использовать вместо Sendmail?
+
+Сервер http://www.sendmail.org/[Sendmail] является программным обеспечением для работы почтового сервера во FreeBSD, используемым по умолчанию, но его можно заменить другим MTA, установленным из Коллекции Портов. В дереве портов имеется package:mail/exim[], package:mail/postfix[] и package:mail/qmail[]. Проверьте архивы списков рассылки на предмет обсуждения достоинств и недостатков имеющихся MTA.
+
+=== Я забыл пароль пользователя root! Что делать?
+
+Без паники! Перезапустите систему, наберите `boot -s` в приглашении `Boot:` для входа в однопользовательский режим. На вопрос об используемой оболочке нажмите kbd:[Enter] для получения приглашения # . Введите `mount -urw /`, чтобы перемонтировать корневую файловую систему в режиме чтения/записи, после чего выполните команду `mount -a` для монтирования всех файловых систем. Запустите команду `passwd root`, чтобы сменить пароль пользователя `root`, а затем man:exit[1] для продолжения процесса загрузки.
+
+[NOTE]
+====
+Если при входе в однопользовательский режим предлагается ввести пароль пользователя `root`, это означает, что консоль была помечена как `insecure` в [.filename]#/etc/ttys#. В этом случае потребуется загрузиться с установочного диска FreeBSD, выбрать [.guimenuitem]#Live CD# или [.guimenuitem]#Shell# в начале процесса установки и выполнить указанные выше команды. В этом случае смонтируйте нужный раздел и выполните туда chroot. Например, замените команду `mount -urw /` на `mount /dev/ada0p1 /mnt; chroot /mnt` для системы, расположенной на _ada0p1_.
+====
+
+[NOTE]
+====
+Если корневой раздел не получается смонтировать в однопользовательском режиме, то возможно, что разделы являются зашифрованными, и смонтировать их без ключей доступа не представляется возможным. За дополнительной информацией обращайтесь к разделу link:{handbook}#disks-encrypting/[Руководства], посвященному шифрованию дисков во FreeBSD.
+====
+
+=== Как запретить перезагрузку по нажатию Control Alt Delete?
+
+При использовании стандартного драйвера консоли man:syscons[4] перегенерируйте и установите новое ядро с таким параметром в конфигурационном файле:
+
+[.programlisting]
+....
+options SC_DISABLE_REBOOT
+....
+
+Этого также можно достичь установкой следующего man:sysctl[8], что не требует перезагрузки или пересборки ядра:
+
+[source,bash]
+....
+# sysctl hw.syscons.kbd_reboot=0
+....
+
+[NOTE]
+====
+Оба этих метода являются взаимоисключающими. Данный man:sysctl[8] не существует, если ядро скомпилировано с параметром `SC_DISABLE_REBOOT`.
+====
+
+=== Как преобразовать текстовые файлы DOS в формат UNIX(R)?
+
+Воспользуйтесь следующей командой man:perl[1]:
+
+[source,bash]
+....
+% perl -i.bak -npe 's/\r\n/\n/g' file(s)
+....
+
+где _file(s)_ - это один или несколько файлов для обработки. Преобразование делается в том же самом файле, оригинальные файлы сохраняются с расширением [.filename]#.bak#.
+
+Либо используйте man:tr[1]:
+
+[source,bash]
+....
+% tr -d '\r' < dos-text-file > unix-file
+....
+
+где _dos-text-file_ - это имя файла, содержащего текст DOS, а в файл _unix-file_ будет помещён уже преобразованный текст. Этот способ может работать гораздо быстрее, чем при использовании `perl`.
+
+Еще один способ отформатировать тестовые файлы DOS состоит в использовании package:converters/dosunix[] из Коллекции Портов. Для получения дополнительной информации ознакомьтесь с документацией порта.
+
+=== Как перечитать содержимое /etc/rc.conf и перестартовать /etc/rc без перезагрузки системы?
+
+Перейдите в однопользовательский режим, а затем возвратитесь обратно в многопользовательский.
+
+[source,bash]
+....
+# shutdown now
+# return
+# exit
+....
+
+=== Я пытался обновить мою систему до последней -STABLE, а получил -BETAx, -RC или -PRERELEASE! Что происходит?
+
+Краткий ответ: это же просто название. _RC_ означает "Release Candidate". Это значит, что вскоре произойдет выход релиза. Во FreeBSD появление _-PRERELEASE_, как правило, равнозначно прекращению внесения изменений в код системы перед появлением релиза. (Для некоторых релизом метка _-BETA_ использовалась точно так же, как и _-PRERELEASE_.)
+
+Подробный ответ: во FreeBSD релизы выпускаются из одного из двух мест. Крупные релизы, точка-ноль, такие, как 9.0-RELEASE и 10.0-RELEASE, ответвляются от основного потока разработки, более известного как <<current,-CURRENT>>. Мелкие релизы, такие, как 6.3-RELEASE или 5.2-RELEASE, являлись снэпшотами активной ветки <<stable,-STABLE>>. Начиная с 4.3-RELEASE, каждый релиз также имеет свою ветвь, которой могут следовать те, кому необходим сверхконсервативный метод обновления (как правило, внесение только тех исправлений, которые касаются вопросов обеспечения безопасности).
+
+Когда делается релиз, то ветвь, из которой он выпускается, подвергается некоторой подготовке. Частью этого процесса является замораживание кода. Когда инициируется замораживание кода, то имя ветки изменяется для того, чтобы отразить факт близости релиза. Например, если ветка называлась 6.2-STABLE, то её имя будет изменено на 6.3-PRERELEASE, чтобы обозначить момент прекращения внесения изменений в код системы и период дополнительного тестирования перед выходом релиза. В это время исправления ошибок могут быть внесены в код системы для того, чтобы быть включенными в релиз. Когда исходный код подготовлен к выпуску релиза, имя будет изменено на 6.3-RC для обозначения того, что релиз будет сделан, скорее всего, именно из этого кода. Когда код находится на этапе RC, в нём могут исправляться только самые критичные ошибки. Как только релиз (в нашем примере 6.3-RELEASE) и ветка релиза будут созданы, ветвь будет переименована в 6.3-STABLE.
+
+Для получения дополнительной информации о номерах версий и различных ветках Subversion обратитесь к статье о link:{releng}[выпуске релизов].
+
+=== Я попытался установить новое ядро, однако утилита man:chflags[1] не сработала. Как это обойти?
+
+Краткий ответ: Режим безопасности имеет значение больше нуля. Для установки ядра перезагрузите машину и войдите в однопользовательский режим.
+
+Подробный ответ: FreeBSD запрещает менять системные флаги при работе на уровнях безопасности, превышающих 0. Чтобы проверить текущий уровень безопасности:
+
+[source,bash]
+....
+# sysctl kern.securelevel
+....
+
+Уровень безопасности нельзя понизить в многопользовательском режиме, поэтому для установки ядра загрузитесь в однопользовательский режим, или измените уровень безопасности в [.filename]#/etc/rc.conf#, а затем выполните перезагрузку. Обратитесь к странице Справочника по man:init[8] за подробной информацией о `securelevel` и посмотрите [.filename]#/etc/defaults/rc.conf# и справочную страницу по man:rc.conf[5] для выяснения подробностей о файле [.filename]#rc.conf#.
+
+=== Не получается изменить системное время больше чем на одну секунду! Как это обойти?
+
+Краткий ответ: Система работает на уровне безопасности со значением выше 1. Для смены даты перезагрузите машину и войдите в однопользовательский режим.
+
+Подробный ответ: FreeBSD запрещает менять системное время больше чем на одну секунду на уровне безопасности выше 1. Чтобы определить уровень безопасности:
+
+[source,bash]
+....
+# sysctl kern.securelevel
+....
+
+Уровень безопасности нельзя понизить в многопользовательском режиме. Для изменения даты перезагрузите систему в однопользовательский режим, либо измените уровень безопасности в [.filename]#/etc/rc.conf#, а затем выполните перезагрузку. Обратитесь к странице Справочника по man:init[8] за подробной информацией о `securelevel` и посмотрите [.filename]#/etc/defaults/rc.conf# и справочную страницу по man:rc.conf[5] для выяснения подробностей о файле [.filename]#rc.conf#.
+
+=== В rpc.statd; есть ошибка работы с памятью! Он использует 256 Мбайт оперативной памяти!
+
+Нет, там нет ошибок и он не использует 256 Мбайт памяти. Для удобства `rpc.statd` отображает неприлично большой кусок памяти в своё адресное пространство. Здесь нет ничего неправильного с технической точки зрения, это просто сбивает с толку программы вроде man:top[1] и man:ps[1]
+
+man:rpc.statd[8] отображает свой статусный файл (находящийся на [.filename]#/var#) в свое адресное пространство. Для того, чтобы постоянно не беспокоиться о будущих переотражениях, когда файл вырастет в размерах, он просто отображает его с огромным размером заранее. Это просто заметить в исходных текстах, где как вы можете увидеть параметр длина к функции man:mmap[2] имеет значение `0x10000000`, или одна шестнадцатая адресного пространства для IA32, то есть 256 Мбайт.
+
+=== Почему я не могу снять с файла флаг schg?
+
+Система работает с уровнем защиты выше нуля. Понизьте уровень защиты и попробуйте еще раз. Для получения более подробной информации обратитесь к <<securelevel,разделу FAQ об уровне защиты>> и справочной странице man:init[8].
+
+=== Что такое vnlru?
+
+`vnlru` сбрасывает и освобождает vnode, когда система достигает ограничения по параметру `kern.maxvnodes`. Этот поток ядра в основном работает вхолостую и активируется только при наличии огромного объема ОЗУ и обращении к десяткам тысяч файлов небольшого размера.
+
+=== Что означают различные состояния памяти, показываемые утилитой top?
+
+* `Active`: по статистике страницы недавно использовались.
+* `Inactive`: по статистике страницы недавно не использовались.
+* `Cache`: (наиболее часто) страницы, которых перемещены из числа неактивных в статус, в котором они содержат данные, но которые могут часто сразу же использоваться повторно (как с их старым содержимым, так и повторно с новым). Это может быть некоторое непосредственное перемещение из состояния `active` в состояние `cache`, если известно, что страница чиста (не модифицировалась), но такое перемещение определяется политикой, зависящей от выбора алгоритма разработчиком VM-системы.
+* `Free`: страницы, не содержащие данных, и которые могут быть использованы при некоторых условиях, когда страницы кэша могут не подойти. Свободные страницы могут повторно использоваться в состояниях прерывания или процессах.
+* `Wired`: страницы, зафиксированные в памяти, обычно для использования ядром, а также иногда для специального использования процессами.
+
+Страницы чаще всего записываются на диск (типа синхронизации VM), когда они находятся в неактивном состоянии, однако страницы в активном состоянии также могут сбрасываться. Это зависит от наличия и возможности отслеживания со стороны ЦП бита 'модифицированности', и в некоторых ситуациях это может быть лучше для блока синхронизируемых страниц VM, вне зависимости от их активности. В большинстве встречающихся ситуаций лучше всего представлять неактивную очередь как очередь сравнительно неиспользуемых страниц, которые могут быть, а могут и не быть в процессе записи на диск. Кэшируемые страницы уже синхронизированы, не отображаются, но доступны для непосредственного использования процессом со своей старой или новой привязкой. Свободные страницы доступны на уровне прерывания, однако кэшируемые или свободные страницы могут использоваться в процессе повторно. Кэшируемые страницы недостаточно заблокированы для того, чтобы быть доступными на уровне прерывания.
+
+Есть ещё некоторые другие флаги (например, флаг занятости или счётчик занятости), которые могут изменить некоторые описанные правила.
+
+=== Сколько свободной памяти доступно?
+
+Есть несколько понятий "свободной памяти". В одном случае это объём памяти, непосредственно доступной в данный момент без страничной выгрузки чего-либо. Этот объём равен примерно размеру очереди кэша + размер очереди на высвобождение (с учётом допустимых отклонений, зависящих от настроек системы). В другом случае "свободная память" обозначает общий объём пространства VM. Он может сложно вычисляться, но зависит от объёма раздела подкачки и памяти. Другие определения "свободной памяти" также возможны, но они достаточно бесполезны, ведь в любом случае важно сохранять низкий уровень подкачки и избегать исчерпания раздела подкачки.
+
+=== Что такое /var/empty?
+
+[.filename]#/var/empty# представляет собой каталог, который используется в программе man:sshd[8] при выполнении разделения полномочий. Каталог [.filename]#/var/empty# пуст, его владельцем является `root`, и на нём установлен флаг `schg`. Этот каталог не должен удаляться.
+
+=== Я поменял /etc/newsyslog.conf. Как проверить правильность изменений?
+
+Чтобы посмотреть, что будет делать man:newsyslog[8], используйте следующую команду:
+
+[source,bash]
+....
+% newsyslog -nrvv
+....
+
+=== Как поправить часовой пояс?
+
+Используйте man:tzsetup[8].
+
+== X Window System и виртуальные консоли
+
+=== Что такое X Window System?
+
+X Window System (обычно `X11`) является наиболее общедоступной оконной системой, которая может работать на UNIX(R) и UNIX(R)-подобных системах, в том числе и во FreeBSD. Разработкой стандартов на используемый http://en.wikipedia.org/wiki/X_Window_System_core_protocol[X-протокол] занимается организация http://www.x.org/wiki/[The X.Org Foundation], с текущей эталонной реализацией version 11 release 7.7, поэтому название часто сокращается до `X11`.
+
+Для разных архитектур и операционных систем существует множество реализаций этой системы. Реализацию кода для серверной части называют `X-сервером`.
+
+=== Я хочу запустить Xorg, как это сделать?
+
+Для установки Xorg выполните одно из действий:
+
+Используйте мета-порт [.filename]#x11/xorg#, который выполняет построение и установку всех компонентов Xorg.
+
+Используйте [.filename]#x11/xorg-minimal#, который выполняет построение и установку только необходимых компонентов Xorg.
+
+Установите Xorg из пакетов FreeBSD.
+
+[source,bash]
+....
+# pkg install xorg
+....
+
+После установки Xorg следуйте указаниям в разделе link:{handbook}#x-config/[Конфигурация X11] Руководства FreeBSD.
+
+=== Я попытался запустить X, но получил сообщение No devices detected. после ввода команды startx. Что мне теперь делать?
+
+Вероятно, в системе установлен повышенный уровень безопасности (`securelevel`). При повышенном уровне защиты систему X запустить невозможно, потому что X требуются права на операции записи в устройство man:io[4]. Дополнительная информация находится на странице Справочника man:init[8].
+
+Существует два решения проблемы: установить значение `securelevel` обратно в ноль или запускать man:xdm[1] (или любой другой оконный менеджер) во время загрузки, до того как повышается значение `securelevel`.
+
+Обратитесь к <<xdm-boot>> для получения более полной информации о запуске man:xdm[1] во время загрузки.
+
+=== Почему моя мышь не работает с X?
+
+При использовании стандартного драйвера консоли man:syscons[4] во FreeBSD можно включить поддержку указателя мыши во всех виртуальных экранах. Во избежание конфликтов с X, драйвер man:syscons[4] поддерживает виртуальное устройство [.filename]#/dev/sysmouse#. Все события от реального устройства мыши пишутся в устройство man:sysmouse[4] через man:moused[8]. Чтобы использовать мышь на одной и более виртуальных консолях, и при этом продолжать использовать X, посмотрите <<moused>> и настройте man:moused[8].
+
+Затем отредактируйте [.filename]#/etc/X11/xorg.conf#, чтобы в нём были следующие строки:
+
+[.programlisting]
+....
+Section "InputDevice"
+ Option "Protocol" "SysMouse"
+ Option "Device" "/dev/sysmouse"
+.....
+....
+
+Начиная с версии Xorg 7.4 раздел `InputDevice` в файле [.filename]#xorg.conf# игнорируется, и вместо него используется механизм автоматически определяемых устройств. Чтобы восстановить прежнее поведение, добавьте в раздел `ServerLayout` или `ServerFlags` такую строку:
+
+[.programlisting]
+....
+Option "AutoAddDevices" "false"
+....
+
+Некоторые предпочитают использовать в X устройство [.filename]#/dev/mouse#. Чтобы оно работало, файл устройства [.filename]#/dev/mouse# должен являться ссылкой на [.filename]#/dev/sysmouse# (посмотрите справку по man:sysmouse[4]). Это можно сделать, добавив следующую строку в [.filename]#/etc/devfs.conf# (посмотрите справку по man:devfs.conf[5]):
+
+[.programlisting]
+....
+link sysmouse mouse
+....
+
+Ссылка может быть создана путем перезапуска man:devfs[5] с использованием следующей команды (из под пользователя `root`):
+
+[source,bash]
+....
+# service devfs restart
+....
+
+=== У моей мыши есть колёсико. Могу ли я его использовать при работе в X?
+
+Да, если X настроена для использования 5-кнопочной мыши. Для этого добавьте строчки `Buttons 5` и `ZAxisMapping 4 5` в раздел "InputDevice" файла [.filename]#/etc/X11/xorg.conf# как показано в этом примере:
+
+[.programlisting]
+....
+Section "InputDevice"
+ Identifier "Mouse1"
+ Driver "mouse"
+ Option "Protocol" "auto"
+ Option "Device" "/dev/sysmouse"
+ Option "Buttons" "5"
+ Option "ZAxisMapping" "4 5"
+EndSection
+....
+
+Для использования мыши в Emacs также добавьте в [.filename]#~/.emacs# следующие строки:
+
+[.programlisting]
+....
+;; wheel mouse
+(global-set-key [mouse-4] 'scroll-down)
+(global-set-key [mouse-5] 'scroll-up)
+....
+
+=== Как заставить работать тачпад Synaptics в X?
+
+Для его работы понадобится настроить некоторые вещи.
+
+Чтобы использовать драйвер synaptics из Xorg, для начала удалите строку moused_enable из [.filename]#rc.conf#.
+
+Для включения synaptics добавьте следующую строку в [.filename]#/boot/loader.conf#:
+
+[.programlisting]
+....
+hw.psm.synaptics_support="1"
+....
+
+Добавьте следующее в [.filename]#/etc/X11/xorg.conf#:
+
+[.programlisting]
+....
+Section "InputDevice"
+Identifier "Touchpad0"
+Driver "synaptics"
+Option "Protocol" "psm"
+Option "Device" "/dev/psm0"
+EndSection
+....
+
+И не забыть добавить следующее в раздел "ServerLayout":
+
+[.programlisting]
+....
+InputDevice "Touchpad0" "SendCoreEvents"
+....
+
+=== Как использовать удалённые X-дисплеи?
+
+Из соображений обеспечения информационной безопасности открывать удалённые окна на машине по умолчанию запрещено.
+
+Для включения этой возможности запустите X с аргументом `-listen_tcp`:
+
+[source,bash]
+....
+% startx -listen_tcp
+....
+
+=== Что такое виртуальные консоли и как изменить их количество?
+
+Виртуальные консоли предоставляют несколько одновременных сеансов работы с той же самой машиной без установки какой бы то ни было сети или запуска X.
+
+При запуске системы после вывода сообщений этапа загрузки на консоль выдаётся приглашение для входа в систему. Введите своё имя и пароль, чтобы начать работу на первой виртуальной консоли.
+
+Чтобы запустить ещё один сеанс, скажем, чтобы заглянуть в документацию по программе или для чтения электронной почты во время ожидания завершения передачи данных по FTP, нажмите kbd:[F2], удерживая kbd:[Alt]. Это отобразит приглашение на второй виртуальной консоли. Чтобы вернуться к первоначальному сеансу, нажмите kbd:[Alt+F1].
+
+По умолчанию во FreeBSD задействованы восемь виртуальных консолей, а комбинации клавиш kbd:[Alt+F1], kbd:[Alt+F2], kbd:[Alt+F3] и далее служат для переключения между ними.
+
+Чтобы увеличить количество виртуальных консолей, отредактируйте [.filename]#/etc/ttys# (смотрите страницу Справочника man:ttys[5]), добавив туда записи для терминалов с именами от [.filename]#ttyv8# до [.filename]#ttyvc# после комментария про "Virtual terminals":
+
+[.programlisting]
+....
+# Edit the existing entry for ttyv8 in /etc/ttys and change
+# "off" to "on".
+ttyv8 "/usr/libexec/getty Pc" xterm on secure
+ttyv9 "/usr/libexec/getty Pc" xterm on secure
+ttyva "/usr/libexec/getty Pc" xterm on secure
+ttyvb "/usr/libexec/getty Pc" xterm on secure
+....
+
+Чем больше виртуальных терминалов, тем больше ресурсов используется. Это может привести к проблемам на системах с 8 Мбайт ОЗУ или меньше. Подумайте о смене статуса консолей с `secure` на `insecure`.
+
+[NOTE]
+====
+Во FreeBSD до версии 9.0 использовался тип терминала "cons25" вместо "xterm". При добавлении в [.filename]#/etc/ttys# новых записей используйте существующий формат.
+====
+
+[IMPORTANT]
+====
+Чтобы запустить сервер X, нужно зарезервировать под него хотя бы один виртуальный терминал со значением `off`. Это означает, что под виртуальные консоли можно отвести только одиннадцать функциональных клавиш, и ещё одна остаётся за X-сервером.
+====
+
+Например, чтобы запустить X и 11 виртуальных консолей, нужно настроить двенадцатый виртуальный терминал:
+
+[.programlisting]
+....
+ttyvb "/usr/libexec/getty Pc" xterm off secure
+....
+
+Самым простым способом активировать виртуальные консоли является перезагрузка.
+
+=== Как осуществляется доступ к виртуальным консолям из X?
+
+Используйте комбинацию клавиш kbd:[Ctrl+Alt+Fn] для переключения обратно в виртуальную консоль. Нажмите kbd:[Ctrl+Alt+F1], чтобы вернуться на первую виртуальную консоль.
+
+После того, как вы оказались в текстовой консоли, используйте комбинации kbd:[Alt+Fn] для переключения между ними.
+
+Чтобы вернуться в сеанс работы X, переключитесь в виртуальную консоль, на которой запущена X Window. Если X был запущен из командной строки с использованием команды `startx`, то сеанс работы X будет привязан к следующей неиспользуемой виртуальной консоли, а не к той текстовой консоли, с которой он был запущен. В случае восьми активных виртуальных терминалов X будет работать на девятом, поэтому используйте комбинацию kbd:[Alt+F9].
+
+[[xdm-boot]]
+=== Как запустить XDM во время загрузки?
+
+Есть две философские школы, проповедующие различные методы запуска man:xdm[1]. Последователи одного течения запускают `xdm` из [.filename]#/etc/ttys# (посмотрите man:ttys[5]), используя приводимый пример, тогда как другие вставляют запуск `xdm` в скрипт [.filename]#rc.local# (посмотрите справку по man:rc[8]) или [.filename]#X#, помещая последний в каталог [.filename]#/usr/local/etc/rc.d#. Оба метода равноправны, и один из них может работать в ситуациях, с которыми не справляется другой и наоборот. В обоих случаях результат один и тот же: X выводит графическое приглашение для входа в систему.
+
+Плюсом метода с использованием man:ttys[5] является документирование того, на каком vty будет запущен X и то, что ответственность за перезапуск X-сервера при завершении сеанса работы лежит на процессе man:init[8]. Метод с использованием man:rc[8] позволяет просто прекратить работу xdm командой `kill xdm`, если при запуске X возникли какие-нибудь проблемы.
+
+Из man:rc[8] `xdm` должен быть запущен без аргументов. `xdm` должен быть запущен _после_ запуска man:getty[8], иначе они будут конфликтовать, блокируя консоль. Лучше всего выдержать паузу секунд на 10 и потом запустить `xdm`.
+
+Если `xdm` запускается из [.filename]#/etc/ttys#, остаётся вероятность конфликта между `xdm` и man:getty[8]. Одним из способов избежать этого является добавление номера `vt` в файл [.filename]#/usr/local/lib/X11/xdm/Xservers#:
+
+[.programlisting]
+....
+:0 local /usr/local/bin/X vt4
+....
+
+В вышеприведённом случае X-серверу указывается работать на [.filename]#/dev/ttyv3#. Заметьте, что номера отличаются на единицу. Дело в том, что X-сервер считает vty от единицы, когда как отсчёт vty в ядре FreeBSD ведётся с нуля.
+
+=== При запуске xconsole выдаётся сообщение Couldn't open console.
+
+Если X запускается с помощью startx, права на устройство [.filename]#/dev/console#_не_ изменяются, поэтому такие программы как xterm -C и xconsole не будут работать.
+
+Это зависит от прав доступа, установленных для консоли по умолчанию. В многопользовательской системе вовсе не нужно, чтобы любой пользователь мог выводить информацию на системную консоль. Для пользователей, вошедших в систему через VTY, для решения этой проблемы существует файл man:fbtab[5].
+
+В общем, раскомментируйте строчку в файле [.filename]#/etc/fbtab# (посмотрите справку по man:fbtab[5]):
+
+[.programlisting]
+....
+/dev/ttyv0 0600 /dev/console
+....
+
+Этого будет достаточно для того, чтобы всякий, кто вошёл в систему с терминала [.filename]#/dev/ttyv0#, имел доступ к консоли.
+
+=== Моя мышь PS/2 в X работает неправильно.
+
+Мышь и драйвер могли рассинхронизироваться. В редких случаях драйвер может ошибочно сообщать о проблемах синхронизации:
+
+[.programlisting]
+....
+psmintr: out of sync (xxxx != yyyy)
+....
+
+Если это случилось, отмените проверку согласования, установив значение флага для драйвера мыши PS/2 в `0x100`. Проще всего это сделать добавлением `hint.psm.0.flags="0x100"` в [.filename]#/boot/loader.conf# с перезагрузкой.
+
+=== Как поменять местами кнопки мыши?
+
+Наберите `xmodmap -e "pointer = 3 2 1"`. Добавьте эту команду в [.filename]#~/.xinitrc# или [.filename]#~/.xsession# для автоматического запуска.
+
+=== Как установить экранную заставку и где такие заставки можно найти?
+
+Подробный ответ находится в разделе link:{handbook}#boot-blocks[Загрузочные экранные заставки] Руководства FreeBSD.
+
+=== Можно ли в X использовать клавишу Windows?
+
+Да. Используйте man:xmodmap[1] для привязки функций к этим клавишам.
+
+Если все клавиатуры Windows стандартны, то эти три клавиши имеют следующие клавиатурные коды:
+
+* 115 - клавиша kbd:[Windows] между клавишами kbd:[Ctrl] и kbd:[Alt] с левой стороны
+* 116 - клавиша kbd:[Windows] справа от kbd:[AltGr]
+* 117 - клавиша kbd:[Menu], слева от клавиши kbd:[Ctrl], находящейся справа
+
+Чтобы заставить левую клавишу kbd:[Windows] набирать запятую, попробуйте выполнить такую команду:
+
+[source,bash]
+....
+# xmodmap -e "keycode 115 = comma"
+....
+
+Для того, чтобы переопределения клавиш kbd:[Windows] выполнялось автоматически каждый раз при запуске X, поместите команды `xmodmap` в [.filename]#~/.xinitrc# либо, что предпочтительней, создайте файл [.filename]#~/.xmodmaprc# и включите в него параметры `xmodmap` по одному на строку, затем добавьте в [.filename]#~/.xinitrc# такую строку:
+
+[.programlisting]
+....
+xmodmap $HOME/.xmodmaprc
+....
+
+Например, чтобы переопределить эти 3 клавиши так, чтобы они выполняли функции клавиш kbd:[F13], kbd:[F14] и kbd:[F15]. Это позволит легко привязать их к полезным функциям в приложениях или менеджере окон.
+
+Чтобы сделать это, поместите такие строки в файл [.filename]#~/.xmodmaprc#:
+
+[.programlisting]
+....
+keycode 115 = F13
+keycode 116 = F14
+keycode 117 = F15
+....
+
+При использовании оконного менеджера package:x11-wm/fvwm2[] клавиши можно переопределить так, чтобы kbd:[F13] сворачивал в иконку (и восстанавливал предыдущий размер) то окно, на которое указывает курсор, kbd:[F14] перемещал окно с курсором на передний план или, если оно уже впереди, возвращал обратно, а kbd:[F15] вызывал главное меню Workplace, даже если курсор находится не на рабочем столе, что бывает полезно, когда не видно ни одного кусочка рабочего стола.
+
+Следующие записи в [.filename]#~/.fvwmrc# позволяют достичь описанных выше функций:
+
+[.programlisting]
+....
+Key F13 FTIWS A Iconify
+Key F14 FTIWS A RaiseLower
+Key F15 A A Menu Workplace Nop
+....
+
+=== Как заставить работать аппаратное ускорение 3D-графики для OpenGL(R)?
+
+Наличие 3D-ускорения зависит от версии сервера Xorg и типа графического адаптера. Для адаптера nVidia используйте двоичный драйвер для FreeBSD, установив один из нижеследующих портов:
+
+Последние версии адаптеров nVidia поддерживаются портом package:x11/nvidia-driver[].
+
+Более старые драйверы доступны как package:x11/nvidia-driver-###[].
+
+nVidia предоставляет подробную информацию о том, какие адаптеры поддерживаются тем или иным драйвером, на своём сайте: http://www.nvidia.com/object/IO_32667.html[http://www.nvidia.com/object/IO_32667.html].
+
+Для адаптеров Matrox G200/G400 следует попробовать порт package:x11-servers/mga_hal[].
+
+Для ATI Rage 128 и Radeon посмотрите страницы Справочника man:ati[4], man:r128[4] и man:radeon[4].
+
+== Работа в сети
+
+=== Где можно найти информацию о бездисковой загрузке?
+
+"Бездисковая загрузка" означает, что машина с FreeBSD загружается по сети и читает необходимые файлы с сервера, а не со своего диска. Подробное описание есть в link:{handbook}#network-diskless/[ соответствующей главе] Руководства.
+
+=== Может ли машина с FreeBSD использоваться как маршрутизатор?
+
+Да. Обратитесь к разделу Руководства, посвящённому link:{handbook}#advanced-networking/[сложным вопросам работы в сети], особенно в той части, что касается link:{handbook}#network-routing/[маршрутизации и маршрутизаторов].
+
+=== Можно ли подключить машину с Windows(R) к Internet с помощью FreeBSD?
+
+Как правило, те, кто задают такие вопросы, имеют дома два компьютера, один с FreeBSD, а другой с какой-то версией Windows(R). Идея состоит в использовании FreeBSD для подключения к Internet, а затем осуществлять выход в Internet из Windows(R) через FreeBSD. На самом деле это просто частный случай предыдущего вопроса, который хорошо отработан.
+
+Для подключения к Internet с использованием коммутируемого соединения нужно указать параметр `-nat` и установить в файле [.filename]#/etc/rc.conf# переменную `gateway_enable` в значение _YES_. Для получения дополнительной информации обратитесь к страницам справочной системы по команде man:ppp[8] или link:{handbook}#userppp/[ разделу Руководства о PPP режима пользователя].
+
+Если подключение к Internet выполняется через Ethernet, используйте man:natd[8]. Вводная информация находится в разделе Руководства link:{handbook}#network-natd/[natd].
+
+=== Поддерживает ли FreeBSD протокол PPP?
+
+Да. man:ppp[8] может обслуживать как входящие, так и исходящие соединения.
+
+Более подробная информация об их использовании находится в link:{handbook}#ppp-and-slip/[разделе Руководства о протоколе PPP].
+
+=== Поддерживает ли FreeBSD технологию NAT или Masquerading?
+
+Да. Для получения указаний по использованию NAT через подключение PPP обратитесь к link:{handbook}#userppp/[разделу Руководства о PPP]. Чтобы использовать NAT вместе с другим типом сетевого подключения, взгляните на раздел Руководства link:{handbook}#network-natd/[natd].
+
+=== Как настроить алиас в сети Ethernet?
+
+Если алиас находится в той же самой сети, что и уже настроенный на интерфейсе адрес, допишите к этой команде `netmask 0xffffffff`:
+
+[source,bash]
+....
+# ifconfig ed0 alias 192.0.2.2 netmask 0xffffffff
+....
+
+В противном случае укажите сетевой адрес и маску обычным образом:
+
+[source,bash]
+....
+# ifconfig ed0 alias 172.16.141.5 netmask 0xffffff00
+....
+
+Дополнительная информация находится в link:{handbook}#configtuning-virtual-hosts/[Руководстве] FreeBSD.
+
+=== Почему я не могу смонтировать диск Linux(R) по NFS?
+
+Некоторые версии NFS для Linux(R) поддерживают запросы на монтирование только с привилегированного порта; попробуйте выполнить следующую команду:
+
+[source,bash]
+....
+# mount -o -P linuxbox:/blah /mnt
+....
+
+=== Почему mountd продолжает выдавать сообщения can't change attributes и bad exports list на моём сервере NFS, работающем под управлением FreeBSD?
+
+В большинстве случаев проблема заключается в недостаточном понимании корректного формата файла [.filename]#/etc/exports#. Просмотрите ещё раз справочную информацию по man:exports[5] и раздел об link:{handbook}#network-nfs/[NFS] в Руководстве, особенно в части link:{handbook}#configuring-nfs[настройки NFS].
+
+=== Как включить поддержку multicast IP?
+
+Установите пакет package:net/mrouted[] и добавьте `mrouted_enable="YES"` в [.filename]#/etc/rc.conf# для запуска этого сервиса во время загрузки.
+
+=== Почему я должен использовать FQDN для хостов не в моей сети?
+
+За ответом на этот вопрос обращайтесь к link:{handbook}#mail-trouble/[Руководству] FreeBSD.
+
+=== Permission denied для любых действий, связанных с работой сети.
+
+Если ядро скомпилировано с параметром `IPFIREWALL`, имейте в виду, что политикой по умолчанию является запрет прохождения всех пакетов, которые явно не разрешены.
+
+Если межсетевой экран был случайно сконфигурирован неверным образом, то для восстановления работоспособности сети наберите такую команду из-под пользователя `root`:
+
+[source,bash]
+....
+# ipfw add 65534 allow all from any to any
+....
+
+Рассмотрите использование `firewall_type='open'` в файле [.filename]#/etc/rc.conf#.
+
+Дополнительная информация о настройке данного межсетевого экрана находится в link:{handbook}#firewalls-ipfw/[соответствующей главе] Руководства.
+
+=== Почему моё правило fwd для ipfw по перенаправлению сервиса на другую машину не работает?
+
+Возможно, потому, что вместо простого перенаправления пакетов нужна трансляция сетевых адресов (NAT). Правило "fwd" только перенаправляет пакеты и данные внутри него не меняет. Рассмотрим такое правило:
+
+[source,bash]
+....
+01000 fwd 10.0.0.1 from any to foo 21
+....
+
+Когда пакет с адресом назначения _foo_ достигает машины с этим правилом, пакет перенаправляется на _10.0.0.1_, но в нём остаётся адрес назначения _foo_. Адрес назначения пакета не меняется на _10.0.0.1_. Большинство машин, скорее всего, отбросят полученный пакет, имеющий адрес назначения, им не соответствующий. Таким образом, правило "fwd" не часто работает так, как ожидает пользователь. Такое поведение является особенностью, а не ошибкой.
+
+Обратитесь к <<service-redirect,FAQ о перенаправлении сервисов>>, руководству по man:natd[8] или одной из нескольких утилит для перенаправления из link:https://www.FreeBSD.org/ports/[Коллекции Портов] для того, чтобы сделать это правильно.
+
+=== Как можно перенаправить запросы с одной машины на другую?
+
+Запросы FTP и других сервисов можно перенаправить с помощью порта package:sysutils/socket[]. Замените запись для этого сервиса в [.filename]#/etc/inetd.conf# на вызов `socket`, как показано в этом примере для ftpd:
+
+[.programlisting]
+....
+ftp stream tcp nowait nobody /usr/local/bin/socket socket ftp.example.com ftp
+....
+
+где _ftp.example.com_ и _ftp_ являются соответственно хостом и портом для перенаправления.
+
+=== Где можно найти средства управления сетевым трафиком?
+
+Для FreeBSD имеются три средства управления трафиком. man:dummynet[4] интегрирован в систему FreeBSD как составная часть man:ipfw[4]. http://www.sonycsl.co.jp/person/kjc/programs.html[ ALTQ] включен во FreeBSD как составная часть man:pf[4]. Bandwidth Manager компании http://www.etinc.com/[Emerging Technologies] является коммерческим продуктом.
+
+=== Почему появляются сообщения /dev/bpf0: device not configured?
+
+Для работы приложения требуется Berkeley Packet Filter (man:bpf[4]), однако это устройство удалено из вашего ядра. Постройте новое ядро с добавлением в его конфигурационный файл следующей строки:
+
+[.programlisting]
+....
+device bpf # Berkeley Packet Filter
+....
+
+=== Как смонтировать диск Windows(R)-машины в моей локальной сети, как это делает smbmount в Linux(R)?
+
+Используйте пакет SMBFS. В него включён набор изменений в ядре и пользовательские программы. Программы и информация доступны как man:mount_smbfs[8] и входят в состав базовой системы.
+
+=== Что значат сообщения Limiting icmp/open port/closed port response в файле журнала?
+
+Данное сообщение ядра означает, что имеет место некоторая активность, приводящая к отправке большого количества ответных пакетов ICMP или сбросов TCP (RST). Ответы ICMP часто генерируются в результате попыток подключения к незанятым портам UDP. Сбросы TCP генерируются в результате попыток подключения к закрытым портам TCP. Помимо всего прочего, такие сообщения могут быть вызваны следующими действиями:
+
+* Лобовая атака типа отказ в обслуживании DoS (в отличие от атак в один пакет, которые используют конкретную брешь в защите).
+* Сканирование портов в попытке осуществить подключение к большому количеству портов (в отличие от проб нескольких известных портов).
+
+Первое число в сообщении показывает количество пакетов, которое ядро посылало бы при отсутствии ограничений, а второе число указывает лимит. Этот лимит меняется при помощи `net.inet.icmp.icmplim`. В этом примере устанавливается лимит на `300` пакетов в секунду:
+
+[source,bash]
+....
+# sysctl net.inet.icmp.icmplim=300
+....
+
+Для выключения подобных сообщений без отключения самого ограничения используйте `net.inet.icmp.icmplim_output`, чтобы подавить вывода:
+
+[source,bash]
+....
+# sysctl net.inet.icmp.icmplim_output=0
+....
+
+И наконец, чтобы полностью выключить это ограничение, сделайте `net.inet.icmp.icmplim` равным `0`. Выключение этого лимита не приветствуется по причинам, изложенным выше.
+
+=== Что это за сообщения arp: unknown hardware address format?
+
+Это означает, что какое-то устройство в локальной сети Ethernet использует MAC-адрес в формате, неизвестном FreeBSD. Вероятно, это происходит из-за того, что кто-то в сети экспериментирует с сетевым адаптером. Чаще всего это происходит в сетях с кабельными модемами. Это безобидно и не должно влиять на производительность системы FreeBSD.
+
+=== Почему я постоянно вижу сообщения вида 192.168.0.10 is on fxp1 but got reply from 00:15:17:67:cf:82 on rl0 и как мне их отключить?
+
+Это так, потому что пакет приходит извне сети, чего не должно быть. Чтобы отключить эти сообщения, установите `net.link.ether.inet.log_arp_wrong_iface` в значение `0`.
+
+== Безопасность
+
+=== Что означает термин sandbox (песочница)?
+
+"Sandbox" - это термин, используемый при обеспечении безопасности. Он имеет два значения:
+
+* Процесс, помещённый внутрь некоторых виртуальных стен, которые предназначены для предотвращения взлома всей системы в результате взлома этого конкретного процесса.
++
+Процесс может работать в границах этих стен. Поскольку, что бы этот процесс ни делал, он эти стены разрушить не может, особый аудит его кода не нужен для того, чтобы с уверенностью сказать, насколько его работа безопасна для системы.
++
+Стеной может служить, например, идентификатор пользователя. Вот определение, даваемое на страницах Справочника man:security[7] и man:named[8].
++
+Рассмотрим, например, службу `ntalk` (смотрите man:inetd[8]). Раньше эта служба запускалась с идентификатором пользователя `root`, а сейчас - `tty`. Пользователь `tty` - это та песочница, которая осложняет взлом системы через `ntalk` посредством использования этого идентификатора пользователя.
+* Процесс, помещённый внутрь симулируемой машины. Это даёт больший уровень безопасности. Это означает, что некто, взломавший процесс, может думать, что может сломать и систему в целом, однако фактически может сломать только симулятор этой машины и не может модифицировать никаких реальных данных.
++
+Самым распространённым способом достигнуть такого результата является построение имитирующего окружения в каталоге и затем запуск процессов в этом каталоге через chroot (т.е. задав этот каталог в качестве [.filename]#/# для этого процесса, а не реальный [.filename]#/# всей системы).
++
+Другим часто используемым методом является монтирование низлежащей файловой системы в режиме "только для чтения" и затем создание уровня файловой системы поверх неё, что даёт процессу видимость доступа по записи на ту файловую систему. Процесс будет полагать, что может записывать в те файлы, но это будет единственный процесс, который увидит результат - другие процессы не будут этого делать ни в коем случае.
++
+Попытка сделать такой тип песочницы настолько прозрачна, что пользователь (или взломщик) даже не поймёт, что он в ней находится.
+
+В UNIX(R) реализованы два типа "песочниц". Один на уровне процесса, и один на уровне идентификаторов пользователей.
+
+Каждый процесс в UNIX(R) полностью защищён от других процессов. Никакой процесс не может модифицировать адресное пространство другого процесса.
+
+В UNIX(R) каждым процессом владеет некоторый идентификатор пользователя. Если этот пользователь не `root`, он ограждает процесс от других, владельцами которых являются другие пользователи. Этот идентификатор используется также для защиты данных на диске.
+
+=== Что такое уровень защиты (securelevel)?
+
+`securelevel` является механизмом обеспечения безопасности, который реализован в ядре. Когда уровень защиты больше нуля, ядро ограничивает выполнение некоторых операций; даже суперпользователю `root` запрещается их выполнять. Механизм уровня защиты ограничивает возможности по:
+
+* снятию некоторых флагов с файлов, таких, как `schg` (системный флаг неизменяемости),
+* записи в память ядра через устройства [.filename]#/dev/mem# и [.filename]#/dev/kmem#,
+* загрузке модулей ядра и
+* изменению правил сетевого экрана.
+
+Для выяснения состояния уровня защиты в работающей системе:
+
+[source,bash]
+....
+# sysctl -n kern.securelevel
+....
+
+Результат содержит текущее значение уровня защиты. Если оно больше нуля, то по крайней мере некоторые из защит этого механизма включены.
+
+Уровень защиты работающей системы не может быть понижен, поскольку это противоречит назначению этого механизма. Если для задачи требуется неположительный уровень защиты, измените значения переменных `kern_securelevel` и `kern_securelevel_enable` в файле [.filename]#/etc/rc.conf# и перезагрузите систему.
+
+Более подробная информация об уровнях защиты и о том, какие специфические действия выполняют все уровни, может быть найдена на справочных страницах о man:init[8].
+
+[WARNING]
+====
+
+Уровень защиты не является панацеей; в нём есть много недостатков. Зачастую он даёт обманчивое чувство безопасности.
+
+Одной из самых больших проблем является то, что для его эффективной работы все файлы, используемые в процессе загрузки, должны быть защищены. Если атакующий сможет заставить систему выполнять свой код до установки уровня защиты (что происходит достаточно поздно во время процесса загрузки, так как некоторые вещи, выполняемые системой в это время, не могут быть сделаны при повышенном уровне защиты), то эта защита может быть отключена. Хотя такая задача по защите всех файлов, используемых в процессе загрузки, технически вполне осуществима, если это будет сделано, то поддержка системы станет кошмаром, так как для изменения конфигурационного файла придётся останавливать систему, переводя её по крайней мере в однопользовательский режим.
+
+Это обстоятельство, а также ряд других, часто обсуждаются в списках рассылки, в частности, во {freebsd-security}. Поищите в link:https://www.FreeBSD.org/search/[ архивах] более подробное обсуждение. Предпочтителен более гибкий механизм.
+====
+
+=== BIND (named) работает на одном из портов с большим номером. Что происходит?
+
+Для исходящих запросов BIND использует случайно выбираемый порт с большим номером. В последних версиях при каждом запросе выбирается новый случайный порт UDP. Это может вызвать проблемы в некоторых сетевых конфигурациях, особенно если фаервол блокирует входящие UDP пакеты на определенных портах. Чтобы обеспечить прохождение пакетов через фаервол, попробуйте параметры `avoid-v4-udp-ports` и `avoid-v6-udp-ports`, чтобы предотвратить случайный выбор номеров портов, пересекающихся с блокируемым диапазоном.
+
+[WARNING]
+====
+
+Если в [.filename]#/etc/namedb/named.conf# указан номер порта (такой как 53) в параметре `query-source` или `query-source-v6`, то случайный выбор порта использоваться не будет. Настоятельно рекомендуется, чтобы эти параметры не использовались для указания фиксированных номеров порта.
+====
+
+Кстати, поздравляем. Прекрасно, что вы читаете вывод команды man:sockstat[1] и обращаете внимание на аномалии!
+
+=== Даемон Sendmail ждёт соединений как на стандартном порту 25, так и на порту 587! Что происходит?
+
+Последние версии Sendmail поддерживают механизм посылки почты, который работает по порту 587. Эта возможность пока широко не используется, но её популярность растёт.
+
+=== Что это за пользователь toor с UID 0? Я подвергся взлому?
+
+Не волнуйтесь, `toor` является "альтернативной" учётной записью суперпользователя (toor - это root, записанный задом наперёд). Его предлагается использовать с нестандартным командным интерпретатором, так чтобы не нужно было менять используемый по умолчанию командный процессор для `root`. Это важно, так как оболочки, не являющиеся частью дистрибутива системы, устанавливаются в каталог [.filename]#/usr/local/bin#, который по умолчанию располагается в другой файловой системе. Если командный процессор для пользователя `root` располагается в [.filename]#/usr/local/bin# и файловая система, содержащая [.filename]#/usr/local/bin#, не смонтирована, то `root` не сможет войти в систему для исправления проблемы и понадобится перезагрузиться в однопользовательском режиме, чтобы указать командный процессор.
+
+Некоторые используют `toor` для выполнения повседневных административных работ с нестандартным командным процессором, оставляя `root` со стандартной оболочкой для работы в однопользовательском режиме или выполнения аварийных работ. По умолчанию пользователь не сможет войти в систему как `toor`, потому что для него не указан пароль, поэтому войдите из-под `root` и установите пароль для `toor` до того как использовать его для входа в систему.
+
+== PPP
+
+=== Не могу заставить работать ppp. Что я делаю не так?
+
+Первым делом прочтите страницу Справочника man:ppp[8] и link:{handbook}#ppp-and-slip[раздел PPP] Руководства. Для помощи с устранением неполадок включите протоколирование следующей командой:
+
+[.programlisting]
+....
+set log Phase Chat Connect Carrier lcp ipcp ccp command
+....
+
+Эту команду можно набрать в командной строке man:ppp[8] или ввести в начале раздела `default` в [.filename]#/etc/ppp/ppp.conf#. Проверьте, что файл [.filename]#/etc/syslog.conf# содержит указанные ниже строки и существует файл [.filename]#/var/log/ppp.log#:
+
+[.programlisting]
+....
+!ppp
+*.* /var/log/ppp.log
+....
+
+Полную информацию о происходящем можно найти в файле протокола. Не беспокойтесь, если не всё будет понятно, ведь это может быть понятно кому-то ещё.
+
+=== Ppp просто зависает, когда я его запускаю
+
+Обычно это происходит, когда имя хоста не может быть преобразовано в адрес. Наилучший способ исправить это - удостовериться, что файл [.filename]#/etc/hosts# читается первым. Для этого нужно проверить, что в файле [.filename]#/etc/host.conf# на первом месте стоит строчка `hosts`. Затем добавьте в файл [.filename]#/etc/hosts# запись о локальной машине. Если локальная сеть отсутствует, измените строку для `localhost`:
+
+[.programlisting]
+....
+127.0.0.1 foo.example.com foo localhost
+....
+
+В противном случае добавьте для хоста ещё одну запись. Обратитесь к соответствующим страницам Справочника за подробным описанием.
+
+В конце убедитесь, что эта команда выполняется успешно: `ping -c1 hostname`.
+
+=== Ppp не звонит в режиме -auto
+
+Сначала проверьте наличие маршрута по умолчанию. Команда `netstat -rn` должна показать две строки:
+
+[.programlisting]
+....
+Destination Gateway Flags Refs Use Netif Expire
+default 10.0.0.2 UGSc 0 0 tun0
+10.0.0.2 10.0.0.1 UH 0 0 tun0
+....
+
+Если нет маршрута по умолчанию, убедитесь, что строка `HISADDR` была добавлена в [.filename]#/etc/ppp/ppp.conf#.
+
+Другая причина отсутствия строки с маршрутом по умолчанию может крыться в том, что маршрут по умолчанию был добавлен в [.filename]#/etc/rc.conf#, и эта строка отсутствует в [.filename]#/etc/ppp/ppp.conf#:
+
+[.programlisting]
+....
+delete ALL
+....
+
+В таком случае обратитесь к соответствующему link:{handbook}#userppp-final[разделу] Руководства.
+
+=== Что означает сообщение No route to host?
+
+Обычно эта ошибка появляется из-за отсутствия в файле [.filename]#/etc/ppp/ppp.linkup# следующего раздела:
+
+[.programlisting]
+....
+MYADDR:
+ delete ALL
+ add 0 0 HISADDR
+....
+
+Он необходим только для динамического IP адреса или когда адрес маршрутизатора не известен. При использовании интерактивного режима можно набрать следующие команды после входа в пакетный режим. Пакетный режим обозначается заглавными буквами PPP в приглашении:
+
+[.programlisting]
+....
+delete ALL
+add 0 0 HISADDR
+....
+
+Обратитесь к разделу link:{handbook}#userppp-dynamicip[PPP и динамические IP адреса] Руководства за подробной информацией.
+
+=== Соединение разрывается через 3 минуты
+
+Таймаут для PPP по умолчанию равен 3 минутам. Это может быть изменено такой строкой:
+
+[.programlisting]
+....
+set timeout NNN
+....
+
+где _NNN_ - время неактивности в секундах, после которого соединение закрывается. Если _NNN_ равно нулю, соединение никогда не разрывается по таймауту. Эту команду можно поместить в файл [.filename]#ppp.conf# или набрать ее в интерактивном режиме. Изменение этого параметра также возможно при активном соединении, если подключиться к сокету ppp сервера с помощью программ man:telnet[1] или man:pppctl[8]. Обратитесь к страницам Справочника, посвящённым man:ppp[8].
+
+=== Соединение разрывается при большой нагрузке
+
+Если включен Link Quality Reporting (LQR), то возможно слишком много пакетов LQR теряется в канале. man:ppp[8] делает вывод, что канал плох, и разрывает соединение. LQR по умолчанию выключен. Включить LQR можно так:
+
+[.programlisting]
+....
+enable lqr
+....
+
+=== Соединение разрывается в случайные промежутки времени
+
+Иногда на шумной линии или даже на линии с включенным режимом ожидания звонка модем может вешать трубку, ошибочно полагая, что потеряна несущая.
+
+В большинстве модемов есть параметр, определяющий чувствительность к временной потере несущей. Обратитесь к документации модема.
+
+=== Соединение часто рвётся в случайные промежутки времени
+
+Многие сообщают об обрывах соединений без видимой причины. Первым делом нужно выяснить, с какой стороны рвётся соединение.
+
+При использовании внешнего модема проверьте утилитой man:ping[8], мигает ли индикатор TD при передаче данных. Если он мигает, а индикатор RD нет, проблема с той стороны. Если TD не загорается, проблема является локальной. Для внутреннего модема используйте команду `set server` в [.filename]#ppp.conf#. При обрыве связи подключитесь к man:ppp[8] с помощью man:pppctl[8]. Если сетевое подключение неожиданно восстанавливается при проявлении активности на диагностическом сокете или нет соединения, но команда `set socket` в начальный момент была выполнена успешно, то проблема имеет локальный характер. Если получается подключиться, но связи всё равно нет, включите вывод локальной отладочной информации командой `set log local async` и используйте man:ping[8] в другом окне или терминале, чтобы проверить связь. В отладочном выводе будут показаны данные, передаваемые и получаемые из канала связи. Если данные посылаются, но не принимаются обратно, то проблема с той стороны.
+
+Теперь, после выяснения местонахождения проблемы, имеется два варианта действий:
+
+* Если проблема на удалённой машине, то прочтите <<ppp-remote-not-responding>>.
+* Если проблема с вашей стороны, прочтите <<ppp-hung>>.
+
+[[ppp-remote-not-responding]]
+=== Удалённая система не отвечает
+
+Здесь мало что можно сделать. Большинство провайдеров отказываются помогать пользователям, которые не используют ОС от Microsoft(R). Добавьте `enable lqr` в [.filename]#/etc/ppp/ppp.conf#, чтобы позволить man:ppp[8] отследить ошибки в удалённой системе и закрыть соединение. Такое обнаружение достаточно медленно и поэтому не так уж полезно.
+
+Первым делом попробуйте отключить любое сжатие, указав в конфигурационном файле следующее:
+
+[.programlisting]
+....
+disable pred1 deflate deflate24 protocomp acfcomp shortseq vj
+deny pred1 deflate deflate24 protocomp acfcomp shortseq vj
+....
+
+Теперь попробуйте установить соединение ещё раз и удостоверьтесь, что ситуация не изменилась. Если качество соединения улучшилось или проблема оказалась полностью решённой, выясните, настройка чего приводила к проблемам методом проб и ошибок. Это полезная информация для провайдера, хотя при этом может обнаружиться, что вы работаете не с продуктом Microsoft(R).
+
+Перед тем, как звонить провайдеру, включите вывод отладочной информации и подождите, пока соединение снова не прервётся. Для этого может потребоваться некоторое дисковое пространство. Интерес могут представлять последние прочитанные из порта данные. Обычно это данные в формате ASCII и они могут даже содержать описание проблемы (`Memory fault`, `Core dumped`).
+
+Если провайдер согласен помочь, нужно будет включить режим отладки с их стороны, и затем, когда связь прервётся в следующий раз, они смогут сказать, почему с их стороны возникли проблемы.
+
+[[ppp-hung]]
+=== Ppp зависает
+
+В этом случае перекомпилируйте man:ppp[8] с отладочной информацией, и затем используйте man:gdb[1] для получения стека вызовов для зависшего процесса ppp. Чтобы откомпилировать программу ppp с отладочной информацией, наберите такие команды:
+
+[source,bash]
+....
+# cd /usr/src/usr.sbin/ppp
+# env DEBUG_FLAGS='-g' make clean
+# env DEBUG_FLAGS='-g' make install
+....
+
+Затем перезапустите ppp и дождитесь следующего зависания. Когда отладочная сборка man:ppp[8] зависнет, запустите gdb для зависшего процесса:
+
+[source,bash]
+....
+# gdb ppp `pgrep ppp`
+....
+
+В приглашении gdb используйте команду `bt` или `where` для получения стека вызовов. Сохраните вывод сессии gdb и "отключитесь" от работающего процесса, выполнив команду `quit` в gdb.
+
+=== В протоколе есть сообщения о том, что magic being the same.
+
+Иногда, сразу после установления соединения, в журнале могут возникать сообщения `Magic is the same`. Иногда эти сообщения проходят безболезненно, а иногда одна из сторон прекращает работу. Большинство реализаций PPP не может справиться с такой ситуацией, и даже когда связь выглядит установившейся, вы будeт только бесконечно повторяющиеся конфигурационные запросы и подтверждения в файле протокола до тех пор, пока man:ppp[8] окончательно не закроет соединение.
+
+Обычно это происходит на серверах с медленными дисками, на которых порт обслуживает программа man:getty[8], а man:ppp[8] выполняется из сценария регистрации или другой программы после регистрации пользователя. Были сообщения, что такое случается постоянно при использовании slirp. Причина заключается в том, что во время, проходящее между завершением работы man:getty[8] и запуском man:ppp[8], man:ppp[8] со стороны клиента начинает посылать пакеты Line Control Protocol (LCP). Так как режим эха остаётся всё ещё включенным, man:ppp[8] клиента получает "отражения" своих запросов.
+
+Частью процесса согласования параметров LCP является определение "магического" числа для каждой стороны соединения для обнаружения "отражений". Согласно спецификации, когда одна сторона пытается использовать совпадающее "магическое" число, должен быть послан ответ NAK и должно быть выбрано новое "магическое" число. В тот момент, когда на порту сервера включен режим эха, клиент man:ppp[8] посылает пакеты LCP, получает то же самое "магическое" число в отражённом пакете и отвечает на него NAK. Он также видит отражённый NAK (который также означает, что man:ppp[8] должен изменить своё "магическое" число). В потенциале это может вызвать появление огромного количества процессов смен "магических" чисел, и все они накапливаются в буфере терминала. Как только запустится сервер man:ppp[8], он будет перегружен запросами на смену "магических", немедленно решит, что этого много для согласования LCP и прервёт соединение. В то же самое время, клиент, который больше не видит отражений, останавливается для того, чтобы увидеть, что сервер закрыл соединение.
+
+Этого можно избежать, позволив начинать согласование противоположной стороне следующей строкой в файле [.filename]#ppp.conf#:
+
+[.programlisting]
+....
+set openmode passive
+....
+
+Это заставит man:ppp[8] ожидать начала согласования LCP. Некоторые серверы, однако, могут никогда не начать согласование. В этом случае попробуйте сделать следующее:
+
+[.programlisting]
+....
+set openmode active 3
+....
+
+Это заставит man:ppp[8] пассивно ждать 3 секунды, и только затем посылать запросы LCP. Если противоположная сторона начнёт посылать в этот момент запросы, man:ppp[8] немедленно ответит, не ожидая истечения трёхсекундного интервала.
+
+=== Согласование LCP продолжается, пока не закроется соединение
+
+В настоящий момент одной из неприятных особенностей реализации man:ppp[8] является то, что она не связывает сообщения LCP, CCP & IPCP с запросами. Как результат, если реализация PPP с одной стороны более чем на 6 секунд медленнее, чем с другой, противоположная сторона будет посылать два дополнительных запроса на согласование параметров LCP. Это фатально.
+
+Предположим, что у нас работают две реализации, на машинах `A` и `B`. `A` начинает посылать запросы LCP сразу же после соединения, а `B` требуется 7 секунд для запуска. Когда `B` запускается, `A` послало 3 LCP-запроса. Полагаем, что режим эха выключен, в противном случае мы столкнулись бы с проблемами "магического" числа, описанными в предыдущем разделе. `B` посылает REQ, затем ACK на первый REQ от `A`. Это приводит к тому, что `A` входит в состояние OPENED и посылает (первый) ACK обратно `B`. В то же самое время `B` посылает обратно ещё два ACK в ответ на два дополнительных REQ, посланные `A` до старта `B`. `B` затем получает первый ACK от `A` и возвращается в состояние REQ-SENT, послав ещё один (четвёртый) REQ согласно RFC. Затем он получает третий ACK и входит в состояние OPENED. В это же время `B` принимает четвёртый REQ от `A`, что возвращает его в состояние ACK-SENT и посылает ещё один (второй) REQ и (четвёртый) ACK согласно RFC. `A` получает REQ, переходит в состояние REQ-SENT и посылает ещё один REQ. Он немедленно принимает последующий ACK и входит в состояние OPENED.
+
+Это будет продолжаться до тех пор, пока одна из сторон не обнаружит, что это ни к чему не приводит и не закроет соединение.
+
+Лучшим способом избежать этой ситуации является конфигурация одной из сторон как `passive`, чтобы она ждала другую для начала согласования. Это можно сделать следующей командой:
+
+[.programlisting]
+....
+set openmode passive
+....
+
+С этой командой нужно быть осторожным. Эту команду можно также использовать для ограничения периода ожидания, в течении которого man:ppp[8] ждёт начала согласования с противоположной стороны:
+
+[.programlisting]
+....
+set stopped N
+....
+
+Как вариант, может быть использована следующая команда (где _N_ - период ожидания в секундах перед тем, как начать согласование):
+
+[.programlisting]
+....
+set openmode active N
+....
+
+За дополнительной информацией обращайтесь к странице Справочника.
+
+=== Когда я выполняю команду shell для тестирования соединения, ppp блокируется
+
+При использовании `shell` или `!` man:ppp[8] запускает оболочку или переданные параметры. Программа ppp будет ждать окончания выполнения команды, прежде чем продолжить. При любой попытке воспользоваться связью PPP во время выполнения команды связь будет выглядеть заблокированной. Это происходит из-за того, что man:ppp[8] ждёт завершения команды.
+
+Для выполнения подобных команд используйте вместо этого `!bg`. В этом случае нужная команда будет выполняться в фоновом режиме, а man:ppp[8] сможет продолжить обслуживание канала связи.
+
+=== Почему программа ppp, обслуживающая нуль-модем, никогда не закрывается?
+
+man:ppp[8] не может определить, что соединение было закрыто. Это происходит из-за метода использования сигнальных линий нуль-модемного кабеля. При использовании такого типа соединения всегда включайте LQR:
+
+[.programlisting]
+....
+enable lqr
+....
+
+По умолчанию LQR включается, если это было затребовано с противоположной стороны на этапе согласования параметров соединения.
+
+=== В режиме -auto ppp неожиданно начинает звонить
+
+Если man:ppp[8] начинает неожиданно звонить, определите причину и настройте фильтры дозвона для предотвращения подобных звонков.
+
+Для выяснения причины такого поведения, используйте строку:
+
+[.programlisting]
+....
+set log +tcp/ip
+....
+
+Это включит протоколирование всего трафика через соединение. В следующий раз, когда неожиданно будет установлено соединение, в файл протокола будет следом занесена причина с отметкой времени.
+
+Теперь отключите дозвон при данных условиях. Как правило, такие проблемы возникают из-за обращений к DNS. Для предотвращения обращений к DNS и установления соединения (что _не_ запретит man:ppp[8] пропускать пакеты через уже установленное соединение), используйте такую комбинацию:
+
+[.programlisting]
+....
+set dfilter 1 deny udp src eq 53
+set dfilter 2 deny udp dst eq 53
+set dfilter 3 permit 0/0 0/0
+....
+
+Это не всегда удобно, так как закрывает возможность дозвона по запросу. Большинству программ нужно обратиться к DNS до того, как начать работать.
+
+В случае DNS попытайтесь установить, что именно пытается определить имя хоста. В большинстве случаев виновным оказывается Sendmail. Проверьте, чтобы в конфигурационном файле программы Sendmail не было указано обращаться к DNS. Обратитесь к разделу об link:{handbook}#smtp-dialup/[использовании электронной почты при коммутируемом соединении] в Руководстве FreeBSD за подробным описанием. Вам может понадобиться добавить в файл [.filename]#.mc# строку:
+
+[.programlisting]
+....
+define(`confDELIVERY_MODE', `d')dnl
+....
+
+Это заставит Sendmail добавлять все сообщения в очередь до тех пор, пока не будет запущена её обработка, как правило, каждые 30 минут, или пока не будет выполнена команда `sendmail -q`, возможно, из файла [.filename]#/etc/ppp/ppp.linkup#).
+
+=== Что означают ошибки CCP
+
+В файле протокола появляются такие сообщения об ошибках:
+
+[.programlisting]
+....
+CCP: CcpSendConfigReq
+CCP: Received Terminate Ack (1) state = Req-Sent (6)
+....
+
+Это происходит, если man:ppp[8] пытается установить сжатие Predictor1, а противоположная сторона не хочет устанавливать никакого сжатия. Эти сообщения безобидны, но их можно заглушить отключением сжатия:
+
+[.programlisting]
+....
+disable pred1
+....
+
+=== Почему ppp не протоколирует скорость соединения?
+
+Для записи полного протокола взаимодействия с модемом включите следующее:
+
+[.programlisting]
+....
+set log +connect
+....
+
+Это заставит man:ppp[8] протоколировать всё, вплоть до последней прочтённой через "expect" строки.
+
+Чтобы увидеть скорость соединения при использовании PAP или CHAP, укажите man:ppp[8] ожидать полную строку CONNECT:
+
+[.programlisting]
+....
+set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 4 \
+ \"\" ATZ OK-ATZ-OK ATDT\\T TIMEOUT 60 CONNECT \\c \\n"
+....
+
+Здесь мы получаем строку CONNECT, ничего не посылаем, а затем ожидаем символа перевода строки, заставляя man:ppp[8] читать целиком содержимое ответа CONNECT.
+
+=== Ppp игнорирует символ \ в chat-скрипте
+
+Программа ppp разбирает каждую строку в конфигурационных файлах и поэтому может правильно интерпретировать строки вида `set phone "123 456 789"` и обнаруживать, что на самом деле номер является единственным аргументом. Для того, чтобы указать символ `"`, заэкранируйте его символом обратного слэша (`\`).
+
+Когда интерпретатор chat разбирает каждый параметр, он ещё раз просматривает аргумент на предмет каких-либо специальных последовательностей типа `\P` или `\T`. Вследствие этой двойной интерпретации не забывайте об использовании нужного количества экранирующих символов.
+
+Чтобы передать сам символ `\`, укажите что-то типа:
+
+[.programlisting]
+....
+set dial "\"\" ATZ OK-ATZ-OK AT\\\\X OK"
+....
+
+Это приведёт к такой последовательности:
+
+[.programlisting]
+....
+ATZ
+OK
+AT\X
+OK
+....
+
+Или:
+
+[.programlisting]
+....
+set phone 1234567
+set dial "\"\" ATZ OK ATDT\\T"
+....
+
+Это даст такую последовательность:
+
+[.programlisting]
+....
+ATZ
+OK
+ATDT1234567
+....
+
+=== Процесс, вызвавший прозвонку в режиме -auto, никогда не получает затребованного соединения
+
+Эта проблема проявлялась, когда man:ppp[8] в режиме `-auto` был настроен на динамическое согласование локального IP-адреса с противоположной стороной. Это было давно исправлено - поищите на странице справочника слово `iface`.
+
+Причиной было то, что когда эта программа использует системный вызов man:connect[2], для сокета назначается IP-адрес интерфейса man:tun[4]. Ядро создаёт первый исходящий пакет и записывает его в устройство man:tun[4]. Затем man:ppp[8] читает пакет и устанавливает соединение. Если в результате согласования man:ppp[8] динамического IP-адреса адрес интерфейса изменится, сокет будет работать некорректно. Любые IP-пакеты, передаваемые через сокет, будут отброшены. Если даже этого не произойдёт, ответные данные не будут достигать отправителя, так как этот адрес больше ему не принадлежит.
+
+Теоретически есть несколько способов решить эту проблему. Лучше всего, если противоположная сторона назначит интерфейсу тот же самый IP-адрес. Текущая версия man:ppp[8] именно так и поступает, но большинство других реализаций этого не делают.
+
+Самым простым решением будет просто никогда не менять IP-адрес интерфейса man:tun[4], а вместо этого изменять на лету все исходящие пакеты так, чтобы IP-адрес источника менялся с IP-адреса интерфейса на соответствующий с противоположной стороны. Это, в сущности, то же самое, что делает опция `iface-alias` в самой последней версии man:ppp[8] (с помощью библиотеки man:libalias[3] и ключа `-nat` для man:ppp[8]) - она отслеживает все назначенные ранее интерфейсу адреса и замещает их на последний из назначенных.
+
+Другой возможный (и, наверное, самый надёжный) способ - это создать системный вызов, меняющий IP-адреса всем уже связанным сокетам. man:ppp[8] использовал бы этот вызов для модификации сокетов всех работающих программ после согласования нового IP-адреса. Этот же самый системный вызов могли бы использовать клиенты DHCP, когда они осуществляют повторную привязку к сокету, вызывая для этого функцию `bind()`.
+
+Ещё одной возможностью является разрешение интерфейсу становиться активным без IP-адреса. Исходящим пакетам будет даваться IP адрес `255.255.255.255` до первого вызова man:ioctl[2] `SIOCAIFADDR`, приводящего к полной привязке сокета. man:ppp[8] нужно будет изменять исходящий IP-адрес и контрольную сумму пакета, только если он установлен в `255.255.255.255`. Это, однако, является некоторым хаком, так как ядро будет посылать некорректные пакеты на не полностью сконфигурированный интерфейс, в предположении, что существует механизм исправления этих пакетов.
+
+=== Что такое ошибки FCS?
+
+FCS является сокращением от Frame Check Sequence (контроль последовательности кадров). Каждый кадр PPP имеет контрольную сумму для проверки того, что принятые данные совпадают с переданными. Если FCS принятого пакета некорректна, пакет отбрасывается и счётчик FCS для HDLC увеличивается. Значения ошибок уровня HDLC можно вывести командой `show hdlc`.
+
+Если линия плохого качества или драйвер коммуникационного адаптера отбрасывает пакеты, будут появляться случайные ошибки FCS. Это обычно не является причиной для волнений, хотя это существенно замедляет протоколы компрессии.
+
+Если связь замирает сразу при установлении соединения и наблюдается большое количество ошибок FCS, убедитесь, чтобы модем не использовал программное управление потоком (XON/XOFF). Если же для соединения должно использоваться программное управление потоком, то воспользуйтесь командой `set accmap 0x000a0000` для указания man:ppp[8] экранировать символы `^Q` и `^S`.
+
+Другой причиной слишком большого количества ошибок FCS может быть прекращение противоположной стороной сеанса PPP. В этом случае включите протоколирование `async` для проверки того, не являются ли поступаемые из линии данные на самом деле приглашением login или shell. Если с противоположной стороны находится приглашение shell, завершить man:ppp[8] без обрыва связи можно командой `close lcp` и последующей командой `term`, чтобы переподключиться к приглашению shell на удалённой машине.
+
+Если ничего в файле протокола не говорит о причине разрыва связи, спросите у администратора удалённой машины или вашего провайдера, почему сеанс был закрыт.
+
+=== Ничего не помогает - я уже отчаялся!
+
+Если всё уже перепробовано, и ничего не получается, пошлите подробности об ошибке, конфигурационные файлы, способ запуска man:ppp[8], соответствующие части файла протокола, и вывод команды `netstat -rn` до и после соединения в {freebsd-questions}.
+
+== Коммуникационные адаптеры
+
+В этом разделе освещены вопросы о работе последовательных адаптеров во FreeBSD. Протокол PPP рассматривается в разделе <<networking,Работа в сети>>.
+
+=== Какие многопортовые последовательные адаптеры поддерживаются во FreeBSD?
+
+Список таких устройств находится в главе Руководства link:{handbook}#serial/[Последовательные соединения].
+
+Большинство многопортовых PCI адаптеров на базе 16550 и их клоны поддерживаются без дополнительных усилий.
+
+Некоторые безымянные клоны таких адаптеров тоже работают нормально, особенно те, которые заявляют о своей совместимости с AST.
+
+Прочтите страницы Справочника man:uart[4] и man:sio[4] для получения подробной информации о конфигурировании таких адаптеров.
+
+=== Как сделать, чтобы приглашение boot: выводилось на консоль на последовательном порту?
+
+Подробная информация находится в link:{handbook}#serialconsole-setup/[этом разделе Руководства].
+
+=== Как узнать, обнаружила ли FreeBSD последовательные порты или внутренние модемы?
+
+В процессе своей загрузки ядро FreeBSD будет пытаться найти последовательные порты, с поддержкой которых ядро сконфигурировано. Внимательно просмотрите сообщения загрузки либо выполните такую команду после того, как система запустилась и работает:
+
+[source,bash]
+....
+% dmesg | grep -E "^sio[0-9]"
+sio0: <16550A-compatible COM port> port 0x3f8-0x3ff irq 4 flags 0x10 on acpi0
+sio0: type 16550A
+sio1: <16550A-compatible COM port> port 0x2f8-0x2ff irq 3 on acpi0
+sio1: type 16550A
+....
+
+Здесь присутствуют два последовательных порта. Первый находится на IRQ4, порт ввода/вывода `0x3f8`, и построен на микросхеме UART типа 16550A. Второй использует тот же тип микросхемы, но находится на IRQ3 и использует адрес порта ввода/вывода `0x2f8`. Внутренние модемы выглядят точно также, как последовательные порты, за исключением того, что модем к ним подключен всегда.
+
+В ядро [.filename]#GENERIC# встроена поддержка двух последовательных портов, с теми же IRQ и адресами портов ввода/вывода, как указано в примере выше. Если эти настройки не соответствуют системе или имеется больше внутренних модемов или последовательных портов, чем описано в ядре, переконфигурируйте его, следуя инструкциям в разделе <<make-kernel,о построении ядра>>.
+
+=== Как осуществляется доступ к последовательным портам во FreeBSD?
+
+Третий последовательный порт, [.filename]#sio2# или [.filename]#COM3#, обозначается как [.filename]#/dev/cuad2# для устройств, выполняющих исходящие звонки, и [.filename]#/dev/ttyd2# для устройств, принимающих входящие звонки. Какая разница между этими двумя классами устройств?
+
+При открытии [.filename]#/dev/ttydX# в блокирующем режиме процесс будет ожидать неактивности соответствующего устройства [.filename]#cuadX#, а затем появления сигнала о наличии несущей. При открытии устройства [.filename]#cuadX# он проверяет, что последовательный порт не занят устройством [.filename]#ttydX#. Если порт доступен, он похищает его у устройства [.filename]#ttydX#. Также устройство [.filename]#cuadX# не следит за наличием несущей. С такой схемой работы и модемом в режиме автоответа удалённые пользователи могут входить в систему, а локальные пользователи через тот же модем могут по прежнему осуществлять исходящие звонки, а система позаботится о возможных конфликтах.
+
+=== Как включить поддержку многопортовых последовательных адаптеров?
+
+Информация о конфигурировании ядра содержится в соответствующем разделе, посвящённом этому вопросу. Для многопортовых последовательных адаптеров добавьте в файл man:device.hints[5] по строке man:sio[4] на каждый порт. Но IRQ должен быть указан только у одного порта. Все порты на адаптере должны использовать одно и то же значение IRQ. Для обеспечения согласованности используйте для указания IRQ последний последовательный порт. Также укажите следующую опцию в файле конфигурации ядра:
+
+[.programlisting]
+....
+COM_MULTIPORT
+....
+
+В следующем примере указано содержимое [.filename]#/boot/device.hints# для 4-портового последовательного адаптера AST на IRQ 12:
+
+[.programlisting]
+....
+hint.sio.4.at="isa"
+hint.sio.4.port="0x2a0"
+hint.sio.4.flags="0x701"
+hint.sio.5.at="isa"
+hint.sio.5.port="0x2a8"
+hint.sio.5.flags="0x701"
+hint.sio.6.at="isa"
+hint.sio.6.port="0x2b0"
+hint.sio.6.flags="0x701"
+hint.sio.7.at="isa"
+hint.sio.7.port="0x2b8"
+hint.sio.7.flags="0x701"
+hint.sio.7.irq="12"
+....
+
+Флаги указывают, что управляющий порт имеет младший номер устройства `7` (`0x700`), и все порты совместно используют один и тот же номер IRQ (`0x001`).
+
+=== Можно ли настроить для порта режим работы по умолчанию?
+
+Смотрите раздел Руководства FreeBSD, посвящённый link:{handbook}#serial/#serial-hw-config[последовательным соединениям].
+
+=== Как сделать вход через модем?
+
+Ознакомьтесь с разделом Руководства FreeBSD, посвящённым link:{handbook}#dialup/[входящим соединениям].
+
+=== Как подключить терминал к FreeBSD?
+
+Информация по этому вопросу находится в разделе link:{handbook}#term/[Терминалы] Руководства FreeBSD.
+
+=== Почему не удаётся запустить tip или cu?
+
+Встроенные утилиты man:tip[1] и man:cu[1] могут получить доступ к каталогу [.filename]#/var/spool/lock# только из-под пользователя `uucp` и членов группы `dialer`. Используйте группу `dialer` для управления доступом к модему или удалённым системам посредством добавления в неё пользовательских учётных записей.
+
+Либо же можно разрешить всем запускать man:tip[1] и man:cu[1]:
+
+[source,bash]
+....
+# chmod 4511 /usr/bin/cu
+# chmod 4511 /usr/bin/tip
+....
+
+== Разное
+
+=== Почему FreeBSD использует много места в разделе подкачки даже при большом объёме свободной памяти?
+
+FreeBSD активно перемещает неиспользуемые страницы памяти, к которым не было обращений, в раздел подкачки, чтобы увеличить объём доступной физической памяти для активного использования. Такое активное использование раздела подкачки компенсируется использованием дополнительной свободной оперативной памяти для кеширования.
+
+Заметьте, что хотя FreeBSD предпочитает использовать раздел подкачки, страницы не перемещаются произвольно при полностью неактивной системе. По этой причине система не будет находиться целиком в разделе подкачки после ночного простаивания.
+
+=== Почему утилита man:top[1] показывает очень маленький объём свободной памяти, даже когда запущено всего лишь несколько приложений?
+
+Просто дело в том, что под свободной памятью подразумевается никак не используемая память. Вся память, которая программам явно не выделялась, используется ядром FreeBSD для дискового кэша. Значения, показываемые утилитой man:top[1], помеченные как `Inact`, `Cache` и `Buf` - это всё кэшированные данные разных степеней устаревания. То, что данные находятся в кэше, означает, что система не будет обращаться к медленному диску снова за теми данными, обращение к которым было недавно, повышая таким образом общую производительность. В общем случае маленькие значения в пункте `Free`, показываемые утилитой man:top[1] для свободной памяти - это хорошо, если, конечно они не _очень_ маленькие.
+
+=== Почему командой chmod невозможно изменить права на символические ссылки?
+
+Символические ссылки не имеют атрибутов доступа, и по умолчанию утилита man:chmod[1] следует по символической ссылке, чтобы по возможности изменить права доступа на исходный файл. Для файла [.filename]#foo# с символической ссылкой [.filename]#bar# на этот файл эта команда всегда будет выполняться успешно.
+
+[source,bash]
+....
+% chmod g-w bar
+....
+
+Однако права на файл [.filename]#bar# не изменятся.
+
+Чтобы это работало, используйте опцию `-H` или `-L` вместе с опцией `-R`. Обратитесь к страницам Справочника по команде man:chmod[1] и по man:symlink[7].
+
+[WARNING]
+====
+
+Опция `-R` выполняет man:chmod[1] _рекурсивно_. Будьте внимательны, задавая каталоги или символические ссылки на каталоги в параметрах man:chmod[1]. Чтобы изменить права на каталог, на который указывает символическая ссылка, используйте man:chmod[1] без опций и следуйте символической ссылке с помощью лидирующего слэша ([.filename]#/#). Например, если [.filename]#foo# является символической ссылкой на каталог [.filename]#bar#, то чтобы изменить права на [.filename]#foo# (на самом деле на [.filename]#bar#), выполните такую команду:
+
+[source,bash]
+....
+% chmod 555 foo/
+....
+
+Если задан ведущий слэш, то man:chmod[1] будет следовать символической ссылке [.filename]#foo#, меняя права на каталог [.filename]#bar#.
+====
+
+=== Можно ли запускать программы для DOS во FreeBSD?
+
+Да. Программа эмуляции DOS package:emulators/doscmd[] включена в Коллекцию Портов FreeBSD.
+
+Если doscmd не достаточно, package:emulators/pcemu[] эмулирует 8088 и набор сервисов BIOS, достаточный для запуска многих приложений текстового режима DOS. Требуется X Window System.
+
+В Коллекции Портов FreeBSD также имеется package:emulators/dosbox[]. Программа в основном предназначена для эмуляции старых игр, написанных под DOS, для хранения файлов которых используется локальная файловая система.
+
+=== Что мне нужно сделать, чтобы перевести документацию FreeBSD на родной язык?
+
+Ознакомьтесь с link:{fdp-primer}#translations/[FAQ по Переводам] из FreeBSD Documentation Project Primer.
+
+=== Почему возвращается моя электронная почта, отправленная на любой из адресов FreeBSD.org?
+
+В почтовой системе `FreeBSD.org` в Postfix применяются некоторые проверки входящей почты, и отвергаются сообщения, которые были неправильно сформированы при пересылке либо как-то иначе похожи на спам. Некоторые из требований:
+
+* IP-адрес клиента SMTP должен иметь обратное преобразование в символическое имя.
+* Полное имя хоста, указанное на этапе EHLO/HELO в процессе обмена сообщениями SMTP, должно разрешаться в IP-адрес клиента.
+
+Дополнительные советы по доставке письма:
+
+* Письмо должно быть отправлено в текстовом формате. Сообщение в почтовый список рассылки, как правило, не должно иметь размер больше 200 Кбайт.
+* Избегайте избыточного кросспостинга. Выберите _один_ список рассылки, который кажется наиболее подходящим.
+
+Если у вас всё ещё остались трудности при работе с почтовой инфраструктурой `FreeBSD.org`, отправьте сообщение с подробным описанием на адрес mailto:postmaster@freebsd.org[postmaster@freebsd.org]. Укажите в нём временной интервал для проверки логов - и обратите внимание, что мы держим журнал почтовых логов всего за неделю. (Обязательно укажите часовой пояс или разницу в UTC.)
+
+=== Где можно получить бесплатный доступ к FreeBSD?
+
+Хотя FreeBSD не предоставляет бесплатный доступ ни к одному из своих серверов, другие компании предоставляют UNIX(R)-системы с открытым доступом. Стоимость этой услуги различна, также как и ограниченный набор услуг.
+
+http://www.arbornet.org/[Arbornet, Inc], также известный как _M-Net_, предоставляет свободный доступ к UNIX(R)-системам с 1983 года. Начиная на платформе Altos с работающей System III, сайт перешёл на BSD/OS в 1991. В июне 2000 сайт сменил систему снова, теперь на FreeBSD. _M-Net_ может быть доступна через протоколы telnet и SSH и предоставляет доступ к полному набору программного обеспечения FreeBSD. Однако доступ к сети ограничен для членов и спонсоров, которые поддерживают систему, которая работает как неприбыльная организация. _M-Net_ предоставляет также услуги электронной доски объявлений (BBS) и интерактивного чата.
+
+=== Как зовут этого маленького симпатичного красного парня?
+
+У него нет определённого имени, он называется просто "даемон BSD". Если вам непременно нужно имя, называйте его "beastie". Заметьте, что "beastie" произносится как "BSD".
+
+Больше о даемоне BSD можно узнать из его http://www.mckusick.com/beastie/index.html[домашней страницы].
+
+=== Могу ли я использовать изображение даемона BSD?
+
+Вполне. Права на даемона BSD имеет Marshall Kirk McKusick. Для выяснения подробностей относительно правил его использования обратитесь к странице автора http://www.mckusick.com/beastie/mainpage/copyright.html[Statement on the Use of the BSD Daemon Figure].
+
+В общем, использовать изображение можно в высокохудожественном стиле и в личных целях, если даются соответствующие отсылки. Перед использованием знака в коммерческих целях обратитесь за разрешением к {mckusick}. Дополнительная информация находится на http://www.mckusick.com/beastie/index.html[домашней странице Даемона BSD].
+
+=== Не найдется ли у вас изображений даемона BSD, которые можно использовать?
+
+В каталоге [.filename]#/usr/shared/examples/BSD_daemon/# есть рисунки в форматах eps и Xfig.
+
+=== При просмотре списков рассылки, я встретил акроним или другой термин, который мне не понятен. Где я должен посмотреть, что он значит?
+
+Пожалуйста, обращайтесь к link:{handbook}#freebsd-glossary/[Глоссарию FreeBSD].
+
+=== Почему я должен беспокоиться о цвете велосипедных навесов (bikeshed)?
+
+На самом деле, очень краткий ответ на этот вопрос заключается в том, что вы этого делать не должны. Если давать более подробный ответ, то ваше умение делать навесы не должно означать, что вы должны препятствовать другим делать их просто потому, что вам не нравится цвет, в который они собираются их окрашивать. Эта метафора означает, что вам не нужно обсуждать каждую мелочь просто потому, что вы знаете о ней достаточно много. Некоторые люди отмечают, что объём шума, генерируемый при появлении некоторого изменения, находится в обратной зависимости от сложности самого изменения.
+
+Более пространный и полный ответ заключается в том, что после очень долгого обсуждения того, должна ли утилита man:sleep[1] обрабатывать дробное число, заданное в качестве второго аргумента, {phk} опубликовал большое сообщение, озаглавленное "link:http://www.FreeBSD.org/cgi/getmsg.cgi?fetch=506636+517178+/usr/local/www/db/text/1999/freebsd-hackers/19991003.freebsd-hackers[Велосипедный навес (подставьте здесь цвет) на зелёной траве...]". Соответствующие части этого сообщения цитируются ниже.
+
+{phk} on freebsd-hackers, October 2, 1999
+"Что это за история с навесом для велосипеда?" Кто-то из вас задавал такой вопрос.
+
+Это долгая история, или же это старая история, но на самом деле она коротка. В начале 1960-х годов Паркинсон (C. Northcote Parkinson) написал книгу "Закон Паркинсона", которая содержит много интересных взглядов на процесс управления.
+
+_[немного выдержек из краткого содержания книги]_
+
+В конкретном примере велосипедный навес сопоставляется с другим важным объектом - атомной электростанцией. Я полагаю, что это иллюстрирует древность книги.
+
+Паркинсон показывает, что вы можете прийти на совещание руководителей и получить добро на строительство многомиллионной или даже многомиллиардной атомной электростанции, но если вы хотите построить навес для велосипеда, то погрязнете в бесконечных обсуждениях.
+
+Паркинсон объясняет это тем, что атомная станция настолько большой, дорогой и сложный объект, что люди не могут его осознать и вместо того, чтобы попробовать это сделать, они полагаются на то, что кто-то уже проверил все мелочи до того, как всё зашло так далеко. В своей книге Ричард П. Фейнманн (Richard P. Feynmann) даёт несколько интересных и очень поучительных примеров, связанных с Лос Аламос.
+
+Велосипедный навес - это противоположный случай. Любой может построить навес за один уикэнд, и у него ещё останется время посмотреть футбол по телевизору. Так что не важно, насколько хорошо вы готовились к обсуждению, насколько убедительны будут ваши аргументы, кто-нибудь воспользуется шансом показать, что он не зря ест свой хлеб, что он обращает внимание, что он _здесь_.
+
+В Дании это называется "оставить отпечаток своего пальца". Это касается личной гордости и престижа, это похоже на возможность указать куда-то и сказать: " Вон там! Это сделал _я_." Это сильно выражено в политиках, но присутствует во многих людях, которые получают возможность сделать это. Просто вспомните об отпечатках ног во влажном цементе.
+
+== Юмор от FreeBSD
+
+=== Насколько греется процессор при работе FreeBSD?
+
+В. Кто-нибудь делал замеры температуры при работе FreeBSD? Я знаю, что Linux(R) греется меньше, чем DOS, но никогда не видел упоминания FreeBSD. Наверное, он сильно греется.
+
+О. Нет, но мы сделали различные вкусовые тесты у добровольцев с завязанными глазами, которые до этого приняли по 250 микрограмм LSD-25. 35% добровольцев заявило, что FreeBSD имеет вкус апельсина, тогда как вкус Linux(R) расценивался как фиолетовый туман. Ни одна из групп не отметила значительной разницы в температуре. Мы хотели опубликовать полные результаты этого опроса, когда обнаружили, что слишком много добровольцев покинули помещение во время тестов, что несколько смазало результаты. Думаем, что большинство из них работают сейчас в Apple над их новым GUI "чеши и нюхай". Это старый добрый бизнес!
+
+Если серьёзно, то FreeBSD использует инструкцию HLT (halt), когда система простаивает, что уменьшает потребление энергии и, в свою очередь, выделение тепла. Вдобавок, если у вас настроен ACPI (усовершенствованный интерфейс управления конфигурацией и питанием), то FreeBSD может переводить процессор в режим пониженного энергопотребления.
+
+=== Кто там скребётся в микросхемах памяти??
+
+В. Делает ли FreeBSD что-нибудь "эдакое" при компиляции ядра, что вызывает поскрипывание микросхем памяти? При компиляции (и в короткий промежуток времени после обнаружения дисковода при старте системы) от микросхем памяти исходит странный царапающий звук.
+
+О. Да! Вы, наверное, видели частое упоминание "даемонов" в документации по BSD, но не многие знают, что это настоящие нематериальные существа, которые теперь завладели вашим компьютером. Царапающий звук, издаваемый микросхемами памяти - это на самом деле высокочастотное перешёптывание между даемонами, когда они решают, как лучше справиться с различными задачами по администрированию системы.
+
+Если шум достиг ваших ушей, команда DOS `fdisk /mbr` их спугнёт, но не удивляйтесь, если они отреагируют соответствующим образом и попытаются вас остановить. Фактически, если во время выполнения этой команды вы услышите сатанинский голос Билла Гейтса из встроенного динамика, бегите и даже не оглядывайтесь! Избавленные от противостояния с даемонами BSD, близнецы-демоны DOS и Windows(R) часто могут захватить полный контроль не только над вашей машиной и навлечь вечное проклятие на вашу душу. Теперь, когда вы это знаете, если бы у вас был выбор, думаем, что вы бы предпочли слышать царапающий звук, не так ли?
+
+=== Сколько требуется разработчиков FreeBSD, чтобы сменить электрическую лампочку?
+
+Необходимо иметь ровно одну тысячу сто шестьдесят девять разработчиков:
+
+Двадцать три сообщат в -CURRENT о том, что не горит свет;
+
+Четыре начнут утверждать, что это проблема конфигурации и такие сообщения нужно посылать в -questions;
+
+Трое оформят PR по этому поводу, причём одно их них будет направлено в doc и будет содержать только строчку "здесь темно";
+
+Один закоммитит неоттестированную лампочку, что сломает построение системы, а затем через пять минут вернёт всё назад;
+
+Восемь поругаются с авторами PR по поводу включения патчей в PR;
+
+Пять сообщат о том, что не проходит компиляция системы;
+
+Тридцать один человек ответит, что у них всё работает и наверное, те обновились в неподходящее время;
+
+Один пошлёт патч для новой лампочки в -hackers;
+
+Один пожалуется, что у него имелись патчики ещё три года назад, но когда он послал их в -CURRENT, они были проигнорированы и он имел неудачный опыт работы с системой PR; кроме того предлагаемая лампочка не имеет отражателя.
+
+Тридцать семь начнут кричать, что лампочки не относятся к базовой системе, что коммиттеры не имеют права делать такие вещи без опроса общественности и ЧТО ВООБЩЕ -CORE ДЕЛАЕТ ПО ЭТОМУ ПОВОДУ?
+
+Две сотни напишут о цвете велосипедного навеса;
+
+Трое скажут, что этот патч не соответствует man:style[9]
+
+Семнадцать возразят, что предлагаемая новая лампа подпадает под лицензию GPL;
+
+Пятьсот восемьдесят шесть раздуют флейм по поводу сравнения лицензий GPL, BSD, MIT, NPL и личных мнений о неизвестных основателей FSF;
+
+Семеро пошлют различные части этих обсуждений в -chat и -advocacy;
+
+Один закоммитит предлагаемую лампу, хотя она светит хуже, чем старая;
+
+Двое откатят эти изменения с ужасной руганью в журнале коммитта о том, что лучше FreeBSD будет сидеть в темноте, чем с тусклой лампой.
+
+Сорок шесть громко воспротивятся этому изменению и потребуют объяснений от -core;
+
+Одиннадцать попросят уменьшить размер лампочки, чтобы она подошла к их Тамагочи на случай, если мы когда-нибудь соберёмся переносить FreeBSD на эту платформу;
+
+Семьдесят три заявят о SNR в -hackers и -chat и в знак протеста отпишутся;
+
+Тринадцать пошлют письма "unsubscribe", "How do I unsubscribe?" или "Please remove me from the list" с обычной подписью;
+
+Один закоммитит работающую лампочку в то время, как все будут слишком заняты руганью, чтобы это заметить;
+
+Тридцать один человек напишет, что новая лампочка будет светить на 0.364% ярче, если её откомпилировать с помощью TenDRA (хотя при этом она приобретёт форму куба) и что FreeBSD должна перейти на компилятор TenDRA, а не на GCC;
+
+Один заметит, что у лампочки отсутствует цоколь;
+
+Девять (включая авторов PR) спросят "что такое MFC?";
+
+Спустя две недели после смены лампочки пятьдесят семь человек сообщат о том, что света всё равно нет.
+
+_{nik} добавил:_
+
+_Я сильно смеялся над всем этим._
+
+_И тогда я подумал, "Постойте-ка, найдётся ли кто-нибудь, чтобы задокументировать это?"_
+
+_И на меня снизошло озарение :-)_
+
+_{tabthorpe}_ говорит: "Нет, _настоящие_ хакеры FreeBSD не боятся темноты!"
+
+=== Куда направляются данные, записываемые в /dev/null?
+
+Они отправляются в специальную сточную трубу для данных в CPU, где преобразуются в тепло, выдуваемое через охлаждающие вентиляторы. Вот почему охлаждение ЦП становится все более важным; так как люди используют все более быстрые процессоры, они все менее заботятся о данных, все большее их количество оканчивает свой путь в [.filename]#/dev/null#, перегревая ЦП. Если вы удалите [.filename]#/dev/null# (что соответственно отключит трубу данных в ЦП), то ваш процессор может охладиться, но система начнет переполняться излишними данными и начнет работать с ошибками. Если у вас быстрое сетевое подключение, вы можете охладить CPU, читая данные из [.filename]#/dev/random# и посылая их куда-нибудь; однако вы рискуете перегреть ваше сетевое соединение и [.filename]#/# или разозлить вашего провайдера, так как большинство данных преобразуется в тепло на его оборудовании, но, как правило, у него хорошее охлаждение, так что если вы не перестараетесь, все должно быть в порядке.
+
+_Пол Робинсон (Paul Robinson) добавляет:_
+
+Есть и другие методы. Как знает каждый хороший системный администратор, частью хорошей практики является посылка данных на экран интересным образом, чтобы феи, которые образуют картинку, были счастливы. Экранные феи (часто неправильно называемые "пикселами") различаются по цвету головных уборов, которые они носят (красные, зеленые или синие), и прячутся или появляются (показывая, таким образом, цвет своих шляп), когда получают немного пищи. Видеоадаптеры преобразуют данные в еду для фей, а затем посылают ее феям - чем дороже адаптер, тем лучше еда, тем лучше ведут себя феи. Они также нуждаются в постоянной стимуляции - вот зачем нужны хранители экранов.
+
+Продолжив наше предположение, вы можете просто выдавать случайные данные на консоль, таким образом позволяя феям их потреблять. Это вовсе приводит к прекращению выделения тепла, феи постоянно счастливы, а данные быстро исчезают, даже если на вашем экране все выглядит несколько хаотично.
+
+Как бывший администратор крупного провайдера, который имел много проблем при попытке поддерживать постоянную температуру в серверной комнате, я выступаю против того, чтобы люди посылали ненужные им данные в сеть. Волшебников, которые выполняют коммутацию пакетов и маршрутизацию, это также затрудняет.
+
+== Сложные темы
+
+=== Как можно узнать больше о внутреннем устройстве FreeBSD?
+
+Список относящихся к делу книг можно найти в разделе Руководства link:{handbook}#bibliography-osinternals/[ Библиография по внутреннему устройству операционной системы].
+
+Кроме того, большинство общих знаний о UNIX(R) непосредственно применимо к FreeBSD.
+
+=== Как можно оказать помощь проекту FreeBSD?
+
+Пожалуйста, обратитесь к соответствующей link:{contributing}[статье], в которой вы получите советы относительно того, как это сделать. Ваша помощь более чем приветствуется!
+
+=== Что такое снапшоты и релизы?
+
+В http://svnweb.FreeBSD.org/base/[Хранилище Subversion] сейчас находятся {rel-numbranch} активно/полуактивно развивающихся ветки FreeBSD. (Более ранние ветки изменяются очень редко, именно поэтому в разработке только {rel-numbranch} активные ветки):
+
+* {rel3-releng}, также известная как {rel3-stable}
+* {rel2-releng}, также известная как {rel2-stable}
+* {rel-releng}, также известная как {rel-stable}
+* {rel-head-releng}, также известная как _-CURRENT_ и {rel-head}
+
+`HEAD` - это не настоящий тэг ветки. Это символьная константа для обозначения текущего, не ветвящегося, находящегося в разработке дерева, то есть _-CURRENT_.
+
+На данный момент _-CURRENT_ является находящимся в разработке деревом {rel-head-relx}; ветка {rel-stable}, {rel-releng}, отделилась от _-CURRENT_ {rel-relengdate} года, а ветка {rel2-stable}, {rel2-releng}, отделилась от _-CURRENT_ {rel2-relengdate}.
+
+=== Можно ли работать с -CURRENT при ограниченном доступе в Internet?
+
+Да, это можно делать _без_ скачивания полного дерева исходных текстов с помощью link:{handbook}#ctx[системы CTM].
+
+=== Я написал некоторое добавление к ядру, кому его послать?
+
+Обратитесь к статье о том, как link:{contributing}[помочь проекту FreeBSD], чтобы выяснить, как это сделать.
+
+И спасибо Вам за Ваши усилия!
+
+=== Что делать при аварийном останове системы?
+
+Вот типичная паника ядра:
+
+[.programlisting]
+....
+Fatal trap 12: page fault while in kernel mode
+fault virtual address = 0x40
+fault code = supervisor read, page not present
+instruction pointer = 0x8:0xf014a7e5
+stack pointer = 0x10:0xf4ed6f24
+frame pointer = 0x10:0xf4ed6f28
+code segment = base 0x0, limit 0xfffff, type 0x1b
+ = DPL 0, pres 1, def32 1, gran 1
+processor eflags = interrupt enabled, resume, IOPL = 0
+current process = 80 (mount)
+interrupt mask =
+trap number = 12
+panic: page fault
+....
+
+Этого сообщения не достаточно. Здесь важно значение указателя инструкций, но оно зависит от конфигурации, поскольку значение меняется для каждого конкретного файла ядра. Если это ядро [.filename]#GENERIC# из одного из снэпшотов, то кто-то ещё может отследить функцию, вызвавшую ошибку, но в случае со специально сконфигурированным ядром только вы можете сказать нам, где случилась ошибка.
+
+Чтобы продолжить:
+
+[.procedure]
+====
+. Запишите значение указателя инструкций. Заметьте, что часть `0x8:` в этом случае не важна: нам нужна часть `0xf0xxxxxx`.
+. Когда система перезагрузится, сделайте следующее:
++
+[source,bash]
+....
+% nm -n kernel.that.caused.the.panic | grep f0xxxxxx
+....
++
+где `f0xxxxxx` - это значение указателя инструкций. Однако неприятность заключается в том, что вы не получите точного соответствия, так как в таблице имен ядра для точек входа в функции даны адреса на начало функций, а указатель инструкций будет указывать куда-то внутрь её тела. Если вы не получили точного соответствия, опустите последнюю цифру в значении указателя инструкций и попробуйте снова:
++
+[source,bash]
+....
+% nm -n kernel.that.caused.the.panic | grep f0xxxxx
+....
++
+Если и это не привело ни к каким результатам, отрежьте следующую цифру. Повторяйте, пока не получите хоть что-то. Результатом будет список функций, которые, возможно, привели к аварийному останову. Этот механизм обнаружения ошибочного места довольно неточен, но это всё же лучше, чем ничего.
+====
+
+Тем не менее, лучшим способом выяснить причину, вызвавшую аварийный останов, является получение аварийного дампа системы, а затем использование man:kgdb[1] для получения трассировки вызовов в этом дампе.
+
+В любом случае, метод таков:
+
+[.procedure]
+====
+. Убедитесь в том, что в файле конфигурации ядра имеется следующая строка:
++
+[.programlisting]
+....
+makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols
+....
++
+. Перейдите в каталог [.filename]#/usr/src#:
++
+[source,bash]
+....
+# cd /usr/src
+....
++
+. Скомпилируйте ядро:
++
+[source,bash]
+....
+# make buildkernel KERNCONF=MYKERNEL
+....
++
+. Дождитесь завершения компиляции.
++
+[source,bash]
+....
+# make installkernel KERNCONF=MYKERNEL
+....
++
+. Выполните перезагрузку.
+====
+
+[NOTE]
+====
+Если не указать `KERNCONF`, то будет собрано и установлено ядро [.filename]#GENERIC#.
+====
+
+В процессе выполнения команды man:make[1] будут построены два ядра, [.filename]#/usr/obj/usr/src/sys/MYKERNEL/kernel# и [.filename]#/usr/obj/usr/src/sys/MYKERNEL/kernel.debug#. [.filename]#kernel# будет установлен как [.filename]#/boot/kernel/kernel#, тогда как [.filename]#kernel.debug# может быть использован в качестве источника отладочных символов для man:kgdb[1].
+
+Чтобы получать аварийный дамп, отредактируйте файл [.filename]#/etc/rc.conf# так, чтобы устройство `dumpdev` указывало на раздел подкачки или имело значение `AUTO`. В этом случае скрипты man:rc[8] будут вызывать команду man:dumpon[8] для создания аварийных дампов. Эту команду можно также запускать вручную. После аварийной остановки аварийный дамп может быть получен с помощью программы man:savecore[8] если значение переменной `dumpdev` было установлено в [.filename]#/etc/rc.conf#, скрипты man:rc[8] запустят man:savecore[8] автоматически и поместят аварийный дамп в каталог [.filename]#/var/crash#.
+
+[NOTE]
+====
+Аварийные дампы FreeBSD обычно имеют размер, равный объёму оперативной памяти. Поэтому убедитесь в наличии достаточного места для хранения дампа в каталоге [.filename]#/var/crash#. Либо запустите вручную man:savecore[8], чтобы создать аварийный дамп в другом каталоге, где достаточно места. Размер аварийного дампа можно уменьшить, указав в конфигурации ядра `options MAXMEM=N`, где _N_ - значение в Кбайт для объёма памяти, которое будет использоваться ядром. Например, для 1 Гбайт ОЗУ установите ограничение на использование памяти ядром в 128 Мбайт, так чтобы размер аварийного дампа был равен 128 Мбайт, а не 1 Гбайт.
+====
+
+Как только аварийный дамп получен, трассировку вызовов можно получить таким образом:
+
+[source,bash]
+....
+% kgdb /usr/obj/usr/src/sys/MYKERNEL/kernel.debug /var/crash/vmcore.0
+(kgdb) backtrace
+....
+
+Заметьте, что это может дать несколько экранов полезной информации. Лучше всего использовать man:script[1] для перехвата всего вывода. При использовании необработанного файла ядра со всей отладочной информацией может быть найдена конкретная строка исходного текста ядра, при достижении которой случилась аварийная остановка. Для выяснения последовательности событий, приведших к аварийному останову, трассировка стека обычно читается снизу вверх. Также можно использовать man:kgdb[1] для вывода значений различных переменных или структур, чтобы выяснить состояние системы во время аварии.
+
+[TIP]
+====
+
+Если есть второй компьютер, то можно настроить man:kgdb[1] для удалённой отладки, включая точки останова и пошаговый проход по коду ядра.
+====
+
+[NOTE]
+====
+Если включена поддержка `DDB` и ядро переходит в режим отладки, можно намеренно вызвать аварийный останов и создание аварийного дампа, набрав `panic` в приглашении командной строки `ddb`. Выполнение фазы аварийного останова может снова остановиться с вызовом отладчика. В этом случае наберите `continue`, и процесс будет завершён созданием аварийного дампа.
+====
+
+=== Перестала работать функция dlsym() для исполняемых файлов ELF!
+
+По умолчанию при работе с форматом ELF символы, определённые в исполняемом файле, не доступны динамическому загрузчику. Поэтому при вызове функции `dlsym()`, которая осуществляет поиск по дескриптору, полученному после вызова `dlopen(NULL, flags)`, желаемый результат достигнут не будет.
+
+Чтобы осуществить поиск символов в исполняемом файле процесса с помощью функции `dlsym()`, выполните компоновку исполняемого файла с параметром `--export-dynamic` компоновщика ELF (man:ld[1]).
+
+=== Как я могу увеличить или уменьшить адресное пространство ядра в архитектуре i386?
+
+По умолчанию размер адресного пространства ядра для i386 равен 1 Гбайт (2 Гбайт для PAE). Для работы сервера с интенсивной сетевой нагрузкой или при использовании ZFS этого может быть недостаточно.
+
+Чтобы увеличить доступное пространство, добавьте следующую строку в файл конфигурации ядра и пересоберите ядро:
+
+[.programlisting]
+....
+options KVA_PAGES=N
+....
+
+Чтобы получить нужное значение для _N_, разделите желаемый размер адресного пространства (в мегабайтах) на четыре (для 2 Гбайт это будет `512`).
+
+== Наши благодарности
+
+Этот небольшой скромный документ с ответами на часто задаваемые вопросы создавался, переписывался, редактировался, сокращался, растягивался, уродовался, потрошился, пристально разглядывался, полностью перетряхивался, обдумывался, отвергался, перестраивался, критиковался и снова укреплялся в течение последнего десятилетия силами сотен, если не тысяч, людей. Постоянно.
+
+Мы хотим поблагодарить всех их и приглашаем вас link:{contributing}[присоединиться], чтобы сделать этот FAQ ещё лучше.
+
+[bibliography]
+[[bibliography]]
+== Bibliographie
+
+[biblio-unleashed] FreeBSD Unleashed. Michael Urban und Brian Tiemann. Sams. Erste Ausgabe. 992 Seiten. Oktober 2001. ISBN 0-67232-206-4.
+
+[biblio-44sysman] 4.4BSD System Manager's Manual. Computer Systems Research Group, University of California, Berkeley. O'Reilly and Associates. Erste Ausgabe. Juni 1994. 804 Seiten. ISBN 1-56592-080-5.
+
+[biblio-44userman] 4.4BSD User's Reference Manual. Computer Systems Research Group, University of California, Berkeley. O'Reilly and Associates. Erste Ausgabe. Juni 1994. 905 Seiten. ISBN 1-56592-075-9.
+
+[biblio-44suppman] 4.4BSD User's Supplementary Documents. Computer Systems Research Group, University of California, Berkeley. O'Reilly and Associates. Erste Ausgabe. Juni 1994. 712 Seiten. ISBN 1-56592-076-7.
+
+[biblio-44progman] 4.4BSD Programmer's Reference Manual. Computer Systems Research Group, University of California, Berkeley. O'Reilly and Associates. Erste Ausgabe. Juni 1994. 866 Seiten. ISBN 1-56592-078-3.
+
+[biblio-44progsupp] 4.4BSD Programmer's Supplementary Documents. Computer Systems Research Group, University of California, Berkeley. O'Reilly and Associates. Erste Ausgabe. Juni 1994. 596 Seiten. ISBN 1-56592-079-1.
+
+[biblio-44kernel] The Design and Implementation of the 4.4BSD Operating System. M. K. McKusick, Kirk Marshall, Keith Bostic, Michael J Karels und John Quarterman. Addison-Wesley. Reading MA . 1996. ISBN 0-201-54979-4.
+
+[biblio-freebsdkernel] The Design and Implementation of the FreeBSD Operating System. M. K. McKusick und George V. Neville-Neil. Addison-Wesley. Boston MA . 2004. ISBN 0-201-70245-2.
+
+[biblio-nemeth3rd] Unix System Administration Handbook. Evi Nemeth, Garth Snyder, Scott Seebass, Trent R. Hein und John Quarterman. Prentice-Hall. Dritte Ausgabe. 2000. ISBN 0-13-020601-6.
+
+[lehey3rd] The Complete FreeBSD. Greg Lehey. Walnut Creek. Dritte Ausgabe. Juni 1999. 773 Seiten. ISBN 1-57176-246-9.
+
+[McKusick et al, 1994] Berkeley Software Architecture Manual, 4.4BSD Edition. M. K. McKusick, M. J. Karels, S. J. Leffler, W. N. Joy und R. S. Faber. 5:1-42.
+
+[biblio-ja-fbsdpc98] FreeBSD for PC 98'ers (in Japanisch). SHUWA System Co, LTD.. ISBN 4-87966-468-5 C3055 P2900E.
+
+[biblio-ja-fbsd] FreeBSD (in Japanisch). CUTT. ISBN 4-906391-22-2.
+
+[biblio-ja-compintro] Complete Introduction to FreeBSD (in Japanisch). Shoeisha Co., Ltd. ISBN 4-88135-473-6 P3600E.
+
+[biblio-ja-unixstarterkit] Personal UNIX Starter Kit FreeBSD (in Japanisch). ASCII. ISBN 4-7561-1733-3 P3000E.
+
+[biblio-ja-fbsdhb] FreeBSD Handbook (Japanische Übersetzung). ASCII. ISBN 4-7561-1580-2 P3800E.
+
+[biblio-ge-fbsdmitmeth] FreeBSD mit Methode (in Deutsch). Computer und Literature Verlag/Vertrieb Hanser. 1998. ISBN 3-932311-31-0.
+
+[biblio-ja-fbsdinstandutil] FreeBSD install and Utilization Manual (in Japanisch). Mainichi Communications Inc..
+
+[biblio-indo-intserv] Building Internet Server with FreeBSD (in Indonesisch). Elex Media Komputindo. Onno W Purbo, Dodi Maryanto, Syahrial Hubbany und Widjil Widodo.
+
+[biblio-fbsdcorpnetguide] The FreeBSD Corporate Networker's Guide. Addison-Wesley.
+
+[biblio-unixnutshell] UNIX in a Nutshell. O'Reilly & Associates, Inc.. 1990. ISBN 093717520X.
+
+[biblio-cantfindadmin] What You Need To Know When You Can't Find Your Unix System Administrator. O'Reilly & Associates, Inc.. 1995. Linda Mui. ISBN 1-56592-104-6.
+
+[biblio-ja-fbsdusrrefman] FreeBSD User's Reference Manual (Japanische Übersetzung). Mainichi Communications Inc.. Jpman Project, Japan FreeBSD Users Group. 1998. ISBN 4-8399-0088-4 P3800E.
+
+[biblio-newcomeunix] http://unixhelp.ed.ac.uk/[Online Guide for newcomers to the UNIX environment]“. http://www.ed.ac.uk/[Edinburgh University].
+
+[biblio-dnsandbind] DNS and BIND. O'Reilly & Associates, Inc. ISBN 1-56592-512-2. Paul Albitz Albitz und Cricket Liu. 1998. Dritte Ausgabe.
+
+[biblio-sendmail] Sendmail. O'Reilly & Associates, Inc. 1997. Zweite Auflage. Brian Costales. ISBN 1-56592-222-0.
+
+[biblio-esssysadmin] Essential System Administration. Æleen Frisch. Zweite Auflage. O'Reilly & Associates. 1995. ISBN 1-56592-127-5.
+
+[biblio-tcpipnetworkadministration] TCP/IP Network Administration. Craig Hunt. Zweite Auflage. O'Reilly & Associates, Inc. 1997. ISBN 1-56592-322-7.
+
+[biblio-managingnfsandnis] Managing NFS and NIS. Hal Stern. O'Reilly & Associates, Inc. 1991. ISBN 0-937175-75-7.
+
+[biblio-jpmanprojectjfug] http://www.pc.mycom.co.jp/FreeBSD/sam.html[FreeBSD System Administration's Manual]. http://www.jp.freebsd.org/[Jpman Project, Japan FreeBSD Users Group]. http://www.pc.mycom.co.jp/[Mainichi Communications Inc.]. 1998. ISBN 4-8399-0109-0 P3300E.
+
+[biblio-xwinsystoolkit] X Window System Toolkit. Digital Press. Paul Asente. ISBN 1-55558-051-3.
+
+[biblio-carefman] C: A Reference Manual. Prentice Hall. 1995. Vierte Auflage. Samuel P. Harbison und Guy L. Jr. Steele. ISBN 0-13-326224-3.
+
+[biblio-thecproglang] The C Programming Language. Prentice Hall. 1998. Brian Kernighan und Dennis Ritchie. ISBN 0-13-110362-9.
+
+[biblio-portingunixsoft] Porting UNIX Software. Greg Lehey. O'Reilly & Associates, Inc.. 1995. ISBN 1-56592-126-7.
+
+[biblio-thestandardclibrary] The Standard C Library. Prentice Hall. 1992. P. J. Plauger. ISBN 0-13-131509-9.
+
+[biblio-advprogintheunixenv] Advanced Programming in the UNIX Environment. Addison-Wesley. 1992. W. Richard Stevens. ISBN 0-201-56317-7.
+
+[biblio-unixnetprog] UNIX Network Programming. W. Richard Stevens. Prentice Hall. 1998. Zweite Auflage. ISBN 0-13-490012-X.
+
+[biblio-writeserialdriverforunix] Writing Serial Drivers for UNIX. Bill Wells. Dezember 1994. Dr. Dobb's Journal. pp68-71, pp97-99.
+
+[biblio-unixsysarch] UNIX System Architecture. Prentice-Hall, Inc. 1990. Prabhat K. Andleigh. ISBN 0-13-949843-5.
+
+[biblio-portingunixtothe386] Porting UNIX to the 386. William Jolitz. Dr. Dobb's Journal. Januar 1991 - Juli 1992.
+
+[biblio-tcpipillv1theprotocols] TCP/IP Illustrated, Volume 1: The Protocols. W. Richard Stevens. Addison-Wesley. 1996. ISBN 0-201-63346-9.
+
+[biblio-unixsysformodrnarch] Unix Systems for Modern Architectures. Addison-Wesley. Curt Schimmel. 1994. ISBN 0-201-63338-8.
+
+[biblio-tcpipillvol3] TCP/IP Illustrated, Volume 3: TCP for Transactions, HTTP, NNTP and the UNIX Domain Protocols. Addison-Wesley. 1996. W. Richard Stevens. ISBN 0-201-63495-3.
+
+[biblio-unixinternthenewfrontiers] UNIX Internals -- The New Frontiers. Uresh Vahalia. Prentice Hall. 1996. ISBN 0-13-101908-2.
+
+[biblio-tcpipillvol2theimplementation] TCP/IP Illustrated, Volume 2: The Implementation. Gary R. Wright und W. Richard Stevens. 1995. Addison-Wesley. ISBN 0-201-63354-X.
+
+[biblio-firewallsandinternetsecurity] Firewalls and Internet Security: Repelling the Wily Hacker. William R. CHeswick und Steven M. Bellovin. Addison-Wesley. 1995. ISBN 0-201-63357-4.
+
+[biblio-practicalunixsecurity] Practical UNIX Security. Simson Garfinkel und Gene Spafford. 1996. Zweite Auflage. O'Reilly & Associates, Inc. ISBN 1-56592-148-8.
+
+[biblio-pgpprettygoodprivacy] PGP Pretty Good Privacy. Simson Garfinkel. O'Reilly & Associates, Inc. 1995. ISBN 1-56592-098-8.
+
+[biblio-pentiumprocarch] Pentium Processor System Architecture. Don Anderson und Tom Shanley. Addison-Wesley. 1995. Zweite Auflage. ISBN 0-201-40992-5.
+
+[biblio-progguidetothesvgacards] Programmer's Guide to the EGA, VGA, and Super VGA Cards. Richard F. Ferraro. Dritte Ausgabe. Addison-Wesley. 1995. ISBN 0-201-62490-7.
+
+[biblio-80486] 80486 System Architecture. Tom Shanley. Addison-Wesley. 1995. Dritte Ausgabe. ISBN 0-201-40994-1.
+
+[biblio-isasysarch] ISA System Architecture. Tom Shanley. Addison-Wesley. Dritte Ausgabe. 1995. ISBN 0-201-40996-8.
+
+[biblio-pcisysarch] PCI System Architecture. Tom Shanley. Addison-Wesley. 1995. Dritte Ausgabe. ISBN 0-201-40993-3.
+
+[biblio-theundocumentedpc] The Undocumented PC. Frank Van Gilluwe. Addison-Wesley. 1994. ISBN 0-201-62277-7.
+
+[biblio-bellsystemtechnicaljournal] Bell System Technical Journal, Unix Time-Sharing System. American Telephone & Telegraph Company. Juli - August 1978. Vol 57, No 6, Part 2. ISSN0005-8580.
+
+[biblio-commentaryonunix] Lion's Commentary on UNIX. John Lion. ITP Media Group. 1996. Sechste Ausgabe. ISBN 1573980137.
+
+[biblio-newhackerdict] The New Hacker's Dictionary. Eric S. Raymond. MIT Press. 1996. Dritte Ausgabe. ISBN 0-262-68092-0.
+
+[biblio-aqtrcentofunix] A quarter century of UNIX. Peter H. Salus. Addison-Wesley. 1994. ISBN 0-201-54777-5.
+
+[biblio-unixhatershandbook] The UNIX-HATERS Handbook. Steven Strassman, Daniel Weise und Simon Garfinkel. IDG Books Worldwide, Inc. 1994. ISBN 1-56884-203-1.
+
+[biblio-lifewithunix] Life with UNIX - special edition. Don Libes und Sandy Ressler. Prentice-Hall. 1989. ISBN 0-13-536657-7.
+
+[biblio-bsdfamilytree] https://svnweb.freebsd.org/base/head/shared/misc/bsd-family-tree?view=co[The BSD Family Tree]. 1997.
+
+[absolutebsd] Absolute BSD. Michael Lucas. No Starch Press. Juni 2002. ISBN 1-886411-74-3.
+
+[biblio-ccppusersjournal] The C/C++ Users Journal. R&D Publications Inc.. ISSN 1075-2838.
+
+[biblio-sysadminthejournalforunixsysadmins] Sys Admin - The Journal for UNIX System Administrators. Miller Freeman, Inc. ISSN 1061-2688.
diff --git a/documentation/content/ru/books/faq/chapters-order.adoc b/documentation/content/ru/books/faq/chapters-order.adoc
new file mode 100644
index 0000000000..bb86b134ce
--- /dev/null
+++ b/documentation/content/ru/books/faq/chapters-order.adoc
@@ -0,0 +1 @@
+_index.adoc
diff --git a/documentation/content/ru/books/handbook/_index.adoc b/documentation/content/ru/books/handbook/_index.adoc
new file mode 100644
index 0000000000..aaed2e9cfb
--- /dev/null
+++ b/documentation/content/ru/books/handbook/_index.adoc
@@ -0,0 +1,44 @@
+---
+title: Руководство FreeBSD
+authors:
+ - author: Проект Документации FreeBSD
+copyright: 1995-2020 The FreeBSD Documentation Project
+releaseinfo: "$FreeBSD$"
+trademarks: ["freebsd", "ibm", "ieee", "redhat", "3com", "adobe", "apple", "intel", "linux", "microsoft", "opengroup", "sun", "realnetworks", "oracle", "3ware", "arm", "adaptec", "heidelberger", "intuit", "lsilogic", "themathworks", "thomson", "vmware", "wolframresearch", "xiph", "xfree86", "general"]
+next: books/handbook/preface
+---
+
+= FreeBSD Handbook
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:toc-title: Содержание
+:part-signifier: Часть
+:chapter-signifier: Глава
+:appendix-caption: Приложение
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+
+[.abstract-title]
+Аннотация
+
+Добро пожаловать в FreeBSD! Это Руководство охватывает процесс установки и ежедневного использования _FreeBSD {rel112-current}-RELEASE_ и _FreeBSD {rel120-current}-RELEASE_. Оно находится _в процессе разработки_ и являет собой результат работы множества людей. Многие из разделов до сих пор не существуют, а некоторые из существующих требуют обновления. Если вы заинтересованы в помощи этому проекту, отправьте письмо в {freebsd-doc}. Обновленная версия этого документа постоянно доступна с http://www.FreeBSD.org/ru/index.html[Основного Web сервера FreeBSD]. Он также может быть загружен из интернет в одном из наиболее распространенных форматов с link:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/[FTP сервера Проекта FreeBSD] или с одного из многочисленных <<mirrors-ftp,зеркал>>. Если вы предпочитаете иметь напечатанный (английский) вариант Руководства, то можете приобрести его на http://www.freebsdmall.com/[FreeBSD Mall]. Вы также можете воспользоваться link:https://www.FreeBSD.org/ru/search/[Поиском в Руководстве FreeBSD].
+
+'''
+
+include::content/ru/books/handbook/toc.adoc[]
+
+include::content/ru/books/handbook/toc-figures.adoc[]
+
+include::content/ru/books/handbook/toc-tables.adoc[]
+
+include::content/ru/books/handbook/toc-examples.adoc[]
diff --git a/documentation/content/ru/books/handbook/advanced-networking/_index.adoc b/documentation/content/ru/books/handbook/advanced-networking/_index.adoc
new file mode 100644
index 0000000000..6845057dba
--- /dev/null
+++ b/documentation/content/ru/books/handbook/advanced-networking/_index.adoc
@@ -0,0 +1,2336 @@
+---
+title: Глава 27. Сложные вопросы работы в сети
+part: Часть IV. Сетевые коммуникации
+prev: books/handbook/firewalls
+next: books/handbook/partv
+---
+
+[[advanced-networking]]
+= Сложные вопросы работы в сети
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 27
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../../images/books/handbook/advanced-networking/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/advanced-networking/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/advanced-networking/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[advanced-networking-synopsis]]
+== Краткий обзор
+
+Эта глава охватывает множество различных сетевых тематик повышенной сложности.
+
+После чтения этой главы вы будете знать:
+
+* Основные понятия о маршрутизации и маршрутах.
+* Как настроить IEEE 802.11 и Bluetooth(R).
+* Как заставить FreeBSD работать в качестве сетевого моста.
+* Как настроить загрузку по сети для бездисковой машины.
+* Как настроить трансляцию сетевых адресов.
+* Как соединить два компьютера посредством PLIP.
+* Как настроить IPv6 на машине FreeBSD.
+* Как настроить ATM.
+
+Перед чтением этой главы вы должны:
+
+* Понимать основы работы скриптов [.filename]#/etc/rc#.
+* Свободно владеть основными сетевыми терминами.
+* Знать как настраивать и устанавливать новое ядро FreeBSD (crossref:kernelconfig[kernelconfig, Настройка ядра FreeBSD]).
+* Знать как устанавливать дополнительное программное обеспечение сторонних разработчиков (crossref:ports[ports, Установка приложений. порты и пакеты]).
+
+[[network-routing]]
+== Сетевые шлюзы и маршруты
+
+Чтобы некоторая машина могла найти в сети другую, должен иметься механизм описания того, как добраться от одной машине к другой. Такой механизм называется _маршрутизацией_. "Маршрут" задаётся парой адресов: "адресом назначения" (destination) и "сетевым шлюзом" (gateway). Эта пара указывает на то, что если Вы пытаетесь соединиться с _адресом назначения_, то вам нужно устанавливать связь через "сетевой шлюз". Существует три типа адресов назначения: отдельные хосты, подсети и "маршрут по умолчанию" (default). "Маршрут по умолчанию" (default route) используется, если не подходит ни один из других маршрутов. Мы поговорим немного подробнее о маршрутах по умолчанию позже. Также имеется и три типа сетевых шлюзов: отдельные хосты, интерфейсы (также называемые "подключениями" (links)) и аппаратные адреса Ethernet (MAC-адреса).
+
+=== Пример
+
+Для иллюстрации различных аспектов маршрутизации мы будем использовать следующий пример использования команды `netstat`:
+
+[source,bash]
+....
+% netstat -r
+Routing tables
+
+Destination Gateway Flags Refs Use Netif Expire
+
+default outside-gw UGSc 37 418 ppp0
+localhost localhost UH 0 181 lo0
+test0 0:e0:b5:36:cf:4f UHLW 5 63288 ed0 77
+10.20.30.255 link#1 UHLW 1 2421
+example.com link#1 UC 0 0
+host1 0:e0:a8:37:8:1e UHLW 3 4601 lo0
+host2 0:e0:a8:37:8:1e UHLW 0 5 lo0 =>
+host2.example.com link#1 UC 0 0
+224 link#1 UC 0 0
+....
+
+В первых двух строках задаются маршрут по умолчанию (который будет описан в <<network-routing-default,следующем разделе>>) и маршрут на `localhost`.
+
+Интерфейс (колонка `Netif`), который указан в этой таблице маршрутов для использования с `localhost` и который назван [.filename]#lo0#, имеет также второе название, устройство loopback. Это значит сохранение всего трафика для указанного адреса назначения внутри, без посылки его по сети, так как он все равно будет направлен туда, где был создан.
+
+Следующими выделяющимися адресами являются адреса, начинающиеся с `0:e0:...`. Это аппаратные адреса Ethernet, или MAC-адреса. FreeBSD будет автоматически распознавать любой хост (в нашем примере это `test0`) в локальной сети Ethernet и добавит маршрут для этого хоста, указывающий непосредственно на интерфейс Ethernet, [.filename]#ed0#. С этим типом маршрута также связан параметр таймаута (колонка `Expire`), используемый в случае неудачной попытки услышать этот хост в течении некоторого периода времени. Если такое происходит, то маршрут до этого хоста будет автоматически удалён. Такие хосты поддерживаются при помощи механизма, известного как RIP (Routing Information Protocol), который вычисляет маршруты к хостам локальной сети при помощи определения кратчайшего расстояния.
+
+FreeBSD добавит также все маршруты к подсетям для локальных подсетей (`10.20.30.255` является широковещательным адресом для подсети `10.20.30`, а имя `example.com` является именем домена, связанным с этой подсетью). Назначение `link#1` соответствует первому адаптеру Ethernet в машине. Отметьте отсутствие дополнительного интерфейса для этих строк.
+
+В обеих этих группах (хосты и подсети локальной сети) маршруты конфигурируются автоматически даемоном, который называется routed. Если он не запущен, то будут существовать только статически заданные (то есть введенные явно) маршруты.
+
+Строка `host1` относится к нашему хосту, который известен по адресу Ethernet. Так как мы являемся посылающим хостом, FreeBSD знает, что нужно использовать loopback-интерфейс ([.filename]#lo0#) вместо того, чтобы осуществлять посылку в интерфейс Ethernet.
+
+Две строки `host2` являются примером того, что происходит при использовании алиасов в команде man:ifconfig[8] (обратитесь к разделу об Ethernet для объяснения того, почему мы это делаем). Символ `=>` после интерфейса [.filename]#lo0# указывает на то, что мы используем не просто интерфейс loopback (так как это адрес, обозначающий локальный хост), но к тому же это алиас. Такие маршруты появляются только на хосте, поддерживающем алиасы; для всех остальных хостов в локальной сети для таких маршрутов будут показаны просто строчки `link#1`.
+
+Последняя строчка (подсеть назначения `224`) имеет отношение к многоадресной посылке, которая будет рассмотрена в другом разделе.
+
+И наконец, различные атрибуты каждого маршрута перечисляются в колонке `Flags`. Ниже приводится краткая таблица некоторых из этих флагов и их значений:
+
+[.informaltable]
+[cols="1,1", frame="none"]
+|===
+
+|U
+|Up: Маршрут актуален.
+
+|H
+|Host: Адресом назначения является отдельный хост.
+
+|G
+|Gateway: Посылать все для этого адреса назначения на указанную удаленную систему, которая будет сама определять дальнейший путь прохождения информации.
+
+|S
+|Static: Маршрут был настроен вручную, а не автоматически сгенерирован системой.
+
+|C
+|Clone: Новый маршрут сгенерирован на основе указанного для машин, к которым мы подключены. Такой тип маршрута обычно используется для локальных сетей.
+
+|W
+|WasCloned: Указывает на то, что маршрут был автоматически сконфигурирован на основе маршрута в локальной сети (Clone).
+
+|L
+|Link: Маршрут включает ссылку на аппаратный адрес Ethernet.
+|===
+
+[[network-routing-default]]
+=== Маршруты по умолчанию
+
+Когда локальной системе нужно установить соединение с удаленным хостом, она обращается к таблице маршрутов для того, чтобы определить, существует ли такой маршрут. Если удаленный хост попадает в подсеть, для которой известен способ ее достижения (маршруты типа Cloned), то система определяет возможность подключиться к ней по этому интерфейсу.
+
+Если все известные маршруты не подходят, у системы имеется последняя возможность: маршрут "default". Это маршрут с особым типом сетевого шлюза (обычно единственным, присутствующим в системе), и в поле флагов он всегда помечен как `c`. Для хостов в локальной сети этот сетевой шлюз указывает на машину, имеющую прямое подключение к внешнему миру (неважно, используется ли связь по протоколу PPP, канал DSL, кабельный модем, T1 или какой-то другой сетевой интерфейс).
+
+Если вы настраиваете маршрут по умолчанию на машине, которая сама является сетевым шлюзом во внешний мир, то маршрутом по умолчанию будет являться сетевой шлюз у Вашего провайдера Интернет (ISP).
+
+Давайте взглянем на примеры маршрутов по умолчанию. Вот типичная конфигурация:
+
+image::net-routing.png[]
+
+Хосты `Local1` и `Local2` находятся в нашей сети. `Local1` подключён к ISP через коммутируемое соединение по протоколу PPP. Этот компьютер с сервером PPP подключён посредством локальной сети к другому шлюзовому компьютеру через внешний интерфейс самого ISP к Интернет.
+
+Маршруты по умолчанию для каждой из ваших машин будут следующими:
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Хост
+| Маршрут по умолчанию
+| Интерфейс
+
+|Local2
+|Local1
+|Ethernet
+
+|Local1
+|T1-GW
+|PPP
+|===
+
+Часто задаётся вопрос "Почему (или каким образом) в качестве шлюза по умолчанию для машины `Local1` мы указываем `T1-GW`, а не сервер провайдера, к которому подключаемся?".
+
+Запомните, что из-за использования PPP-интерфейсом адреса в сети провайдера Интернет с вашей стороны соединения, маршруты для всех других машин в локальной сети провайдера будут сгенерированы автоматически. Таким образом, вы уже будете знать, как достичь машины `T1-GW`, так что нет нужды в промежуточной точке при посылке трафика к серверу ISP.
+
+В локальных сетях адрес `X.X.X.1` часто используется в качестве адреса сетевого шлюза. Тогда (при использовании того же самого примера) если пространство адресов класса C вашей локальной сети было задано как `10.20.30`, а ваш провайдер использует `10.9.9`, то маршруты по умолчанию будут такие:
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Хост
+| Маршрут по умолчанию
+
+|Local2 (10.20.30.2)
+|Local1 (10.20.30.1)
+
+|Local1 (10.20.30.1, 10.9.9.30)
+|T1-GW (10.9.9.1)
+|===
+
+Вы можете легко задать используемый по умолчанию маршрутизатор посредством файла [.filename]#/etc/rc.conf#. В нашем примере на машине `Local2` мы добавили такую строку в файл [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+defaultrouter="10.20.30.1"
+....
+
+Это также возможно сделать и непосредственно из командной строки при помощи команды man:route[8]:
+
+[source,bash]
+....
+# route add default 10.20.30.1
+....
+
+Для получения дополнительной информации об управлении таблицами маршрутизации обратитесь к справочной странице по команде man:route[8].
+
+=== Хосты с двойным подключением
+
+Есть еще один тип подключения, который мы должны рассмотреть, и это случай, когда хост находится в двух различных сетях. Технически, любая машина, работающая как сетевой шлюз (в примере выше использовалось PPP-соединение), считается хостом с двойным подключением. Однако этот термин реально используется для описания машины, находящейся в двух локальных сетях.
+
+В одном случае у машины имеется два адаптера Ethernet, каждый имеющий адрес в разделенных подсетях. Как альтернативу можно рассмотреть вариант с одним Ethernet-адаптером и использованием алиасов в команде man:ifconfig[8]. В первом случае используются два физически разделённые сети Ethernet, в последнем имеется один физический сегмент сети, но две логически разделённые подсети.
+
+В любом случае таблицы маршрутизации настраиваются так, что для каждой подсети эта машина определена как шлюз (входной маршрут) в другую подсеть. Такая конфигурация, при которой машина выступает в роли маршрутизатора между двумя подсетями, часто используется, если нужно реализовать систему безопасности на основе фильтрации пакетов или функций брандмауэра в одном или обоих направлениях.
+
+Если вы хотите, чтобы эта машина действительно перемещала пакеты между двумя интерфейсами, то вам нужно указать FreeBSD на включение этой функции. Обратитесь к следующей главе, чтобы узнать, как это сделать.
+
+[[network-dedicated-router]]
+=== Построение маршрутизатора
+
+Сетевой маршрутизатор является обычной системой, которая пересылает пакеты с одного интерфейса на другой. Стандарты Интернет и хорошая инженерная практика не позволяют Проекту FreeBSD включать эту функцию по умолчанию во FreeBSD. Вы можете включить эту возможность, изменив значение следующей переменной в `YES` в файле man:rc.conf[5]:
+
+[.programlisting]
+....
+gateway_enable=YES # Set to YES if this host will be a gateway
+....
+
+Этот параметр изменит значение man:sysctl[8]-переменной `net.inet.ip.forwarding` в `1`. Если вам временно нужно выключить маршрутизацию, вы можете на время сбросить это значение в `0`.
+
+Вашему новому маршрутизатору нужна информация о маршрутах для того, чтобы знать, куда пересылать трафик. Если ваша сеть достаточно проста, то вы можете использовать статические маршруты. С FreeBSD также поставляется стандартный даемон BSD для маршрутизации man:routed[8], который умеет работать с RIP (как версии 1, так и версии 2) и IRDP. Поддержка BGP v4, OSPF v2 и других сложных протоколов маршрутизации имеется в пакете package:net/zebra[]. Также существуют и коммерческие продукты, применяемые как более комплексное решение проблемы маршрутизации в сети, такие как GateD(R).
+
+=== Настройка статических маршрутов
+
+==== Ручная настройка
+
+Предположим, что у нас есть следующая сеть:
+
+image::static-routes.png[]
+
+В этом сценарии, `RouterA` это наш компьютер с FreeBSD, который выступает в качестве маршрутизатора в сеть Интернет. Его маршрут по умолчанию настроен на `10.0.0.1`, что позволяет ему соединяться с внешним миром. Мы будем предполагать, что `RouterB` уже правильно настроен и знает все необходимые маршруты (на этом рисунке все просто; добавьте на `RouterB` маршрут по умолчанию, используя `192.168.1.1` в качестве шлюза).
+
+Если мы посмотрим на таблицу маршрутизации `RouterA`, то увидим примерно следующее:
+
+[source,bash]
+....
+% netstat -nr
+Routing tables
+
+Internet:
+Destination Gateway Flags Refs Use Netif Expire
+default 10.0.0.1 UGS 0 49378 xl0
+127.0.0.1 127.0.0.1 UH 0 6 lo0
+10.0.0/24 link#1 UC 0 0 xl0
+192.168.1/24 link#2 UC 0 0 xl1
+....
+
+С текущей таблицей маршрутизации `RouterA` не сможет достичь внутренней сети 2 (Internal Net 2). Один из способов обхода этой проблемы - добавление маршрута вручную. Следующая команда добавляет внутреннюю сеть 2 к таблице маршрутизации `RouterA` с `192.168.1.2` в качестве следующего узла:
+
+[source,bash]
+....
+# route add -net 192.168.2.0/24 192.168.1.2
+....
+
+Теперь `RouterA` сможет достичь любого хоста в сети `192.168.2.0/24`.
+
+==== Постоянная конфигурация
+
+Предыдущий пример прекрасно подходит для настройки статического маршрута в работающей системе. Однако, проблема заключается в том, что маршрутная информация не сохранится после перезагрузки FreeBSD. Способ сохранения добавленного маршрута заключается в добавлении его в файл [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+# Добавление статического маршрута в Internal Net 2
+static_routes="internalnet2"
+route_internalnet2="-net 192.168.2.0/24 192.168.1.2"
+....
+
+В переменной `static_routes` находятся строки, разделенные пробелами. Каждая строка означает имя маршрута. В примере выше в `static_routes` есть только одна строка, это _internalnet2_. Затем мы добавили переменную `route__internalnet2_`, куда помещены все параметры, которые необходимо передать команде man:route[8]. В примере выше была использована команда:
+
+[source,bash]
+....
+# route add -net 192.168.2.0/24 192.168.1.2
+....
+
+поэтому нам потребуется `"-net 192.168.2.0/24 192.168.1.2"`.
+
+Как было сказано выше, мы можем добавить в `static_routes` более чем одну строку. Это позволит создать несколько статических маршрутов. В следующем примере показано добавление маршрутов для сетей `192.168.0.0/24` и `192.168.1.0/24` (этот маршрутизатор не показан на рисунке выше:
+
+[.programlisting]
+....
+static_routes="net1 net2"
+route_net1="-net 192.168.0.0/24 192.168.0.1"
+route_net2="-net 192.168.1.0/24 192.168.1.1"
+....
+
+=== Распространение маршрутов
+
+Мы уже говорили о том, как мы задаем наши маршруты во внешний мир, но не упоминали о том, как внешний мир находит нас.
+
+Мы уже знаем, что таблицы маршрутизации могут быть настроены так, что весь трафик для некоторого диапазона адресов (в нашем примере это подсеть класса C) может быть направлен заданному хосту в той сети, которая будет перенаправлять входящие пакеты дальше.
+
+При получении адресного пространства, выделенного Вашей сети, Ваш провайдер настроит свои таблицы маршрутизации так, что весь трафик для Вашей подсети будет пересылаться по PPP-соединению к Вашей сети. Но как серверы по всей стране узнают, что Ваш трафик нужно посылать Вашему ISP?
+
+Существует система (подобная распределению информации DNS), которая отслеживает все назначенные пространства адресов и определяет точку подключения к магистрали Интернет. "Магистралью" называют главные каналы, по которым идет трафик Интернет внутри страны и по всему миру. Каждая магистральная машина имеет копию основного набора таблиц, согласно которой трафик для конкретной сети направляется по конкретному магистральному каналу, и затем, передаваясь по цепочке провайдеров, он достигает вашей сети.
+
+Задачей вашего провайдера является объявить на магистрали о том, что он отвечает за подключение (и поэтому на него указывает маршрут) вашей сети. Этот процесс называется распространением маршрута.
+
+=== Устранение неполадок
+
+Иногда с распространением маршрута возникают проблемы, и некоторые сайты не могут к вам подключиться. Наверное, самой полезной командой для определения точки неверной работы маршрутизации является man:traceroute[8]. Она также полезна и когда вы сами не можете подключиться к удаленной машине (то есть команда man:ping[8] не срабатывает).
+
+Команда man:traceroute[8] запускается с именем удаленного хоста, с которым вы хотите установить соединение, в качестве параметра. Она показывает промежуточные сетевые шлюзы по пути следования, в конце концов достигая адрес назначения или прерывая свою работу из-за отсутствия соединения.
+
+За дополнительной информацией обратитесь к странице Справочника по man:traceroute[8].
+
+=== Маршрутизация многоадресного трафика
+
+FreeBSD изначально поддерживает как приложения, работающие с многоадресным трафиком, так и его маршрутизацию. Такие приложения не требуют особой настройки FreeBSD; обычно они работают сразу. Для маршрутизации многоадресного трафика требуется, чтобы поддержка этого была включена в ядро:
+
+[.programlisting]
+....
+options MROUTING
+....
+
+Кроме того, даемон многоадресной маршрутизации, man:mrouted[8], должен быть настроен посредством файла [.filename]#/etc/mrouted.conf# на использование туннелей и DVMRP. Дополнительную информацию о настройки многоадресного трафика можно найти на страницах справочной системы, посвящённых даемону man:mrouted[8].
+
+[[network-wireless]]
+== Беспроводные сети
+
+=== Введение
+
+Было бы весьма полезным иметь возможность использовать компьютер без хлопот, связанных с постоянно подключенным сетевым кабелем. FreeBSD может использоваться как клиент беспроводной сети, и даже в качестве "точки доступа" к ней.
+
+=== Режимы работы беспроводной связи
+
+Существуют два варианта конфигурации устройств беспроводного доступа 802.11: BSS и IBSS.
+
+==== Режим BSS
+
+Режим BSS является наиболее часто используемым. Режим BSS также называют режимом инфраструктуры. В этом режиме несколько точек доступа беспроводной сети подключаются к проводной сети передачи данных. Каждое беспроводная сеть имеет собственное имя. Это имя является идентификатором SSID сети.
+
+Клиенты беспроводной сети подключаются к этим точкам доступа беспроводной сети. Стандарт IEEE 802.11 определяет протокол, используемый для связи в беспроводных сетях. Клиент сети беспроводного доступа может подключаться к некоторой сети, если задан её SSID. Клиент может также подключаться к любой сети, если SSID не задан.
+
+==== Режим IBSS
+
+Режим IBSS, также называемый ad-hoc, предназначен для соединений точка-точка. На самом деле существуют два типа режима ad-hoc. Один из них является режимом IBSS, называемый также режимом ad-hoc или IEEE ad-hoc. Этот режим определён стандартами IEEE 802.11. Второй режим называется демонстрационным режимом ad-hoc, или Lucent ad-hoc (или, иногда неправильно, режимом ad-hoc). Это старый, существовавший до появления 802.11, режим ad-hoc, и он должен использоваться только для старых сетей. В дальнейшем мы не будем рассматривать ни один из режимов ad-hoc.
+
+=== Режим инфраструктуры
+
+==== Точки доступа
+
+Точки доступа представляют собой беспроводные сетевые устройства, позволяющие одному или большему количеству клиентов беспроводной сети использовать эти устройства в качестве центрального сетевого концентратора. При использовании точки доступа все клиенты работают через неё. Зачастую используются несколько точек доступа для полного покрытия беспроводной сетью некоторой зоны, такой, как дом, офис или парк.
+
+Точки доступа обычно имеют несколько подключений к сети: адаптер беспроводной связи и один или большее количество сетевых ethernet-адаптеров для подключения к остальной части сети.
+
+Точки доступа могут быть либо приобретены уже настроенными, либо вы можете создать собственную при помощи FreeBSD и поддерживаемого адаптера беспроводной связи. Несколько производителей выпускают точки беспроводного доступа и адаптеры беспроводной связи с различными возможностями.
+
+==== Построение точки доступа с FreeBSD
+
+===== Требования
+
+Для того, чтобы создать беспроводную точку доступа на FreeBSD, вам нужно иметь совместимый адаптер беспроводной связи. На данный момент поддерживаются адаптеры только на основе набора микросхем Prism. Вам также потребуется поддерживаемый FreeBSD адаптер проводной сети (найти такой будет нетрудно, FreeBSD поддерживает множество различных устройств). В этом руководстве мы будем полагать, что вы будете строить сетевой мост (man:bridge[4]) для пропуска всего трафика между устройством беспроводной связи и сетью, подключенной к обычному Ethernet-адаптеру.
+
+Функциональность hostap, которая используется FreeBSD для организации точки доступа, работает лучше всего с некоторыми версиями микрокода. Адаптеры Prism 2 должны использовать микрокод версии 1.3.4 или более новый. Адаптеры Prism 2.5 и Prism 3 должны использовать микрокод версии 1.4.9. Более старые версии микрокода могут работать нормально, а могут и некорректно. В настоящее время единственным способом обновления адаптеров является использование утилит обновления для Windows(R), которые можно получить у производителя ваших адаптеров.
+
+===== Настройка
+
+Первым делом убедитесь, что ваша система распознаёт адаптер беспроводной связи:
+
+[source,bash]
+....
+# ifconfig -a
+wi0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
+ inet6 fe80::202:2dff:fe2d:c938%wi0 prefixlen 64 scopeid 0x7
+ inet 0.0.0.0 netmask 0xff000000 broadcast 255.255.255.255
+ ether 00:09:2d:2d:c9:50
+ media: IEEE 802.11 Wireless Ethernet autoselect (DS/2Mbps)
+ status: no carrier
+ ssid ""
+ stationname "FreeBSD Wireless node"
+ channel 10 authmode OPEN powersavemode OFF powersavesleep 100
+ wepmode OFF weptxkey 1
+....
+
+На данном этапе не беспокойтесь о деталях, просто убедитесь, что выдаётся нечто, указывающее на установленный адаптер беспроводной связи. Если при этом у вас есть проблемы с недоступностью интерфейса беспроводной связи, и вы используете PC Card, то обратитесь к страницам справочной системы, описывающим man:pccardc[8] и man:pccardd[8] для получения более полной информации.
+
+Теперь вам нужно загрузить модуль для подготовки той части FreeBSD, что отвечает за организацию сетевых мостов, для работы с точкой доступа. Для загрузки модуля man:bridge[4] просто выполните следующую команду:
+
+[source,bash]
+....
+# kldload bridge
+....
+
+При загрузке модуля никаких сообщений об ошибках быть не должно. Если это всё же произошло, вам может потребоваться вкомпилировать код для модуля man:bridge[4] в ядро. В этом вам должен помочь раздел этого Руководства об <<network-bridging,организации сетевых мостов>>.
+
+Теперь, когда вы завершили с той частью, что касается организации сетевого моста, нам нужно указать ядру FreeBSD, какие интерфейсы должны объединяться в сетевом мосте. Это мы делаем при помощи man:sysctl[8]:
+
+[source,bash]
+....
+# sysctl net.link.ether.bridge.enable=1
+# sysctl net.link.ether.bridge.config="wi0 xl0"
+# sysctl net.inet.ip.forwarding=1
+....
+
+В версиях FreeBSD, предшествующих 5.2, вместо указанных нужно использовать следующие параметры:
+
+[source,bash]
+....
+# sysctl net.link.ether.bridge=1
+# sysctl net.link.ether.bridge_cfg="wi0,xl0"
+# sysctl net.inet.ip.forwarding=1
+....
+
+Теперь необходимо настроить адаптер беспроводной сети. Следующая команда заставит адаптер работать в режиме точки доступа:
+
+[source,bash]
+....
+# ifconfig wi0 ssid my_net channel 11 media DS/11Mbps mediaopt hostap up stationname "FreeBSD AP"
+
+....
+
+Строчка man:ifconfig[8] активизирует интерфейс [.filename]#wi0#, конфигурирует его SSID как _my_net_, а имя станции как _FreeBSD AP_. `media DS/11Mbps` переводит адаптер в режим 11Mbps и нужен только для того, чтобы сработал параметр `mediaopt`. Параметр `mediaopt hostap` переводит интерфейс в режим точки доступа. Параметр `channel 11` задаёт использование канала 802.11b. Страница справки по команде man:wicontrol[8] перечисляет корректные значения каналов для ваших нужд.
+
+Теперь у вас должна получиться полнофункциональная работающая точка доступа. Настоятельно советуем прочесть страницы справочной по man:wicontrol[8], man:ifconfig[8], и man:wi[4] для получения дополнительной информации.
+
+Также полагаем, что вы прочтёте следующий раздел о шифровании.
+
+===== Информация о состоянии
+
+После того, как точка доступа сконфигурирована и начала свою работу, операторам может понадобиться видеть клиентов, связанных с этой точкой. В любой момент оператор может набрать:
+
+[source,bash]
+....
+# wicontrol -l
+1 station:
+00:09:b7:7b:9d:16 asid=04c0, flags=3<ASSOC,AUTH>, caps=1<ESS>, rates=f<1M,2M,5.5M,11M>, sig=38/15
+....
+
+Это показывает, что имеется одна связанная станция с перечисленными характеристиками. Выдаваемое значение сигнала должно использоваться только как сравнительный индикатор его силы. Его перевод в dBm или другие единицы измерения различаются в разных версиях микрокода.
+
+==== Клиенты
+
+Клиент в беспроводной сети представляет собой систему, которая обращается к точке доступа или непосредственно к другому клиенту.
+
+Как правило, клиенты беспроводной сети имеют только один сетевой адаптер, а именно адаптер беспроводной сети.
+
+Существует несколько различных способов конфигурации клиента беспроводной сети. Они основаны на различных режимах работы в беспроводной сети, обычно BSS (режим инфраструктуры, который требует точки доступа) или IBSS (ad-hoc или режим одноранговой сети). В нашем примере мы будем использовать самый популярный их них, режим BSS, для связи с точкой доступа.
+
+===== Требования
+
+Существует только одно жёсткое условие для настройки FreeBSD в качестве клиента беспроводной сети. Вам нужен адаптер беспроводной связи, поддерживаемый FreeBSD.
+
+===== Конфигурация FreeBSD как клиента беспроводной сети
+
+Перед тем, как подключиться к беспроводной сети, вам нужно будет узнать о ней несколько вещей. В этом примере мы подключаемся к сети, которая называется _my_net_, и шифрование в ней отключено.
+
+[NOTE]
+====
+В этом примере мы не используем шифрование, но это небезопасно. В следующем разделе вы узнаете, как её включить, почему это так важно, и почему некоторые технологии шифрования всё же не могут полностью обеспечить вашу информационную безопасность.
+====
+
+Удостоверьтесь, что ваш адаптер распознаётся во FreeBSD:
+
+[source,bash]
+....
+# ifconfig -a
+wi0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
+ inet6 fe80::202:2dff:fe2d:c938%wi0 prefixlen 64 scopeid 0x7
+ inet 0.0.0.0 netmask 0xff000000 broadcast 255.255.255.255
+ ether 00:09:2d:2d:c9:50
+ media: IEEE 802.11 Wireless Ethernet autoselect (DS/2Mbps)
+ status: no carrier
+ ssid ""
+ stationname "FreeBSD Wireless node"
+ channel 10 authmode OPEN powersavemode OFF powersavesleep 100
+ wepmode OFF weptxkey 1
+....
+
+Теперь мы можем изменить настройки адаптера на те, что соответствуют нашей сети:
+
+[source,bash]
+....
+# ifconfig wi0 inet 192.168.0.20 netmask 255.255.255.0 ssid my_net
+....
+
+Замените `192.168.0.20` и `255.255.255.0` на правильные IP-адрес и сетевую маску в вашей проводной сети. Запомните, что наша точка доступа выступает в роли моста для данных между беспроводной и проводной сетями, так что они будут доступны для других устройств, находящихся в сети, как будто они тоже находятся в проводной сети.
+
+Как только вы это выполнили, то сможете получить ping от хостов в проводной сети, как будто вы подключены посредством обычных проводов.
+
+Если вы столкнулись с проблемами при работе в беспроводной сети, удостоверьтесь, что вы ассоциированы (подключены) с точкой доступа:
+
+[source,bash]
+....
+# ifconfig wi0
+....
+
+должна выдать некоторую информацию, и вы должны увидеть:
+
+[source,bash]
+....
+status: associated
+....
+
+Если статус не будет соответствовать `associated`, это может значить, что вы оказались вне зоны досягаемости точки доступа, включили шифрование или, возможно, имеются проблемы с конфигурацией.
+
+==== Шифрование
+
+Шифрование в беспроводной сети имеет важное значение, потому что у вас нет больше возможности ограничить сеть хорошо защищённой областью. Данные вашей беспроводной сети вещаются по всей окрестности, так что любой заинтересовавшийся может их считать. Вот здесь используется шифрование. Шифруя данные, посылаемые в эфир, вы делаете их прямой перехват гораздо более сложным для всех любопытных.
+
+Двумя наиболее широко применяемыми способами шифрования данных между вашим клиентом и точкой доступа являются WEP и man:ipsec[4].
+
+===== WEP
+
+WEP является сокращением от Wired Equivalency Protocol (Протокол Соответствия Проводной сети). WEP является попыткой сделать беспроводные сети такими же надёжными и безопасными, как проводные. К сожалению, он был взломан и сравнительно легко поддаётся вскрытию. Это означает также, что он не тот протокол, на который следует опираться, когда речь идёт о шифровании критически важных данных.
+
+Он лучше, чем ничего, так что используйте следующую команду для включения WEP в вашей новой точке доступа FreeBSD:
+
+[source,bash]
+....
+# ifconfig wi0 inet up ssid my_net wepmode on wepkey 0x1234567890 media DS/11Mbps mediaopt hostap
+....
+
+Вы можете включить WEP на клиенте следующей командой:
+
+[source,bash]
+....
+# ifconfig wi0 inet 192.168.0.20 netmask 255.255.255.0 ssid my_net wepmode on wepkey 0x1234567890
+....
+
+Отметьте, что вы должны заменить _0x1234567890_ на более уникальный ключ.
+
+===== IPsec
+
+man:ipsec[4] является гораздо более надёжным и мощным средством шифрования данных в сети. Этот метод определённо является предпочтительным для шифрования данных в беспроводной сети. Более детально ознакомиться с безопасностью и применением man:ipsec[4] вы можете в разделе об crossref:security[ipsec,IPsec] этого Руководства.
+
+==== Утилиты
+
+Имеется несколько утилит, которые можно использовать для настройки и отладки вашей беспроводной сети, и здесь мы попытаемся описать некоторые из них и что они могут делать.
+
+===== Пакет bsd-airtools
+
+Пакет bsd-airtools представляет собой полный набор инструментов, включая инструменты для проверки беспроводной сети на предмет взлома WEP-ключа, обнаружения точки доступа и тому подобное.
+
+Утилиты bsd-airtools можно установить из порта package:net-mgmt/bsd-airtools[]. Информацию об установке портов можно найти в Главе crossref:ports[ports, Установка приложений. порты и пакеты] этого Руководства.
+
+Программа `dstumbler` является инструментом, предназначенным для обнаружения точки доступа и выдачи отношения уровня сигнала к шуму. Если у вас с трудом получается запустить точку доступа, `dstumbler` может помочь вам начать.
+
+Для тестирования информационной безопасности вашей беспроводной сети, вы можете воспользоваться набором "dweputils" (`dwepcrack`, `dwepdump` и `dwepkeygen`), который может помочь понять, является ли WEP подходящим решением для обеспечения ваших потребностей в информационной безопасности.
+
+===== Утилиты `wicontrol`, `ancontrol` и `raycontrol`
+
+Это инструменты, которые могут быть использованы для управления поведением адаптера беспроводной связи в сети. В примере выше мы выбирали man:wicontrol[8], так как нашим адаптером беспроводной сети был интерфейс [.filename]#wi0#. Если у вас установлено устройство беспроводного доступа от Cisco, этим интерфейсом будет [.filename]#an0#, и тогда вы будете использовать man:ancontrol[8].
+
+===== Команда `ifconfig`
+
+Команда man:ifconfig[8] может использоваться для установки многих из тех параметров, что задаёт man:wicontrol[8], однако работа с некоторыми параметрами в ней отсутствует. Обратитесь к man:ifconfig[8] для выяснения параметров и опций командной строки.
+
+==== Поддерживаемые адаптеры
+
+===== Точки доступа
+
+Единственными адаптерами, которые на данный момент поддерживаются в режиме BSS (как точка доступа), являются те устройства, что сделаны на основе набора микросхем Prism 2, 2.5 или 3). Полный список можно увидеть в man:wi[4].
+
+===== Клиенты 802.11b
+
+Практически все адаптеры беспроводной связи 802.11b на данный момент во FreeBSD поддерживаются. Большинство адаптеров, построенных на основе Prism, Spectrum24, Hermes, Aironet и Raylink, будут работать в качестве адаптера беспроводной сети в режиме IBSS (ad-hoc, одноранговая сеть и BSS).
+
+===== Клиенты 802.11a и 802.11g
+
+Драйвер устройства man:ath[4] поддерживает 802.11a и 802.11g. Если ваша карта основана на чипсете Atheros, вы можете использовать этот драйвер.
+
+К сожалению, все еще много производителей, не предоставляющих схематику своих драйверов сообществу open source, поскольку эта информация считается торговым секретом. Следовательно, у разработчиков FreeBSD и других операционных систем остается два варианта: разработать драйверы долгим и сложным методом обратного инжиниринга, или использовать существующие драйверы для платформ Microsoft(R) Windows(R). Большинство разработчиков FreeBSD выбрали второй способ.
+
+Благодаря усилиям Билла Пола (wpaul), начиная с FreeBSD 5.3-RELEASE существует "прозрачная" поддержка Network Driver Interface Specification (NDIS). FreeBSD NDISulator (известный также как Project Evil) преобразует бинарный драйвер Windows(R) так, что он работает так же как и в Windows(R). Эта возможность всё ещё относительно нова, но в большинстве тестов она работает адекватно.
+
+Для использования NDISulator потребуются три вещи:
+
+. Исходные тексты ядра
+. Бинарный драйвер Windows(R) XP (расширение [.filename]#.SYS#)
+. Файл конфигурации бинарного драйвера Windows(R) XP (расширение [.filename]#.INF#)
+
+Вам может потребоваться компиляция драйвера оболочки мини порта man:ndis[4]. Под `root`:
+
+[source,bash]
+....
+# cd /usr/src/sys/modules/ndis
+# make && make install
+....
+
+Определите местоположение файлов для вашей карты. Обычно их можно найти на входящем в комплект CD или на Web-сайте поставщика. В нашем примере используются файлы [.filename]#W32DRIVER.SYS# и [.filename]#W32DRIVER.INF#.
+
+Следующий шаг это компиляция бинарного драйвера в загружаемый модуль ядра. Чтобы сделать это, сначала зайдите в каталог модуля [.filename]#if_ndis# и с правами `root` скопируйте туда драйверы Windows(R):
+
+[source,bash]
+....
+# cd /usr/src/sys/modules/if_ndis
+# cp /path/to/driver/W32DRIVER.SYS ./
+# cp /path/to/driver/W32DRIVER.INF ./
+....
+
+Теперь используйте утилиту `ndiscvt` для создания заголовка определения драйвера [.filename]#ndis_driver_data.h# перед сборкой модуля:
+
+[source,bash]
+....
+# ndiscvt -i W32DRIVER.INF -s W32DRIVER.SYS -o ndis_driver_data.h
+....
+
+Параметры `-i` и `-s` задают соответственно файл настройки и бинарный файл. Мы используем параметр `-o ndis_driver_data.h`, поскольку [.filename]#Makefile# при создании модуля будет обращаться именно к этому файлу.
+
+[NOTE]
+====
+Некоторым драйверам Windows(R) для работы требуются дополнительные файлы. Вы можете включить их параметром `ndiscvt -f`. Обратитесь к странице справочной системы man:ndiscvt[8] за дополнительной информацией.
+====
+
+Наконец, соберите и установите модуль драйвера:
+
+[source,bash]
+....
+# make && make install
+....
+
+Для использования драйвера необходимо загрузить соответствующие модули:
+
+[source,bash]
+....
+# kldload ndis
+# kldload if_ndis
+....
+
+Первая команда загружает оболочку драйвера мини-порта NDIS, вторая загружает собственно сетевой интерфейс. Проверьте man:dmesg[8] на предмет ошибок загрузки. Если все прошло хорошо, вывод должен быть примерно таким:
+
+[source,bash]
+....
+ndis0: <Wireless-G PCI Adapter> mem 0xf4100000-0xf4101fff irq 3 at device 8.0 on pci1
+ndis0: NDIS API version: 5.0
+ndis0: Ethernet address: 0a:b1:2c:d3:4e:f5
+ndis0: 11b rates: 1Mbps 2Mbps 5.5Mbps 11Mbps
+ndis0: 11g rates: 6Mbps 9Mbps 12Mbps 18Mbps 36Mbps 48Mbps 54Mbps
+....
+
+Начиная с этого момента вы можете использовать устройство [.filename]#ndis0# как любое другое беспроводное устройство (например, [.filename]#wi0#); в этой ситуации применима информация, приведенная в начале этой главы.
+
+[[network-bluetooth]]
+== Bluetooth
+
+=== Введение
+
+Bluetooth является беспроводной технологией для создания персональных сетей на расстоянии не более 10 метров, работающей на частоте 2.4 ГГц, которая не подлежит лицензированию. Обычно такие сети формируются из портативных устройств, таких, как сотовые телефоны, КПК и лэптопы. В отличие от Wi-Fi, другой популярной беспроводной технологии, Bluetooth предоставляет более высокий уровень сервиса, например, файловые серверы типа FTP, передачу файлов, голоса, эмуляцию последовательного порта и другие.
+
+Стек протоколов Bluetooth во FreeBSD реализован на основе технологии Netgraph (обратитесь к man:netgraph[4]). Широкий спектр USB-устройств Bluetooth поддерживается драйвером man:ng_ubt[4]. Устройства Bluetooth на основе набора микросхем Broadcom BCM2033 поддерживается драйвером man:ng_bt3c[4]. Устройства Bluetooth, работающие через последовательные и UART-порты, поддерживаются драйверами man:sio[4], man:ng_h4[4] и man:hcseriald[8]. В этом разделе описывается использование Bluetooth-устройств, подключаемых через USB.
+
+=== Подключение устройства
+
+По умолчанию драйверы устройств Bluetooth поставляются в виде модулей ядра. Перед подключением устройства вам необходимо подгрузить драйвер в ядро:
+
+[source,bash]
+....
+# kldload ng_ubt
+....
+
+Если Bluetooth-устройство в момент запуска системы подключено, то загружайте модуль из файла [.filename]#/boot/loader.conf#:
+
+[.programlisting]
+....
+ng_ubt_load="YES"
+....
+
+Подключите ваше USB-устройство. На консоли (или в журнале syslog) появится примерно такое сообщение:
+
+[source,bash]
+....
+ubt0: vendor 0x0a12 product 0x0001, rev 1.10/5.25, addr 2
+ubt0: Interface 0 endpoints: interrupt=0x81, bulk-in=0x82, bulk-out=0x2
+ubt0: Interface 1 (alt.config 5) endpoints: isoc-in=0x83, isoc-out=0x3,
+ wMaxPacketSize=49, nframes=6, buffer size=294
+....
+
+[NOTE]
+====
+Стек протоколов Bluetooth запускается вручную во FreeBSD 6.0, и во FreeBSD 5.X, перед 5.5. Это делается автоматически через man:devd[8] во FreeBSD 5.5, 6.1 и в более новых версиях.
+
+Скопируйте файл [.filename]#/usr/shared/examples/netgraph/bluetooth/rc.bluetooth# в какое-нибудь подходящее место, например, в файл [.filename]#/etc/rc.bluetooth#. Этот скрипт используется для запуска и остановки работы Bluetooth-стека. Перед отключением устройства рекомендуется остановить его работы, хотя (обычно) это не фатально. При запуске стека вы получите сообщения, подобные следующим:
+
+[source,bash]
+....
+# /etc/rc.bluetooth start ubt0
+BD_ADDR: 00:02:72:00:d4:1a
+Features: 0xff 0xff 0xf 00 00 00 00 00
+<3-Slot> <5-Slot> <Encryption> <Slot offset>
+<Timing accuracy> <Switch> <Hold mode> <Sniff mode>
+<Park mode> <RSSI> <Channel quality> <SCO link>
+<HV2 packets> <HV3 packets> <u-law log> <A-law log> <CVSD>
+<Paging scheme> <Power control> <Transparent SCO data>
+Max. ACL packet size: 192 bytes
+Number of ACL packets: 8
+Max. SCO packet size: 64 bytes
+Number of SCO packets: 8
+....
+
+====
+
+=== Host Controller Interface (HCI)
+
+Host Controller Interface (HCI) предоставляет интерфейс для управления контроллером передатчика и менеджером соединений, а также доступ к данным о состоянии оборудования и его управляющим регистрам. Этот интерфейс предоставляет унифицированный метод доступа к передающим возможностям Bluetooth. Уровень HCI на управляющей машине обменивается данными и командами с микрокодом HCI в оборудовании Bluetooth. Драйвер для Host Controller Transport Layer (то есть физической шины) предоставляет обоим слоям HCI возможность обмениваться данными друг с другом.
+
+Для одного Bluetooth-устройства создаётся один узел Netgraph типа _hci_. HCI-узел обычно подключается к узлу драйвера устройства Bluetooth (входящий поток) и к узлу L2CAP (исходящий поток). Все операции с HCI должны выполняться на узле HCI, но не на узле драйвера устройства. В качестве имени по умолчанию для узла HCI используется "devicehci". Дополнительные подробности можно найти на справочной странице man:ng_hci[4].
+
+Одной из самой часто выполняемой задач является обнаружение Bluetooth-устройств в радиусе RF-доступности. Эта операция называется _опросом_ (inquiry). Опрос и другие операции, связанные с HCI, выполняются при помощи утилиты man:hccontrol[8]. Пример ниже показывает, как найти доступные устройства Bluetooth. Список таких устройств должен быть получен в течение нескольких секунд. Заметьте, что удалённые устройства будут отвечать на опрос, если только они находятся в режиме _обнаруживаемости_ (discoverable).
+
+[source,bash]
+....
+% hccontrol -n ubt0hci inquiry
+Inquiry result, num_responses=1
+Inquiry result #0
+ BD_ADDR: 00:80:37:29:19:a4
+ Page Scan Rep. Mode: 0x1
+ Page Scan Period Mode: 00
+ Page Scan Mode: 00
+ Class: 52:02:04
+ Clock offset: 0x78ef
+Inquiry complete. Status: No error [00]
+....
+
+`BD_ADDR` является уникальным адресом устройства Bluetooth, вроде MAC-адресов сетевых адаптеров. Этот адрес необходим для дальнейшей работы с устройством. Адресу BD_ADDR можно присвоить удобное для чтения имя. Файл [.filename]#/etc/bluetooth/hosts# содержит информацию об известных хостах Bluetooth. В следующем примере показано, как получить имя, назначенное удалённому устройству:
+
+[source,bash]
+....
+% hccontrol -n ubt0hci remote_name_request 00:80:37:29:19:a4
+BD_ADDR: 00:80:37:29:19:a4
+Name: Pav's T39
+....
+
+Если вы выполните опрос на другом Bluetooth-устройстве, но ваш компьютер будет опознан как "your.host.name (ubt0)". Имя, назначаемое локальному устройству, может быть в любой момент изменено.
+
+Система Bluetooth предоставляет услуги по соединениям типа точка-точка (при этом задействованы только два устройства Bluetooth) или точка-ко-многим-точкам. В последнем случае соединение используется совместно несколькими устройствам Bluetooth. В следующем примере показывается, как получить список активных для локального устройства соединений:
+
+[source,bash]
+....
+% hccontrol -n ubt0hci read_connection_list
+Remote BD_ADDR Handle Type Mode Role Encrypt Pending Queue State
+00:80:37:29:19:a4 41 ACL 0 MAST NONE 0 0 OPEN
+....
+
+Идентификатор соединения (_connection handle_) полезен, когда необходимо прекратить соединение. Заметьте, что обычно нет нужды делать это вручную. Стек будет автоматически разрывать неактивные соединения.
+
+[source,bash]
+....
+# hccontrol -n ubt0hci disconnect 41
+Connection handle: 41
+Reason: Connection terminated by local host [0x16]
+....
+
+Обратитесь к помощи посредством `hccontrol help` для получения полного списка доступных HCI-команд. Большинство команд HCI для выполнения не требуют прав администратора системы.
+
+=== Logical Link Control and Adaptation Protocol (L2CAP)
+
+Протокол L2CAP (Logical Link Control and Adaptation Protocol) предоставляет услуги по работе с данными, как ориентированные на соединения, так и без ориентации на них, протоколам более высокого уровня с возможностями мультиплексирования и обеспечением операций по сегментации и обратной сборке. L2CAP позволяет протоколам более высокого уровня и приложениям передавать и получать пакеты данных L2CAP длиной до 64 Кбайт.
+
+L2CAP основан на концепции _каналов_. Каналом является логическое соединение поверх соединения по радиоканалу. Каждый канал привязан к некоторому протоколу по принципу многие-к-одному. Несколько каналов могут быть привязаны к одному и тому же протоколу, но канал не может быть привязан к нескольким протоколам. Каждый пакет L2CAP, получаемый каналом, перенаправляется к соответствующему протоколу более высокого уровня. Несколько каналов могут совместно использовать одно и то же радиосоединение.
+
+Для одного Bluetooth-устройства создается один узел Netgraph типа _l2cap_. Узел L2CAP обычно подключается к узлу Bluetooth HCI (нижестоящий) и узлам Bluetooth-сокетов (вышестоящие). По умолчанию для узла L2CAP используется имя "devicel2cap". Для получения дополнительной информации обратитесь к справочной странице по man:ng_l2cap[4].
+
+Полезной является программа man:l2ping[8], которая может использоваться для проверки связи с другими устройствами. Некоторые реализации Bluetooth могут не возвращать все данные, посылаемые им, так что `0 bytes` в следующем примере - это нормально.
+
+[source,bash]
+....
+# l2ping -a 00:80:37:29:19:a4
+0 bytes from 0:80:37:29:19:a4 seq_no=0 time=48.633 ms result=0
+0 bytes from 0:80:37:29:19:a4 seq_no=1 time=37.551 ms result=0
+0 bytes from 0:80:37:29:19:a4 seq_no=2 time=28.324 ms result=0
+0 bytes from 0:80:37:29:19:a4 seq_no=3 time=46.150 ms result=0
+....
+
+Утилита man:l2control[8] используется для выполнения различных операций с узлами L2CAP. В этом примере показано, как получить список логических соединений (каналов) и перечень радиосоединений локального устройства:
+
+[source,bash]
+....
+% l2control -a 00:02:72:00:d4:1a read_channel_list
+L2CAP channels:
+Remote BD_ADDR SCID/ DCID PSM IMTU/ OMTU State
+00:07:e0:00:0b:ca 66/ 64 3 132/ 672 OPEN
+% l2control -a 00:02:72:00:d4:1a read_connection_list
+L2CAP connections:
+Remote BD_ADDR Handle Flags Pending State
+00:07:e0:00:0b:ca 41 O 0 OPEN
+....
+
+Ещё одним диагностическим инструментом является man:btsockstat[1]. Она выполняет действия, подобные тем, что обычно выполняет man:netstat[1], но со структурами данных, связанных с работой в сети Bluetooth. В примере ниже описывается то же самое логическое соединение, что и с man:l2control[8] выше.
+
+[source,bash]
+....
+% btsockstat
+Active L2CAP sockets
+PCB Recv-Q Send-Q Local address/PSM Foreign address CID State
+c2afe900 0 0 00:02:72:00:d4:1a/3 00:07:e0:00:0b:ca 66 OPEN
+Active RFCOMM sessions
+L2PCB PCB Flag MTU Out-Q DLCs State
+c2afe900 c2b53380 1 127 0 Yes OPEN
+Active RFCOMM sockets
+PCB Recv-Q Send-Q Local address Foreign address Chan DLCI State
+c2e8bc80 0 250 00:02:72:00:d4:1a 00:07:e0:00:0b:ca 3 6 OPEN
+....
+
+=== Протокол RFCOMM
+
+Протокол RFCOMM эмулирует последовательные порты поверх протокола L2CAP. Он основан на ETSI-стандарте TS 07.10. RFCOMM представляет собой простой транспортный протокол, с дополнительными возможностями по эмуляции 9 цепей последовательных портов RS-232 (EIATIA-232-E). Протокол RFCOMM поддерживает одновременно до 60 соединений (каналов RFCOMM) между двумя устройствами Bluetooth.
+
+В рамках RFCOMM полный коммуникационный маршрут включает два приложения, работающие на разных устройствах (конечные коммуникационные точки) с коммуникационным сегментом между ними. RFCOMM предназначен для сокрытия приложений, использующих последовательные порты устройств, в которых они расположены. Коммуникационный сегмент по сути является Bluetooth-связью от одного устройства к другому (прямое соединение).
+
+RFCOMM имеет дело с соединением между устройствами в случае прямого соединения, или между устройством и модемом в сетевом случае. RFCOMM может поддерживать и другие конфигурации, такие, как модули, работающие через беспроводную технологию Bluetooth с одной стороны и предоставляющие проводное соединение с другой стороны.
+
+Во FreeBSD протокол RFCOMM реализован на уровне сокетов Bluetooth.
+
+=== Pairing of Devices
+
+По умолчанию связь Bluetooth не аутентифицируется, поэтому любое устройство может общаться с любым другим. Устройство Bluetooth (например, сотовый телефон) может задать обязательность аутентификации для предоставления определённого сервиса (в частности, услугу доступа по коммутируемой линии). Bluetooth-аутентификация обычно выполняется через _PIN-коды_. PIN-код представляет из себя ASCII-строку длиной до 16 символов. Пользователь обязан ввести один и тот же PIN-код на обоих устройствах. Как только он введёт PIN-код, оба устройства сгенерируют _ключ связи_. После этого ключ может быть сохранён либо в самом устройстве, либо на постоянном носителе. В следующий раз оба устройства будут использовать ранее сгенерированный ключ соединения. Процедура, описанная выше, носит название _подгонки пары_ (pairing). Заметьте, что если ключ связи потерян любой из сторон, то подбор пары должен быть повторен.
+
+За обработку всех запросов на Bluetooth-аутентификацию отвечает даемон man:hcsecd[8]. По умолчанию файл конфигурации называется [.filename]#/etc/bluetooth/hcsecd.conf#. Пример раздела, содержащего информацию о сотовом телефоне с явно заданным PIN-кодом "1234" приведен ниже:
+
+[.programlisting]
+....
+device {
+ bdaddr 00:80:37:29:19:a4;
+ name "Pav's T39";
+ key nokey;
+ pin "1234";
+ }
+....
+
+Кроме длины, на PIN-коды не накладывается никаких ограничений. Некоторые устройства (например, Bluetooth-гарнитуры) могут иметь фиксированный встроенный PIN-код. Параметр `-d` позволяет запустить man:hcsecd[8] как нефоновый процесс, что облегчает просмотр происходящих событий. Задайте получение парного ключа на удалённом устройстве и инициируйте Bluetooth-соединение с этим устройством. Удалённое устройство должно подтвердить получение пары и запросить PIN-код. Введите тот же самый код, что находится в [.filename]#hcsecd.conf#. Теперь ваш ПК и удалённое устройство спарены. Альтернативным способом является инициация процесса создания пары на удалённом устройстве.
+
+Во FreeBSD 5.5, 6.1 и в более новых, следующая строка может быть добавлена к [.filename]#/etc/rc.conf#, чтобы hcsecd запускался автоматически во время старта системы:
+
+[.programlisting]
+....
+hcsecd_enable="YES"
+....
+
+Ниже даётся пример выдачи протокола команды hcsecd:
+
+[.programlisting]
+....
+hcsecd[16484]: Got Link_Key_Request event from 'ubt0hci', remote bdaddr 0:80:37:29:19:a4
+hcsecd[16484]: Found matching entry, remote bdaddr 0:80:37:29:19:a4, name 'Pav's T39', link key doesn't exist
+hcsecd[16484]: Sending Link_Key_Negative_Reply to 'ubt0hci' for remote bdaddr 0:80:37:29:19:a4
+hcsecd[16484]: Got PIN_Code_Request event from 'ubt0hci', remote bdaddr 0:80:37:29:19:a4
+hcsecd[16484]: Found matching entry, remote bdaddr 0:80:37:29:19:a4, name 'Pav's T39', PIN code exists
+hcsecd[16484]: Sending PIN_Code_Reply to 'ubt0hci' for remote bdaddr 0:80:37:29:19:a4
+....
+
+=== Service Discovery Protocol (SDP)
+
+Протокол обнаружения сервисов SDP даёт возможность клиентским приложениям осуществлять поиск услуг, предоставляемых серверными приложениями, а также характеристик этих услуг. В перечень атрибутов сервиса включается тип класса предлагаемого сервиса и информация о механизме или протоколе, требуемом для использования сервиса.
+
+SDP подразумевает коммуникации между SDP-сервером и SDP-клиентом. Сервер поддерживает список сервисов, в котором описываются параметры сервисов, связанных с сервером. Каждая запись об услуге содержит информацию об одном сервисе. Клиент может запросить информацию об определённом сервисе, обслуживаемом SDP-сервером, выдавая SDP-запрос. Если клиент или приложение, связанное с клиентом, решат воспользоваться сервисом, то для его использования необходимо открыть отдельное соединение к устройству, предоставляющему сервис. SDP предоставляет механизм обнаружения услуг и их параметров, но не даёт механизма использования этих сервисов.
+
+Обычно SDP-клиент выполняет поиск услуг на основе некоторых желаемых характеристик услуг. Однако иногда возникает необходимость выяснить полный перечень типов услуг, предоставляемых SDP-сервером, не имея никакой информации об имеющихся сервисах. Такой процесс всех предлагаемых сервисов называется _обзором_ (browsing).
+
+Bluetooth SDP сервер man:sdpd[8] и клиент с интерфейсом командной строки man:sdpcontrol[8] включены в стандартную поставку FreeBSD. В следующем примере показано, как выполнять запрос на SDP-обзор.
+
+[source,bash]
+....
+% sdpcontrol -a 00:01:03:fc:6e:ec browse
+Record Handle: 00000000
+Service Class ID List:
+ Service Discovery Server (0x1000)
+Protocol Descriptor List:
+ L2CAP (0x0100)
+ Protocol specific parameter #1: u/int/uuid16 1
+ Protocol specific parameter #2: u/int/uuid16 1
+
+Record Handle: 0x00000001
+Service Class ID List:
+ Browse Group Descriptor (0x1001)
+
+Record Handle: 0x00000002
+Service Class ID List:
+ LAN Access Using PPP (0x1102)
+Protocol Descriptor List:
+ L2CAP (0x0100)
+ RFCOMM (0x0003)
+ Protocol specific parameter #1: u/int8/bool 1
+Bluetooth Profile Descriptor List:
+ LAN Access Using PPP (0x1102) ver. 1.0
+....
+
+... и так далее. Заметьте, что каждый сервис имеет перечень атрибутов (например, канал RFCOMM). В зависимости от сервиса вам может потребоваться где-то сохранить эти атрибуты. Некоторые реализации Bluetooth не поддерживают просмотр сервисов и могут возвращать пустой список. В этом случае возможен поиск конкретной услуги. В примере ниже показано, как выполнить поиск службы OBEX Object Push (OPUSH):
+
+[source,bash]
+....
+% sdpcontrol -a 00:01:03:fc:6e:ec search OPUSH
+....
+
+Во FreeBSD предоставление сервисов клиентам Bluetooth осуществляется сервером man:sdpd[8]. Во FreeBSD 5.5, 6.1 и в более новых, следующая строка может быть добавлена в файл [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+sdpd_enable="YES"
+....
+
+После этого sdpd даемон может быть запущен с помощью:
+
+[source,bash]
+....
+# /etc/rc.d/sdpd start
+....
+
+Во FreeBSD 6.0, и во FreeBSD 5.X перед 5.5, sdpd не интегрирован в скрипты загрузки системы. Он должен запускаться автоматически командой:
+
+[source,bash]
+....
+# sdpd
+....
+
+Приложение на локальном сервере, желающее предоставить сервис Bluetooth удаленным клиентам, регистрирует сервис через локального даемона SDP. Пример такого приложения - man:rfcomm_pppd[8]. После запуска оно регистрирует Bluetooth LAN сервис через локального даемона SDP.
+
+Список сервисов, зарегистрированных через локальный SDP сервер, может быть получен путем выдачи запроса на просмотр SDP через локальный контрольный канал:
+
+[source,bash]
+....
+# sdpcontrol -l browse
+....
+
+=== Доступ к сети по коммутируемой линии связи (DUN) и по протоколу PPP (LAN)
+
+Модуль работы с коммутируемым доступом к сети (DUN - Dial-Up Networking) в большинстве случаев используется с модемами и сотовыми телефонами. Этот модуль покрывает следующие случаи:
+
+* сотовый телефон или модем используется вместе с компьютером в качестве беспроводного модема для подключения к серверу коммутируемого доступа в Интернет, или другой коммутируемой услуге;
+* сотовый телефон или модем используется компьютером для приёма входящих соединений.
+
+Модуль доступа к сети по протоколу PPP (Network Access with PPP - LAN) может использоваться в следующих ситуациях:
+
+* доступ к ЛВС для одного Bluetooth-устройства;
+* доступ к ЛВС для нескольких Bluetooth-устройств;
+* связь между двумя ПК (при помощи протокола PPP поверх эмулируемого последовательного канала связи).
+
+Во FreeBSD оба случая реализуются при помощи сервисных программ man:ppp[8] и man:rfcomm_pppd[8] - это обработчик, преобразующий RFCOMM-соединения Bluetooth в нечто, с чем может работать PPP. Перед тем, как использовать любой модуль, в файле [.filename]#/etc/ppp/ppp.conf# должна быть создана новая PPP-метка. Примеры использования можно найти в справочной странице к man:rfcomm_pppd[8].
+
+В следующем примере man:rfcomm_pppd[8] будет использоваться для открытия RFCOMM-соединения к удалённому устройству с BD_ADDR 00:80:37:29:19:a4 на DUN RFCOMM-канале. Реальный номер RFCOMM-канала будет получаться с удалённого устройства через SDP. Возможно указать RFCOMM-канал вручную, и в этом случае man:rfcomm_pppd[8] не будет выполнять SDP-запрос. Для нахождения RFCOMM-канала на удалённом устройстве используйте утилиту man:sdpcontrol[8].
+
+[source,bash]
+....
+# rfcomm_pppd -a 00:80:37:29:19:a4 -c -C dun -l rfcomm-dialup
+....
+
+Для того, чтобы организовать сервис Network Access with PPP (LAN), необходимо запустить сервер man:sdpd[8]. В файле [.filename]#/etc/ppp/ppp.conf# должна быть создана новая запись для клиентов LAN. Примеры можно найти в справке по man:rfcomm_pppd[8]. Наконец, запустите RFCOMM PPP сервер на существующем номере канала RFCOMM. Сервер RFCOMM PPP автоматически зарегистрирует Bluetooth LAN сервис через локальный SDP даемон. В примере ниже показано, как запустить сервер RFCOMM PPP.
+
+[source,bash]
+....
+# rfcomm_pppd -s -C 7 -l rfcomm-server
+....
+
+=== OBEX Object Push (OPUSH) Profile
+
+OBEX является широко используемым протоколом для простой передачи файлов между мобильными устройствами. В основном он используется в коммуникациях через инфракрасный порт для передачи файлов между ноутбуками или КПК, а также для пересылки визитных карточек или календарных планов между сотовыми телефонами и другими устройствами с персональными информационными менеджерами.
+
+Сервер и клиент OBEX реализованы в виде пакета стороннего разработчика obexapp, который доступен в виде порта package:comms/obexapp[].
+
+Клиент OBEX используется для посылки или приёма объектов с сервера OBEX. Объектом, к примеру, может быть визитная карточка или указание. Клиент OBEX может получить номер RFCOMM-канала, указав вместо него имя сервиса. Поддерживаются следующие имена сервиса: IrMC, FTRN и OPUSH. Канал RFCOMM можно задать его номером. Ниже даётся пример сеанса OBEX, где с сотового телефона забирается объект с информацией об устройстве, а новый объект (визитная карточка) передаётся в каталог сотового телефона.
+
+[source,bash]
+....
+% obexapp -a 00:80:37:29:19:a4 -C IrMC
+obex> get telecom/devinfo.txt devinfo-t39.txt
+Success, response: OK, Success (0x20)
+obex> put new.vcf
+Success, response: OK, Success (0x20)
+obex> di
+Success, response: OK, Success (0x20)
+....
+
+Для того, чтобы предоставить сервис OBEX Push, должен быть запущен сервер man:sdpd[8]. Должен быть создан корневой каталог, в котором будут сохраняться все поступающие объекты. По умолчанию корневым каталогом является [.filename]#/var/spool/obex#. Наконец, запустите OBEX сервер на существующем номере канала RFCOMM. OBEX сервер автоматически зарегистрирует сервис OBEX Object Push через локального даемона SDP. В примере ниже показано, как запустить OBEX-сервер.
+
+[source,bash]
+....
+# obexapp -s -C 10
+....
+
+=== Профиль последовательного порта (SPP)
+
+Профиль последовательного порта (SPP - Serial Port Profile) позволяет Bluetooth-устройствам осуществлять эмуляцию последовательного порта RS232 (или подобного). Этот профиль покрывает случаи, касающиеся работы унаследованных приложений с Bluetooth в качестве замены кабельному соединению, при это используется абстракция виртуального последовательного порта.
+
+Утилита man:rfcomm_sppd[1] реализует профиль последовательного порта. В качестве виртуального последовательного порта используется псевдо-терминал. В примере ниже показано, как подключиться к сервису Serial Port удалённого устройства. Заметьте, что вы не указываете RFCOMM-канал - man:rfcomm_sppd[1] может получить его с удалённого устройства через SDP. Если вы хотите переопределить это, укажите RFCOMM-канал явно в командной строке.
+
+[source,bash]
+....
+# rfcomm_sppd -a 00:07:E0:00:0B:CA -t /dev/ttyp6
+rfcomm_sppd[94692]: Starting on /dev/ttyp6...
+....
+
+После подключения псевдо-терминал можно использовать как последовательный порт:
+
+[source,bash]
+....
+# cu -l ttyp6
+....
+
+=== Решение проблем
+
+==== Удалённое устройство не подключается
+
+Некоторые старые Bluetooth-устройства не поддерживают переключение ролей. По умолчанию, когда FreeBSD подтверждает новое соединение, она пытается выполнить переключение роли и стать ведущим устройством. Устройства, которые это не поддерживают, не смогут подключиться. Заметьте, что переключение ролей выполняется при установлении нового соединения, поэтому невозможно выяснить, поддерживает ли удалённое устройство переключение ролей. На локальной машине имеется возможность отключить переключение ролей при помощи HCI-параметра:
+
+[source,bash]
+....
+# hccontrol -n ubt0hci write_node_role_switch 0
+....
+
+==== Что-то идёт не так, можно ли посмотреть, что в точности происходит?
+
+Да, можно. Воспользуйтесь пакетом стороннего разработчика, hcidump который доступен в виде порта package:comms/hcidump[]. Утилита hcidump похожа на man:tcpdump[1]. Она может быть использована для вывода на терминал содержимого Bluetooth-пакетов и сбрасывать пакеты Bluetooth в файл.
+
+[[network-bridging]]
+== Мосты
+
+=== Введение
+
+Иногда полезно разделить одну физическую сеть (такую, как сегмент Ethernet) на два отдельных сегмента сети без необходимости создания подсетей IP и использования маршрутизатора для соединения сегментов. Устройство, которое соединяет две сети на такой манер, называется "сетевым мостом" ("bridge"). Система FreeBSD с двумя сетевыми адаптерами может выступать в роли моста.
+
+Мост работает на основе изучения адресов уровня MAC (адресов Ethernet) устройств на каждом из своих сетевых интерфейсах. Он перенаправляет трафик между двумя сетями, только когда адреса отправителя и получателя находятся в разных сетях.
+
+По многим параметрам мост работает также, как коммутатор Ethernet с малым количеством портов.
+
+=== Ситуации, когда можно использовать мосты
+
+На сегодняшний день есть две ситуации, когда можно использовать мост.
+
+==== Большой трафик в сегменте
+
+Первая ситуация возникает, когда ваша физическая сеть перегружена трафиком, но по каким-то соображениям вы не хотите разделять сеть на подсети и соединять их с помощью маршрутизатора.
+
+Давайте рассмотрим в качестве примера газету, в которой редакторский и производственный отделы находятся в одной и той же подсети. Пользователи в редакторском отделе все используют сервер `A` для служб доступа к файлам, а пользователи производственного отдела используют сервер `B`. Для объединения всех пользователей используется сеть Ethernet, а высокая нагрузка на сеть замедляет работу.
+
+Если пользователи редакторского отдела могут быть собраны в одном сегменте сети, а пользователи производственного отдела в другом, то два сетевых сегмента можно объединить мостом. Только сетевой трафик, предназначенный для интерфейсов с "другой" стороны моста, будет посылаться в другую сеть, тем самым снижая уровень нагрузки на каждый сегмент сети.
+
+==== Сетевой экран с возможностями фильтрации/ограничения пропускной способности трафика
+
+Второй распространённой ситуацией является необходимость в обеспечении функций сетевого экрана без трансляции сетевых адресов (NAT).
+
+Для примера можно взять маленькую компанию, которая подключена к своему провайдеру по каналу DSL или ISDN. Для неё провайдер выделил 13 глобально доступных IP-адресов для имеющихся в сети 10 персональных компьютеров. В такой ситуации использование сетевого экрана на основе маршрутизатора затруднено из-за проблем с разделением на подсети.
+
+Брандмауэр на основе моста может быть настроен и включен между маршрутизаторами DSL/ISDN без каких-либо проблем с IP-адресацией.
+
+=== Настройка моста
+
+==== Выбор сетевого адаптера
+
+Для работы моста требуются по крайней мере два сетевых адаптера. К сожалению, не все сетевые адаптеры поддерживают функции моста. Прочтите страницу Справочника по man:bridge[4] для выяснения подробностей о поддерживаемых адаптерах.
+
+Перед тем, как продолжить, сначала установите и протестируйте два сетевых адаптера.
+
+==== Изменения в конфигурации ядра
+
+Для включения поддержки функций сетевого моста в ядре, добавьте строчку
+
+[.programlisting]
+....
+options BRIDGE
+....
+
+в файл конфигурации вашего ядра, и перестройте ядро.
+
+==== Поддержка функций брандмауэра
+
+Если вы планируете использовать мост в качестве брандмауэра, вам нужно также добавить опцию `IPFIREWALL`. Прочтите crossref:firewalls[firewalls, Межсетевые экраны], содержащую общую информацию о настройке моста в качестве брандмауэра.
+
+Если вам необходимо обеспечить прохождение не-IP пакетов (таких, как ARP) через мост, то имеется опция брандмауэра, которую можно задать. Это опция `IPFIREWALL_DEFAULT_TO_ACCEPT`. Заметьте, что при этом правило, используемое брандмауэром по умолчанию, меняется на разрешительное для всех пакетов. Перед тем, как задавать эту опцию, убедитесь, что вы понимаете работу вашего набора правил.
+
+==== Поддержка функций ограничения пропускной способности
+
+Если вы хотите использовать мост в качестве машины, ограничивающей пропускную способность, то добавьте в файл конфигурации ядра опцию `DUMMYNET`. Дополнительную информацию можно почерпнуть из страницы Справочника по man:dummynet[4].
+
+=== Включение функций моста
+
+Добавьте строку
+
+[.programlisting]
+....
+net.link.ether.bridge.enable=1
+....
+
+в файл [.filename]#/etc/sysctl.conf# для включения функций моста во время работы системы, и строку:
+
+[.programlisting]
+....
+net.link.ether.bridge.config=if1,if2
+....
+
+для включения функций моста для указанных интерфейсов (замените _if1_ и _if2_ на имена двух ваших сетевых интерфейсов). Если вы хотите, чтобы проходящие через мост пакеты фильтровались посредством man:ipfw[8], вы должны также добавить строчку:
+
+[.programlisting]
+....
+net.link.ether.bridge.ipfw=1
+....
+
+Для версий FreeBSD, предшествующих FreeBSD 5.2-RELEASE, нужно использовать следующие строки:
+
+[.programlisting]
+....
+net.link.ether.bridge=1
+net.link.ether.bridge_cfg=if1,if2
+net.link.ether.bridge_ipfw=1
+....
+
+=== Дополнительные замечания
+
+Если вы хотите осуществлять удалённый доступ на мост через man:ssh[1] из сети, то корректно назначить одному из сетевых адаптеров IP-адрес. Общепринято, что назначение адреса обоим сетевым адаптерам является не самой хорошей идеей.
+
+Если в вашей сети присутствует несколько мостов, не должно быть более одного маршрута между любыми двумя рабочими станциями. С технической точки зрения это означает отсутствие поддержки протокола spanning tree.
+
+Сетевой мост может увеличить задержки в замерах командой man:ping[8], особенно для трафика между двумя разными сегментами.
+
+[[network-diskless]]
+== Работа с бездисковыми станциями
+
+Машина с FreeBSD может загружаться по сети и работать без наличия локального диска, используя файловые системы, монтируемые с сервера NFS. Кроме стандартных конфигурационных файлов, не нужны никакие модификации в системе. Такую систему легко настроить, потому что все необходимые элементы уже готовы:
+
+* Имеется по крайней мере два возможных способа загрузки ядра по сети:
+
+** PXE: Система Intel(R) Preboot eXecution Environment является формой загрузочного ПЗУ, встроенного в некоторые сетевые адаптеры или материнские платы. Обратитесь к справочной странице по man:pxeboot[8] для получения более полной информации.
+** Порт Etherboot (package:net/etherboot[]) генерирует код, который может применяться в ПЗУ для загрузки ядра по сети. Код может быть либо прошит в загрузочный PROM на сетевом адаптере, либо загружен с локальной дискеты (или винчестера), или с работающей системы MS-DOS(R). Поддерживаются многие сетевые адаптеры.
+
+* Примерный скрипт ([.filename]#/usr/shared/examples/diskless/clone_root#) облегчает создание и поддержку корневой файловой системы рабочей станции на сервере. Скрипт, скорее всего, потребует некоторых настроек, но он позволит вам быстро начать работу.
+* Стандартные файлы начального запуска системы, располагающиеся в [.filename]#/etc#, распознают и поддерживают загрузку системы в бездисковом варианте.
+* Подкачка, если она нужна, может выполняться через файл NFS либо на локальный диск.
+
+Существует много способов настройки бездисковой рабочей станции. При этом задействованы многие компоненты, и большинство из них могут быть настроены для удовлетворения ваших вкусов. Далее будет описаны варианты полной настройки системы, при этом упор будет делаться на простоту и совместимость с стандартной системой скриптов начальной загрузки FreeBSD. Описываемая система имеет такие характеристики:
+
+* Бездисковые рабочие станции совместно используют файловую систему [.filename]#/# в режиме только чтения, а также используют [.filename]#/usr# совместно тоже в режиме только чтения.
++
+Корневая файловая система является копией стандартной корневой системы FreeBSD (обычно сервера), с некоторыми настроечными файлами, измененными кем-то специально для бездисковых операций или, возможно, для рабочей станции, которой она предназначена.
++
+Части корневой файловой системы, которые должны быть доступны для записи, перекрываются файловыми системами man:md[4]. Любые изменения будут потеряны при перезагрузках системы.
+* Ядро передается и загружается посредством Etherboot или PXE, и в некоторых ситуациях может быть использован любой из этих методов.
+
+[CAUTION]
+====
+
+Как описано, эта система не защищена. Она должна располагаться в защищенной части сети, а другие хосты не должны на нее полагаться.
+====
+
+Вся информация этого раздела была протестирована с релизом FreeBSD 5.2.1-RELEASE.
+
+=== Общая информация
+
+Настройка бездисковых рабочих станций относительно проста, но в то же время легко сделать ошибку. Иногда сложно диагностировать эти ошибки по нескольким причинам. Например:
+
+* Параметры компиляции могут по-разному проявлять себя во время работы.
+* Сообщения об ошибках бывают загадочны или вовсе отсутствуют.
+
+В данной ситуации некоторые знания, касающиеся используемых внутренних механизмов, очень полезны при разрешении проблем, которые могут возникнуть.
+
+Для выполнения успешной загрузки необходимо произвести несколько операций:
+
+* Компьютеру необходимо получить начальные параметры, такие как собственный IP адрес, имя исполняемого файла, корневой каталог. Для этого используются протоколы DHCP или BOOTP. DHCP это совместимое расширение BOOTP, используются те же номера портов и основной формат пакетов.
++
+Возможна настройка системы для использования только BOOTP. Серверная программа man:bootpd[8] включена в основную систему FreeBSD.
++
+Тем не менее, у DHCP есть множество преимуществ над BOOTP (лучше файлы настройки, возможность использования PXE, плюс многие другие преимущества, не относящиеся непосредственно к бездисковым операциям), и мы в основном будем описывать настройку DHCP, с эквивалентными примерами для man:bootpd[8], когда это возможно. Пример конфигурации будет использовать пакет ISC DHCP (релиз 3.0.1.r12 был установлен на тестовом сервере).
+* Компьютеру требуется загрузить в локальную память одну или несколько программ. Используются TFTP или NFS. Выбор между TFTP или NFS производится во время компилирования в нескольких местах. Часто встречающаяся ошибка это указание имен файлов для другого протокола: TFTP обычно загружает все файлы с одного каталога сервера, и принимает имена файлов относительно этого каталога. NFS нужны абсолютные пути к файлам.
+* Необходимо инициализировать и выполнить возможные промежуточные программы загрузки и ядро. В этой области существует несколько важных вариаций:
+
+** PXE загрузит man:pxeboot[8], являющийся модифицированной версией загрузчика третьей стадии FreeBSD. man:loader[8] получит большинство параметров, необходимых для старта системы, и оставит их в окружении ядра до контроля передачи. В этом случае возможно использование ядра [.filename]#GENERIC#.
+** Etherboot, непосредственно загрузит ядро, с меньшей подготовкой. Вам потребуется собрать ядро со специальными параметрами.
++
+PXE и Etherboot работают одинаково хорошо; тем не менее, поскольку ядро обычно позволяет man:loader[8] выполнить больше предварительной работы, метод PXE предпочтителен.
++
+Если ваш BIOS и сетевые карты поддерживают PXE, используйте его.
+* Наконец, компьютеру требуется доступ к файловым системам. NFS используется во всех случаях.
+
+Обратитесь также к странице справочника man:diskless[8].
+
+=== Инструкции по настройке
+
+==== Конфигурация с использованием ISC DHCP
+
+Сервер ISC DHCP может обрабатывать как запросы BOOTP, так и запросы DHCP.
+
+ISC DHCP 3.0 не включается в поставку системы. Сначала вам нужно будет установить порт package:net/isc-dhcp3-server[] или соответствующий пакет.
+
+После установки ISC DHCP ему для работы требуется конфигурационный файл (обычно называемый [.filename]#/usr/local/etc/dhcpd.conf#). Вот прокомментированный пример, где хост `margaux` использует Etherboot, а хост `corbieres` использует PXE:
+
+[.programlisting]
+....
+
+default-lease-time 600;
+max-lease-time 7200;
+authoritative;
+
+option domain-name "example.com";
+option domain-name-servers 192.168.4.1;
+option routers 192.168.4.1;
+
+subnet 192.168.4.0 netmask 255.255.255.0 {
+ use-host-decl-names on; <.>
+ option subnet-mask 255.255.255.0;
+ option broadcast-address 192.168.4.255;
+
+ host margaux {
+ hardware ethernet 01:23:45:67:89:ab;
+ fixed-address margaux.example.com;
+ next-server 192.168.4.4; <.>
+ filename "/data/misc/kernel.diskless"; <.>
+ option root-path "192.168.4.4:/data/misc/diskless"; <.>
+ }
+ host corbieres {
+ hardware ethernet 00:02:b3:27:62:df;
+ fixed-address corbieres.example.com;
+ next-server 192.168.4.4;
+ filename "pxeboot";
+ option root-path "192.168.4.4:/data/misc/diskless";
+ }
+}
+....
+
+<.> Этот параметр указывает dhcpd посылать значения деклараций `host` как имя хоста для бездисковой машины. Альтернативным способом было бы добавление `option host-name _margaux_` внутри объявлений `host`.
+
+<.> Директива `next-server` определяет сервер TFTP или NFS, используемый для получения загрузчика или файла ядра (по умолчанию используется тот же самый хост, на котором расположен сервер DHCP).
+
+<.> Директива `filename` определяет файл, который Etherboot или PXE будут загружать для следующего шага выполнения. Он должен быть указан в соответствии с используемым методом передачи. Etherboot может быть скомпилирован для использования NFS или TFTP. FreeBSD порт по умолчанию использует NFS. PXE использует TFTP, поэтому здесь применяются относительные пути файлов (это может зависеть от настроек TFTP сервера, но обычно довольно типично). Кроме того, PXE загружает [.filename]#pxeboot#, а не ядро. Существуют другие интересные возможности, такие как загрузка [.filename]#pxeboot# из каталога [.filename]#/boot# FreeBSD CD-ROM (поскольку man:pxeboot[8] может загружать [.filename]#GENERIC# ядро, это делает возможной загрузку с удаленного CD-ROM).
+
+<.> Параметр `root-path` определяет путь к корневой файловой системе, в обычной нотации NFS. При использовании PXE, можно оставить IP хоста отключенным, если параметр ядра BOOTP не используется. Затем NFS сервер может использоваться так же, как и TFTP.
+
+==== Настройка с использованием BOOTP
+
+Далее описана эквивалентная конфигурация с использованием bootpd (для одного клиента). Она будет располагаться в [.filename]#/etc/bootptab#.
+
+Пожалуйста, отметьте, что Etherboot должен быть откомпилирован с нестандартной опцией `NO_DHCP_SUPPORT` для того, чтобы можно было использовать BOOTP, и что для работы PXE_необходим_DHCP. Единственным очевидным преимуществом bootpd является его наличие в поставке системы.
+
+[.programlisting]
+....
+
+.def100:\
+ :hn:ht=1:sa=192.168.4.4:vm=rfc1048:\
+ :sm=255.255.255.0:\
+ :ds=192.168.4.1:\
+ :gw=192.168.4.1:\
+ :hd="/tftpboot":\
+ :bf="/kernel.diskless":\
+ :rp="192.168.4.4:/data/misc/diskless":
+
+margaux:ha=0123456789ab:tc=.def100
+....
+
+==== Подготовка программы загрузки при помощи Etherboot
+
+http://etherboot.sourceforge.net[Сайт Etherboot] содержит http://etherboot.sourceforge.net/doc/html/userman/t1.html[ подробную документацию], в основном предназначенную для систем Linux, но несомненно, она полезна. Далее будет просто кратко описано, как вы должны использовать Etherboot в системе FreeBSD.
+
+Сначала вы должны установить пакет или порт package:net/etherboot[].
+
+Вы можете изменить настройку Etherboot (например, для использования TFTP вместо NFS) путем редактирования файла [.filename]#Config# в каталоге исходных текстов Etherboot.
+
+В нашей ситуации мы будем использовать загрузочную дискету. Для других методов (PROM или программа MS-DOS(R)) пожалуйста, обратитесь к документации по Etherboot.
+
+Для создания загрузочной дискеты, вставьте дискету в дисковод на машине, где установлен Etherboot, затем перейдите в каталог [.filename]#src# в дереве Etherboot и наберите:
+
+[source,bash]
+....
+# gmake bin32/devicetype.fd0
+
+....
+
+_devicetype_ зависит от типа адаптера Ethernet на бездисковой рабочей станции. Обратитесь к файлу [.filename]#NIC# в том же самом каталоге для определения правильного значения для _devicetype_.
+
+==== Загрузка с PXE
+
+По умолчанию, man:pxeboot[8] загружает ядро через NFS. Он может быть скомпилирован для использования вместо него TFTP путем указания параметра `LOADER_TFTP_SUPPORT` в [.filename]#/etc/make.conf#. Смотрите комментарии в файле [.filename]#/usr/shared/examples/etc/make.conf#.
+
+Есть два не документированных параметра [.filename]#make.conf#, которые могут быть полезны для настройки бездискового компьютера с последовательной консолью: `BOOT_PXELDR_PROBE_KEYBOARD`, и `BOOT_PXELDR_ALWAYS_SERIAL`.
+
+Для использования PXE при загрузке компьютера вам обычно потребуется выбрать параметр `Boot from network` (загрузка по сети) в настройках BIOS, или нажать функциональную клавишу во время загрузки PC.
+
+==== Настройка серверов TFTP и NFS
+
+Если вы используете PXE или Etherboot, настроенные для использования TFTP, вам нужно включить tftpd на файловом сервере:
+
+[.procedure]
+====
+
+. Создайте каталог, файлы которого будет обслуживать tftpd, например, [.filename]#/tftpboot#.
+. Добавьте в ваш [.filename]#/etc/inetd.conf# такую строчку:
++
+[.programlisting]
+....
+tftp dgram udp wait root /usr/libexec/tftpd tftpd -l -s /tftpboot
+....
++
+[NOTE]
+======
+Бывает, что некоторым версиям PXE требуется TCP-вариант TFTP. В таком случае добавьте вторую строчку, заменяющую `dgram udp` на `stream tcp`.
+======
++
+. Сообщите inetd о необходимости перечитать свой файл конфигурации. Файл [.filename]#/etc/rc.conf# должен содержать строку `inetd_enable="YES"` для корректного исполнения команды
++
+[source,bash]
+....
+# /etc/rc.d/inetd restart
+....
+====
+
+Вы можете поместить каталог [.filename]#tftpboot# в любом месте на сервере. Проверьте, что это местоположение указано как в [.filename]#inetd.conf#, так и в [.filename]#dhcpd.conf#.
+
+Во всех случаях, вам также нужно включить NFS и экспортировать соответствующую файловую систему на сервере NFS.
+
+[.procedure]
+====
+
+. Добавьте следующее в [.filename]#/etc/rc.conf#:
++
+[.programlisting]
+....
+nfs_server_enable="YES"
+....
++
+. Экспортируйте файловую систему, в которой расположен корневой каталог для бездисковой рабочей станции, добавив следующую строку в [.filename]#/etc/exports# (подправьте точку монтирования и замените _margaux corbieres_ именами бездисковых рабочих станций):
++
+[.programlisting]
+....
+/data/misc -alldirs -ro margaux corbieres
+....
++
+. Заставьте mountd перечитать настроечный файл. На самом деле если вам потребовалось на первом шаге включить NFS в [.filename]#/etc/rc.conf#, то вам нужно будет выполнить перезагрузку.
++
+[source,bash]
+....
+# /etc/rc.d/mountd restart
+....
+====
+
+==== Построение ядра для бездисковой рабочей станции
+
+При использовании Etherboot, вам потребуется создать конфигурационный файл ядра для бездискового клиента со следующими параметрами (вдобавок к обычным):
+
+[.programlisting]
+....
+
+options BOOTP # Use BOOTP to obtain IP address/hostname
+options BOOTP_NFSROOT # NFS mount root filesystem using BOOTP info
+....
+
+Вам может потребоваться использовать `BOOTP_NFSV3`, `BOOT_COMPAT` и `BOOTP_WIRED_TO` (посмотрите файл [.filename]#NOTES#).
+
+Эти имена параметров сложились исторически, и могут немного ввести в заблуждение, поскольку включают необязательное использование DHCP и BOOTP в ядре (возможно включение обязательного использования BOOTP или DHCP use).
+
+Постройте ядро (обратитесь к crossref:kernelconfig[kernelconfig, Настройка ядра FreeBSD]) и скопируйте его в каталог, указанный в [.filename]#dhcpd.conf#.
+
+[NOTE]
+====
+При использовании PXE, сборка ядра с вышеприведенными параметрами не является совершенно необходимой (хотя желательна). Включение этих параметров приведет к выполнению большинства DHCP запросов во время загрузки ядра, с небольшим риском несоответствия новых значений и значений, полученных man:pxeboot[8] в некоторых особых случаях. Преимущество использования в том, что в качестве побочного эффекта будет установлено имя хоста. Иначе вам потребуется установить имя хоста другим методом, например в клиент-специфичном файле [.filename]#rc.conf#.
+====
+
+[NOTE]
+====
+Для включения возможности загрузки с Etherboot, в ядро необходимо включить устройство hints. Вам потребуется установить в файле конфигурации следующий параметр (см. файл комментариев [.filename]#NOTES#):
+
+[.programlisting]
+....
+hints "GENERIC.hints"
+....
+
+====
+
+==== Подготовка корневой файловой системы
+
+Вам нужно создать корневую файловую систему для бездисковых рабочих станций, в местоположении, заданном как `root-path` в [.filename]#dhcpd.conf#.
+
+===== Использование процедуры `make world`
+
+Этот метод установит новую систему (не только корневую) в `DESTDIR`. Все, что вам потребуется сделать, это просто выполнить следующий скрипт:
+
+[.programlisting]
+....
+#!/bin/sh
+export DESTDIR=/data/misc/diskless
+mkdir -p ${DESTDIR}
+cd /usr/src; make buildworld && make buildkernel
+cd /usr/src/etc; make distribution
+....
+
+Как только это будет сделано, вам может потребоваться настроить [.filename]#/etc/rc.conf# и [.filename]#/etc/fstab#, помещенные в `DESTDIR`, в соответствии с вашими потребностями.
+
+==== Настройка области подкачки
+
+Если это нужно, то файл подкачки, расположенный на сервере, можно использовать посредством NFS.
+
+===== Подкачка через NFS
+
+На стадии загрузки ядро не поддерживает подкачку через NFS. Подкачка должна быть разрешена при помощи загрузочных скриптов, монтирующих файловую систему, пригодную для записи и создающих на ней файл подкачки. Для создания файла подкачки подходящего размера вы можете выполнить следующие команды:
+
+[source,bash]
+....
+# dd if=/dev/zero of=/path/to/swapfile bs=1k count=1 oseek=100000
+....
+
+Для активации этого файла подкачки следует добавить в файл [.filename]#rc.conf# строку
+
+[.programlisting]
+....
+swapfile=/path/to/swapfile
+....
+
+==== Различные проблемы
+
+===== Работа с [.filename]#/usr#, доступной только для чтения
+
+Если бездисковая рабочая станция настроена на запуск X, вам нужно подправить настроечный файл для XDM, который по умолчанию помещает протокол ошибок в [.filename]#/usr#.
+
+===== Использование не-FreeBSD сервера
+
+Если сервер с корневой файловой системой работает не под управлением FreeBSD, вам потребуется создать корневую файловую систему на машине FreeBSD, а затем скопировать ее в нужно место, при помощи `tar` или `cpio`.
+
+В такой ситуации иногда возникают проблемы со специальными файлами в [.filename]#/dev# из-за различной разрядности целых чисел для старшего/младшего чисел. Решением этой проблемы является экспортирование каталога с не-FreeBSD сервера, монтирование его на машине с FreeBSD и использование man:devfs[5] для создания файлов устройств прозрачно для пользователя.
+
+[[network-isdn]]
+== ISDN
+
+Полезным источником информации о технологии ISDN и его аппаратном обеспечении является http://www.alumni.caltech.edu/~dank/isdn/[ Страница Дэна Кегела (Dan Kegel) об ISDN].
+
+Быстрое введение в ISDN:
+
+* Если вы живёте в Европе, то вам может понадобиться изучить раздел об ISDN-адаптерах.
+* Если вы планируете использовать ISDN в основном для соединений с Интернет через провайдера по коммутируемому, не выделенному соединению, рекомендуется посмотреть информацию о терминальных адаптерах. Это даст вам самую большую гибкость и наименьшее количество проблем при смене провайдера.
+* Если вы объединяете две локальные сети или подключаетесь к Интернет через постоянное ISDN-соединение, рекомендуем остановить свой выбор на отдельном мосте/маршрутизаторе.
+
+Стоимость является важным фактором при выборе вашего решения. Далее перечислены все возможности от самого дешевого до самого дорогого варианта.
+
+[[network-isdn-cards]]
+=== Адаптеры ISDN
+
+Реализация ISDN во FreeBSD поддерживает только стандарт DSS1/Q.931 (или Евро-ISDN) при помощи пассивных адаптеров. Поддерживаются некоторые активные адаптеры, прошивки которых поддерживают также другие сигнальные протоколы; также сюда включена поддержка адаптеров ISDN Primary Rate (PRI).
+
+Пакет программ isdn4bsd позволяет вам подключаться к другим маршрутизаторам ISDN при помощи IP поверх DHLC, либо при помощи синхронного PPP; либо при помощи PPP на уровне ядра с `isppp`, модифицированного драйвера man:sppp[4], или при помощи пользовательского man:ppp[8]. При использовании пользовательского man:ppp[8] возможно использование двух и большего числа B-каналов ISDN. Также имеется приложение, работающее как автоответчик, и много утилит, таких, как программный модем на 300 Бод.
+
+Во FreeBSD поддерживается все возрастающее число адаптеров ISDN для ПК, и сообщения показывают, что они успешно используются по всей Европе и других частях света.
+
+Из пассивных адаптеров ISDN поддерживаются в основном те, которые сделаны на основе микросхем Infineon (бывший Siemens) ISAC/HSCX/IPAC ISDN, а также адаптеры ISDN с микросхемами от Cologne Chip (только для шины ISA), адаптеры PCI с микросхемами Winbond W6692, некоторые адаптеры с набором микросхем Tiger300/320/ISAC и несколько адаптеров, построенных на фирменных наборах микросхем, такие, как AVM Fritz!Card PCI V.1.0 и AVM Fritz!Card PnP.
+
+На данный момент из активных адаптеров ISDN поддерживаются AVM B1 (ISA и PCI) адаптеры BRI и AVM T1 PCI адаптеры PRI.
+
+Документацию по isdn4bsd можно найти в каталоге [.filename]#/usr/shared/examples/isdn/# вашей системы FreeBSD или на http://www.freebsd-support.de/i4b/[домашней странице isdn4bsd], на которой также размещены ссылки на советы, замечания по ошибкам и более подробную информацию, например, на http://people.FreeBSD.org/~hm/[руководство по isdn4bsd].
+
+Если вы заинтересованы в добавлении поддержки для различных протоколов ISDN, не поддерживаемых на данный момент адаптеров ISDN для PC или каких-то других усовершенствованиях isdn4bsd, пожалуйста, свяжитесь с {hm}.
+
+Для обсуждения вопросов, связанных с установкой, настройкой и устранением неисправностей isdn4bsd, имеется список рассылки link:{freebsd-isdn-url}[freebsd-isdn].
+
+`subscribe freebsd-isdn`
+
+=== Терминальные адаптеры ISDN
+
+Терминальные адаптеры (TA) для ISDN выполняют ту же роль, что и модемы для обычных телефонных линий.
+
+Большинство TA используют стандартный набор AT-команд Hayes-модемов, и могут использоваться в качестве простой замены для модемов.
+
+TA будут работать точно так же, как и модемы, за исключением скорости соединения и пропускной способности, которые будут гораздо выше, чем у вашего старого модема. Вам потребуется настроить crossref:ppp-and-slip[ppp,PPP] точно также, как и в случае использования модема. Проверьте, что вы задали скорость работы последовательного порта максимально высокой.
+
+Главным преимуществом использования TA для подключения к провайдеру Интернет является возможность использования динамического PPP. Так как пространство адресов IP истощается все больше, большинство провайдеров не хочет больше выдавать вам статический IP-адрес. Большинство же маршрутизаторов не может использовать динамическое выделение IP-адресов.
+
+TA полностью полагаются на даемон PPP, который используете из-за его возможностей и стабильности соединения. Это позволяет вам при использовании FreeBSD легко заменить модем на ISDN, если у вас уже настроено соединение PPP. Однако, в тоже время любые проблемы, которые возникают с программой PPP, отражаются и здесь.
+
+Если вы хотите максимальной надёжности, используйте crossref:ppp-and-slip[ppp,PPP] на уровне параметра ядра, а не crossref:ppp-and-slip[userppp,пользовательский PPP].
+
+Известно, что следующие TA работают с FreeBSD:
+
+* Motorola BitSurfer и Bitsurfer Pro
+* Adtran
+
+Большинство остальных TA, скорее всего, тоже будут работать, производители TA прилагают все усилия для обеспечения поддержки практически всего набора стандартных AT-команд модема.
+
+Как и в случае модемов проблемой использования внешнего TA является потребность в хорошем последовательном адаптере на вашем компьютере.
+
+Вы должны прочесть учебник link:{serial-uart}[Последовательные устройства во FreeBSD] для того, чтобы в деталях понять работу последовательных устройств и осознать различие между асинхронными и синхронными последовательными портами.
+
+TA, работающий со стандартным последовательным (асинхронным) портом PC, ограничивает вас скоростью 115.2 Кбит/с, хотя реально у вас соединение на скорости 128 Кбит/с. Чтобы использовать 128 Кбит/с, которые обеспечивает ISDN, полностью, вы должны подключить TA к синхронному последовательному адаптеру.
+
+Не обманывайте себя, думая, что покупка встроенного TA поможет избежать проблемы синхронности/асинхронности. Встроенные TA просто уже имеют внутри стандартный последовательный порт PC. Все, что при этом достигается - это экономия дополнительных последовательного кабеля и электрической розетки.
+
+Синхронный адаптер с TA по крайней мере так же быстр, как и отдельный маршрутизатор, а если он работает под управлением машины класса 386 с FreeBSD, то это гораздо более гибкое решение.
+
+Выбор между использованием синхронного адаптера/TA или отдельного маршрутизатора в большей степени является религиозным вопросом. По этому поводу в списках рассылки была некоторая дискуссия. Рекомендуем поискать в link:https://www.FreeBSD.org/search/[архивах] обсуждение полностью.
+
+=== Отдельные мосты/маршрутизаторы ISDN
+
+Мосты или маршрутизаторы ISDN не так уж специфичны для FreeBSD или для любой другой операционной системы. Для более подробного описания технологий маршрутизации и работы мостов, пожалуйста, обратитесь к справочникам по сетевым технологиям.
+
+В контексте этого раздела термины маршрутизатор и сетевой мост будут использоваться как взаимозаменяемые.
+
+Вместе с падением цен на простые мосты/маршрутизаторы ISDN, они становятся все более популярными. Маршрутизатор ISDN представляет собой маленькую коробочку, которая подключается непосредственно в вашу сеть Ethernet, и поддерживает связь с другим мостом/маршрутизатором. Всё программное обеспечение для работы по PPP и другим протоколам встроено в маршрутизатор.
+
+Маршрутизатор обладает гораздо большей пропускной способностью, чем стандартный TA, так как он использует полное синхронное соединение ISDN.
+
+Основной проблемой с маршрутизаторами и мостами ISDN является то, что их совместная работа с оборудованием других производителей может оказаться под вопросом. Если вы собираетесь подключаться к провайдеру, то вы должны обсудить с ним то, что вам нужно.
+
+Если вы планируете объединить два сегмента локальной сети, например, домашнюю сеть с сетью офиса, это самое простое решение с минимальными издержками на обслуживание. Так как вы покупаете оборудование для обоих сторон соединения, то можете быть уверены, что связь будет работать нормально.
+
+Например, для соединения домашнего компьютера или сети подразделения к сети центрального офиса, может использоваться такая настройка:
+
+.Офис подразделения или домашняя сеть
+[example]
+====
+Сеть построена в топологии общей шины на основе 10 base 2 Ethernet ("thinnet" - "тонкий Ethernet"). Подключите маршрутизатор к сетевому кабелю с помощью трансивера AUI/10BT, если это нужно.
+
+image::isdn-bus.png[10 Base 2 Ethernet]
+
+Если ваш домашний или удаленный офис представляет собой один компьютер, то для непосредственного подключения к маршрутизатору вы вы можете использовать витую пару с перекрестным соединениям.
+====
+
+.Центральный офис или другая локальная сеть
+[example]
+====
+Сеть построена в топологии звезды на основе 10 Base T Ethernet ("витая пара").
+
+image::isdn-twisted-pair.png[Схема сети с ISDN]
+
+====
+
+Одним большим преимуществом большинства маршрутизаторов/мостов является то, что они позволяют иметь 2 _отдельных независимых_ соединения PPP к 2 различным сайтам _одновременно_. Это не поддерживается в большинстве TA, кроме специальных (обычно дорогих) моделей, имеющих по два последовательных порта. Не путайте это с балансировкой нагрузки, MPP и так далее.
+
+Это может оказаться весьма полезной особенностью, например, если у вас имеется постоянное ISDN-соединение в вашем офисе, и вы хотите им воспользоваться, но не хотите задействовать дополнительный канал ISDN на работе. Маршрутизатор, расположенный в офисе, может использовать выделенное соединение по каналу B (64 Кбит/с) для Интернет, и одновременно другой канал B для отдельного соединения для передачи данных. Второй канал B может использоваться для входящих, исходящих и динамически распределяемых соединений (MPP и так далее) совместно с первым каналом B для повышения пропускной способности.
+
+Мост Ethernet также позволяет вам передавать больше, чем просто трафик IP. Вы сможете передавать IPX/SPX и любые другие протоколы, которые вы используете.
+
+[[network-natd]]
+== Даемон преобразования сетевых адресов (natd)
+
+[[network-natoverview]]
+=== Обзор
+
+Даемон преобразования сетевых адресов (Network Address Translation) во FreeBSD, широко известный как man:natd[8], является даемоном, который принимает входящие IP-пакеты, изменяет адрес отправителя на адрес локальной машины и повторно отправляет эти пакеты в потоке исходящих пакетов. man:natd[8] делает это, меняя IP-адрес отправителя и порт таким образом, что когда данные принимаются обратно, он может определить расположение источника начальных данных и переслать их машине, которая запрашивала данные изначально.
+
+Чаще всего NAT используется для организации так называемого Совместного Использования Интернет.
+
+[[network-natsetup]]
+=== Настройка
+
+Из-за исчерпания пространства адресов в IPv4 и увеличения количества пользователей высокоскоростных каналов связи, таких, как кабельное подключение или DSL, необходимость в решении по Совместному Использованию Интернет растёт. Возможность подключить несколько компьютеров через единственное соединение и IP-адрес делает man:natd[8] подходящим решением.
+
+Чаще всего у пользователя имеется машина, подключенная к кабельному каналу или каналу DSL с одним IP-адресом и есть желание использовать этот единственный подключенный компьютер для организации доступа в Интернет другим компьютерам в локальной сети.
+
+Для этого машина FreeBSD, находящаяся в Интернет, должна выступать в роли шлюза. Эта шлюзовая машина должна иметь два сетевых адаптера-один для подключения к маршрутизатору Интернет, а другой для подключения к ЛВС. Все машины в локальной сети подключаются через сетевой концентратор или коммутатор.
+
+[NOTE]
+====
+Существует много способов подсоединить локальную сеть к Internet через шлюз FreeBSD. Этот пример показывает шлюз c двумя сетевыми картами.
+====
+
+image::natd.png[Структура сети]
+
+Подобная конфигурация часто используется для совместного использования доступа в Интернет. Одна из подключенных к локальной сети машин подключается к Интернет. Остальные машины работают с Интернет посредством этой "шлюзовой" машины.
+
+[[network-natdkernconfiguration]]
+=== Настройка
+
+В файле конфигурации ядра должны присутствовать следующие параметры:
+
+[.programlisting]
+....
+options IPFIREWALL
+options IPDIVERT
+....
+
+Дополнительно, если это нужно, можно добавить следующее:
+
+[.programlisting]
+....
+options IPFIREWALL_DEFAULT_TO_ACCEPT
+options IPFIREWALL_VERBOSE
+....
+
+В файле [.filename]#/etc/rc.conf# должны быть такие строки:
+
+[.programlisting]
+....
+gateway_enable="YES" <.>
+firewall_enable="YES" <.>
+firewall_type="OPEN" <.>
+natd_enable="YES"
+natd_interface="fxp0" <.>
+natd_flags="" <.>
+....
+
+<.> Указывает машине выступать в качестве шлюза. Выполнение команды `sysctl net.inet.ip.forwarding=1` приведёт к тому же самому результату.
+
+<.> При загрузке включает использование правил брандмауэра из файла [.filename]#/etc/rc.firewall#.
+
+<.> Здесь задается предопределенный набор правил брандмауэра, который разрешает все. Посмотрите файл [.filename]#/etc/rc.firewall# для нахождения дополнительных типов.
+
+<.> Указывает, через какой интерфейс передавать пакеты (интерфейс, подключенный к Интернет).
+
+<.> Любые дополнительный параметры, передаваемые при запуске даемону man:natd[8].
+
+При использовании вышеуказанных параметров в файле [.filename]#/etc/rc.conf# при загрузке будет запущена команда `natd -interface fxp0`. Эту команду можно запустить и вручную.
+
+[NOTE]
+====
+Если для передачи man:natd[8] набирается слишком много параметров, возможно также использовать конфигурационный файл. В этом случае имя настроечного файла должно быть задано добавлением следующей строки в [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+natd_flags="-f /etc/natd.conf"
+....
+
+Файл [.filename]#/etc/natd.conf# будет содержать перечень конфигурационных параметров, по одному в строке. К примеру, для примера из следующего раздела будет использоваться такой файл:
+
+[.programlisting]
+....
+redirect_port tcp 192.168.0.2:6667 6667
+redirect_port tcp 192.168.0.3:80 80
+....
+
+Для получения более полной информации о конфигурационном файле прочтите страницу справки по man:natd[8] относительно параметра `-f`.
+====
+
+Каждой машине и интерфейсу в ЛВС должен быть назначен IP-адрес из адресного пространства частных сетей, как это определено в link:ftp://ftp.isi.edu/in-notes/rfc1918.txt[RFC 1918], а в качестве маршрутизатора по умолчанию должен быть задан IP-адрес машины с natd из внутренней сети.
+
+Например, клиенты `A` и `B` в ЛВС имеют IP-адреса `192.168.0.2` и `192.168.0.3`, а интерфейс машины с natd в локальной сети имеет IP-адрес `192.168.0.1`. Маршрутизатором по умолчанию для клиентов `A` и `B` должна быть назначена машина с natd, то есть `192.168.0.1`. Внешний, или Интернет-интерфейс машины с natd не требует особых настроек для работы man:natd[8].
+
+[[network-natdport-redirection]]
+=== Перенаправление портов
+
+Минусом использования man:natd[8] является то, что машины в локальной сети недоступны из Интернет. Клиенты в ЛВС могут выполнять исходящие соединения во внешний мир, но не могут обслуживать входящие. Это является проблемой при запуске служб Интернет на клиентских машинах в локальной сети. Простым решением является перенаправление некоторых портов Интернет машины с natd на клиента локальной сети.
+
+Пусть, к примеру, сервер IRC запущен на клиенте `A`, а Web-сервер работает на клиенте `B`. Чтобы это работало, соединения, принимаемые на портах 6667 (IRC) и 80 (Web), должны перенаправляться на соответствующие машины.
+
+Программе man:natd[8] должна быть передана команда `-redirect_port` с соответствующими параметрами. Синтаксис следующий:
+
+[.programlisting]
+....
+ -redirect_port proto targetIP:targetPORT[-targetPORT]
+ [aliasIP:]aliasPORT[-aliasPORT]
+ [remoteIP[:remotePORT[-remotePORT]]]
+....
+
+В примере выше аргументы должен быть такими:
+
+[.programlisting]
+....
+ -redirect_port tcp 192.168.0.2:6667 6667
+ -redirect_port tcp 192.168.0.3:80 80
+....
+
+При этом будут перенаправлены соответствующие порты _tcp_ на клиентские машины в локальной сети.
+
+Аргумент `-redirect_port` может использоваться для указания диапазонов портов, а не конкретного порта. Например, _tcp 192.168.0.2:2000-3000 2000-3000_ будет перенаправлять все соединения, принимаемые на портах от 2000 до 3000, на порты от 2000 до 3000 клиента `A`.
+
+Эти параметры можно указать при непосредственном запуске man:natd[8], поместить их в параметр `natd_flags=""` файла [.filename]#/etc/rc.conf#, либо передать через конфигурационный файл.
+
+Для получение информации о других параметрах настройки обратитесь к справочной странице по man:natd[8]
+
+[[network-natdaddress-redirection]]
+=== Перенаправление адреса
+
+Перенаправление адреса полезно, если имеется несколько адресов IP, и они должны быть на одной машине. В этой ситуации man:natd[8] может назначить каждому клиенту ЛВС свой собственный внешний IP-адрес. Затем man:natd[8] преобразует исходящие от клиентов локальной сети пакеты, заменяя IP-адреса на соответствующие внешние, и перенаправляет весь трафик, входящий на некоторый IP-адрес, обратно конкретному клиенту локальной сети. Это также называют статическим NAT. К примеру, пусть IP-адреса `128.1.1.1`, `128.1.1.2` и `128.1.1.3` принадлежат шлюзовой машине natd. `128.1.1.1` может использоваться в качестве внешнего IP-адреса шлюзовой машины natd, тогда как `128.1.1.2` и `128.1.1.3` будут перенаправляться обратно к клиентам ЛВС `A` и `B`.
+
+Синтаксис для `-redirect_address` таков:
+
+[.programlisting]
+....
+-redirect_address localIP publicIP
+....
+
+[.informaltable]
+[cols="1,1", frame="none"]
+|===
+
+|localIP
+|Внутренний IP-адрес клиента локальной сети.
+
+|publicIP
+|Внешний IP, соответствующий клиенту локальной сети.
+|===
+
+В примере этот аргумент будет выглядеть так:
+
+[.programlisting]
+....
+-redirect_address 192.168.0.2 128.1.1.2
+-redirect_address 192.168.0.3 128.1.1.3
+....
+
+Как и для `-redirect_port`, эти аргументы также помещаются в строку `natd_flags=""` файла [.filename]#/etc/rc.conf# или передаются через конфигурационный файл. При перенаправлении адресов нет нужды в перенаправлении портов, потому что перенаправляются все данные, принимаемые для конкретного IP-адреса.
+
+Внешние IP-адреса машины с natd должны быть активизированы и являться синонимами для внешнего интерфейса. Обратитесь к man:rc.conf[5], чтобы это сделать.
+
+[[network-plip]]
+== IP по параллельному порту (PLIP)
+
+PLIP позволяет нам работать с TCP/IP по параллельному порту. Это полезно для машин без сетевых адаптеров или для установки на лэптопы. В этом разделе мы обсудим:
+
+* создание кабеля для параллельного порта (laplink).
+* Соединение двух компьютеров посредством PLIP.
+
+[[network-create-parallel-cable]]
+=== Создание параллельного кабеля
+
+Вы можете приобрести кабель для параллельного порта в большинстве магазинов, торгующих комплектующими. Если вы его не найдете, или же просто хотите знать, как он делается, то следующая таблица поможет вам сделать такой кабель из обычного принтерного кабеля для параллельного порта.
+
+.Распайка кабеля для параллельного порта для сетевой работы
+[cols="1*l,1*l,1*l,1,1*l", frame="none", options="header"]
+|===
+| A-name
+| A-End
+| B-End
+| Описание
+| Post/Bit
+
+|
+
+....
+DATA0
+-ERROR
+....
+|
+
+....
+2
+15
+....
+|
+
+....
+15
+2
+....
+|Data
+|
+
+....
+0/0x01
+1/0x08
+....
+
+|
+
+....
+DATA1
++SLCT
+....
+|
+
+....
+3
+13
+....
+|
+
+....
+13
+3
+....
+|Data
+|
+
+....
+0/0x02
+1/0x10
+....
+
+|
+
+....
+DATA2
++PE
+....
+|
+
+....
+4
+12
+....
+|
+
+....
+12
+4
+....
+|Data
+|
+
+....
+0/0x04
+1/0x20
+....
+
+|
+
+....
+DATA3
+-ACK
+....
+|
+
+....
+5
+10
+....
+|
+
+....
+10
+5
+....
+|Strobe
+|
+
+....
+0/0x08
+1/0x40
+....
+
+|
+
+....
+DATA4
+BUSY
+....
+|
+
+....
+6
+11
+....
+|
+
+....
+11
+6
+....
+|Data
+|
+
+....
+0/0x10
+1/0x80
+....
+
+|GND
+|18-25
+|18-25
+|GND
+|-
+|===
+
+[[network-plip-setup]]
+=== Настройка PLIP
+
+Прежде всего вы должны найти laplink-кабель. Затем удостоверьтесь, что на обоих компьютерах в ядро включена поддержка драйвера man:lpt[4]:
+
+[source,bash]
+....
+# grep lp /var/run/dmesg.boot
+lpt0: <Printer> on ppbus0
+lpt0: Interrupt-driven port
+....
+
+Управление параллельным портом должно выполняться по прерываниям. Файл [.filename]#/boot/device.hints# должен содержать следующие строки:
+
+[.programlisting]
+....
+hint.ppc.0.at="isa"
+hint.ppc.0.irq="7"
+....
+
+Затем проверьте, что файл конфигурации ядра имеет строку `device plip`, или загружен ли модуль ядра [.filename]#plip.ko#. В обоих случаях интерфейс работы с сетью по параллельному порту должен присутствовать на момент использования команды man:ifconfig[8].
+
+[source,bash]
+....
+# ifconfig plip0
+plip0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> mtu 1500
+....
+
+Подключите кабель laplink к параллельным интерфейсам на обоих компьютерах.
+
+Настройте параметры сетевого интерфейса с обеих сторон, работая как пользователь `root`. К примеру, если вы хотите соединить хост `host1`, на котором работает FreeBSD 4.X, с хостом `host2` под управлением FreeBSD 5.X:
+
+[.programlisting]
+....
+ host1 <-----> host2
+IP Address 10.0.0.1 10.0.0.2
+....
+
+Настройте интерфейс на машине `host1`, выполнив:
+
+[source,bash]
+....
+# ifconfig plip0 10.0.0.1 10.0.0.2
+....
+
+Настройте интерфейс на машине `host2`, выполнив:
+
+[source,bash]
+....
+# ifconfig lp0 10.0.0.2 10.0.0.1
+....
+
+Теперь вы должны получить работающее соединение. Пожалуйста, прочтите страницы руководства по man:lp[4] и man:lpt[4] для выяснения деталей.
+
+Вы должны также добавить оба хоста в [.filename]#/etc/hosts#:
+
+[.programlisting]
+....
+127.0.0.1 localhost.my.domain localhost
+10.0.0.1 host1.my.domain host1
+10.0.0.2 host2.my.domain
+....
+
+Чтобы проверить работу соединения, перейдите к каждому хосту и выполните тестирование соединения с другой машиной посредством команды ping. К примеру, на машине `host1`:
+
+[source,bash]
+....
+# ifconfig lp0
+lp0: flags=8851<UP,POINTOPOINT,RUNNING,SIMPLEX,MULTICAST> mtu 1500
+ inet 10.0.0.1 --> 10.0.0.2 netmask 0xff000000
+# netstat -r
+Routing tables
+
+Internet:
+Destination Gateway Flags Refs Use Netif Expire
+host2 host1 UH 0 0 lp0
+# ping -c 4 host2
+PING host2 (10.0.0.2): 56 data bytes
+64 bytes from 10.0.0.2: icmp_seq=0 ttl=255 time=2.774 ms
+64 bytes from 10.0.0.2: icmp_seq=1 ttl=255 time=2.530 ms
+64 bytes from 10.0.0.2: icmp_seq=2 ttl=255 time=2.556 ms
+64 bytes from 10.0.0.2: icmp_seq=3 ttl=255 time=2.714 ms
+
+--- host2 ping statistics ---
+4 packets transmitted, 4 packets received, 0% packet loss
+round-trip min/avg/max/stddev = 2.530/2.643/2.774/0.103 ms
+....
+
+[[network-ipv6]]
+== IPv6
+
+IPv6 (также называемый IPng "IP next generation" - следующее поколение IP) является новой версией широко известного протокола IP (называемого также IPv4). Как и другие современные системы *BSD, FreeBSD включает эталонную реализацию IPv6 от KAME. Так что система FreeBSD поставляется со всем, что вам нужно для экспериментирования с IPv6. Этот раздел посвящён настройке и запуску в работу IPv6.
+
+В начале 1990-х люди стали беспокоиться о быстро иссякающем адресном пространстве IPv4. Принимая во внимание темпы роста Интернет, имелись основные проблемы:
+
+* Нехватка адресов. Сегодня это не такая большая проблема, так как стали применяться адресные пространства для частных сетей (RFC1918) (`10.0.0.0/8`, `172.16.0.0/12` и `192.168.0.0/24`) и технология преобразования сетевых адресов (NAT - Network Address Translation).
+* Таблицы маршрутов становятся чересчур большими. Это всё ещё является проблемой сегодня.
+
+IPv6 решает эти и многие другие вопросы:
+
+* 128-битное адресное пространство. Другими словами, теоретически доступны 340,282,366,920,938,463,463,374,607,431,768,211,456 адреса. Это означает плотность примерно в 6.67 * 10^27 адресов IPv6 на квадратный метр нашей планеты.
+* Маршрутизаторы будут хранить в своих таблицах только агрегированные адреса сетей, что уменьшает средний размер таблицы маршрутизации до 8192 записей.
+
+Имеется также множество других полезных особенностей IPv6, таких, как:
+
+* Автоматическая настройка адреса (http://www.ietf.org/rfc/rfc2462.txt[RFC2462])
+* Групповые адреса ("один к нескольким из многих")
+* Обязательные адреса множественной рассылки
+* IPsec (IP security - безопасный IP)
+* Упрощённая структура заголовка
+* Мобильный IP
+* Механизмы преобразования IPv6-в-IPv4
+
+Для получения дополнительной информации посмотрите:
+
+* Обзор IPv6 на сайте http://playground.sun.com/pub/ipng/html/ipng-main.html[playground.sun.com]
+* http://www.kame.net[KAME.net]
+* http://www.6bone.net[6bone.net]
+
+=== Основы адресации IPv6
+
+Существуют различные типы адресов IPv6: одноадресные (Unicast), групповые (Anycast) и многоадресные (Multicast).
+
+Адреса типа Unicast хорошо всем известны. Пакет, посланный на такой адрес, достигает в точности интерфейса, который этому адресу соответствует.
+
+Адреса типа Anycast синтаксически неотличимы от адресов Unicast, но они адресуют группу интерфейсов. Пакет, направленный такому адресу, попадёт в ближайший (согласно метрике маршрутизатора) интерфейс. Адреса Anycast могут использоваться только маршрутизаторами.
+
+Адреса типа Multicast идентифицируют группу интерфейсов. Пакет, посланный на такой адрес, достигнет всех интерфейсов, привязанных к группе многоадресного вещания.
+
+[NOTE]
+====
+Широковещательные адреса IPv4 (обычно `xxx.xxx.xxx.255`) выражаются адресами многоадресного вещания IPv6.
+====
+
+.Зарезервированные адреса IPv6
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| IPv6 адрес
+| Длина префикса (биты)
+| Описание
+| Заметки
+
+|`::`
+|128 бит
+|нет описания
+|cf. `0.0.0.0` в IPv4
+
+|`::1`
+|128 бит
+|loopback адрес
+|cf. `127.0.0.1` в IPv4
+
+|`::00:xx:xx:xx:xx`
+|96 бит
+|встроенный IPv4
+|Нижние 32 бита это адрес IPv4. Также называется "IPv4 совместимым IPv6 адресом"
+
+|`::ff:xx:xx:xx:xx`
+|96 бит
+|Адрес IPv6, отображенный на IPv4
+|Нижние 32 бита это адрес IPv4. Для хостов, не поддерживающих IPv6.
+
+|`fe80::` - `feb::`
+|10 бит
+|link-local
+|cf. loopback адрес в IPv4
+
+|`fec0::` - `fef::`
+|10 бит
+|site-local
+|
+
+|`ff::`
+|8 бит
+|широковещательный
+|
+
+|`001` (основание 2)
+|3 бит
+|global unicast
+|Все global unicast адреса присваиваются из этого пула. Первые три бита "001".
+|===
+
+=== Чтение адресов IPv6
+
+Каноническая форма представляется в виде `x:x:x:x:x:x:x:x`, где каждый символ "x" является 16-разрядным числом в шестнадцатеричной форме. К примеру, `FEBC:A574:382B:23C1:AA49:4592:4EFE:9982`
+
+Часто в адресе присутствуют длинные строчки, заполненные нулями, поэтому одна такая последовательность на адрес может быть сокращена до "::". Кроме того, до трех ведущих "0" на шестнадцатеричную четверку могут быть пропущены. К примеру, `fe80::1` соответствует канонической форме `fe80:0000:0000:0000:0000:0000:0000:0001`.
+
+В третьей форме последние 32 бита записываются в широко известном (десятичном) стиле IPv4 с точками "." в качестве разделителей. Например, `f2002::10.0.0.1` соответствует (шестнадцатеричному) каноническому представлению `2002:0000:0000:0000:0000:0000:0a00:0001`, которое, в свою очередь, равнозначно записи `2002::a00:1`.
+
+Теперь читатель должен понять следующую запись:
+
+[source,bash]
+....
+# ifconfig
+....
+
+[.programlisting]
+....
+rl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
+ inet 10.0.0.10 netmask 0xffffff00 broadcast 10.0.0.255
+ inet6 fe80::200:21ff:fe03:8e1%rl0 prefixlen 64 scopeid 0x1
+ ether 00:00:21:03:08:e1
+ media: Ethernet autoselect (100baseTX )
+ status: active
+....
+
+`fe80::200:21ff:fe03:8e1%rl0` является автоматически настроенным локальным адресом. Он генерируется из MAC адреса в процессе автоматической конфигурации.
+
+Для получения дополнительной информации о структуре адресов IPv6 обратитесь к http://www.ietf.org/rfc/rfc3513.txt[RFC3513].
+
+=== Настройка подключения
+
+На данный момент существуют четыре способа подключиться к другим хостам и сетям IPv6:
+
+* Подключиться к экспериментальному 6bone
+* Получить сеть IPv6 от вышестоящего провайдера. Для получения рекомендаций обратитесь к вашему провайдеру Интернет.
+* Туннелировать посредством 6-в-4 (http://www.ietf.org/rfc/rfc3068.txt[RFC3068])
+* Использовать порт package:net/freenet6[], если вы используете коммутируемое соединение.
+
+Здесь мы будем рассматривать подключение к 6bone, так как на данный момент это является самым популярным способом.
+
+Сначала взгляните на сайт http://www.6bone.net/[6bone] и найдите ближайшую к вам точку подключения к 6bone. Напишите ответственному и при некоторой удаче вам дадут инструкции по настройке соединения. Обычно это касается настройки туннеля GRE (gif).
+
+Вот типичный пример настройки туннеля man:gif[4]:
+
+[source,bash]
+....
+# ifconfig gif0 create
+# ifconfig gif0
+gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
+# ifconfig gif0 tunnel MY_IPv4_ADDR MY_IPv4_REMOTE_TUNNEL_ENDPOINT_ADDR
+# ifconfig gif0 inet6 alias MY_ASSIGNED_IPv6_TUNNEL_ENDPOINT_ADDR MY_IPv6_REMOTE_TUNNEL_ENDPOINT_ADDR
+....
+
+Замените слова, написанные заглавными буквами, информацией, которую вам дал вышестоящий узел 6bone.
+
+При этом установится туннель. Проверьте работу туннеля утилитой man:ping6[8] с адресом `ff02::1%gif0`. Вы должны получить два положительных ответа.
+
+[NOTE]
+====
+Если вы заинтригованы адресом `ff02:1%gif0`, скажем, что это адрес многоадресного вещания. `%gif0` указывает на использование такого адреса с сетевым интерфейсом [.filename]#gif0#. Так как мы выполняем `ping` над адресом многоадресного вещания, то другая сторона туннеля также должна ответить.
+====
+
+Теперь настройка маршрута к вашей вышестоящей точке подключения 6bone должна быть весьма проста:
+
+[source,bash]
+....
+# route add -inet6 default -interface gif0
+# ping6 -n MY_UPLINK
+....
+
+[source,bash]
+....
+# traceroute6 www.jp.FreeBSD.org
+(3ffe:505:2008:1:2a0:24ff:fe57:e561) from 3ffe:8060:100::40:2, 30 hops max, 12 byte packets
+ 1 atnet-meta6 14.147 ms 15.499 ms 24.319 ms
+ 2 6bone-gw2-ATNET-NT.ipv6.tilab.com 103.408 ms 95.072 ms *
+ 3 3ffe:1831:0:ffff::4 138.645 ms 134.437 ms 144.257 ms
+ 4 3ffe:1810:0:6:290:27ff:fe79:7677 282.975 ms 278.666 ms 292.811 ms
+ 5 3ffe:1800:0:ff00::4 400.131 ms 396.324 ms 394.769 ms
+ 6 3ffe:1800:0:3:290:27ff:fe14:cdee 394.712 ms 397.19 ms 394.102 ms
+....
+
+Эта выдача будет отличаться от машины к машине. Теперь вы должны суметь достигнуть сайта IPv6 http://www.kame.net[www.kame.net] и увидеть танцующую черепаху - в случае, если ваш браузер поддерживает IPv6, как, например, package:www/mozilla[] или Konqueror, который входит в package:x11/kdebase3[], или package:www/epiphany[].
+
+=== DNS в мире IPv6
+
+Для IPv6 использовались два типа записей DNS. IETF объявил записи A6 устаревшими. Стандартом на данный момент являются записи AAAA.
+
+Использование записей AAAA достаточно просто. Назначение вашему имени хоста нового адреса IPv6 достигается просто добавлением:
+
+[.programlisting]
+....
+MYHOSTNAME AAAA MYIPv6ADDR
+....
+
+к вашему первичному файлу DNS зоны. В случае, если вы не обслуживаете собственные зоны DNS, обратитесь к вашему провайдеру DNS. Имеющиеся версии bind (версий 8.3 и 9) и package:dns/djbdns[] (с патчем IPv6) поддерживают записи AAAA.
+
+=== Внесение необходимых изменений в [.filename]#/etc/rc.conf#
+
+==== Настройки клиентов IPv6
+
+Эти установки помогут вам настроить компьютер, который будет работать в сети как клиент, а не как маршрутизатор. Для включения настройки интерфейсов через man:rtsol[8] при загрузке, все, что вам потребуется, это добавить следующую строку:
+
+[.programlisting]
+....
+ipv6_enable="YES"
+....
+
+Для статического присвоения IP адреса, такого как `2001:471:1f11:251:290:27ff:fee0:2093`, интерфейсу [.filename]#fxp0#, добавьте:
+
+[.programlisting]
+....
+ipv6_ifconfig_fxp0="2001:471:1f11:251:290:27ff:fee0:2093"
+....
+
+Для назначения маршрутизатором по умолчанию `2001:471:1f11:251::1`, добавьте следующую строку к [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+ipv6_defaultrouter="2001:471:1f11:251::1"
+....
+
+==== Настройки маршрутизатора/шлюза IPv6
+
+Этот раздел поможет вам использовать инструкции, которые выдал провайдер туннеля, например, http://www.6bone.net/[6bone], и сделать эти настройки постоянными. Для восстановления туннеля при загрузке системы используйте в [.filename]#/etc/rc.conf# нижеприведенные настройки.
+
+Задайте список туннельных интерфейсов (Generic Tunneling interfaces), которые необходимо настроить, например [.filename]#gif0#:
+
+[.programlisting]
+....
+gif_interfaces="gif0"
+....
+
+Для настройки интерфейса с локальным подключением на _MY_IPv4_ADDR_ к удаленной точке _REMOTE_IPv4_ADDR_:
+
+[.programlisting]
+....
+gifconfig_gif0="MY_IPv4_ADDR REMOTE_IPv4_ADDR"
+....
+
+Для включения IPv6 адреса, который был вам присвоен для использования в подключении к туннелю IPv6, добавьте:
+
+[.programlisting]
+....
+ipv6_ifconfig_gif0="MY_ASSIGNED_IPv6_TUNNEL_ENDPOINT_ADDR"
+....
+
+Затем все, что вам потребуется сделать, это добавить маршрут по умолчанию для IPv6. Это другая сторона туннеля IPv6:
+
+[.programlisting]
+....
+ipv6_defaultrouter="MY_IPv6_REMOTE_TUNNEL_ENDPOINT_ADDR"
+....
+
+==== Настройка туннелирования IPv6
+
+Если сервер будет обеспечивать маршрутизацию между вашей сетью и остальным миром, то в файле [.filename]#/etc/rc.conf# понадобится следующая строка:
+
+[.programlisting]
+....
+ipv6_gateway_enable="YES"
+....
+
+=== Распространение маршрутов и автоматическая настройка хостов
+
+Этот раздел поможет вам настроить man:rtadvd[8] для распространения маршрута IPv6 по умолчанию.
+
+Для включения man:rtadvd[8] вам понадобится добавить в [.filename]#/etc/rc.conf# следующую строку:
+
+[.programlisting]
+....
+rtadvd_enable="YES"
+....
+
+Важно указать интерфейс, на котором выполняется запрос маршрутизатора IPv6. Например, для указания man:rtadvd[8] использовать [.filename]#fxp0#:
+
+[.programlisting]
+....
+rtadvd_interfaces="fxp0"
+....
+
+Теперь мы должны создать файл настройки, [.filename]#/etc/rtadvd.conf#. Вот пример:
+
+[.programlisting]
+....
+fxp0:\
+ :addrs#1:addr="2001:471:1f11:246::":prefixlen#64:tc=ether:
+....
+
+Замените [.filename]#fxp0# на интерфейс, который вы будете использовать.
+
+Затем, замените `2001:471:1f11:246::` на префикс вашего размещения.
+
+Если у вас выделенная подсеть `/64`, больше ничего менять не потребуется. Иначе, вам потребуется изменить `prefixlen#` на корректное значение.
+
+[[network-atm]]
+== Асинхронный режим передачи (ATM)
+
+=== Классическая настройка IP через ATM (PVC)
+
+Классический IP через ATM (CLIP) это простейший метод использования асинхронного режима передачи (Asynchronous Transfer Mode, ATM) с IP. Он может быть использован с коммутируемыми подключениями (switched connections, SVC) и с постоянными подключениями (permanent connections, PVC). В этом разделе будет описано как настроить сеть на основе PVC.
+
+==== Полностью объединенные конфигурации
+
+Первый метод для настройки CLIP с PVC это подключение каждого компьютера к каждому в сети с выделенным PVC. Хотя настройка проста, она непрактична для большого количества компьютеров. В примере предполагается, что в сети есть четыре компьютера, каждый подключенный к ATM сети с помощью карты ATM адаптера. Первый шаг это планирование IP адресов и ATM подключений между компьютерами. Мы используем:
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Хост
+| IP адрес
+
+|`hostA`
+|`192.168.173.1`
+
+|`hostB`
+|`192.168.173.2`
+
+|`hostC`
+|`192.168.173.3`
+
+|`hostD`
+|`192.168.173.4`
+|===
+
+Для сборки полностью объединенной сети нам потребуется по одному ATM соединению между каждой парой компьютеров:
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Компьютеры
+| VPI.VCI соединение
+
+|`hostA` - `hostB`
+|0.100
+
+|`hostA` - `hostC`
+|0.101
+
+|`hostA` - `hostD`
+|0.102
+
+|`hostB` - `hostC`
+|0.103
+
+|`hostB` - `hostD`
+|0.104
+
+|`hostC` - `hostD`
+|0.105
+|===
+
+Значения VPI и VCI на каждом конце соединения конечно могут отличаться, но для упрощения мы предполагаем, что они одинаковы. Затем нам потребуется настроить ATM интерфейсы на каждом хосте:
+
+[source,bash]
+....
+hostA# ifconfig hatm0 192.168.173.1 up
+hostB# ifconfig hatm0 192.168.173.2 up
+hostC# ifconfig hatm0 192.168.173.3 up
+hostD# ifconfig hatm0 192.168.173.4 up
+....
+
+предполагая, что ATM интерфейс называется [.filename]#hatm0# на всех хостах. Теперь PVC необходимо настроить на `hostA` (мы предполагаем, что ATM коммутаторы уже настроены, вам необходимо свериться с руководством на коммутатор за информацией по настройке).
+
+[source,bash]
+....
+hostA# atmconfig natm add 192.168.173.2 hatm0 0 100 llc/snap ubr
+hostA# atmconfig natm add 192.168.173.3 hatm0 0 101 llc/snap ubr
+hostA# atmconfig natm add 192.168.173.4 hatm0 0 102 llc/snap ubr
+
+hostB# atmconfig natm add 192.168.173.1 hatm0 0 100 llc/snap ubr
+hostB# atmconfig natm add 192.168.173.3 hatm0 0 103 llc/snap ubr
+hostB# atmconfig natm add 192.168.173.4 hatm0 0 104 llc/snap ubr
+
+hostC# atmconfig natm add 192.168.173.1 hatm0 0 101 llc/snap ubr
+hostC# atmconfig natm add 192.168.173.2 hatm0 0 103 llc/snap ubr
+hostC# atmconfig natm add 192.168.173.4 hatm0 0 105 llc/snap ubr
+
+hostD# atmconfig natm add 192.168.173.1 hatm0 0 102 llc/snap ubr
+hostD# atmconfig natm add 192.168.173.2 hatm0 0 104 llc/snap ubr
+hostD# atmconfig natm add 192.168.173.3 hatm0 0 105 llc/snap ubr
+....
+
+Конечно, вместо UBR может быть использован другой тип, если ATM адаптер поддерживает это. В этом случае имя типа дополняется параметрами трафика. Помощь по man:atmconfig[8] может быть получена командой:
+
+[source,bash]
+....
+# atmconfig help natm add
+....
+
+или на странице справочника man:atmconfig[8].
+
+Та же настройка может быть выполнена через [.filename]#/etc/rc.conf#. Для `hostA` это будет выглядеть примерно так:
+
+[.programlisting]
+....
+network_interfaces="lo0 hatm0"
+ifconfig_hatm0="inet 192.168.173.1 up"
+natm_static_routes="hostB hostC hostD"
+route_hostB="192.168.173.2 hatm0 0 100 llc/snap ubr"
+route_hostC="192.168.173.3 hatm0 0 101 llc/snap ubr"
+route_hostD="192.168.173.4 hatm0 0 102 llc/snap ubr"
+....
+
+Текущий статус всех маршрутов CLIP может быть получен командой:
+
+[source,bash]
+....
+hostA# atmconfig natm show
+....
diff --git a/documentation/content/ru/books/handbook/audit/_index.adoc b/documentation/content/ru/books/handbook/audit/_index.adoc
new file mode 100644
index 0000000000..43c69ec804
--- /dev/null
+++ b/documentation/content/ru/books/handbook/audit/_index.adoc
@@ -0,0 +1,406 @@
+---
+title: Глава 16. Аудит событий безопасности
+part: Часть III. Системное администрирование
+prev: books/handbook/mac
+next: books/handbook/disks
+---
+
+[[audit]]
+= Аудит событий безопасности
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 16
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/audit/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/audit/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/audit/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[audit-synopsis]]
+== Краткий обзор
+
+Операционная система FreeBSD включает в себя поддержку аудита событий безопасности. Аудит позволяет выполнять надежное, детальное и гибко настраиваемое протоколирование различных событий, связанных с безопасностью, включая входы в систему, изменения конфигурации, доступ к файлам и сети. Эти записи могут быть незаменимы для мониторинга функционирующей системы, обнаружения вторжений и для анализа событий, приведших к краху системы. В FreeBSD реализован опубликованный Sun(TM) интерфейс прикладного программирования (Application Programming Interface, API), называемый Basic Security Module (BSM), и формат файла, который совместим с реализациями аудита в Solaris(TM) и Mac OS(R) X.
+
+В этой главе описывается процесс установки и конфигурирования системы аудита. В том числе, приводится разъяснение политик аудита, а также даются примеры конфигурационных файлов.
+
+После прочтения этой главы вы будете знать:
+
+* Что такое система аудита и как она работает.
+* Как настроить аудит во FreeBSD для мониторинга пользователей и процессов.
+* Как просматривать журнал аудита при помощи инструментов просмотра и фильтрации (reduction).
+
+Перед прочтением этой главы вы должны:
+
+* Понимать основы UNIX(R) и FreeBSD (crossref:basics[basics, Основы UNIX]).
+* Уметь конфигурировать и компилировать ядро (crossref:kernelconfig[kernelconfig, Настройка ядра FreeBSD]).
+* Понимать основные принципы безопасности в применении к операционной системе FreeBSD (crossref:security[security, Безопасность]).
+
+[WARNING]
+====
+
+Реализация аудита имеет известные ограничения. Не все события в настоящий момент протоколируемые. Также, некоторые механизмы входа в систему, такие как оконные менеджеры X11 или демоны от сторонних производителей, не настраивают аудит пользовательских сессий должным образом.
+
+Использование системы аудита может привести к генерированию изобилующих подробностями журнальных файлов. Их размер на загруженных серверах в некоторых конфигурациях может превышать несколько гигабайт в неделю. Администраторы должны принимать во внимание требования к дисковому пространству для нагруженных конфигураций системы аудита. Например, желательно выделить отдельный раздел для файловой системы аудита [.filename]#/var/audit#, чтобы заполнение раздела аудита не влияло на другие файловые системы.
+====
+
+[[audit-inline-glossary]]
+== Ключевые понятия
+
+Следующие термины относятся к аудиту событий безопасности:
+
+* _событие_ (event): событие, которое может быть занесено в журнал. Примерами событий, относящихся к безопасности системы, являются: создание файла, инициализацию сетевого соединения, вход пользователя в систему. События разделяются на "приписываемые" (attributable) - те, которые могут быть отнесены к конкретному пользователю - и "неприписываемые" (non-attributable). Пример неприписываемого события - любое событие, произошедшее до аутентификации пользователя, например, неверно набранный пароль.
+* _класс_ (class): именованные наборы однотипных событий, которые используются в выражениях выбора. Часто используемые классы событий включают "создание файла" (fc), "выполнение файла" (ex) и "события входа в систему и выхода из нее" (lo).
+* _запись_ (record): единичная запись в журнале, описывающая то или иное событие. Записи содержат информацию о типе события, информацию о субъекте события (пользователе), который выполнил некоторое действие, дату и время события, информацию об объектах и аргументах события, а также информацию об успешности или неуспешности выполнения операции.
+* _журнал_ (trail): файл, содержащий последовательность записей аудита, описывающих события безопасности (security events). Журнал содержит записи в ориентировочно хронологическом порядке по времени завершения события. Только авторизованные процессы могут добавлять записи в журнал.
+* _выражение выбора_ (selection expression): строка, содержащая список префиксов и имен классов, используемая для выбора группы событий.
+* _предварительный выбор_ (preselection): процесс, с помощью которого система определяет, какие события имеют важность для администратора. Предварительный выбор использует ряд выражений выбора, задающих какие именно классы событий и для какого пользователя необходимо вносить в журнал, а также - глобальные настройки, которые будут применяться как для авторизованных, так и для неавторизованных процессов.
+* _фильтрация_ (reduction): процесс, в результате которого записи из существующего журнала выделяются для хранения, распечатки или анализа. Также, это процесс, в результате которого нежелательные записи удаляются из журнала аудита. Используя фильтрацию, администраторы могут реализовывать различные политики хранения данных аудита. Например, детализированный журнал может храниться месяц, но после этого он может быть сокращен чтобы хранить только информацию о входе в систему и выходе из нее.
+
+[[audit-config]]
+== Настройка системы аудита
+
+Пользовательская часть системы аудита входит в базовую систему FreeBSD, системная часть включена в ядро [.filename]#GENERIC#, старт демона man:auditd[8] активируется включением следующей записи в [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+auditd_enable="YES"
+....
+
+Затем нужно запустить демон аудита:
+
+[source,bash]
+....
+# service auditd start
+....
+
+Пользователям, предпочитающим строить специализированное ядро, необходимо включить следующую запись в файл конфигурации ядра:
+
+[.programlisting]
+....
+options AUDIT
+....
+
+=== Выражения выбора событий
+
+Выражения выбора используются в нескольких местах конфигурации для отбора событий, подлежащих аудиту. Выражения содержат перечень классов событий, с которым сравнивается происшедшее событие. Выражения выбора рассматриваются слева направо, и два выражения объединяются добавлением первого выражения ко второму.
+
+<<event-selection>> перечисляет имеющиеся по умолчанию записи:
+
+[[event-selection]]
+.Классы событий системы аудита
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Имя класса
+| Расшифровка
+| Действие
+
+|all
+|all
+|Соответствует всем классам событий.
+
+|aa
+|authentication and authorization
+|
+
+|ad
+|administrative
+|Аудит административных действий, произошедших в системе.
+
+|ap
+|application
+|События, определяемые каким-либо приложением.
+
+|cl
+|file close
+|Аудит вызовов системной функции `close`.
+
+|ex
+|exec
+|Аудит запуска приложения. Аудит аргументов командной строки и переменных окружения контролируется через man:audit_control[5] используя параметры `argv` и `envv` в опции `policy`.
+
+|fa
+|file attribute access
+|Аудит доступа к атрибутам объектов, например таких как man:stat[1], man:pathconf[2].
+
+|fc
+|file create
+|Аудит событий, в результате которых создаются файлы.
+
+|fd
+|file delete
+|Аудит событий, в результате которых удаляются файлы.
+
+|fm
+|file attribute modify
+|Аудит событий, в результате которых изменяются атрибуты файлов, например, man:chown[8], man:chflags[1], man:flock[2].
+
+|fr
+|file read
+|Аудит событий, в результате которых происходит чтение данных или открываются файлы на чтение.
+
+|fw
+|file write
+|Аудит событий, в результате которых происходит запись данных, запись или изменение файлов.
+
+|io
+|ioctl
+|Аудит вызовов системной функции man:ioctl[2].
+
+|ip
+|ipc
+|Аудит различных видов взаимодействия процессов, включая создание неименованных каналов (POSIX pipe) и взаимодействие процессов в стиле System V IPC.
+
+|lo
+|login_logout
+|Аудит событий man:login[1] и man:logout[1].
+
+|na
+|non attributable
+|Аудит неприписываемых событий.
+
+|no
+|invalid class
+|Не соответствует никаким событиям аудита.
+
+|nt
+|network
+|Аудит событий, связанных с сетевыми подключениями, например man:connect[2] и man:accept[2].
+
+|ot
+|other
+|Аудит различных событий.
+
+|pc
+|process
+|Аудит действий процессов, таких как man:exec[3] и man:exit[3].
+|===
+
+Эти классы событий могут быть настроены изменением конфигурационных файлов [.filename]#audit_class# и [.filename]#audit_event#.
+
+Каждый класс аудита можно скомбинировать с префиксом, показывающим, какие операции будут учитываться - удачные или неудачные, а также то, включает ли данная запись аудит для данного класса и типа, либо отключает его. <<event-prefixes>> обобщает доступные префиксы:
+[[event-prefixes]]
+.Префиксы классов аудита событий
+[cols="1,1", frame="none", options="header"]
+|===
+| Префикс
+| Действие
+
+|+
+|Аудит успешных событий в данном классе.
+
+|-
+|Аудит ошибочных событий в данном классе.
+
+|^
+|Отключение аудита как успешных, так и ошибочных событий в данном классе.
+
+|^+
+|Отключение аудита успешных событий в данном классе.
+
+|^-
+|Отключение аудита ошибочных событий в данном классе.
+|===
+
+Если префикс не указан, то аудиту подлежат как успешные, так и неуспешные события.
+
+Следующий пример выбирает успешные и неуспешные события входа в систему и выхода из нее, и только успешные события выполнения приложения:
+
+[.programlisting]
+....
+lo,+ex
+....
+
+=== Конфигурационные файлы
+
+В каталоге [.filename]#/etc/security# находятся следующие конфигурационные файлы системы аудита:
+
+* [.filename]#audit_class#: содержит определения классов аудита.
+* [.filename]#audit_control#: контроллирует некоторые аспекты системы аудита, такие как классы по умолчанию, минимальное дисковое пространство, которое должно оставаться на разделе журнала аудита, максимальный размер журнала аудита.
+*
++
+[.filename]#audit_event#: связывает идентификаторы событий (eventnum) с их текстовыми именами, описаниями и классами событий.
+* [.filename]#audit_user#: уточняет настройки аудита для конкретных пользователей; они комбинируются с глобальными настройками при входе пользователя в систему.
+* [.filename]#audit_warn#: настраиваемый скрипт командного интерпретатора, который вызывается man:auditd[8] для генерации предупреждений в исключительных ситуациях, таких как исчерпание дискового пространства записями аудита или при ротации журнала аудита.
+
+[WARNING]
+====
+
+Файлы конфигурации аудита должны редактироваться и изменяться с осторожностью, так как ошибки в конфигурации могут привести к сохранению бесполезных записей.
+====
+
+В большинстве случаев администратору придется вносить изменения только в два конфигурационных файла системы аудита: [.filename]#audit_control# и [.filename]#audit_user#. Первый из них содержит общие настройки системы аудита, второй может использоваться для уточнения настроек аудита для конкретных пользователей.
+
+[[audit-auditcontrol]]
+==== Файл [.filename]#audit_control#
+
+Ниже приведен перечень настроек по умолчанию, содержащихся в [.filename]#audit_control#:
+
+[.programlisting]
+....
+dir:/var/audit
+dist:off
+flags:lo,aa
+minfree:5
+naflags:lo,aa
+policy:cnt,argv
+filesz:2M
+expire-after:10M
+....
+
+Запись `dir` используется для установки одного или более каталогов, в которых будет сохраняться журнал системы аудита. Если указан более чем один каталог, то указанные каталоги будут использоваться по очереди, по мере заполнения. Как правило, система аудита настраивается на хранение журнала аудита на отдельном разделе, чтобы предотвратить взаимное влияние подсистемы аудита и остальных подсистем в случае исчерпания свободного места на разделе.
+
+Если опция `dist` имеет значение `on` или `yes`, то для всех журналов аудита будут создаваться жесткие ссылки, сохраняемые в [.filename]#/var/audit/dist#.
+
+Запись `flags` используется для установки глобальной маски предварительного выбора для приписываемых событий. В примере выше аудиту будут подвергаться как успешные, так и неудачные попытки входа в систему и выхода из нее, а также - аутентификация и авторизация для всех пользователей.
+
+Запись `minfree` определяет минимальное количество свободного дискового пространства на разделе, в который сохраняются файлы журналов аудита.
+
+Запись `naflags` определяет классы аудита для неприписываемых событий, например, процессов входа в систему и системных демонов.
+
+Запись `policy` определяет разделяемый запятыми список флагов политики, определяющей различные аспекты поведения аудита. Флаг `cnt` указывает, что система должна продолжать работать, несмотря на ошибки аудита (данный флаг настоятельно рекомендуется). Второй флаг, `argv`, заставляет подвергать аудиту аргументы командной строки при вызове системного вызова man:execve[2].
+
+Запись `filesz` определяет максимальный размер журнала событий аудита, по достижении которого журнал будет автоматически закончен и подвергнут ротации. Значение `0` запрещает автоматическую ротацию логов. Если указанный размер ниже минимального значения 512К, то он будет проигнорирован, и будет сгенерировано предупреждающее сообщение в логах.
+
+Поле `expire-after` определяет момент времени, при достижении которого журнальные файлы считаются неактуальными и удаляются.
+
+[[audit-audituser]]
+==== Файл [.filename]#audit_user#
+
+Администратор может определить дополнительные требования к аудиту для конкретных пользователей в файле [.filename]#audit_user#. Каждая строка позволяет уточнить настройки аудита для пользователя при помощи двух полей: `alwaysaudit` - определяющее набор событий, которые должны всегда подвергаться аудиту для данного пользователя, и `neveraudit` - перечисляющее набор событий, которые никогда не должны подвергаться аудиту для пользователя.
+
+Нижеследующий пример настраивает аудит всех событий входа в систему, выхода из системы, а также аудит всех успешных выполнений команд для пользователя `root`, а также - аудит всех событий, связанных с созданием файлов и успешным выполнением команд пользователем `www`. С настройками по умолчанию в [.filename]#audit_control# запись `lo` для `root` является избыточной, кроме того, события входа в систему и выхода из системы будут подвергаться аудиту и для пользователя `www`.
+
+[.programlisting]
+....
+root:lo,+ex:no
+www:fc,+ex:no
+....
+
+[[audit-administration]]
+== Работа с журналами аудита
+
+Так как журнал аудита хранится в бинарном формате BSM, то для его изменения или перевода в текстовый формат предоставляются встроенные утилиты. Утилита `praudit` преобразует журнал аудита в текстовый формат. Утилита `auditreduce` применяется для фильтрации журнальных записей с целью анализа, архивирования или распечатки. Последняя утилита поддерживает разнообразие параметров, позволяющих выбирать записи по типу события, по классу события, по пользователю, по дате или времени события, по пути к файлу или по объекту, над которым производилось действие.
+
+Например, для отображения всего содержимого журнала аудита в текстовом формате выполните:
+
+[source,bash]
+....
+# praudit /var/audit/AUDITFILE
+....
+
+В данном примере _AUDITFILE_ - журнал, который будет выведен в текстовом формате.
+
+Журнал аудита состоит из серии записей, которые, в свою очередь состоят из элементов, которые команда `praudit` выводит последовательно - по одному на строку. Каждый элемент имеет определенный тип, например `header` (содержит заголовок записи) или `path` (полный путь к файлу). Следующий пример показывает запись для события `execve`:
+
+[.programlisting]
+....
+header,133,10,execve(2),0,Mon Sep 25 15:58:03 2006, + 384 msec
+exec arg,finger,doug
+path,/usr/bin/finger
+attribute,555,root,wheel,90,24918,104944
+subject,robert,root,wheel,root,wheel,38439,38032,42086,128.232.9.100
+return,success,0
+trailer,133
+....
+
+Эта запись отражает результат успешного выполнения системного вызова `execve`, который стал результатом выполнения команды `finger doug`. В элементе записи `exec arg` есть командная строка, которую оболочка передала ядру. Элемент `path` содержит путь к исполняемому файлу в представлении ядра. Элемент `attribute` описывает исполняемый файл, а также права доступа файла. Элемент `subject` описывает ID аудируемого пользователя, исполняющие (effective) UID и GID, реальные ID пользователя и группы, идентификатор процесса, идентификатор сессии, порт и адрес, с которого был осуществлен вход в систему. Обратите внимание: идентификатор аудируемого пользователя и реальный идентификатор пользователя отличаются, так как пользователь `robert` повысил привилегии до пользователя `root` перед выполнением команды, но система аудита занесла его действия в журнал используя изначальный идентификатор. Элемент `return` описывает успешное выполнение операции, а элемент `trailer` завершает запись.
+
+Указав аргумент `-x` можно получить вывод в формате XML.
+
+Поскольку логи системы аудита могут иметь огромный размер, возможно выделить только часть записей при помощи `auditreduce`. В следующем примере из [.filename]#AUDITFILE# выбираются все записи, касающиеся пользователя `trhodes`:
+
+[source,bash]
+....
+# auditreduce -u trhodes /var/audit/AUDITFILE | praudit
+....
+
+Члены группы `audit` имеют доступ на чтение к журналу аудита, находящемуся в [.filename]#/var/audit#. По умолчанию эта группа пуста, и только `root` имеет к ним доступ. Для того, чтобы дать пользователю права на чтение журнала, его необходимо добавить в группу `audit`. Право на чтение журнала аудита позволяет получить множество информации о поведении пользователей и процессов, поэтому рекомендуется делегировать права на чтение журнала аудита с большой осторожностью.
+
+=== Мониторинг системы в реальном времени с использованием потоков аудита
+
+Потоки системы аудита - клонирующиеся псевдоустройства, позволяющие приложениям просматривать в реальном времени поток событий аудита. В первую очередь, это должно заинтересовать авторов программ определения вторжений и мониторинга системы. Тем не менее, для администратора поток системы аудита предоставляет возможность организовать наблюдение за системой, избежав проблем с правами доступа на журнал аудита или с прерыванием потока событий из-за ротации журнала. Для отслеживания потока событий аудита в реальном времени, выполните:
+
+[source,bash]
+....
+# praudit /dev/auditpipe
+....
+
+По умолчанию, потоки доступны только пользователю `root`. Чтобы сделать их доступными членам группы `audit`, добавьте правило `devfs` в файл [.filename]#/etc/devfs.rules#:
+
+[.programlisting]
+....
+add path 'auditpipe*' mode 0440 group audit
+....
+
+Обратитесь к man:devfs.rules[5] за более полной информацией о настройке файловой системы `devfs`.
+
+[WARNING]
+====
+
+Довольно легко создать зацикленный поток событий аудита, в котором просмотр каждого события порождает несколько событий аудита. Например, если аудиту подвергаются все операции сетевого ввода-вывода, и команда `praudit` запущена во время SSH-сессии, то будет сгенерирован интенсивный поток сообщений аудита, так как каждое печатаемое событие вызовет еще одно событие. По этой причине рекомендуется запускать `praudit` на устройстве потока только из сессий, для которых нет детального аудита ввода-вывода.
+====
+
+=== Ротация и сжатие журнальных файлов аудита
+
+Журнал аудита пишется ядром и управляется демоном аудита man:auditd[8]. Администраторам не следует пытаться использовать man:newsyslog.conf[5] или другие инструменты для прямой ротации логов. Вместо этого, для прекращения аудита, реконфигурации и ротации журнальных файлов должна использоваться команда `audit`. Следующая команда приведет к созданию нового журнального файла и даст указание ядру переключиться на запись в этот файл. Протоколирование в старый файл будет прекращено, а сам файл - переименован, в результате чего с ним можно будет работать администратору:
+
+[source,bash]
+....
+# audit -n
+....
+
+Если man:auditd[8] не запущен, то эта команда окончится неудачей, и будет выведено сообщение об ошибке.
+
+Добавление следующей строки в файл [.filename]#/etc/crontab# приведет к ротации каждые двенадцать часов:
+
+[.programlisting]
+....
+0 */12 * * * root /usr/sbin/audit -n
+....
+
+Изменения вступят в силу после сохранения файла [.filename]#/etc/crontab#.
+
+Автоматическая ротация журнальных файлов на основании их размера возможна при использовании опции `filesz` в файле [.filename]#audit_control#, которая описана в <<audit-auditcontrol>>.
+
+Поскольку журнальные файлы могут достигать очень больших размеров, может возникнуть необходимость сжимать их в целях хранения сразу же после закрытия их демоном аудита. Для выполнения определенных пользователем действий, соответствующих разнообразным событиям системы аудита, включая нормальное завершение журналов аудита при их ротации, может быть использован скрипт [.filename]#audit_warn#. Например, добавление следующих строк в файл [.filename]#/etc/security/audit_warn# приведет к сжатию файла аудита после его закрытия:
+
+[.programlisting]
+....
+#
+# Compress audit trail files on close.
+#
+if [ "$1" = closefile ]; then
+ gzip -9 $2
+fi
+....
+
+Примерами других действий могут быть копирование файлов аудита на централизованный сервер, удаление старых журнальных файлов, фильтрация журнальных файлов для удаления ненужных записей. Скрипт будет запущен только при корректном закрытии журнала системой аудита и не запустится для журнальных файлов, запись в которые была прекращена в результате некорректного завершения.
diff --git a/documentation/content/ru/books/handbook/basics/_index.adoc b/documentation/content/ru/books/handbook/basics/_index.adoc
new file mode 100644
index 0000000000..ac5041a83a
--- /dev/null
+++ b/documentation/content/ru/books/handbook/basics/_index.adoc
@@ -0,0 +1,1732 @@
+---
+title: Глава 4. Основы UNIX
+part: Часть I. В начале
+prev: books/handbook/bsdinstall
+next: books/handbook/ports
+---
+
+[[basics]]
+= Основы UNIX
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 4
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../../images/books/handbook/basics/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/basics/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/basics/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[basics-synopsis]]
+== Краткий обзор
+
+В этой главе мы попытаемcя раскрыть основные принципы и команды операционной системы FreeBSD. Большая часть нижеизложенного материала в более или менее равной степени применима к любой UNIX(R)-подобной операционной системе. Если вы уверены, что не найдете здесь ничего нового для себя, можете смело пропустить эту главу. Если же вы новичок, мы настоятельно рекомендуем внимательно прочесть это главу.
+
+Прочитав эту главу, вы узнаете:
+
+* Как использовать "виртуальные консоли" FreeBSD.
+* Как работают права доступа на файлы в UNIX(R) и как следует интерпретировать флаги файлов в ОС FreeBSD.
+* Иерархия каталогов FreeBSD.
+* Организация дисков FreeBSD.
+* Как монтировать и размонтировать файловые системы.
+* Что такое процессы, даемоны и сигналы.
+* Что такое командная оболочка (или интерпретатор команд) и как настроить личное рабочее окружение.
+* Как пользоваться стандартными текстовыми редакторами.
+* Что такое устройства и файлы устройств.
+* Какие бинарные форматы используются в FreeBSD.
+* Как пользоваться справочным руководством для получения дополнительной информации.
+
+[[consoles]]
+== Виртуальные консоли и терминалы
+
+FreeBSD можно использовать разными способами. Один из них - набор команд в текстовом терминале. Используйте этот способ, и вся гибкость и мощь систем UNIX(R) будет в ваших руках. Этот раздел рассказывает о "терминалах", "консолях" и их использовании в FreeBSD.
+
+[[consoles-intro]]
+=== Консоль
+
+Если во время установки вы не настроили FreeBSD для автоматического запуска графической среды при загрузке, система запросит ввод логина сразу после завершения стартовых скриптов. Вы увидите примерно следующее:
+
+[source,bash]
+....
+Additional ABI support:.
+Local package initialization:.
+Additional TCP options:.
+
+Fri Sep 20 13:01:06 EEST 2002
+
+FreeBSD/i386 (pc3.example.org) (ttyv0)
+
+login:
+....
+
+В вашей системе сообщение может быть другим, но очень похожим на это. В данный момент нас интересуют последние две строки. Вторая с конца строка:
+
+[.programlisting]
+....
+FreeBSD/i386 (pc3.example.org) (ttyv0)
+....
+
+В этой строке содержится немного информации о только что загруженной системе. Это консоль "FreeBSD", работающей на Intel или совместимом процессоре x86 архитектуры. Имя этого компьютера (у каждого компьютера UNIX(R) есть имя) `pc3.example.org`, и в данный момент вы видите системную консоль - терминал [.filename]#ttyv0#.
+
+Наконец, последняя строка всегда:
+
+[.programlisting]
+....
+login:
+....
+
+Здесь вам предлагается ввести "имя пользователя", чтобы войти в FreeBSD. Следующий раздел описывает способ, которым вы можете сделать это.
+
+[[consoles-login]]
+=== Вход в FreeBSD
+
+FreeBSD это многопользовательская, многопроцессорная система. Это формальное описание системы, которая может быть использована множеством разных людей, одновременно запускающих большое количество программ на одном компьютере.
+
+Любой многопользовательской системе нужен способ отличать каждого "пользователя" от остальных. В FreeBSD (и всех UNIX(R)-подобных операционных системах), эта задача решается путем "входа" пользователя в систему перед запуском каких-либо программ. У каждого пользователя есть уникальное имя ("имя пользователя") и персональный, секретный ключ ("пароль"). Перед тем, как разрешить пользователю выполнять какие-либо программы, FreeBSD запрашивает их оба.
+
+Сразу после загрузки FreeBSD и завершения работы стартовых скриптов, система предложит вам ввести имя пользователя:
+
+[source,bash]
+....
+login:
+....
+
+В этом примере, предположим что ваше имя пользователя `john`. Введите `john` в этом приглашении и нажмите kbd:[Enter]. Далее должно появиться приглашение ввести "пароль":
+
+[source,bash]
+....
+login: john
+Password:
+....
+
+Введите соответствующий имени `john` пароль и нажмите kbd:[Enter]. Пароль _не виден_! Не беспокойтесь об этом. Это сделано по соображениям безопасности.
+
+Если вы ввели пароль правильно, то сразу же войдете в FreeBSD и можете начать выполнять команды.
+
+Вы увидите сообщение дня (MOTD, или message of the day) за которым последует командная строка (с символом `#`, `$`, или `%`). Это означает, что вы успешно вошли в FreeBSD.
+
+[[consoles-virtual]]
+=== Множественные консоли
+
+Запуск команд UNIX(R) из консоли - это конечно хорошо, но FreeBSD может выполнять множество программ одновременно, поэтому наличие одной консоли может быть недостатком. В таком случае очень полезны "виртуальные консоли".
+
+FreeBSD может быть настроена для работы с несколькими виртуальными консолями. Вы можете переключаться с одной виртуальной консоли на другую, нажимая соответствующие сочетания клавиш на клавиатуре. У каждой консоли есть свой канал вывода и FreeBSD заботится о том, чтобы правильно перенаправить ввод с клавиатуры и вывод на монитор, как только вы переключитесь с одной консоли на другую.
+
+Для переключения между консолями зарезервированы специальные комбинации клавиш. Вы можете использовать сочетания kbd:[Alt+F1], kbd:[Alt+F2], до kbd:[Alt+F8] чтобы переключаться между различными виртуальными консолями в FreeBSD.
+
+При переключении от одной консоли к другой, FreeBSD заботится о сохранении и восстановлении вывода на экран. Результатом является "иллюзия" наличия множества "виртуальных" экранов и клавиатур, которые могут быть использованы для ввода и запуска команд FreeBSD. Программы, которые вы запускаете на одной виртуальной консоли, не прекращают выполнение, когда консоль становится невидимой. Они продолжают выполняться, когда вы переключаетесь на другую виртуальную консоль.
+
+[[consoles-ttys]]
+=== Файл [.filename]#/etc/ttys#
+
+В конфигурации по умолчанию FreeBSD запускает восемь виртуальных консолей. Тем не менее, это не ограничение оборудования, и вы можете легко настроить систему для загрузки большего или меньшего числа виртуальных консолей. Число и параметры виртуальных консолей задаются в файле [.filename]#/etc/ttys#.
+
+Вы можете использовать это файл для настройки виртуальных консолей FreeBSD. Любая не закомментированная строка в этом файле (строка, не начинающаяся с символа `#`), содержит настройки для одного терминала или виртуальной консоли. Версия этого файла по умолчанию, поставляемая с FreeBSD, содержит настройки для девяти виртуальных консолей и включает восемь терминалов. Это строки, начинающиеся с `ttyv`:
+
+[.programlisting]
+....
+# name getty type status comments
+#
+ttyv0 "/usr/libexec/getty Pc" cons25 on secure
+# Virtual terminals
+ttyv1 "/usr/libexec/getty Pc" cons25 on secure
+ttyv2 "/usr/libexec/getty Pc" cons25 on secure
+ttyv3 "/usr/libexec/getty Pc" cons25 on secure
+ttyv4 "/usr/libexec/getty Pc" cons25 on secure
+ttyv5 "/usr/libexec/getty Pc" cons25 on secure
+ttyv6 "/usr/libexec/getty Pc" cons25 on secure
+ttyv7 "/usr/libexec/getty Pc" cons25 on secure
+ttyv8 "/usr/X11R6/bin/xdm -nodaemon" xterm off secure
+....
+
+За детальным описанием каждой колонки этого файла и всех опций, которые можно указать для настройки виртуальных консолей, обращайтесь к man:ttys[5].
+
+[[consoles-singleuser]]
+=== Консоль в однопользовательском режиме
+
+Детальное описание "однопользовательского режима" можно найти в crossref:boot[boot-singleuser,Однопользовательский режим]. Стоит отметить, что при работе FreeBSD в однопользовательском режиме есть только одна консоль. Виртуальных консолей нет. Установки консоли в однопользовательском режиме можно найти в файле [.filename]#/etc/ttys#. Обратите внимание на строку, начинающуюся с `console`:
+
+[.programlisting]
+....
+# name getty type status comments
+#
+# If console is marked "insecure", then init will ask for the root password
+# when going to single-user mode.
+console none unknown off secure
+....
+
+[NOTE]
+====
+Как сказано в комментариях выше строки `console`, можно отредактировать эту строку и изменить `secure` на `insecure`. Если вы сделаете это, FreeBSD даже при загрузке в однопользовательском режиме будет запрашивать пароль `root`.
+
+__Будьте осторожны при изменении этого значения на ``insecure``__. Если вы забудете пароль `root`, загрузка в однопользовательский режим сильно усложнится. Это все еще возможно, но несколько более сложно для тех, кто еще не очень освоился с процессом загрузки FreeBSD и вызова программ.
+====
+
+[[consoles-vidcontrol]]
+=== Изменение видеорежимов консоли
+
+Установленный по умолчанию размер изображения для консоли FreeBSD может быть изменен до значения 1024x768, 1280x1024, или любого другого, который поддерживается вашим монитором и видеокартой. Для того, чтобы задействовать иной видеорежим, вам прежде всего необходимо будет пересобрать ядро вашей системы, добавив в файл конфигурации две дополнительные опции:
+
+[.programlisting]
+....
+options VESA
+options SC_PIXEL_MODE
+....
+
+После пересборки и установки ядра воспользуйтесь утилитой man:vidcontrol[1] для определения видеорежимов, поддерживаемых вашим оборудованием. Чтобы получить перечень видеорежимов, выполните следующую команду:
+
+[source,bash]
+....
+# vidcontrol -i mode
+....
+
+Команда отобразит список поддерживаемых видеорежимов. Теперь вы можете выбрать один из них и установить его на консоли при помощи man:vidcontrol[1]:
+
+[source,bash]
+....
+# vidcontrol MODE_279
+....
+
+Если новый видеорежим вас устраивает, то его можно определить устанавливаемым автоматически во время старта системы, для чего добавьте в [.filename]#/etc/rc.conf# следующую строку:
+
+[.programlisting]
+....
+allscreens_flags="MODE_279"
+....
+
+[[users-synopsis]]
+== Пользователи и основы управления учетными записями
+
+FreeBSD допускает одновременную работу множества пользователей на одном компьютере. В то время, как только один пользователь может сидеть за клавиатурой и перед экраном в один момент времени, любое количество пользователей может войти в систему через сеть. Для использования системы у каждого пользователя должна быть учетная запись.
+
+В этом разделе описаны:
+
+* Разные типы учетных записей в системе FreeBSD.
+* Как добавлять, удалять и изменять учетные записи пользователей.
+* Как устанавливать ограничения на использование ресурсов для учетных записей или групп учетных записей.
+* Как использовать группы для упрощения управлением учетными записями.
+
+[[users-introduction]]
+=== Разновидности учетных записей
+
+Так как доступ к системе FreeBSD осуществляется через учетные записи, и все процессы запускаются пользователями, то управление пользователями и учетными записями является важным аспектом администрирования.
+
+Существует три разновидности учетных записей: системные учетные записи, учетные записи пользователей и суперпользователь.
+
+[[users-system]]
+==== Системные учетные записи
+
+Системные учетные записи предназначены для запуска сервисов, таких как DNS, почта, веб серверы. Это необходимо по соображениям безопасности; если бы все сервисы работали от суперпользователя, они могли бы действовать без ограничений.
+
+Примеры системных учетных записей: `daemon`, `operator`, `bind`, `news` и `www`.
+
+`nobody` это общепринятая непривилегированная системная учетная запись. Однако, чем больше сервисов используют `nobody`, тем больше файлов и процессов связано с этим пользователем, и следовательно тем больше привилегий появляется у этого пользователя.
+
+[[users-user]]
+==== Учетные записи пользователей
+
+Учетные записи пользователей служат для предоставления доступа к системе обычным людям. Каждый человек, имеющий доступ к системе, должен иметь уникальную учетную запись пользователя. Это позволяет администратору выяснять кто что делает и предотвращает сбивание одним пользователем настроек других пользователей.
+
+Каждый пользователь посредством выбора оболочки, редактора, привязок клавиш и настроек языка может настраивать свою собственную рабочую среду для приспособления системы под свои нужды.
+
+С каждой учетной записью в системе FreeBSD связана определенная идентификационная информация:
+
+Имя пользователя::
+Имя пользователя вводится в приглашение `login:`. Имена пользователей должны быть уникальны. Существует множество правил для создания допустимых имен пользователей, документированных в man:passwd[5]. Рекомендуется составлять имена пользователей из восьми или меньшего количества символов в нижнем регистре, чтобы поддерживать обратную совместимость с приложениями.
+
+Пароль::
+С каждой учетной записью связан пароль.
+
+ID пользователя (User ID, UID)::
+Идентификатор пользователя (UID) - это номер, используемый для однозначной идентификации пользователя в системе FreeBSD. Любая команда, принимающая в качестве аргумента имя пользователя, первым делом преобразует его к UID. Рекомендуется выбирать значения UID, не превышающие 65535, так как большие значения могут вызывать проблемы совместимости для некоторых пользовательских программ.
+
+Идентификатор группы (Group ID, GID)::
+Идентификатор группы (GID) - это номер, используемый для однозначной идентификации главной группы, к которой принадлежит пользователь. Группы это механизм для контроля доступа к ресурсам на основе GID пользователя вместо его UID. Это может значительно уменьшить размер некоторых файлов настройки. Кроме того, пользователь может быть включен более чем в одну группу. Рекомендуется использовать значения GID, не превышающие 65535, так как большие значения могут стать проблемой для некоторых программ.
+
+Класс доступа (login class)::
+Классы доступа это расширение к механизму групп, позволяющее более гибко приспосабливать систему для различных пользователей. Классы доступа описаны в <<users-limiting>>.
+
+Срок действия пароля::
+По умолчанию пароли не устаревают. Однако, есть возможность ограничить срок действия текущего пароля пользователя, и тем самым обязать его обновить пароль.
+
+Срок действия учетной записи::
+По умолчанию во FreeBSD время действия учетных записей не ограничено. При создании учетных записей ограниченного срока действия, например для студентов в учебном заведении, при помощи man:pw[8] укажите дату истечения действия учетной записи. После наступления указанной даты учетная запись становится непригодной для входа в систему, хотя каталоги и файлы этой учетной записи останутся нетронутыми.
+
+Полное имя пользователя::
+Имя пользователя является уникальным идентификатором учетной записи в FreeBSD, однако оно не обязано соответствовать реальному имени пользователя. Это поле может содержать реальное имя пользователя. Здесь допустимы пробелы, символы подчеркивания, строка не ограничена до 8 символов.
+
+Домашний каталог::
+Домашний каталог определяется полным путем в системе. С него пользователь начнет работу после входа в систему. По общепринятому соглашению все домашние каталоги пользователей помещаются в [.filename]#/home/username# или [.filename]#/usr/home/username#. Пользователи хранят личные файлы и подкаталоги в своих домашних каталогах.
+
+Оболочка пользователя::
+Оболочка необходима пользователям как средство взаимодействия с системой. Существует множество различных видов оболочек, опытные пользователи работают с собственными настройками, которые могут быть отражены в установках их учетных записей.
+
+[[users-superuser]]
+==== Учетная запись суперпользователя
+
+Учетная запись суперпользователя, обычно называемая `root`, используется для управления системой без ограничения привилегий. Поэтому она не должна использоваться для повседневных задач, таких как получение и отправка почты, общее исследование системы или программирование.
+
+Суперпользователь, в отличие от обычных пользователей, может работать без ограничений и поэтому неправильное использование учетной записи суперпользователя может привести к полному уничтожению системы. Учетные записи пользователей не способны уничтожить систему вследствие ошибки, поэтому если нет необходимости в привилегиях суперпользователя, то лучше использовать учетные записи обычных пользователей везде, где это возможно.
+
+Всегда перепроверяйте и переперепроверяйте команды, выполняемые под учетной записью суперпользователя, поскольку даже один лишний пробел или отсутствующий символ может привести к безвозвратной потере данных.
+
+Есть несколько способов получения привилегий суперпользователя. Наименее удобный способ - войти в систему под учетной записью `root`.
+
+Вместо этого можно воспользоваться man:su[1]. Если при запуске этой команды указывается ключ `-`, пользователь получит настройки окружения учетной записи `root`. Пользователь, запускающий эту команду, обязан входить в группу `wheel`, в противном случае команда не выполнится. Пользователь также должен знать пароль учетной записи `root`.
+
+В следующем примере пользователь повышает привилегии для запуска команды `make install`, так как этот шаг требует прав суперпользователя. По завершении работы команды пользователь набирает `exit`, тем самым выходя из учетной записи суперпользователя и возвращая привилегии собственной учетной записи.
+
+.Установка программы с привилегиями суперпользователя
+[example]
+====
+
+[source,bash]
+....
+% configure
+% make
+% su -
+Password:
+# make install
+# exit
+%
+....
+
+====
+
+Утилита man:su[1] прекрасно подходит для одиночных систем или небольших сетей с единственным системным администратором. В качестве альтернативы ей следует упомянуть порт или пакет package:security/sudo[]. Эта утилита предоставляет журналирование активности, а также позволяет администратору указывать перечень утилит, доступных пользователю для запуска с правами суперпользователя.
+
+[[users-modifying]]
+=== Изменение учетных записей
+
+FreeBSD располагает набором различных команд для работы с учетными записями пользователей. <<users-modifying-utilities>> перечисляет наиболее часто используемые команды, ниже находятся примеры их использования. За исчерпывающей информацией по каждой утилите следует обратиться к соответствующим страницам справочников.
+[[users-modifying-utilities]]
+.Утилиты для управления учетными записями
+[cols="1,1", frame="none", options="header"]
+|===
+| Команда
+| Краткое описание
+
+|man:adduser[8]
+|Рекомендуемое приложение командной строки для добавления новых пользователей.
+
+|man:rmuser[8]
+|Рекомендуемое приложение командной строки для удаления пользователей.
+
+|man:chpass[1]
+|Гибкий инструмент для изменения информации в базе данных пользователей.
+
+|man:passwd[1]
+|Инструмент командной строки для изменения паролей пользователей.
+
+|man:pw[8]
+|Мощный и гибкий инструмент для изменения любой информации, связанной с учетными записями пользователей.
+|===
+
+[[users-adduser]]
+==== `adduser`
+
+Для добавления новых пользователей рекомендуется использовать man:adduser[8]. При добавлении нового пользователя программа автоматически обновляет [.filename]#/etc/passwd# и [.filename]#/etc/group#. Она также создает домашний каталог для нового пользователя, копируя файлы настройки по умолчанию из [.filename]#/usr/shared/skel#, и может отправлять новому пользователю приветственное сообщение электронной почтой. Эту утилиту необходимо запускать с правами суперпользователя.
+
+Утилита man:adduser[8] является интерактивной. Для создания новой учетной записи потребуется ответить на несколько вопросов. Как показано в <<users-modifying-adduser>>, ответом считается либо ввод необходимой информации, либо нажатие клавиши kbd:[Return] для принятия значения по умолчанию, которое показано в квадратных скобках. В этом примере пользователь включен в группу `wheel`, что дает возможность ему повышать привилегии до суперпользователя при помощи man:su[1]. На последнем шаге утилита предложит создать еще одну учетную запись или завершить работу.
+
+[[users-modifying-adduser]]
+.Добавление пользователя в FreeBSD
+[example]
+====
+
+[source,bash]
+....
+# adduser
+Username: jru
+Full name: J. Random User
+Uid (Leave empty for default):
+Login group [jru]:
+Login group is jru. Invite jru into other groups? []: wheel
+Login class [default]:
+Shell (sh csh tcsh zsh nologin) [sh]: zsh
+Home directory [/home/jru]:
+Home directory permissions (Leave empty for default):
+Use password-based authentication? [yes]:
+Use an empty password? (yes/no) [no]:
+Use a random password? (yes/no) [no]:
+Enter password:
+Enter password again:
+Lock out the account after creation? [no]:
+Username : jru
+Password : ****
+Full Name : J. Random User
+Uid : 1001
+Class :
+Groups : jru wheel
+Home : /home/jru
+Shell : /usr/local/bin/zsh
+Locked : no
+OK? (yes/no): yes
+adduser: INFO: Successfully added (jru) to the user database.
+Add another user? (yes/no): no
+Goodbye!
+#
+....
+
+====
+
+[NOTE]
+====
+При наборе пароля текст не отображается, поэтому постарайтесь не допускать опечаток в пароле при создании учетной записи.
+====
+
+[[users-rmuser]]
+==== `rmuser`
+
+Для полного удаления пользователя из системы запустите man:rmuser[8] с правами суперпользователя. Эта программа выполняет следующие действия:
+
+[.procedure]
+====
+. Если в man:crontab[1] существуют записи пользователя, то они удаляются.
+. Удаляются принадлежащие пользователю задачи man:at[1].
+. Уничтожаются все процессы, принадлежащие пользователю.
+. Удаляется запись пользователя из локального файла паролей.
+. Если домашний каталог принадлежит пользователю, то каталог удаляется.
+. Удаляется принадлежащая пользователю входящая почта из [.filename]#/var/mail#.
+. Удаляются все файлы, принадлежащие пользователю, из каталогов с временными файлами, например из [.filename]#/tmp#.
+. Наконец, в [.filename]#/etc/group# из всех групп удаляется имя пользователя. Если после этого удаления группа остается пустой и имя группы совпадает с именем пользователя, она удаляется. Это необходимо для удаления пользовательских уникальных групп, создаваемых man:adduser[8].
+====
+
+man:rmuser[8] не может использоваться для удаления учетной записи суперпользователя, поскольку это почти всегда означает разрушение системы.
+
+По умолчанию используется интерактивный режим, это показано в следующем примере.
+
+.Интерактивное удаление учетной записи с помощью `rmuser`
+[example]
+====
+
+[source,bash]
+....
+# rmuser jru
+Matching password entry:
+jru:*:1001:1001::0:0:J. Random User:/home/jru:/usr/local/bin/zsh
+Is this the entry you wish to remove? y
+Remove user's home directory (/home/jru)? y
+Removing user (jru): mailspool home passwd.
+#
+....
+
+====
+
+[[users-chpass]]
+==== `chpass`
+
+При помощи man:chpass[1] любой пользователь может изменять информацию, связанную с его учетной записью. И только суперпользователю разрешено менять информацию других пользователей.
+
+При запуске без параметров (кроме необязательного имени пользователя), man:chpass[1] вызывает редактор, содержащий информацию о пользователе. Когда пользователь выходит из редактора, база данных пользователей обновляется новой информацией.
+
+[NOTE]
+====
+Если утилита не была запущена с правами суперпользователя, то после выхода из редактора будет запрошен пароль пользователя.
+====
+
+В <<users-modifying-chpass-su>> суперпользователь, выполнив команду `chpass jru`, просматривает доступные для изменения поля. Если `jru` запустит эту команду, то лишь последние шесть строк будут доступны ему для редактирования. Это показано в <<users-modifying-chpass-ru>>.
+
+[[users-modifying-chpass-su]]
+.Работа с `chpass` с правами суперпользователя
+[example]
+====
+
+[source,bash]
+....
+#Changing user database information for jru.
+Login: jru
+Password: *
+Uid [#]: 1001
+Gid [# or name]: 1001
+Change [month day year]:
+Expire [month day year]:
+Class:
+Home directory: /home/jru
+Shell: /usr/local/bin/zsh
+Full Name: J. Random User
+Office Location:
+Office Phone:
+Home Phone:
+Other information:
+....
+
+====
+
+[[users-modifying-chpass-ru]]
+.Работа с `chpass` с правами обычного пользователя
+[example]
+====
+
+[source,bash]
+....
+#Changing user database information for jru.
+Shell: /usr/local/bin/zsh
+Full Name: J. Random User
+Office Location:
+Office Phone:
+Home Phone:
+Other information:
+....
+
+====
+
+[NOTE]
+====
+man:chfn[1] и man:chsh[1] это ссылки на man:chpass[1], как и man:ypchpass[1], man:ypchfn[1] и man:ypchsh[1]. Так как NIS поддерживается автоматически, указание `yp` перед командой не обязательно. Настройка NIS будет рассмотрена в crossref:network-servers[network-servers, Сетевые серверы].
+====
+
+[[users-passwd]]
+==== `passwd`
+
+Любой пользователь может изменить собственный пароль при помощи man:passwd[1]. Для предотвращения случайного или несанкционированного изменения, команда запрашивает текущий пароль пользователя перед установкой нового:
+
+.Изменение пароля
+[example]
+====
+
+[source,bash]
+....
+% passwd
+Changing local password for jru.
+Old password:
+New password:
+Retype new password:
+passwd: updating the database...
+passwd: done
+....
+
+====
+
+Суперпользователь может изменить пароль любого пользователя, указав его имя при запуске man:passwd[1]. Утилита, запущенная с правами суперпользователя, не запрашивает текущий пароль пользователя. Благодаря этому возможно устанавливать новые пароли забывчивым пользователям.
+
+.Изменение пароля другого пользователя суперпользователем
+[example]
+====
+
+[source,bash]
+....
+# passwd jru
+Changing local password for jru.
+New password:
+Retype new password:
+passwd: updating the database...
+passwd: done
+....
+
+====
+
+[NOTE]
+====
+Как и в случае с man:chpass[1], man:yppasswd[1] это всего лишь ссылка на man:passwd[1], так что NIS работает с обеими командами.
+====
+
+[[users-pw]]
+==== `pw`
+
+man:pw[8] это утилита командной строки для создания, удаления, модифицирования и отображения пользователей и групп. Она функционирует как внешний интерфейс к системным файлам пользователей и групп. У man:pw[8] очень мощный набор параметров командной строки, что делает это программу подходящей для использования в shell скриптах, но новым пользователям она может показаться более сложной, чем другие представленные здесь команды.
+
+[[users-limiting]]
+=== Ограничение пользователей
+
+FreeBSD предоставляет администратору несколько способов ограничения количества занимаемых пользователями системных ресурсов. Дисковые квоты, как один из видов ограничения ресурсов, обсуждаются в отдельном разделе, остальные ограничения перечислены далее в тексте.
+
+Дисковые квоты ограничивают объем дискового пространства, занимаемого пользователями, а также предоставляют способ быстрой проверки занимаемого объема без пересчета его каждый раз. Квоты обсуждаются в crossref:disks[quotas,Квотирование файловых систем].
+
+Другие ограничения ресурсов включают способы ограничения использования CPU, памяти и других ресурсов, которые могут потребляться пользователем. Ограничения накладываются с помощью классов учетных записей и обсуждаются в этом разделе.
+
+Классы учетных записей определяются в [.filename]#/etc/login.conf#, они детально описаны на странице справочника man:login.conf[5]. Каждой учетной записи присвоен класс (`default` по умолчанию), и каждому классу присвоен набор характеристик. Характеристика определяется в виде пары `имя=значение`, где _имя_ это определенный идентификатор, а _значение_ это произвольная строка, обрабатываемая в зависимости от _имени_. Настройка классов и характеристик довольно проста, и также описана в man:login.conf[5].
+
+[NOTE]
+====
+FreeBSD, как правило, не читает настройки в [.filename]#/etc/login.conf# непосредственно, вместо этого она обращается к файлу базы данных [.filename]#/etc/login.conf.db# для ускорения доступа к данным. Всякий раз после редактирования [.filename]#/etc/login.conf# необходимо обновить [.filename]#/etc/login.conf.db# при помощи следующей команды:
+
+[source,bash]
+....
+# cap_mkdb /etc/login.conf
+....
+
+====
+
+Ограничения на ресурсы отличаются от обычных характеристик: во-первых, для каждого ограничения существует "мягкое" (текущее) и "жесткое" ограничение. Мягкое ограничение может настраиваться пользователем или приложением, но не может превышать жесткое ограничение. Последнее может быть уменьшено пользователем, а увеличено - лишь суперпользователем. Во-вторых, большинство ограничений ресурсов накладываются на каждый процесс определенного пользователя, а не к пользователю вообще. Эти различия диктуются особенностями обработки ограничений, а не реализацией структуры характеристик учетных записей.
+
+Ниже приведен список наиболее часто используемых ограничений на ресурсы. Остальные, вместе с другими характеристиками, можно найти в man:login.conf[5].
+
+`coredumpsize`::
+Ограничение на размер файла дампа памяти , генерируемого программой, подчиняющееся другим ограничениям на используемое дисковое пространство, таким как `filesize`, или дисковым квотам. Это ограничение часто используется как менее строгий метод контролирования потребления дискового пространства. Поскольку пользователь не создает файлы дампов памяти самостоятельно, и зачастую не удаляет их, установка этого параметра может предохранить пользователя от выхода за пределы ограничений на дисковое пространство, в случае если большая программа создаст файл аварийного дампа памяти.
+
+`cputime`::
+Это максимальное количество времени ЦПУ, потребляемого пользователем. Превысившие это время процессы будут уничтожены ядром.
++
+
+[NOTE]
+====
+Это ограничение потребляемого _времени_ ЦПУ, а не процентов использования ЦПУ, которые отображаются в некоторых полях man:top[1] и man:ps[1].
+====
+
+`filesize`::
+Это максимальный размер файла , которым может владеть пользователь. В отличие от crossref:disks[quotas,дисковых квот], это ограничение применяется к отдельным файлам, а не ко всему набору принадлежащих пользователю файлов.
+
+`maxproc`::
+Это максимальное число процессов , которые могут быть запущены пользователем. В это число включаются и консольные, и фоновые процессы. Это ограничение не может превышать системный лимит, указываемый через переменную man:sysctl[8] `kern.maxproc`. Установка слишком жестких ограничений может стать помехой работе пользователя: зачастую ему удобно входить в систему с нескольких консолей или использовать каналы. Некоторые задачи, такие как компиляция большой программы, порождают множество процессов.
+
+`memorylocked`::
+Это максимальный объем памяти , блокировка которого может быть запрошена процессом при помощи man:mlock[2]. Некоторые критически важные для системы программы, такие как man:amd[8], блокируют отведенную процессу память так, что в случае "пробуксовывания" системы (system thrashing) они не усугубляют проблему.
+
+`memoryuse`::
+Это максимальный объем памяти , которая может быть занята процессом в любой момент времени. Сюда входит основная память и использование подкачки. Это ограничение не снимает все вопросы, связанные с использованием памяти, но для начала это подходящее ограничение.
+
+`openfiles`::
+Это максимальное количество файлов, которые могут быть открыты процессом. В FreeBSD файлы также используются для представления сокетов и каналов IPC, поэтому не устанавливайте слишком маленькое значение. Ограничение этого параметра, устанавливаемое для всей системы, определяется переменной man:sysctl[8] `kern.maxfiles`.
+
+`sbsize`::
+Это ограничение на объем сетевой памяти, т.е. mbufs , которую может занять пользователь. В общем, это ограничение может быть использовано для ограничения сетевых взаимодействий.
+
+`stacksize`::
+Это максимальный размер сегмента стека процесса. Сам по себе этот параметр не может ограничить размер используемой программой памяти, следовательно, его необходимо использовать вместе с другими ограничениями.
+
+Существуют несколько других аспектов, которые необходимо учитывать при установке ограничений ресурсов. Ниже приведены некоторые общие подсказки, советы и различные комментарии.
+
+* Процессам, загружаемым при старте системы скриптами [.filename]#/etc/rc# присваивается класс `daemon`.
+* Хотя поставляемый с системой [.filename]#/etc/login.conf# - это хороший источник корректных значений для большинства ограничений, сами ограничения могут не подходить для конкретной системы. Установка слишком слабых ограничений может повлечь злоупотребления системой, а установка слишком сильных ограничений может стать помехой производительности.
+* Пользователи Xorg возможно должны получить больше ресурсов, чем другие пользователи. Xorg сама по себе потребляет много ресурсов, а также провоцирует пользователей на одновременный запуск большего количества программ.
+* Многие ограничения применяются к отдельным процессам, а не к пользователю вообще. Например, установка `openfiles` в 50 означает, что каждый процесс, запущенный пользователем, может открывать до 50 файлов. Общее количество файлов, которые могут быть открыты пользователем, вычисляется как `openfiles`, умноженное на `maxproc`. Это также применимо к потребляемой памяти.
+
+За дальнейшей информацией по ограничениям на ресурсы, классам учетных записей и характеристикам, обращайтесь к man:cap.mkdb[1], man:getrlimit[2], и man:login.conf[5].
+
+[[users-groups]]
+=== Группы
+
+Группа это список пользователей. Группа идентифицируется по имени и GID (Group ID). В FreeBSD для определения прав процесса ядро использует UID процесса, а также список групп, которым он принадлежит. В большинстве случаев, GID пользователя означает первую группу из списка.
+
+Имена групп связываются с GID в файле [.filename]#/etc/group#. Это текстовый файл с четырьмя разделенными двоеточием полями. Первое поле это имя группы, второе это зашифрованный пароль, третье это GID, а четвертое это разделенный запятыми список членов группы. За более полным описанием синтаксиса обратитесь к man:group[5].
+
+Суперпользователь может редактировать [.filename]#/etc/group# при помощи текстового редактора. Как вариант, можно задействовать man:pw[8] для добавления и редактирования групп. Например, для добавления группы, называемой `teamtwo`, и проверки ее существования вы можете использовать:
+
+.Добавление группы с использованием man:pw[8]
+[example]
+====
+
+[source,bash]
+....
+# pw groupadd teamtwo
+# pw groupshow teamtwo
+teamtwo:*:1100:
+....
+
+====
+
+В этом примере число `1100` это GID группы `teamtwo`. На данный момент в `teamtwo` нет членов. Следующая команда добавит `jru` в группу `teamtwo`.
+
+.Добавление пользователей в новую группу при помощи man:pw[8]
+[example]
+====
+
+[source,bash]
+....
+# pw groupmod teamtwo -M jru
+# pw groupshow teamtwo
+teamtwo:*:1100:jru
+....
+
+====
+
+Аргумент к параметру `-M` это разделенный запятыми список пользователей, которые добавляются в новую (пустую) группу или заменяют существующих членов группы. Что касается пользователя - это членство в группе отличается от первичной группы пользователя, указанного в файле паролей. Это значит, что пользователь не будет показан как член группы при использовании man:pw[8] `groupshow`, но будет отображен при использовании man:id[1] или похожего инструмента. Когда программа man:pw[8] задействована для добавления пользователя в группу, то она работает только с файлом [.filename]#/etc/group# и не ищет дополнительную информацию в файле [.filename]#/etc/passwd#.
+
+.Добавление нового члена группы с использованием man:pw[8]
+[example]
+====
+
+[source,bash]
+....
+# pw groupmod teamtwo -m db
+# pw groupshow teamtwo
+teamtwo:*:1100:jru,db
+....
+
+====
+
+В этом примере аргументом к опции `-m` является разделенный запятыми список пользователей, добавляемых в группу. В отличие от предыдущего примера, пользователи добавляются в группу, а не замещают имеющийся список пользователей группы.
+
+.Использование man:id[1] для определения принадлежности к группам
+[example]
+====
+
+[source,bash]
+....
+% id jru
+uid=1001(jru) gid=1001(jru) groups=1001(jru), 1100(teamtwo)
+....
+
+====
+
+В этом примере `jru` является членом групп `jru` и `teamtwo`.
+
+За дальнейшей информацией об этой команде и о формате файла [.filename]#/etc/group# обратитесь к man:pw[8] и man:group[5].
+
+[[permissions]]
+== Права доступа
+
+FreeBSD является прямым потомком BSD UNIX(R) и основывается на некоторых ключевых концепциях UNIX(R). В первую очередь это, конечно, тот факт, что FreeBSD - многопользовательская операционная система. Это означает, что несколько пользователей могут работать одновременно, решая различные задачи и совершенно не мешая друг другу. На системе лежит ответственность за правильное разделение и управление такими ресурсами как память, процессорное время, периферийные устройства и прочее.
+
+Многопользовательская среда предполагает наличие механизма регулирования прав доступа к любому ресурсу в системе. Существует три типа прав доступа: на чтение, запись и исполнение. Права сгруппированы три по три, соответственно чтение/запись/выполнение для владельца/группы/всех остальных. Численное представление:
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Значение
+| Права доступа
+| Список файлов каталога
+
+|0
+|Ничего не разрешено
+|`---`
+
+|1
+|Нельзя читать и писать, разрешено исполнять
+|`--x`
+
+|2
+|Нельзя читать и исполнять, разрешено писать
+|`-w-`
+
+|3
+|Нельзя читать, разрешено писать и исполнять
+|`-wx`
+
+|4
+|Разрешено читать, нельзя писать и исполнять
+|`r--`
+
+|5
+|Разрешено читать и исполнять, нельзя писать
+|`r-x`
+
+|6
+|Разрешено читать и писать, нельзя исполнять
+|`rw-`
+
+|7
+|Разрешено все
+|`rwx`
+|===
+
+Вы можете использовать опцию `-l` команды man:ls[1] для получения подробного листинга каталога, включающего колонку с информацией о правах на файл для владельца, группы и всех остальных. Например, команда `ls -l` в произвольном каталоге может вывести следующее:
+
+[source,bash]
+....
+% ls -l
+total 530
+-rw-r--r-- 1 root wheel 512 Sep 5 12:31 myfile
+-rw-r--r-- 1 root wheel 512 Sep 5 12:31 otherfile
+-rw-r--r-- 1 root wheel 7680 Sep 5 12:31 email.txt
+...
+....
+
+Вот как выглядит первая колонка вывода `ls -l`:
+
+[source,bash]
+....
+-rw-r--r--
+....
+
+Первый (считая слева) символ говорит обычный ли это файл, каталог, символьное устройство, сокет или любое другое псевдо-файловое устройство. В нашем случае `-` указывает на обычный файл. Следующие три символа (в данном случае это `rw-`) задают права доступа владельца файла. Затем идут права группы, которой принадлежит файл (`r--`). Последняя тройка (`r--`) определяет права для всех остальных. Минус означает отсутствие каких-либо прав (т.е. нельзя ни читать, ни писать, ни выполнять). В данном случае права установлены таким образом, что владелец может читать и писать в файл, а группа и другие могут только читать. Таким образом, численное представление прав `644`, где каждая цифра представляет три части прав на файл.
+
+Права на устройства контролируются аналогичным образом. В FreeBSD все устройства представлены в виде файлов, которые можно открывать, читать и писать в них. Эти специальные файлы содержатся в каталоге [.filename]#/dev#.
+
+Каталоги также являются файлами. К ним применимы те же права на чтение, запись и выполнение. Правда, в данном случае "выполнение" имеет несколько другой смысл. Когда каталог помечен как "исполнимый", это означает, что можно "зайти" в него (с помощью команды `cd`, change directory). Это также означает, что в данном каталоге можно получить доступ к файлам, имена которых известны (конечно, если собственные права на файл разрешают такой доступ).
+
+Если же требуется получить список файлов в некотором каталоге, права доступа на него должные включать доступ на чтение. Для того, чтобы удалить из каталога какой-либо файл, имя которого известно, на этот каталог должны быть даны права на запись _и_ на исполнение.
+
+Существуют и другие права доступа, но они как правило используются в особых случаях, например, setuid-бит на выполняемые файлы и sticky-бит на каталоги. За дополнительными сведениями по этому вопросу обращайтесь к man:chmod[1].
+
+=== Символические обозначения прав
+
+Символические обозначения, иногда называемые символическими выражениями, используют буквы вместо восьмеричных значений для назначения прав на файлы и каталоги. Символические выражения используют синтаксис (кто) (действие) (права), где существуют следующие значения:
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Опция
+| Буква
+| Значение
+
+|(кто)
+|u
+|Пользователь (User)
+
+|(кто)
+|g
+|Группа (Group)
+
+|(кто)
+|o
+|Другие (Other)
+
+|(кто)
+|a
+|Все (All, "world")
+
+|(действие)
+|+
+|Добавление прав
+
+|(действие)
+|-
+|Удаление прав
+
+|(действие)
+|=
+|Явная установка прав
+
+|(права)
+|r
+|Чтение (Read)
+
+|(права)
+|w
+|Запись (Write)
+
+|(права)
+|x
+|Выполнение (Execute)
+
+|(права)
+|t
+|Sticky бит
+
+|(права)
+|s
+|SUID или SGID
+|===
+
+Эти значения используются командой man:chmod[1] так же как и раньше, но с буквами. Например, вы можете использовать следующую команду для запрета доступа других пользователей к _FILE_:
+
+[source,bash]
+....
+% chmod go= FILE
+....
+
+Для изменения более чем одного набора прав можно применить список, разделенный запятыми. Например, следующая команда удалит права группы и "всех остальных" на запись в _FILE_, а затем добавит права на выполнение для всех:
+
+[source,bash]
+....
+% chmod go-w,a+x FILE
+....
+
+=== Флаги файлов в FreeBSD
+
+Кроме уже описанных прав доступа к файлам, FreeBSD поддерживает использование "флагов файлов". Эти флаги обеспечивают дополнительный уровень защиты и контроля над файлами, но не могут применяться к каталогам.
+
+Эти флаги добавляют дополнительные возможности контроля над файлами, обеспечивая (при определенных условиях) невозможность их удаления или изменения даже пользователю `root`.
+
+Файловые флаги изменяются при помощи утилиты man:chflags[1] посредством простого интерфейса. К примеру, чтобы установить системный признак неудаляемости на файл [.filename]#file1#, выполните следующую команду:
+
+[source,bash]
+....
+# chflags sunlink file1
+....
+
+Чтобы отключить флаг неудаляемости, просто выполните предыдущую команду с ключом "no" перед параметром `sunlink`. Вот так:
+
+[source,bash]
+....
+# chflags nosunlink file1
+....
+
+Чтобы просмотреть флаги этого файла, воспользуйтесь командой man:ls[1] с параметрами `-lo`:
+
+[source,bash]
+....
+# ls -lo file1
+....
+
+Результат выполнения команды должен выглядеть примерно так:
+
+[.programlisting]
+....
+-rw-r--r-- 1 trhodes trhodes sunlnk 0 Mar 1 05:54 file1
+....
+
+Некоторые флаги могут быть установлены или сняты с файлов только пользователем `root`. В остальных случаях эти флаги может установить владелец файла. Для получения дополнительной информации мы рекомендуем изучить содержимое справки по командам man:chflags[1] и man:chflags[2].
+
+=== setuid, setgid и sticky-биты в правах доступа
+
+В дополнение к рассмотренным выше правам доступа и флагам файлов необходимо также упомянуть еще три бита прав доступа, о которых должны знать все системные администраторы. Это такие биты, как `setuid`, `setgid` и `sticky`.
+
+Эти биты играют важную роль в определённых моментах работы UNIX(R), так как они предоставляют функциональность, расширяющую права обычного пользователя. Чтобы понять как они работают, необходимо определить различие между реальным идентификатором пользователя (UID) и действующим идентификатором пользователя (effective UID, EUID).
+
+Реальный UID - это идентификатор пользователя, запустившего процесс на выполнение. Действующий UID (EUID) - это идентификатор пользователя, с которым на самом деле выполняется процесс. Например, утилита man:passwd[1] во время смены пароля пользователем запускается с реальным ID пользователя; однако, чтобы внести изменения в базу данных пользователей, ей необходимо работать с действующим ID пользователя `root`. Это тот механизм, который позволяет обычным пользователям изменять свои пароли и при этом не наблюдать ошибку `Permission Denied`.
+
+[NOTE]
+====
+Опция `nosuid`, указанная при монтировании файловой системы, отменяет действие битов `setuid` и `setgid`. То есть, утилиты, использующие эти биты прав, откажутся выполняться, даже не выдав пользователю никакого предостережения. К тому же, (с точки зрения обеспечения безопасности) эта опция монтирования не является абсолютно надежной, так как, согласно странице справочника man:mount[8], накладываемые ею ограничения могут быть обойдены при помощи "обертки" `nosuid` (`nosuid` wrapper).
+====
+
+Бит setuid устанавливается добавлением цифры четыре (4) перед численным представлением прав доступа, например:
+
+[source,bash]
+....
+# chmod 4755 suidexample.sh
+....
+
+Теперь права доступа на файл [.filename]#suidexample.sh# выглядят подобно следующему:
+
+[.programlisting]
+....
+-rwsr-xr-x 1 trhodes trhodes 63 Aug 29 06:36 suidexample.sh
+....
+
+В вышеприведенной строке приметно то, что в перечне прав доступа для владельца файла присутствует символ `s`, который заменил собой бит выполнения.
+
+Чтобы посмотреть `setuid` в действии, откройте два терминала. На одном из них запустите команду `passwd` с правами обычного пользователя. Пока утилита ждет ввода нового пароля, просмотрите таблицу процессов и найдите в ней запись о процессе `passwd`.
+
+В терминале А:
+
+[source,bash]
+....
+Changing local password for trhodes
+Old Password:
+....
+
+В терминале Б:
+
+[source,bash]
+....
+# ps aux | grep passwd
+....
+
+[source,bash]
+....
+trhodes 5232 0.0 0.2 3420 1608 0 R+ 2:10AM 0:00.00 grep passwd
+root 5211 0.0 0.2 3620 1724 2 I+ 2:09AM 0:00.01 passwd
+....
+
+Как уже было сказано, утилита `passwd` запущена с правами обычного пользователя, но ее действующий UID - `root`.
+
+Действие бита `setgid` подобно действию `setuid`; отличие заключается в том, что изменяются настройки прав для группы. Когда выполняется приложение (или утилита) с установленным битом `setgid`, то ему (ей) будут обеспечены права в соответствии с группой владельца файла, а не с группой пользователя, запустившего процесс.
+
+Чтобы установить на файл бит `setgid`, выполните команду `chmod`, добавив цифру два (2) перед численным представлением прав доступа, например:
+
+[source,bash]
+....
+# chmod 2755 sgidexample.sh
+....
+
+Новый бит отображается подобно предыдущему случаю: обратите внимание на наличие `s` в перечне прав доступа для группы:
+
+[source,bash]
+....
+-rwxr-sr-x 1 trhodes trhodes 44 Aug 31 01:49 sgidexample.sh
+....
+
+[NOTE]
+====
+В этих примерах, несмотря на то, что сценарий оболочки является исполняемым файлом, он не будет выполняться с другим действующим идентификатором пользователя (EUID). Так происходит потому, что сценариям командного интерпретатора недоступен системный вызов man:setuid[2].
+====
+
+Позволяя расширять права пользователя, оба бита прав доступа (`setuid` и `setgid`) могут привести к снижению безопасности системы. Третий обсуждаемый здесь бит - `sticky` - способствует повышению безопасности системы.
+
+Бит `sticky`, будучи установленным на каталог, позволяет производить удаление файла только владельцу файла. Этот бит применяется для предотвращения удаления файлов в публичных каталогах, таких как [.filename]#/tmp#, пользователями, не владеющими файлом. Чтобы задействовать этот бит, добавьте единицу (1) перед численным представлением прав доступа. Например:
+
+[source,bash]
+....
+# chmod 1777 /tmp
+....
+
+Проверить результат можно при помощи команды `ls`:
+
+[source,bash]
+....
+# ls -al / | grep tmp
+....
+
+[source,bash]
+....
+drwxrwxrwt 10 root wheel 512 Aug 31 01:49 tmp
+....
+
+Отличительной особенностью бита `sticky` является наличие символа `t` в самом конце перечня прав.
+
+[[dirstructure]]
+== Структура каталогов
+
+Файловая система FreeBSD является ключевым моментом в понимании устройства всей системы. Самым важным понятием является, несомненно, корневой каталог, обозначаемый символом "/". Корневой каталог монтируется самым первым на этапе загрузки и содержит все необходимое, чтобы подготовить систему к загрузке в многопользовательский режим. Корневой каталог также содержит точки монтирования для остальных файловых систем, которые монтируются во время перехода в многопользовательский режим.
+
+Точкой монтирования называется каталог, находящийся в родительской (обычно - корневой) файловой системе, к которому может быть подсоединена другая файловая система. Более детально это описывается в <<disk-organization>>. Стандартные точки монтирования включают [.filename]#/usr#, [.filename]#/var#, [.filename]#/tmp#, [.filename]#/mnt# и [.filename]#/cdrom#. Эти каталоги обычно перечислены в файле [.filename]#/etc/fstab#, в котором указаны файловые системы и их точки монтирования. Большинство файловых систем, описанных в [.filename]#/etc/fstab# монтируются автоматически из скрипта man:rc[8], если только для них не указана опция `noauto`. Более детальная информация находится в <<disks-fstab>>.
+
+Полное описание иерархии файловой системы есть в man:hier[7]. Здесь же мы упомянем лишь наиболее важные каталоги.
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Каталог
+| Описание
+
+|[.filename]#/#
+|Корневой каталог файловой системы.
+
+|[.filename]#/bin/#
+|Основные утилиты, необходимые для работы как в однопользовательском, так и в многопользовательском режимах.
+
+|[.filename]#/boot/#
+|Программы и конфигурационные файлы, необходимые для нормальной загрузки операционной системы.
+
+|[.filename]#/boot/defaults/#
+|Конфигурационные файлы с настройками по умолчанию, используемые в процессе загрузки операционной системы (см. man:loader.conf[5]).
+
+|[.filename]#/dev/#
+|Файлы устройств (см. man:intro[4]).
+
+|[.filename]#/etc/#
+|Основные конфигурационные файлы системы и скрипты.
+
+|[.filename]#/etc/defaults/#
+|Основные конфигурационные файлы системы с настройками по умолчанию (см. man:rc[8]).
+
+|[.filename]#/etc/mail/#
+|Конфигурационные файлы для систем обработки почты (например, man:sendmail[8]).
+
+|[.filename]#/etc/namedb/#
+|Конфигурационные файлы для утилиты `named` (см. man:named[8]).
+
+|[.filename]#/etc/periodic/#
+|Файлы сценариев, выполняемые ежедневно, еженедельно и ежемесячно (см. man:cron[8] и man:periodic[8]).
+
+|[.filename]#/etc/ppp/#
+|Конфигурационные файлы для утилиты `ppp` (см. man:ppp[8]).
+
+|[.filename]#/mnt/#
+|Пустой каталог, часто используемый системными администраторами как временная точка монтирования.
+
+|[.filename]#/proc/#
+|Виртуальная файловая система, отображающая текущие процессы (см. man:procfs[5], man:mount_procfs[8]).
+
+|[.filename]#/rescue/#
+|Статически собранные программы для восстановления после сбоев. Обратитесь к man:rescue[8].
+
+|[.filename]#/root/#
+|Домашний каталог пользователя `root`.
+
+|[.filename]#/sbin/#
+|Системные утилиты и утилиты администрирования, необходимые для работы как в однопользовательском, так и в многопользовательском режимах.
+
+|[.filename]#/tmp/#
+|Временные файлы. Содержимое [.filename]#/tmp# обычно теряется во время перезагрузки системы. Файловая система в памяти часто монтируется в [.filename]#/tmp#. Это может быть автоматизированно с помощью переменных относительно tmpmfs из man:rc.conf[5] (или же с помощью записи в [.filename]#/etc/fstab#; обращайтесь к man:mdmfs[8]).
+
+|[.filename]#/usr/#
+|Большинство пользовательских утилит и приложений.
+
+|[.filename]#/usr/bin/#
+|Пользовательские утилиты и приложения общего назначения.
+
+|[.filename]#/usr/include/#
+|Стандартные заголовочные файлы для языка C.
+
+|[.filename]#/usr/lib/#
+|Файлы стандартных библиотек.
+
+|[.filename]#/usr/libdata/#
+|Файлы данных для различных утилит.
+
+|[.filename]#/usr/libexec/#
+|Системные даемоны и утилиты (выполняемые другими программами).
+
+|[.filename]#/usr/local/#
+|Локальные пользовательские приложения, библиотеки, и т.д. Также используется по умолчанию коллекцией портов. Внутри [.filename]#/usr/local# иерархия каталогов должна следовать man:hier[7] для [.filename]#/usr#. Исключение составляют каталог [.filename]#man#, который расположен непосредственно в [.filename]#/usr/local#, а не в [.filename]#/usr/local/share#, и документация портов, которая расположена в [.filename]#share/doc/port#.
+
+|[.filename]#/usr/obj/#
+|Архитектурно-зависимые файлы и каталоги, образующиеся в процессе сборки системы из исходных текстов в [.filename]#/usr/src#.
+
+|[.filename]#/usr/ports/#
+|Коллекция портов FreeBSD (опционально).
+
+|[.filename]#/usr/sbin/#
+|Системные утилиты и утилиты администрирования (исполняемые пользователем).
+
+|[.filename]#/usr/shared/#
+|Архитектурно-независимые файлы.
+
+|[.filename]#/usr/src/#
+|Исходные тексты BSD и/или программ.
+
+|[.filename]#/usr/X11R6/#
+|Утилиты, приложения и библиотеки X11R6 (X Window System; необязательно).
+
+|[.filename]#/var/#
+|Файлы журналов общего назначения, временные, перемещаемые файлы и файлы очередей. Файловая система в памяти иногда монтируется в [.filename]#/var#. Это может быть автоматизированно с помощью переменных относительно varmfs из man:rc.conf[5] (или же с помощью записи в [.filename]#/etc/fstab#; обращайтесь к man:mdmfs[8]).
+
+|[.filename]#/var/log/#
+|Различные файлы системных журналов.
+
+|[.filename]#/var/mail/#
+|Почтовые ящики пользователей.
+
+|[.filename]#/var/spool/#
+|Файлы очередей печати, почты, и пр.
+
+|[.filename]#/var/tmp/#
+|Временные файлы, которые обычно сохраняются во время перезагрузки системы, если только [.filename]#/var# не является файловой системой в памяти.
+
+|[.filename]#/var/yp/#
+|Карты (maps) NIS.
+|===
+
+[[disk-organization]]
+== Организация дисков
+
+Наименьшая единица, которую FreeBSD использует для обращения к файлам, это имя файла. Имена файлов чувствительны к регистру, поэтому [.filename]#readme.txt# и [.filename]#README.TXT# - два разных файла. FreeBSD не использует расширение файла ([.filename]#.txt#) для определения программа это, документ или другой тип данных.
+
+Файлы хранятся в каталогах. Каталоги могут не содержать файлов, или могут содержать много сотен файлов. Каталоги также могут содержать другие каталоги, что позволяет создавать иерархию каталогов один в другом. Это упрощает организацию данных.
+
+Обращение к файлам происходит путем задания имени файла или каталога, дополняемого прямым слэшем `/`, за которым может следовать имя другого каталога. Если есть каталог [.filename]#foo#, содержащий каталог [.filename]#bar#, который содержит файл [.filename]#readme.txt#, полное имя, или _путь_ к файлу будет [.filename]#foo/bar/readme.txt#.
+
+Каталоги и файлы хранятся в файловой системе. Каждая файловая система содержит один каталог на верхнем уровне, называемый _корневым каталогом_ этой файловой системы. Этот корневой каталог может содержать другие каталоги.
+
+Внешне это может быть похоже на те операционные системы, которые вы возможно использовали. Есть несколько отличий: например, MS-DOS(R) использует `\` для разделения имен файлов и каталогов, а Mac OS(R) использует `:`.
+
+FreeBSD не использует букв дисков, или других имен дисков в пути. Вам не нужно писать [.filename]#c:/foo/bar/readme.txt# в FreeBSD.
+
+Вместо этого, одна файловая система назначается _корневой файловой системой_. Обращение к корневому каталогу корневой файловой системы происходит через `/`. Любая другая файловая система _монтируется_ к корневой файловой системе. Неважно как много дисков есть в вашей системе FreeBSD, каждый каталог будет выглядеть как расположенный на том же диске.
+
+Предположим, у вас есть три файловых системы: `A`, `B`, и `C`. Каждая файловая система имеет один корневой каталог, в котором содержатся другие каталоги, называемые `A1`, `A2` (и аналогично `B1`, `B2` и `C1`, `C2`).
+
+Назовем `A` корневой файловой системой. Если вы используете команду `ls` для просмотра содержимого каталога, вы увидите два подкаталога, `A1` и `A2`. Дерево каталогов выглядит так:
+
+image::example-dir1.png[]
+
+Файловая система должна быть подмонтирована к каталогу другой файловой системы. Предположим, что вы монтируете файловую систему `B` на каталог `A1`. Корневой каталог `B` замещается `A1`, а каталоги в `B` отображаются соответственно:
+
+image::example-dir2.png[]
+
+Если потребуется, любые файлы из каталогов `B1` или `B2` могут быть получены через путь [.filename]#/A1/B1# или [.filename]#/A1/B2#. Все файлы, бывшие в [.filename]#/A1#, временно скрыты. Они появятся, если `B` будет _размонтирована_ с A.
+
+Если `B` была смонтирована на `A2,` диаграмма будет выглядеть так:
+
+image::example-dir3.png[]
+
+а пути будут [.filename]#/A2/B1# и [.filename]#/A2/B2# соответственно.
+
+Файловые системы могут быть смонтированы одна на другую. Продолжая предыдущий пример, файловая система `C` может быть смонтирована на каталог `B1` файловой системы `B` в таком порядке:
+
+image::example-dir4.png[]
+
+Или `C` может быть смонтирована прямо на файловую систему `A`, на каталог `A1`:
+
+image::example-dir5.png[]
+
+Если вы знакомы с MS-DOS(R), это похоже, хотя и не идентично, команде `join`.
+
+Как правило, это не должно вас интересовать. Обычно вы создаете файловые системы во время установки FreeBSD, решаете куда их монтировать, и ничего не меняете, пока не понадобится добавить новый диск.
+
+Можно создать одну большую корневую файловую систему и не создавать других. У такого подхода есть несколько недостатков и одно преимущество.
+
+.Преимущества нескольких файловых систем
+* Различные файловые системы могут иметь различные _опции монтирования_. Например, в целях безопасности корневая файловая система может быть смонтирована только для чтения, что делает невозможным случайное удаление или редактирование критически важного файла. Отделение файловых систем, используемых пользователями для записи, таких как [.filename]#/home#, от других файловых систем позволяет также монтировать их с параметром _nosuid_; этот параметр отменяет действие битов _suid_/ _guid_ на исполняемых файлах, в этой файловой системе, что потенциально повышает безопасность.
+* FreeBSD автоматически оптимизирует расположение файлов на файловой системе в зависимости от того, как файловая система используется. Файловая система, содержащая множество мелких часто записываемых файлов, будет иметь оптимизацию, отличную от таковой для файловой системы, содержащей несколько больших файлов. На одной большой файловой системе эта оптимизация не работает.
+* Файловые системы FreeBSD очень устойчивы к внезапному отключению. Тем не менее, потеря питания в критический момент все же может повредить структуру файловой системы. Разделение данных на несколько файловых систем повышает шансы, что система все-таки будет работать и делает более легким восстановление с резервной копии.
+
+.Преимущество одной файловой системы
+* Размер файловых систем фиксирован. Если вы создаете файловую систему при установке FreeBSD и задаете определенный размер, позднее вы можете обнаружить что нужен раздел большего размера. Это не так легко сделать без резервного копирования, создания файловых систем нового размера и последующего восстановления сохраненных данных.
++
+[IMPORTANT]
+====
+В FreeBSD представлена команда man:growfs[8], которая позволяет увеличивать размер файловой системы на лету, устраняя это ограничение.
+====
+
+Файловые системы содержатся в разделах. Этот термин не имеет того же смысла, что и при более раннем его использовании в этой главе, из-за наследия UNIX(R) в FreeBSD. Каждый раздел обозначается буквой от `a` до `h`. Каждый раздел может содержать только одну файловую систему, это значит что файловая система может быть описана ее точкой монтирования в файловой иерархии, или буквой раздела, в котором она содержится.
+
+FreeBSD также использует дисковое пространство под _раздел подкачки (swap space)_. Подкачка позволяет FreeBSD работать с _виртуальной памятью_. Ваш компьютер может работать так, как если бы у него было больше памяти, чем есть на самом деле. Когда у FreeBSD кончается память, она перемещает часть данных, не используемых в данный момент, в раздел подкачки и возвращает их обратно (перемещая в подкачку что-то другое), когда они нужны.
+
+По некоторым разделам есть определенные соглашения.
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Раздел
+| Соглашение
+
+|`a`
+|Как правило, содержит корневую файловую систему
+
+|`b`
+|Как правило, содержит раздел подкачки
+
+|`c`
+|Как правило, такого же размера, что и весь слайс (slice). Это позволяет утилитам, которым нужно работать над всем слайсом (например, сканер плохих блоков), работать с разделом `c`. В обычной ситуации не нужно создавать файловую систему на этом разделе.
+
+|`d`
+|Раздел `d` создавался для специальных целей, хотя сейчас они не актуальны и `d` может быть задействован как обычный раздел.
+|===
+
+Каждый раздел-содержащий-файловую-систему хранится на том, что во FreeBSD называется _слайс (slice)_. Слайс - это термин FreeBSD, то, что обычно называют разделом, и опять же это из-за UNIX(R) основы FreeBSD. Слайсы нумеруются с 1 по 4.
+
+Номера слайсов следуют за именем устройства, предваряемые строчной `s`, начиная с 1. Так "da0__s1__" это первый слайс первого SCSI устройства. Может быть только четыре физических слайса на диске, но могут быть логические слайсы нужного типа внутри физических слайсов. Эти дополнительные слайсы нумеруются начиная с 5, так что "ad0__s5__" это первый дополнительный слайс на первом IDE диске. Эти устройства используются файловыми системами, занимающими весь слайс.
+
+Слайсы, "эксклюзивно выделенные (dangerously dedicated)" физические устройства и другие устройства содержат _разделы_, представляемые буквами от `a` до `h`. Эти буквы добавляются к имени устройства. "da0__a__" это раздел a на первом устройстве da, который "эксклюзивно выделен". "ad1s3__e__" это пятый раздел в третьем слайсе второго IDE диска.
+
+Наконец, каждый диск идентифицирован. Имя диска начинается с кода, обозначающего тип диска, затем идет номер диска. В отличие от слайсов, нумерация дисков начинается с 0. Основные коды, которые вам могут встретиться, есть в <<basics-dev-codes>>.
+
+В то время, как ссылка на раздел FreeBSD требует также указания слайса и диска, содержащего раздел, ссылка на слайс требует также указания имени диска. Другими словами, ссылаясь на раздел, указывайте имя диска, `s`, номер слайса, и затем букву раздела. Примеры показаны в <<basics-disk-slice-part>>.
+
+<<basics-concept-disk-model>> показывает концептуальную модель диска, которая должна помочь прояснить ситуацию.
+
+Для установки FreeBSD вы должны сначала настроить слайсы дисков, затем создать разделы внутри слайсов, которые будут использованы для FreeBSD, а затем создать файловую систему (или подкачку) в каждом разделе и решить, куда файловая система будет смонтирована.
+
+[[basics-dev-codes]]
+.Коды дисковых устройств
+[cols="1,1", frame="none", options="header"]
+|===
+| Код
+| Значение
+
+|[.filename]#ad#
+|ATAPI (IDE) диск
+
+|[.filename]#da#
+|SCSI direct access диск
+
+|[.filename]#acd#
+|ATAPI (IDE) CDROM
+
+|[.filename]#cd#
+|SCSI CDROM
+
+|[.filename]#fd#
+|Floppy disk
+|===
+
+[[basics-disk-slice-part]]
+.Пример имен диска, слайса, и раздела
+[example]
+====
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Имя
+| Значение
+
+|`ad0s1a`
+|Первый раздел (`a`) на первом слайсе (`s1`) первого IDE диска (`ad0`).
+
+|`da1s2e`
+|Пятый раздел (`e`) на втором слайсе (`s2`) второго SCSI диска (`da1`).
+|===
+====
+
+[[basics-concept-disk-model]]
+.Концептуальная модель диска
+[example]
+====
+Эта диаграмма показывает первый подключенный к системе IDE диск с точки зрения FreeBSD. Предположим, что размер диска 4 GB, и он содержит два 2 GB слайса (MS-DOS(R) разделы). Первый слайс содержит MS-DOS(R) диск, [.filename]#C:#, а второй слайс содержит установленную FreeBSD. В этом примере у установленной FreeBSD есть три раздела с данными и раздел подкачки.
+
+В каждом из трех разделов есть файловая система. Раздел `a` используется для корневой файловой системы, `e` для иерархии каталогов [.filename]#/var#, а `f` для иерархии каталогов [.filename]#/usr#.
+
+image::disk-layout.png[]
+
+====
+
+[[mount-unmount]]
+== Монтирование и размонтирование файловых систем
+
+Файловая система лучше всего представима в виде дерева, с корнем в [.filename]#/#. Каталоги, [.filename]#/dev#, [.filename]#/usr# и прочие - это ветви дерева, которые, в свою очередь, являются корнями для поддеревьев, также имеющих ветви ([.filename]#/usr/local#), и т.д.
+
+Хорошей практикой является разнесение некоторых особо важных каталогов на разные файловые системы. Например, [.filename]#/var#, содержит [.filename]#log/#, [.filename]#spool/#, а также всевозможные временные файлы и нередко может занять все свободное место на диске. Поэтому лучше смонтировать [.filename]#/var# отдельно, чтобы избежать переполнения [.filename]#/#.
+
+Часто бывает так, что некоторые разделы файловой системы расположены на разных физических носителях (дисках, CDROM), виртуальных или сетевых (например, crossref:network-servers[network-nfs,"сетевая файловая система (Network File System, NFS)"]). В этом случае узлы файловой иерархии будут расположены на разных файловых системах.
+
+[[disks-fstab]]
+=== Файл [.filename]#fstab#
+
+Файловые системы, перечисленные в [.filename]#/etc/fstab#, монтируются автоматически в crossref:boot[boot,процессе загрузки] (если, конечно, для них не указана опция `noauto`).
+
+Формат файла [.filename]#/etc/fstab# следующий (файловые системы перечисляются построчно):
+
+[.programlisting]
+....
+
+ устройство /точка-монтирования тип файловой системы опции частота дампов порядок проверки
+....
+
+`устройство`::
+Имя устройства (которое должно присутствовать), как описано в crossref:disks[disks-naming,Имена устройств].
+
+`точка монтирования`::
+Каталог (существующий), куда следует смонтировать файловую систему.
+
+`тип файловой системы`::
+Тип файловой системы, который передается программе man:mount[8]. По умолчанию FreeBSD использует `ufs`.
+
+`опции`::
+Например, `rw`, для монтирования файловой системы в режиме "чтение-запись", или `ro`, для режима "только чтение", за которыми могут следовать и другие опции. Довольно часто используется опция `noauto`, чтобы не монтировать автоматически файловые системы в процессе загрузки. Об остальных опциях можно прочитать в man:mount[8].
+
+`частота дампов`::
+Используется утилитой man:dump[8] для определения файловых систем, с которых необходимо периодически снимать специальные архивные копии. При отсутствии этого параметра принимается равным нулю.
+
+`порядок проверки`::
+Определяет порядок, в котором следует проверять файловые системы (чаще всего, в случае некорректного размонтирования или внезапной перезагрузки системы). Если файловую системы не нужно проверять, этот параметр должен быть установлен в ноль. Для корневой файловой системы (которая должна быть проверена в первую очередь) установите его в 1. Для всех остальных - 2 или больше. Если две или более файловые системы имеют одинаковое значение `passno`, man:fsck[8] попытается проверять их параллельно (если, конечно, это возможно физически).
+
+Обратитесь к man:fstab[5] за дополнительной информацией о формате файла [.filename]#/etc/fstab# и различных опциях монтирования.
+
+[[disks-mount]]
+=== Команда `mount`
+
+Команда man:mount[8] используется, как следует из ее имени, для монтирования файловых систем.
+
+Пример использования (простейший случай):
+
+[example]
+====
+
+[source,bash]
+....
+# mount устройство точка-монтирования
+....
+
+====
+
+Перечислим основные опции, которые может принимать команда man:mount[8] (полный список смотрите на странице справочника):
+
+.Опции монтирования
+`-a`::
+Смонтировать все файловые системы, перечисленные в файле [.filename]#/etc/fstab#. Исключение составляют помеченные как "noauto", перечисленные после опции `-t` и уже смонтированные.
+
+`-d`::
+Сделать все, кроме самого системного вызова mount. Эта опция полезна вместе с флагом `-v` для определения того, что на самом деле пытается сделать man:mount[8].
+
+`-f`::
+Монтировать поврежденный раздел (опасно!), или форсировать отмену всех запросов на запись при изменении режима монтирования с "чтение-запись" на "только чтение".
+
+`-r`::
+Монтировать файловую систему в режиме "только для чтения". То же самое, что и указание аргумента `ro` для опции `-o`.
+
+`-t` _fstype_::
+Монтировать файловую систему как систему указанного типа, или, в случае опции `-a`, только файловые системы данного типа.
++
+По умолчанию, тип файловой системы - "ufs".
+
+`-u`::
+Обновить опции монтирования для файловой системы.
+
+`-v`::
+Выдавать более подробную информацию.
+
+`-w`::
+Монтировать файловую систему в режиме "чтение-запись".
+
+Опция `-o` принимает разделенные запятыми аргументы, включая нижеперечисленные:
+
+noexec::
+Запрет на исполнение бинарных файлов на файловой системе (тоже полезная опция для повышения безопасности системы).
+
+nosuid::
+Игнорировать setuid и setgid биты на файловой системе (еще одна полезная опция для повышения безопасности системы).
+
+[[disks-umount]]
+=== Команда `umount`
+
+Команда man:umount[8] принимает в качестве параметра точку монтирования какой-либо файловой системы, имя устройства, опцию `-a` или `-A`.
+
+Кроме того, вы можете дополнительно указать опцию `-f` для форсированного размонтирования файловой системы, и `-v` для получения более подробной информации. Имейте ввиду, что это в общем случае опасно и потому не рекомендуется, так как тем самым вы можете нарушить работу компьютера или повредить данные на файловой системе.
+
+Опции `-a` и `-A` используются для размонтирования всех файловых систем (разве что вы укажете опцию `-t`). Разница состоит в том, что `-A` не пытается размонтировать корневую файловую систему.
+
+[[basics-processes]]
+== Процессы
+
+FreeBSD является многозадачной операционной системой. Это означает, что одновременно может быть запущена более чем одна программа. Каждая программа, работающая в некоторый момент времени, называется _процессом_. Каждая команда, которую вы запускаете, порождает хотя бы один процесс. Есть несколько системных процессов, запущенных все время и поддерживающих функциональность системы.
+
+У каждого процесса есть уникальный номер, называемый _process ID_, или _PID_, и, как и у файлов, у каждого процесса есть владелец и группа. Информация о владельце и группе процесса используется для определения того, какие файлы и устройства могут быть открыты процессом с учетом прав на файлы, о которых говорилось ранее. Также у большинства процессов есть родительский процесс. Например, при запуске команд из оболочки, оболочка является процессом и любая запущенная команда также является процессом. Для каждого запущенного таким путем процесса оболочка будет являться родительским процессом. Исключением из этого правила является специальный процесс, называемый man:init[8]. `init` всегда первый процесс, его PID всегда 1. `init` запускается автоматически ядром во время загрузки FreeBSD.
+
+Две команды очень полезны для просмотра работающих в системе процессов, это man:ps[1] и man:top[1]. Команда `ps` используется для получения списка запущенных процессов и может показать их PID, сколько памяти они используют, команду, которой они были запущены и т.д. Команда `top` показывает запущенные процессы и обновляет экран каждые несколько секунд, что позволяет наблюдать за работой компьютера в реальном времени.
+
+По умолчанию, `ps` показывает только принадлежащие вам процессы. Например:
+
+[source,bash]
+....
+% ps
+ PID TT STAT TIME COMMAND
+ 298 p0 Ss 0:01.10 tcsh
+ 7078 p0 S 2:40.88 xemacs mdoc.xsl (xemacs-21.1.14)
+37393 p0 I 0:03.11 xemacs freebsd.dsl (xemacs-21.1.14)
+48630 p0 S 2:50.89 /usr/local/lib/netscape-linux/navigator-linux-4.77.bi
+48730 p0 IW 0:00.00 (dns helper) (navigator-linux-)
+72210 p0 R+ 0:00.00 ps
+ 390 p1 Is 0:01.14 tcsh
+ 7059 p2 Is+ 1:36.18 /usr/local/bin/mutt -y
+ 6688 p3 IWs 0:00.00 tcsh
+10735 p4 IWs 0:00.00 tcsh
+20256 p5 IWs 0:00.00 tcsh
+ 262 v0 IWs 0:00.00 -tcsh (tcsh)
+ 270 v0 IW+ 0:00.00 /bin/sh /usr/X11R6/bin/startx -- -bpp 16
+ 280 v0 IW+ 0:00.00 xinit /home/nik/.xinitrc -- -bpp 16
+ 284 v0 IW 0:00.00 /bin/sh /home/nik/.xinitrc
+ 285 v0 S 0:38.45 /usr/X11R6/bin/sawfish
+....
+
+Как вы можете видеть в данном примере, вывод man:ps[1] организован в несколько колонок. Идентификатор процесса `PID` обсуждался ранее. PID назначаются с 1 до 99999 и опять с начала, если последнее число будет превышено (однажды выданный и используемый PID не может быть назначен повторно). Колонка `TT` показывает терминал (tty), на котором запущена программа (можете пока забыть про это). `STAT` показывает состояние программы и опять же может быть пока проигнорирован. `TIME` это количество времени центрального процессора, использованное программой - это обычно не время, прошедшее с запуска программы, поскольку большинство программы проводят много времени в ожидании некоторого события перед тем, как занять время процессора. Наконец, `COMMAND` это команда, которой программа была запущена.
+
+У man:ps[1] есть множество различных опций, влияющих на выводимую информацию. Один из наиболее полезных наборов опций это `auxww`. `a` позволяет показать информацию о всех запущенных процессах, а не только тех, которыми вы владеете. `u` показывает имя пользователя, владеющего процессом, и информацию об используемой памяти. `x` показывает информацию о процессах-даемонах и `ww` указывает man:ps[1] показать всю командную строку для каждого процесса, вместо обрезания ее, когда она станет слишком длинной, чтобы уместиться на экран.
+
+Вывод man:top[1] похож на только что описанный. Обычно он выглядит так:
+
+[source,bash]
+....
+% top
+last pid: 72257; load averages: 0.13, 0.09, 0.03 up 0+13:38:33 22:39:10
+47 processes: 1 running, 46 sleeping
+CPU states: 12.6% user, 0.0% nice, 7.8% system, 0.0% interrupt, 79.7% idle
+Mem: 36M Active, 5256K Inact, 13M Wired, 6312K Cache, 15M Buf, 408K Free
+Swap: 256M Total, 38M Used, 217M Free, 15% Inuse
+
+ PID USERNAME PRI NICE SIZE RES STATE TIME WCPU CPU COMMAND
+72257 nik 28 0 1960K 1044K RUN 0:00 14.86% 1.42% top
+ 7078 nik 2 0 15280K 10960K select 2:54 0.88% 0.88% xemacs-21.1.14
+ 281 nik 2 0 18636K 7112K select 5:36 0.73% 0.73% XF86_SVGA
+ 296 nik 2 0 3240K 1644K select 0:12 0.05% 0.05% xterm
+48630 nik 2 0 29816K 9148K select 3:18 0.00% 0.00% navigator-linu
+ 175 root 2 0 924K 252K select 1:41 0.00% 0.00% syslogd
+ 7059 nik 2 0 7260K 4644K poll 1:38 0.00% 0.00% mutt
+...
+....
+
+Вывод разбит на два раздела. Заголовок (первые пять строк) показывает PID последнего запущенного процесса, среднее значение загрузки системы (которое показывает насколько система занята), время работы системы с последней перезагрузки и текущее время. Другие цифры заголовка относятся к количеству запущенных процессов (в данном примере 47), количеству занятой памяти и подкачки и время, занимаемое различными состояниями процессора.
+
+Ниже идут несколько колонок, содержащих похожую на вывод man:ps[1] информацию. Как и раньше, это PID, время процессора, командная строка. man:top[1] показывает также величину занятой процессом памяти. Это значение разбито на две колонки, одна для общего объема, а другая для резидентного - общий объем показывает сколько всего памяти нужно приложению, а резидентный показывает количество памяти, используемой в данный момент. Из этого примера видно, что man:getenv[3] требует почти 30 MB памяти, но в данный момент использует только 9 MB.
+
+man:top[1] автоматически обновляет экран каждые две секунды; это значение можно изменить опцией `s`.
+
+[[basics-daemons]]
+== Даемоны, сигналы, уничтожение процессов
+
+Если вы запускаете редактор, им можно легко управлять, открывать в нем файлы и т.д. Вы можете делать это, поскольку редактор предоставляет такие возможности и потому, что редактор присоединен к _терминалу_. Некоторые программы разработаны без поддержки интерфейса пользователя, поэтому они отсоединяются от терминала при первой возможности. Например, веб-сервер целый день отвечает на запросы из сети, и ему как правило не требуется ваше вмешательство. Программы, передающие почту от сервера к серверу - другой пример приложений этого класса.
+
+Мы называем эти программы _даемонами_. Даемоны это персонажи греческой мифологии: хорошие или плохие, они были спутниками человека и, вообще говоря, выполняли полезную работу для людей, почти как веб- и почтовые серверы выполняют полезную работу сегодня. Это причина, по которой талисманом BSD долгое время является веселый даемон в кедах и с вилами.
+
+Есть соглашение, по которому имя программы, которая обычно запускается как даемон, заканчивается на "d". BIND это Berkeley Internet Name Domain, а выполняемая программа называется `named`; программа веб сервера Apache называется `httpd`; даемон очереди печати это `lpd` и так далее. Это соглашение, а не жесткое правило; например, главный почтовый даемон для Sendmail называется `sendmail`, а не `maild`, как вы могли бы предположить.
+
+Иногда может потребоваться взаимодействие с процессом даемона. Один из способов взаимодействия с процессом даемона (или с любым другим запущенным процессом) - это посылка ему так называемого _сигнала_. Есть множество различных сигналов - некоторые из них имеют специальное значение, другие обрабатываются приложением, реакция которого на эти сигналы должна быть описана в документации. Вы можете посылать сигналы только тем процессам, владельцем которых являетесь. Если вы отправите сигнал какому-то другому процессу с помощью man:kill[1] или man:kill[2], доступ будет запрещен. Исключением из правил является пользователь `root`, который может отправлять сигналы любому процессу.
+
+В некоторых случаях FreeBSD тоже посылает сигналы приложениям. Если приложение плохо написано и пробует обратиться к области памяти, к которой оно не должно обращаться, FreeBSD посылает процессу сигнал _нарушение сегментации_ (`SIGSEGV`). Если приложение использует системный вызов man:alarm[3], чтобы получить уведомление по истечении определенного периода времени, будет отправлен сигнал Alarm (`SIGALRM`) и т.д.
+
+Два сигнала могут быть использованы для завершения процесса, `SIGTERM` и `SIGKILL`. `SIGTERM` это корректный способ завершить процесс; процесс может _поймать_ сигнал, определить, что его хотят завершить, закрыть любые файлы, которые он мог открыть, и закончить то, что он делал в момент перед закрытием. В некоторых случаях процесс может даже игнорировать `SIGTERM`, если выполняет задачу, которая не может быть прервана.
+
+`SIGKILL` не может быть проигнорирован процессом. Этот сигнал говорит "Меня не волнует что ты делаешь - остановись немедленно". Если вы посылаете процессу `SIGKILL`, FreeBSD сразу же остановит этот процесс.
+
+Другие сигналы, которые возможно вам понадобятся, `SIGHUP`, `SIGUSR1`, и `SIGUSR2`. Это сигналы общего назначения, различные приложения могут по-разному реагировать на них.
+
+Предположим, что вы изменили файл конфигурации веб сервера - теперь нужно указать ему перечитать конфигурацию. Можно остановить и запустить `httpd`, но это приведет к кратковременной остановке сервера, которая может быть нежелательна. Большинство даемонов написаны так, чтобы при получении сигнала `SIGHUP` перечитывать файлы конфигурации. Поэтому вместо уничтожения и запуска `httpd` можно послать сигнал `SIGHUP`. Поскольку нет стандартного способа реагирования на этот сигнал, различные даемоны будут вести себя по разному; прочитайте документацию на даемон по этому вопросу.
+
+Сигналы посылаются с помощью команды man:kill[1], как показано в этом примере.
+
+[.procedure]
+====
+*Procedure: Отправка сигнала процессу*
+
+Этот пример показывает как послать сигнал man:inetd[8]. Файл конфигурации `inetd`[.filename]#/etc/inetd.conf#, `inetd` перечитает этот файл, если ему отправить сигнал `SIGHUP`.
+
+. Нужно определить PID процесса, которому вы хотите отправить сигнал. Сделайте это с помощью man:ps[1] и man:grep[1]. Команда man:grep[1] используется для поиска по заданной строке в выходном потоке. Эта команда запускается под обычным пользователем, а man:inetd[8] под `root`, поэтому man:ps[1] должна быть запущена с параметром `ax`.
++
+[source,bash]
+....
+% ps -ax | grep inetd
+ 198 ?? IWs 0:00.00 inetd -wW
+....
++
+Итак, PID man:inetd[8] 198. В некоторых случаях в выводе команды может также появиться `grep inetd`. Это из-за способа, которым man:ps[1] получает список запущенных процессов.
+. Используйте man:kill[1] для отправки сигнала. Поскольку man:inetd[8] запускается из под `root`, нужно сначала использовать man:su[1] для получения прав `root`.
++
+[source,bash]
+....
+% su
+Password:
+# /bin/kill -s HUP 198
+....
++
+Как и большинство команд UNIX(R), man:kill[1] ничего не выведет, если отработает нормально. Если вы посылаете сигнал процессу, которым не владеете, на экране появится `kill: _PID_: Operation not permitted`. При неправильно набранном PID вы или отправите сигнал другому процессу, что может привести к неприятностям, или, если повезет, сигнал будет отправлен на PID, который в данный момент не используется - на экране появится `kill: _PID_: No such process`.
++
+[NOTE]
+.Зачем использовать `/bin/kill`?
+======
+Во многих оболочках команда `kill` встроена; таким образом, оболочка вместо вызова [.filename]#/bin/kill# сама посылает сигнал. Это может быть очень полезно, но в разных оболочках имя сигнала указывается по-разному. Чем пытаться выучить их все, гораздо проще использовать `/bin/kill _..._` непосредственно.
+======
+====
+
+Отправка других сигналов очень похожа, просто замените `TERM` или `KILL` в командной строке на имя другого сигнала.
+
+[IMPORTANT]
+====
+Уничтожение процессов наугад может быть плохой идеей. В частности, man:init[8], чей PID 1, имеет особое значение. Выполнение `/bin/kill -s KILL 1` - быстрый способ перегрузить систему. _Всегда_ дважды проверяйте параметры запуска man:kill[1] _перед_ тем, как нажать kbd:[Enter].
+====
+
+[[shells]]
+== Интерпретатор команд
+
+При работе с FreeBSD, в большинстве случаев для выполнения повседневных задач используется командный интерфейс (так называемая "оболочка", "shell"). Основная задача интерпретатора - принимать вводимые команды и выполнять их. Многие командные интерпретаторы имеют встроенные средства для выполнения повседневной работы, например, операции над файлами и каталогами, редактирование командной строки, командные макросы и переменные окружения. Вместе с FreeBSD поставляется несколько командных интерпретаторов, например, `sh`, или Bourne Shell, и `tcsh`, расширенная версия C-shell. Многие другие интерпретаторы доступны из коллекции портов FreeBSD, например `zsh` и `bash`.
+
+Какой из командных интерпретаторов использовать? Это дело вкуса. Если вы программируете на C, то вам, возможно, понравится `tcsh`. Если вы работали с Linux, или только начинаете работать с интерфейсом командной строки UNIX(R), попробуйте `bash`. Каждый из названных интерпретаторов имеет свои особенности, которые отличат его от других, и, возможно, повлияют на ваш выбор.
+
+Одна из наиболее часто используемых функций командного интерпретатора - дополнение частичного имени файла до полного. Вы можете набрать только первые несколько символов имени файла, нажать клавишу табуляции (TAB), и командный интерпретатор автоматически завершит имя. Например, у нас есть два файла, названные [.filename]#foobar# и [.filename]#foo.bar#. Допустим, мы хотим удалить файл [.filename]#foo.bar#. Для этого, наберем на клавиатуре `rm fo[Tab].[Tab]`.
+
+Вы увидите следующее: `rm foo[BEEP].bar`.
+
+Здесь [BEEP] - это так называемый консольный сигнал, оповещающий о том, что интерпретатор не в состоянии закончить имя файла, так как по введенным вами символам невозможно однозначно идентифицировать файл. Например, имена файлов [.filename]#foobar# и [.filename]#foo.bar# оба начинаются с `fo`, но после нажатия TAB можно однозначно дополнить только до `foo`. Если же теперь ввести точку (`.`) и вновь нажать TAB, интерпретатор достроит имя файла целиком.
+
+Дополнительные возможности при работе с интерпретатором дает использование переменных окружения. Переменные окружения это пары переменная/значение, хранящиеся в памяти интерпретатора. Значение переменных окружения может быть прочитано любой программой, запущенной из командного интерпретатора, и часто содержит настройки для многих приложений и утилит. Ниже приведены некоторые наиболее часто встречающиеся переменные окружения и их значения:
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Переменная
+| Описание
+
+|`USER`
+|Имя текущего пользователя.
+
+|`PATH`
+|Каталоги, разделенные двоеточием, для поиска исполняемых файлов.
+
+|`DISPLAY`
+|Сетевое имя виртуального дисплея X11, доступного для подключения.
+
+|`SHELL`
+|Текущий командный интерпретатор.
+
+|`TERM`
+|Тип терминала пользователя. Используется, чтобы узнать возможности терминала.
+
+|`TERMCAP`
+|Список escape-последовательностей для управления различными функциями терминала.
+
+|`OSTYPE`
+|Название (тип) операционной системы. Например, FreeBSD.
+
+|`MACHTYPE`
+|Архитектура машины (процессора).
+
+|`EDITOR`
+|Выбранный пользователем текстовый редактор.
+
+|`PAGER`
+|Выбранная пользователем утилита просмотра файлов.
+
+|`MANPATH`
+|Каталоги, разделенные двоеточием, для поиска файлов системного справочника.
+|===
+
+Установка значений переменных окружения различна для разных оболочек. Например, в интерпретаторах C-стиля, таких как `tcsh` и `csh`, это `setenv`. В интерпретаторах Bourne, таких как `sh` и `bash`, это `export`. Например, чтобы установить или изменить значение переменной `EDITOR` к значению [.filename]#/usr/local/bin/emacs# в `csh` или `tcsh`, выполните команду:
+
+[source,bash]
+....
+% setenv EDITOR /usr/local/bin/emacs
+....
+
+В оболочках Bourne:
+
+[source,bash]
+....
+% export EDITOR="/usr/local/bin/emacs"
+....
+
+Чтобы получить значение переменной, например, в командной строке, поместите символ `$` перед именем переменной. Например, команда `echo $TERM` выведет значение переменной `$TERM`.
+
+Командный интерпретатор воспринимает некоторые символы, называемые метасимволами, в качестве управляющих. Один из наиболее часто используемых - символ `\*`, который заменяет любое количество символов в имени файла. Метасимволы используются для поиска файлов по маске, например, команда `echo *` делает практически тоже самое, что и команда `ls`, поскольку интерпретатор вызывает команду `echo`, передавая ей имена всех файлов, попадающих под маску `*`.
+
+В некоторых ситуациях требуется, чтобы интерпретатор воспринимал метасимволы как обычные, не несущие специальной смысловой нагрузки. Этого можно достичь, поставив перед символом обратную косую черту (`\`). Например, команда `echo $TERM` выведет тип вашего терминала, в то же время команда `echo \$TERM` выведет именно слово `$TERM`, а не значение переменной `$TERM`.
+
+[[changing-shells]]
+=== Как изменить командный интерпретатор по умолчанию
+
+Самым простым способом, пожалуй, будет воспользоваться командой `chsh`. Если переменная `EDITOR` определена, то будет загружен соответствующий текстовый редактор, иначе vi. Вам нужно будет изменить значение поля "Shell:" и выйти из редактора с сохранением результатов.
+
+Можно также воспользоваться опцией `-s` команды `chsh`. Например, если вы хотите изменить интерпретатор на `bash`, выполните:
+
+[source,bash]
+....
+% chsh -s /usr/local/bin/bash
+....
+
+[NOTE]
+====
+Интерпретатор, который вы будете использовать, _обязательно_ должен быть в файле [.filename]#/etc/shells#. Обычно, при установке интерпретаторов из crossref:ports[ports,коллекции портов], это делается автоматически. Если же это не так, вам нужно будет самостоятельно добавить соответствующую строчку в этот файл.
+
+Например, если вы установили `bash` вручную и поместили его в каталог [.filename]#/usr/local/bin#, нужно набрать:
+
+[source,bash]
+....
+# echo "/usr/local/bin/bash" >> /etc/shells
+....
+
+Теперь можно смело использовать команду `chsh`.
+====
+
+[[editors]]
+== Текстовые редакторы
+
+Большинство настроек в FreeBSD производится путем редактирования текстовых файлов. Соответственно, вам нужно будет освоиться с каким-либо текстовым редактором. Вместе с FreeBSD поставляются лишь некоторые из них, гораздо больше редакторов доступно из Коллекции портов.
+
+Самым простым в изучении и использовании, по-видимому, можно назвать ee, что расшифровывается как "easy editor", т.е. "простой редактор". Чтобы начать редактировать какой-либо файл, наберите в командной строке `ee _filename_`, где _filename_ имя редактируемого файла. Например, для редактирования файла [.filename]#/etc/rc.conf#, наберите `ee /etc/rc.conf`. В верхней части экрана вы увидите список основных команд редактора. Символ каретки (`^`) означает клавишу kbd:[Ctrl], таким образом, `^e` означает комбинацию клавиш kbd:[Ctrl+e]. Чтобы выйти из редактора, нажмите клавишу kbd:[Esc], затем kbd:[Enter]. Если остались какие-либо не сохраненные данные, вам потребуется подтвердить выход, сохранив результат работы или оставив файл без изменения.
+
+В FreeBSD присутствует также более мощный текстовый редактор vi, а редакторы emacs и vim можно найти в коллекции портов (package:editors/emacs[] и package:editors/vim[]). Эти редакторы обладают еще большей функциональностью и мощью, но они также и более сложны в изучении. Однако, если в будущем вам потребуется часто редактировать большие объемы текстов, то время, потраченное на изучение более мощного редактора, такого как vim или Emacs, окупится с лихвой.
+
+Многие приложения, модифицирующие файлы или требующие текстового ввода, автоматически открывают текстовый редактор. Чтобы сменить используемый по умолчанию редактор, установите переменную окружения `EDITOR`. За деталями обратитесь к разделу <<shells,интерпретатор команд>>.
+
+[[basics-devices]]
+== Устройства и файлы устройств
+
+Термин "устройство" используется в основном по отношению к аппаратному обеспечению системы, такому как диски, принтеры, графические адаптеры, устройства ввода текста. При загрузке FreeBSD главным образом выводит на экран информацию об обнаруженных устройствах. Вы можете найти эти сообщения в файле [.filename]#/var/run/dmesg.boot#.
+
+Например, [.filename]#acd0# это первый диск IDE CDROM, а [.filename]#kbd0# - клавиатура.
+
+В UNIX(R) доступ к большинству этих устройств можно получить через специальные файлы устройств, расположенные в каталоге [.filename]#/dev#.
+
+=== Создание файлов устройств
+
+При добавлении в систему нового устройства, или добавлении поддержки дополнительных устройств, потребуется создать один или несколько файлов устройств для нового оборудования.
+
+==== `DEVFS` (DEVice File System)
+
+Device filesystem, или `DEVFS`, предоставляет доступ к пространству устройств ядра через общую файловую систему. Вместо создания и модификации файлов устройств, `DEVFS` создает специальную файловую систему.
+
+Обращайтесь к man:devfs[5] за дополнительной информацией.
+
+[[binary-formats]]
+== Бинарные форматы
+
+Для понимания того, почему FreeBSD использует формат man:elf[5], вам потребуется сначала немного узнать о трех "доминирующих" исполняемых форматах для UNIX(R):
+
+* man:a.out[5]
++
+Старейший и "классический" объектный формат UNIX(R). Он использует короткий и компактный заголовок с магическим числом в начале, которое часто используется для описания формата (смотрите man:a.out[5] с более подробной информацией). Он содержит три загружаемых сегмента: .text, .data и .bss плюс таблицу символов и таблицу строк.
+* COFF
++
+Объектный формат SVR3. Заголовок включает таблицу разделов, так что могут быть сегменты кроме .text, .data и .bss.
+* man:elf[5]
++
+Наследник формата COFF, поддерживающий множественные сегменты и 32-битные или 64-битные значения. Одно важное замечание: ELF был разработан в предположении что есть только по одному ABI на одну архитектуру. Это предположение совершенно неверно, и не только в мире коммерческих SYSV (в котором есть как минимум три ABI: SVR4, Solaris, SCO).
++
+FreeBSD пытается обойти эту проблему, в частности предоставляя утилиту для _оглавления_ известного исполняемого файла ELF информацией об ABI с которым он совместим. Обратитесь к странице справочника man:brandelf[1] за более подробной информацией.
+
+FreeBSD имеет произошла из "классического" лагеря и использовала формат man:a.out[5], технологию опробованную и проверенную на многих поколениях релизов BSD, до начала ветки 3.X. Хотя собирать и запускать родные бинарные файлы ELF (и ядро) в системе FreeBSD можно было несколько раньше, FreeBSD вначале сопротивлялась "проталкиванию"ELF как формата по умолчанию. Почему? Когда лагерь Linux производил болезненный переход к ELF, у него не было большого преимущества перед исполняемым форматом [.filename]#a.out#, из-за негибкого, основанного на таблице переходов механизма разделяемых библиотек, что делало создание разделяемых библиотек очень трудным для поставщиков и разработчиков. Когда доступные инструменты ELF предоставили решение проблемы разделяемых библиотек, и появилась некоторая перспектива, цена перехода была признана допустимой и он был сделан. Механизм разделяемых библиотек FreeBSD близок по стилю к механизму разделяемых библиотек SunOS(TM) от Sun, и поэтому очень прост в использовании.
+
+Итак, почему так много разных форматов?
+
+Давно, в темном далеком прошлом, оборудование было простым. Это простое оборудование поддерживало простые, маленькие системы. [.filename]#a.out# был совершенно адекватен задаче представления бинарных файлов на таких простых системах (PDP-11). Люди, портировавшие UNIX(R) с этих простых систем, оставили [.filename]#a.out# формат потому, что он был достаточен для ранних портов UNIX(R) на архитектуры, подобные Motorola 68k, VAXen, etc.
+
+Затем какой-то смышленый инженер по оборудованию решил, что если он сможет заставить программы исполнять некоторые трюки, то сможет несколько упростить дизайн и заставить ядро CPU работать быстрее. Хотя это было сделано с новым типом оборудования (известного сейчас как RISC), формат [.filename]#a.out# не подходил для него, и было разработано множество форматов, чтобы получить лучшую производительность на таком оборудовании по сравнению с той, которую мог предоставить простой формат [.filename]#a.out#. Были изобретены форматы COFF, ECOFF и некоторые другие малоизвестные форматы, и их ограничения были учтены, когда все похоже остановились на ELF.
+
+Кроме того, размеры программ стали огромны, а диски (и оперативная память) остались относительно малы, поэтому появилась концепция разделяемых библиотек. Система VM также стала более сложной. Хотя все эти усовершенствования были выполнены с форматом [.filename]#a.out#, его полезность все больше и больше уменьшалась с каждым нововведением. К тому же потребовалась динамическая загрузка во время выполнения, или выгрузка частей программы после выполнения стартового кода для экономии памяти или места на диске. Языки усложнялись, и потребовался автоматический вызов кода перед главной программой. Множество изменений было внесено в формат [.filename]#a.out#, чтобы все это появилось, и в основном работало некоторое время. Настал момент, когда [.filename]#a.out# не смог решить все эти проблемы без чрезмерного увеличения размера и сложности. В то время, как ELF решил многие из этих проблем, перевод этого формата с системы на систему болезнен. Поэтому формату ELF пришлось подождать, пока не стало более болезненным оставаться с [.filename]#a.out#, чем перейти на ELF.
+
+Тем временем, инструменты разработки, от которых произошли инструменты разработки FreeBSD (особенно ассемблер и загрузчик), развивались в двух параллельных направлениях. Направление FreeBSD добавило разделяемые библиотеки и устранило некоторые ошибки. Люди из GNU, написавшие эти программы, переписали их и добавили простую поддержку сборки кросс-компиляторов, подключения различных форматов в будущем и так далее. Многим требовалось собрать кросс-компиляторы для FreeBSD, и это не удалось, поскольку устаревшие исходные тексты FreeBSD для as и ld не подходили для этой задачи. Новый набор инструментов GNU (binutils) поддерживает кросс-компилирование, ELF, разделяемые библиотеки, C++, расширения и т.д. В дополнение, многие поставщики выпустили программы в формате ELF и они хорошо подходят для запуска в FreeBSD.
+
+ELF более выразителен, чем [.filename]#a.out#, позволяет базовой системе быть более гибкой. ELF лучше поддерживается, и предоставляет поддержку кросс-компиляторов, что важно для многих людей. ELF может быть немного медленнее, чем [.filename]#a.out#, но замерить это сложно. Есть также множество деталей, отличающихся для этих двух форматов, в том как они отображают страницы, обрабатывают начальный код, и т.д. В этом нет ничего очень важного, но они различаются. В настоящее время поддержка [.filename]#a.out# убрана из ядра [.filename]#GENERIC#, и со временем будет убрана из ядра, как только потребность в запуске старых программ [.filename]#a.out# останется в прошлом.
+
+[[basics-more-information]]
+== Дополнительная информация
+
+[[basics-man]]
+=== Системный справочник (man)
+
+Пожалуй, самым полным руководством по FreeBSD является системный справочник (man). Практически каждое приложение или утилита имеют соответствующую страницу (часто не одну), описывающую тот или иной аспект работы программы, всевозможные опции и настройки. Для просмотра этих страниц существует команда `man`:
+
+[source,bash]
+....
+% man command
+....
+
+Здесь `command` - это команда, о которой вы хотите получить информацию. Например, чтобы узнать побольше о команде `ls`, наберите:
+
+[source,bash]
+....
+% man ls
+....
+
+Содержимое системного справочника для удобства разделено на несколько разделов:
+
+. Пользовательские команды.
+. Системные вызовы и коды ошибок.
+. Функции стандартных библиотек.
+. Драйверы устройств.
+. Форматы файлов.
+. Развлечения и игры.
+. Дополнительная информация.
+. Команды системного администрирования.
+. Для разработчиков ядра.
+
+В некоторых случаях (не так уж редко), страницы, относящиеся к одной и той же команде, находятся в различных разделах справочника. Например, есть команда `chmod` и системный вызов `chmod()`. В этом случае, необходимо явно указать раздел `man`, в котором нужно искать соответствующую страницу:
+
+[source,bash]
+....
+% man 1 chmod
+....
+
+Эта команда выведет справку об утилите `chmod`. По традиции, конкретный раздел справочника указывается в скобках после команды, например, man:chmod[1] относится к утилите `chmod`, а man:chmod[2] - к соответствующему системному вызову.
+
+Часто бывает так, что вы не знаете название команды, но имеете представление о том, что она должна делать. В этом случае можно попытаться найти нужную команду по ключевым словам, встречающимся в ее описании, используя опцию `-k` программы `man`:
+
+[source,bash]
+....
+% man -k mail
+....
+
+Вы получите список команд, имеющих слово "mail" в своих описаниях. Это эквивалентно использованию команды `apropos`.
+
+Или например, вы видите список файлов в каталоге [.filename]#/usr/bin#, при этом не имея ни малейшего представления о том, какие функции выполняет каждый их них? Просто наберите:
+
+[source,bash]
+....
+% cd /usr/bin
+% man -f *
+....
+
+или
+
+[source,bash]
+....
+% cd /usr/bin
+% whatis *
+....
+
+что фактически одно и то же.
+
+[[basics-info]]
+=== Файлы GNU Info
+
+FreeBSD поставляется с многочисленными приложениями и утилитами от Фонда Свободного Программного Обеспечения, Free Software Foundation (FSF). В дополнение к страницам справочника, с этими программами поставляется обширная гипертекстовая документация в виде так называемых `info` файлов, которые могут быть просмотрены с помощью команды `info`, или, если установлен emacs, в info режиме этого редактора.
+
+Чтобы воспользоваться командой man:info[1], просто наберите в командной строке:
+
+[source,bash]
+....
+% info
+....
+
+Вызвать на экран краткое введение можно набрав `h`. Краткий список команд можно получить набрав `?`.
diff --git a/documentation/content/ru/books/handbook/bibliography/_index.adoc b/documentation/content/ru/books/handbook/bibliography/_index.adoc
new file mode 100644
index 0000000000..5429f378bb
--- /dev/null
+++ b/documentation/content/ru/books/handbook/bibliography/_index.adoc
@@ -0,0 +1,166 @@
+---
+title: Приложение B. Библиография
+part: Часть V. Приложения
+prev: books/handbook/mirrors
+next: books/handbook/eresources
+---
+
+[appendix]
+[[bibliography]]
+= Библиография
+:doctype: book
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: B
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+Так как страницы Справочника FreeBSD предоставляют лишь описание отдельных частей операционной системы FreeBSD, они не очень удобны для иллюстрации объединения этих частей вместе для того, чтобы настроить ОС и сделать ее работу более гладкой. Для этого незаменимы хорошая книга по системному администрированию UNIX(R) и хорошее руководство пользователя.
+
+[[bibliography-freebsd]]
+== Книги и журналы, специализирующиеся на FreeBSD
+
+_Международные книги и журналы:_
+
+* http://jdli.tw.FreeBSD.org/publication/book/freebsd2/index.html[Using FreeBSD] (на китайском).
+* FreeBSD Unleashed (перевод на китайский), опубликовано http://www.hzbook.com/[China Machine Press]. ISBN 7-111-10201-0.
+* FreeBSD From Scratch First Edition (на китайском), опубликовано China Machine Press. ISBN 7-111-07482-3.
+* FreeBSD From Scratch Second Edition (на китайском), опубликовано China Machine Press. ISBN 7-111-10286-X.
+* FreeBSD Handbook (на китайском), опубликовано http://www.ptpress.com.cn/[Posts & Telecom Press]. ISBN 7-115-10541-3.
+* FreeBSD 3.x Internet (на китайском), опубликовано http://www.tup.tsinghua.edu.cn/[Tsinghua University Press]. ISBN 7-900625-66-6.
+* FreeBSD & Windows (на китайском), ISBN 7-113-03845-X
+* FreeBSD Internet Services HOWTO (на китайском), ISBN 7-113-03423-3
+* FreeBSD for PC 98'ers (на японском), выпущено SHUWA System Co, LTD. ISBN 4-87966-468-5 C3055 P2900E.
+* FreeBSD (на японском), выпущено CUTT. ISBN 4-906391-22-2 C3055 P2400E.
+* http://www.shoeisha.com/book/Detail.asp?bid=650[Complete Introduction to FreeBSD] (на японском), выпущено http://www.shoeisha.co.jp/[Shoeisha Co., Ltd]. ISBN 4-88135-473-6 P3600E.
+* http://www.ascii.co.jp/pb/book1/shinkan/detail/1322785.html[Personal UNIX Starter Kit FreeBSD] (на японском), выпущено http://www.ascii.co.jp/[ASCII]. ISBN 4-7561-1733-3 P3000E.
+* FreeBSD Handbook (японский перевод), выпущено http://www.ascii.co.jp/[ASCII]. ISBN 4-7561-1580-2 P3800E.
+* FreeBSD mit Methode (на немецком), выпущено http://www.cul.de[Computer und Literatur Verlag]/Vertrieb Hanser, 1998. ISBN 3-932311-31-0.
+* http://www.cul.de/freebsd.html[FreeBSD 4 - Installieren, Konfigurieren, Administrieren] (на немецком), выпущено http://www.cul.de[Computer und Literatur Verlag], 2001. ISBN 3-932311-88-4.
+* http://www.cul.de/freebsd.html[FreeBSD 5 - Installieren, Konfigurieren, Administrieren] (на немецком), выпущено http://www.cul.de[Computer und Literatur Verlag], 2003. ISBN 3-936546-06-1.
+* http://www.mitp.de/vmi/mitp/detail/pWert/1343/[ FreeBSD de Luxe] (на немецком), выпущено http://www.mitp.de[Verlag Modere Industrie], 2003. ISBN 3-8266-1343-0.
+* http://www.pc.mycom.co.jp/FreeBSD/install-manual.html[FreeBSD Install and Utilization Manual] (на японском), выпущено http://www.pc.mycom.co.jp/[Mainichi Communications Inc.].
+* Onno W Purbo, Dodi Maryanto, Syahrial Hubbany, Widjil Widodo _http://maxwell.itb.ac.id/[Создание Интернет Сервера с использованием FreeBSD]_ (на Индонезийском языке), выпущено http://www.elexmedia.co.id/[Elex Media Komputindo].
+
+_Книги и журналы на английском языке:_
+
+* http://www.AbsoluteBSD.com/[Absolute BSD: The Ultimate Guide to FreeBSD], выпущено http://www.nostarch.com/[No Starch Press], 2002. ISBN: 1886411743
+* http://www.freebsdmall.com/cgi-bin/fm/bsdcomp[ The Complete FreeBSD], выпущено http://www.oreilly.com/[O'Reilly], 2003. ISBN: 0596005164
+* http://www.freebsd-corp-net-guide.com[The FreeBSD Corporate Networker's Guide], выпущено http://www.awl.com/aw/[Addison-Wesley], 2000. ISBN: 0201704811
+* http://andrsn.stanford.edu/FreeBSD/introbook/[ FreeBSD: An Open-Source Operating System for Your Personal Computer], выпущено The Bit Tree Press, 2001. ISBN: 0971204500
+* Teach Yourself FreeBSD in 24 Hours, выпущено http://www.samspublishing.com/[Sams], 2002. ISBN: 0672324245
+* FreeBSD unleashed, выпущено http://www.samspublishing.com/[Sams], 2006. ISBN: 0672328755
+* FreeBSD: The Complete Reference, выпущено http://books.mcgraw-hill.com[McGrawHill], 2003. ISBN: 0072224096
+
+[[bibliography-userguides]]
+== Руководства для пользователей
+
+* Computer Systems Research Group, UC Berkeley. _4.4BSD User's Reference Manual_. O'Reilly & Associates, Inc., 1994. ISBN 1-56592-075-9
+* Computer Systems Research Group, UC Berkeley. _4.4BSD User's Supplementary Documents_. O'Reilly & Associates, Inc., 1994. ISBN 1-56592-076-7
+* _UNIX in a Nutshell_. O'Reilly & Associates, Inc., 1990. ISBN 093717520X
+* Mui, Linda. _What You Need To Know When You Can't Find Your UNIX System Administrator_. O'Reilly & Associates, Inc., 1995. ISBN 1-56592-104-6
+* http://www-wks.acs.ohio-state.edu/[Ohio State University] написал http://www-wks.acs.ohio-state.edu/unix_course/unix.html[ Ознакомительный Курс UNIX] который доступен в Online в HTML и PS форматах.
++
+Итальянский https://www.FreeBSD.org/doc/it_IT.ISO8859-15/books/unix-introduction/index.html[перевод] этого документа доступен как часть FreeBSD Italian Documentation Project.
+* http://www.jp.FreeBSD.org/[Jpman Project, Japan FreeBSD Users Group]. http://www.pc.mycom.co.jp/FreeBSD/urm.html[FreeBSD User's Reference Manual] (Японский перевод). http://www.pc.mycom.co.jp/[Mainichi Communications Inc.], 1998. ISBN4-8399-0088-4 P3800E.
+* http://www.ed.ac.uk/[Эдинбургский Университет] составил http://unixhelp.ed.ac.uk/[Online Путеводитель] для новичков в UNIX.
+
+[[bibliography-adminguides]]
+== Руководства для администраторов
+
+* Albitz, Paul and Liu, Cricket. _DNS and BIND_, 4th Ed. O'Reilly & Associates, Inc., 2001. ISBN 1-59600-158-4
+* Computer Systems Research Group, UC Berkeley. _4.4BSD System Manager's Manual_. O'Reilly & Associates, Inc., 1994. ISBN 1-56592-080-5
+* Costales, Brian, et al. _Sendmail_, 2nd Ed. O'Reilly & Associates, Inc., 1997. ISBN 1-56592-222-0
+* Frisch, Æleen. _Essential System Administration_, 2nd Ed. O'Reilly & Associates, Inc., 1995. ISBN 1-56592-127-5
+* Hunt, Craig. _TCP/IP Network Administration_, 2nd Ed. O'Reilly & Associates, Inc., 1997. ISBN 1-56592-322-7
+* Nemeth, Evi. _UNIX System Administration Handbook_. 2nd Ed. Prentice Hall, 2000. ISBN 0-13-020601-6
+* Stern, Hal _Managing NFS and NIS_ O'Reilly & Associates, Inc., 1991. ISBN 0-937175-75-7
+* http://www.jp.FreeBSD.org/[Jpman Project, Japan FreeBSD Users Group]. http://www.pc.mycom.co.jp/FreeBSD/sam.html[FreeBSD System Administrator's Manual] (Japanese translation). http://www.pc.mycom.co.jp/[Mainichi Communications Inc.], 1998. ISBN4-8399-0109-0 P3300E.
+* Dreyfus, Emmanuel. http://www.eyrolles.com/Informatique/Livre/9782212114638/[Cahiers de l'Admin: BSD] 2nd Ed. (на французском), Eyrolles, 2004. ISBN 2-212-11463-X
+
+[[bibliography-programmers]]
+== Руководства для программистов
+
+* Asente, Paul, Converse, Diana, and Swick, Ralph. _X Window System Toolkit_. Digital Press, 1998. ISBN 1-55558-178-1
+* Computer Systems Research Group, UC Berkeley. _4.4BSD Programmer's Reference Manual_. O'Reilly & Associates, Inc., 1994. ISBN 1-56592-078-3
+* Computer Systems Research Group, UC Berkeley. _4.4BSD Programmer's Supplementary Documents_. O'Reilly & Associates, Inc., 1994. ISBN 1-56592-079-1
+* Harbison, Samuel P. and Steele, Guy L. Jr. _C: A Reference Manual_. 4th ed. Prentice Hall, 1995. ISBN 0-13-326224-3
+* Kernighan, Brian and Dennis M. Ritchie. _The C Programming Language_. 2nd Ed. PTR Prentice Hall, 1988. ISBN 0-13-110362-8
+* Lehey, Greg. _Porting UNIX Software_. O'Reilly & Associates, Inc., 1995. ISBN 1-56592-126-7
+* Plauger, P. J. _The Standard C Library_. Prentice Hall, 1992. ISBN 0-13-131509-9
+* Spinellis, Diomidis. http://www.spinellis.gr/codereading/[Code Reading: The Open Source Perspective]. Addison-Wesley, 2003. ISBN 0-201-79940-5
+* Spinellis, Diomidis. http://www.spinellis.gr/codequality/[Code Quality: The Open Source Perspective]. Addison-Wesley, 2003. ISBN 0-201-79940-5
+* Stevens, W. Richard. _Advanced Programming in the UNIX Environment_. 2nd Ed. Reading, Mass. : Addison-Wesley, 2005. ISBN 0-201-43307-9
+* Stevens, W. Richard. _UNIX Network Programming_. 2nd Ed, PTR Prentice Hall, 1998. ISBN 0-13-490012-X
+* Wells, Bill. "Writing Serial Drivers for UNIX". _Dr. Dobb's Journal_. 19(15), December 1994. pp68-71, 97-99.
+
+[[bibliography-osinternals]]
+== Внутренности операционной системы
+
+* Andleigh, Prabhat K. _UNIX System Architecture_. Prentice-Hall, Inc., 1990. ISBN 0-13-949843-5
+* Jolitz, William. "Porting UNIX to the 386". _Dr. Dobb's Journal_. January 1991-July 1992.
+* Leffler, Samuel J., Marshall Kirk McKusick, Michael J Karels and John Quarterman _The Design and Implementation of the 4.3BSD UNIX Operating System_. Reading, Mass. : Addison-Wesley, 1989. ISBN 0-201-06196-1
+* Leffler, Samuel J., Marshall Kirk McKusick, _The Design and Implementation of the 4.3BSD UNIX Operating System: Answer Book_. Reading, Mass. : Addison-Wesley, 1991. ISBN 0-201-54629-9
+* McKusick, Marshall Kirk, Keith Bostic, Michael J Karels, and John Quarterman. _The Design and Implementation of the 4.4BSD Operating System_. Reading, Mass. : Addison-Wesley, 1996. ISBN 0-201-54979-4
++
+(глава 2 этой книги доступна link:{design-44bsd}[онлайн] как часть Проекта документирования FreeBSD, и глава 9 доступна http://www.netapp.com/tech_library/nfsbook.html[ здесь].)
+* Marshall Kirk McKusick, George V. Neville-Neil _The Design and Implementation of the FreeBSD Operating System_. Boston, Mass. : Addison-Wesley, 2004. ISBN 0-201-70245-2
+* Stevens, W. Richard. _TCP/IP Illustrated, Volume 1: The Protocols_. Reading, Mass. : Addison-Wesley, 1996. ISBN 0-201-63346-9
+* Schimmel, Curt. _Unix Systems for Modern Architectures_. Reading, Mass. : Addison-Wesley, 1994. ISBN 0-201-63338-8
+* Stevens, W. Richard. _TCP/IP Illustrated, Volume 3: TCP for Transactions, HTTP, NNTP and the UNIX Domain Protocols_. Reading, Mass. : Addison-Wesley, 1996. ISBN 0-201-63495-3
+* Vahalia, Uresh. _UNIX Internals -- The New Frontiers_. Prentice Hall, 1996. ISBN 0-13-101908-2
+* Wright, Gary R. and W. Richard Stevens. _TCP/IP Illustrated, Volume 2: The Implementation_. Reading, Mass. : Addison-Wesley, 1995. ISBN 0-201-63354-X
+
+[[bibliography-security]]
+== Безопасность
+
+* Cheswick, William R. and Steven M. Bellovin. _Firewalls and Internet Security: Repelling the Wily Hacker_. Reading, Mass. : Addison-Wesley, 1995. ISBN 0-201-63357-4
+* Garfinkel, Simson and Gene Spafford. _Practical UNIX & Internet Security_. 2nd Ed. O'Reilly & Associates, Inc., 1996. ISBN 1-56592-148-8
+* Garfinkel, Simson. _PGP Pretty Good Privacy_ O'Reilly & Associates, Inc., 1995. ISBN 1-56592-098-8
+
+[[bibliography-hardware]]
+== Оборудование
+
+* Anderson, Don and Tom Shanley. _Pentium Processor System Architecture_. 2nd Ed. Reading, Mass. : Addison-Wesley, 1995. ISBN 0-201-40992-5
+* Ferraro, Richard F. _Programmer's Guide to the EGA, VGA, and Super VGA Cards_. 3rd ed. Reading, Mass. : Addison-Wesley, 1995. ISBN 0-201-62490-7
+* Intel Corporation publishes documentation on their CPUs, chipsets and standards on their http://developer.intel.com/[developer web site], usually as PDF files.
+* Shanley, Tom. _80486 System Architecture_. 3rd ed. Reading, Mass. : Addison-Wesley, 1995. ISBN 0-201-40994-1
+* Shanley, Tom. _ISA System Architecture_. 3rd ed. Reading, Mass. : Addison-Wesley, 1995. ISBN 0-201-40996-8
+* Shanley, Tom. _PCI System Architecture_. 4th ed. Reading, Mass. : Addison-Wesley, 1999. ISBN 0-201-30974-2
+* Van Gilluwe, Frank. _The Undocumented PC_, 2nd Ed. Reading, Mass: Addison-Wesley Pub. Co., 1996. ISBN 0-201-47950-8
+* Messmer, Hans-Peter. _The Indispensable PC Hardware Book_, 4th Ed. Reading, Mass: Addison-Wesley Pub. Co., 2002. ISBN 0-201-59616-4
+
+[[bibliography-history]]
+== История UNIX(R)
+
+* Lion, John _Lion's Commentary on UNIX, 6th Ed. With Source Code_. ITP Media Group, 1996. ISBN 1573980137
+* Raymond, Eric S. _The New Hacker's Dictionary, 3rd edition_. MIT Press, 1996. ISBN 0-262-68092-0. Also known as the http://www.catb.org/~esr/jargon/html/index.html[Jargon File]
+* Salus, Peter H. _A quarter century of UNIX_. Addison-Wesley Publishing Company, Inc., 1994. ISBN 0-201-54777-5
+* Simon Garfinkel, Daniel Weise, Steven Strassmann. _The UNIX-HATERS Handbook_. IDG Books Worldwide, Inc., 1994. ISBN 1-56884-203-1. Не печаталась, доступна по адресу http://research.microsoft.com/~daniel/unix-haters.html[ online].
+* Don Libes, Sandy Ressler _Life with UNIX_ - special edition. Prentice-Hall, Inc., 1989. ISBN 0-13-536657-7
+* _The BSD family tree_. http://www.FreeBSD.org/cgi/cvsweb.cgi/src/shared/misc/bsd-family-tree[http://www.FreeBSD.org/cgi/cvsweb.cgi/src/shared/misc/bsd-family-tree] или link:file://localhost/usr/shared/misc/bsd-family-tree[/usr/shared/misc/bsd-family-tree] на компьютере FreeBSD.
+* _The BSD Release Announcements collection_. 1997. http://www.de.FreeBSD.org/de/ftp/releases/[http://www.de.FreeBSD.org/de/ftp/releases/]
+* _Networked Computer Science Technical Reports Library_. http://www.ncstrl.org/[http://www.ncstrl.org/]
+* _Old BSD releases from the Computer Systems Research group (CSRG)_. http://www.mckusick.com/csrg/[http://www.mckusick.com/csrg/]: В набор на 4CD включены все версии BSD от 1BSD до 4.4BSD и 4.4BSD-Lite2 (но к сожалению нет 2.11BSD). На последнем диске находится также последняя версия исходных текстов и файлы SCCS.
+
+[[bibliography-journals]]
+== Прочие издания
+
+* _The C/C++ Users Journal_. R&D Publications Inc. ISSN 1075-2838
+* _Sys Admin - The Journal for UNIX System Administrators_ Miller Freeman, Inc., ISSN 1061-2688
+* _freeX - Das Magazin für Linux - BSD - UNIX_ (на немецком) Computer- und Literaturverlag GmbH, ISSN 1436-7033
diff --git a/documentation/content/ru/books/handbook/book.adoc b/documentation/content/ru/books/handbook/book.adoc
new file mode 100644
index 0000000000..306ad325bc
--- /dev/null
+++ b/documentation/content/ru/books/handbook/book.adoc
@@ -0,0 +1,160 @@
+---
+title: Руководство FreeBSD
+authors:
+ - author: Проект Документации FreeBSD
+copyright: 1995-2020 The FreeBSD Documentation Project
+releaseinfo: "$FreeBSD$"
+trademarks: ["freebsd", "ibm", "ieee", "redhat", "3com", "adobe", "apple", "intel", "linux", "microsoft", "opengroup", "sun", "realnetworks", "oracle", "3ware", "arm", "adaptec", "heidelberger", "intuit", "lsilogic", "themathworks", "thomson", "vmware", "wolframresearch", "xiph", "xfree86", "general"]
+---
+
+= Руководство FreeBSD
+:doctype: book
+:toc: macro
+:toclevels: 2
+:icons: font
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnums:
+:sectnumlevels: 6
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:part-signifier: Часть
+:chapter-signifier: Глава
+:appendix-caption: Приложение
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:book: true
+:pdf: false
+:pgpkeys-path: ../../../../../
+
+ifeval::["{backend}" == "html5"]
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+:chapters-path: content/ru/books/handbook/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+include::../../../../shared/mirrors.adoc[]
+include::../../../../shared/authors.adoc[]
+include::../../../../shared/releases.adoc[]
+include::../../../../shared/ru/mailing-lists.adoc[]
+include::../../../../shared/ru/teams.adoc[]
+include::../../../../shared/ru/urls.adoc[]
+:chapters-path:
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+include::../../../../shared/mirrors.adoc[]
+include::../../../../shared/authors.adoc[]
+include::../../../../shared/releases.adoc[]
+include::../../../../shared/ru/mailing-lists.adoc[]
+include::../../../../shared/ru/teams.adoc[]
+include::../../../../shared/ru/urls.adoc[]
+:chapters-path:
+endif::[]
+
+[.abstract-title]
+[abstract]
+Аннотация
+
+Добро пожаловать в FreeBSD! Это Руководство охватывает процесс установки и ежедневного использования _FreeBSD {rel112-current}-RELEASE_ и _FreeBSD {rel120-current}-RELEASE_. Оно находится _в процессе разработки_ и являет собой результат работы множества людей. Многие из разделов до сих пор не существуют, а некоторые из существующих требуют обновления. Если вы заинтересованы в помощи этому проекту, отправьте письмо в {freebsd-doc}. Обновленная версия этого документа постоянно доступна с http://www.FreeBSD.org/ru/index.html[Основного Web сервера FreeBSD]. Он также может быть загружен из интернет в одном из наиболее распространенных форматов с link:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/[FTP сервера Проекта FreeBSD] или с одного из многочисленных <<mirrors-ftp,зеркал>>. Если вы предпочитаете иметь напечатанный (английский) вариант Руководства, то можете приобрести его на http://www.freebsdmall.com/[FreeBSD Mall]. Вы также можете воспользоваться link:https://www.FreeBSD.org/ru/search/[Поиском в Руководстве FreeBSD].
+
+'''
+
+toc::[]
+
+:sectnums!:
+
+include::{chapters-path}preface/_index.adoc[leveloffset=+1, lines=7..-1]
+
+:sectnums:
+
+// Section one
+include::{chapters-path}parti.adoc[lines=7..18]
+
+include::{chapters-path}introduction/_index.adoc[leveloffset=+1, lines=8..26;36..-1]
+
+include::{chapters-path}install/_index.adoc[leveloffset=+1, lines=8..38;48..-1]
+
+include::{chapters-path}bsdinstall/_index.adoc[leveloffset=+1, lines=8..38;48..-1]
+
+include::{chapters-path}basics/_index.adoc[leveloffset=+1, lines=8..38;48..-1]
+
+include::{chapters-path}ports/_index.adoc[leveloffset=+1, lines=8..38;48..-1]
+
+include::{chapters-path}x11/_index.adoc[leveloffset=+1, lines=8..38;48..-1]
+
+// Section two
+include::{chapters-path}partii.adoc[lines=7..18]
+
+include::{chapters-path}desktop/_index.adoc[leveloffset=+1, lines=8..38;48..-1]
+
+include::{chapters-path}multimedia/_index.adoc[leveloffset=+1, lines=8..38;48..-1]
+
+include::{chapters-path}kernelconfig/_index.adoc[leveloffset=+1, lines=8..38;48..-1]
+
+include::{chapters-path}printing/_index.adoc[leveloffset=+1, lines=8..38;48..-1]
+
+include::{chapters-path}linuxemu/_index.adoc[leveloffset=+1, lines=8..38;48..-1]
+
+// Section three
+include::{chapters-path}partiii.adoc[lines=7..12]
+
+include::{chapters-path}config/_index.adoc[leveloffset=+1, lines=8..38;48..-1]
+
+include::{chapters-path}boot/_index.adoc[leveloffset=+1, lines=8..38;48..-1]
+
+include::{chapters-path}security/_index.adoc[leveloffset=+1, lines=8..38;48..-1]
+
+include::{chapters-path}mac/_index.adoc[leveloffset=+1, lines=8..38;48..-1]
+
+include::{chapters-path}audit/_index.adoc[leveloffset=+1, lines=8..38;48..-1]
+
+include::{chapters-path}disks/_index.adoc[leveloffset=+1, lines=8..38;48..-1]
+
+include::{chapters-path}geom/_index.adoc[leveloffset=+1, lines=8..38;48..-1]
+
+include::{chapters-path}filesystems/_index.adoc[leveloffset=+1, lines=8..38;48..-1]
+
+include::{chapters-path}l10n/_index.adoc[leveloffset=+1, lines=8..38;48..-1]
+
+include::{chapters-path}cutting-edge/_index.adoc[leveloffset=+1, lines=8..38;48..-1]
+
+// Section four
+include::{chapters-path}partiv.adoc[lines=7..19]
+
+include::{chapters-path}serialcomms/_index.adoc[leveloffset=+1, lines=8..38;48..-1]
+
+include::{chapters-path}ppp-and-slip/_index.adoc[leveloffset=+1, lines=8..38;48..-1]
+
+include::{chapters-path}mail/_index.adoc[leveloffset=+1, lines=8..38;48..-1]
+
+include::{chapters-path}network-servers/_index.adoc[leveloffset=+1, lines=8..38;48..-1]
+
+include::{chapters-path}firewalls/_index.adoc[leveloffset=+1, lines=8..38;48..-1]
+
+include::{chapters-path}advanced-networking/_index.adoc[leveloffset=+1, lines=8..38;48..-1]
+
+// Section five
+include::{chapters-path}partv.adoc[lines=7..8]
+
+:sectnums!:
+
+include::{chapters-path}mirrors/_index.adoc[leveloffset=+1, lines=8..25;34..-1]
+
+include::{chapters-path}bibliography/_index.adoc[leveloffset=+1, lines=8..25;33..-1]
+
+include::{chapters-path}eresources/_index.adoc[leveloffset=+1, lines=8..25;34..-1]
+
+include::{chapters-path}pgpkeys/_index.adoc[leveloffset=+1, lines=8..25;35..-1]
+
+:sectnums:
diff --git a/documentation/content/ru/books/handbook/boot/_index.adoc b/documentation/content/ru/books/handbook/boot/_index.adoc
new file mode 100644
index 0000000000..c97208cb69
--- /dev/null
+++ b/documentation/content/ru/books/handbook/boot/_index.adoc
@@ -0,0 +1,480 @@
+---
+title: Глава 13. Процесс загрузки FreeBSD
+part: Часть III. Системное администрирование
+prev: books/handbook/config
+next: books/handbook/security
+---
+
+[[boot]]
+= Процесс загрузки FreeBSD
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 13
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/boot/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/boot/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/boot/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[boot-synopsis]]
+== Описание
+
+Процесс включения компьютера и загрузки операционной системы называется "процессом первоначальной загрузки", или просто "загрузкой". Процесс загрузки FreeBSD предоставляет большие возможности по гибкой настройке того, что происходит при запуске системы, позволяя вам выбирать из различных операционных систем, установленных на одном и том же компьютере, или даже из различных версий той же самой операционной системы или установленного ядра.
+
+Эта глава подробно описывает параметры, которые вы можете изменить для настройки процесса загрузки FreeBSD. Под этим подразумевается все, что происходит до начала работы ядра FreeBSD, обнаружения устройств и запуска man:init[8]. Если вы не совсем уверены, то это происходит, когда выводимый текст меняет цвет с ярко-белого на серый.
+
+После чтения этой главы вы будете знать:
+
+* Из каких частей состоит система начальной загрузки FreeBSD, и как эти части взаимодействуют.
+* Параметры, которые вы можете передать компонентам начальной загрузки FreeBSD для управления этим процессом.
+* Основы работы man:device.hints[5]
+
+[NOTE]
+.Только для x86
+====
+Эта глава описывает процесс загрузки FreeBSD только для систем на основе архитектуры Intel x86.
+====
+
+[[boot-introduction]]
+== Проблема загрузки
+
+Включение компьютера и запуск операционной системы приводят к интересной дилемме. По определению до запуска операционной системы компьютер не умеет ничего. В том числе и не знает, как запускать программы с диска. Так что компьютер не может запустить программу с диска без операционной системы, но программы операционной системы находятся на диске, но как запустить операционную систему?
+
+Эта проблема имеет параллели с одной проблемой из книги Приключения барона Мюнхгаузена. Герой провалился в болото, и вытащил сам себя, ухватив за волосы и потянув. В эпоху начала компьютеризации термин _начальная загрузка_ применялся к механизму, используемому для загрузки операционной системы, и затем был сокращен до просто "загрузки".
+
+На оборудовании архитектуры x86 за загрузку операционной системы отвечает BIOS (Basic Input/Output System). Для этого BIOS ищет на жестком диске MBR (Master Boot Record), которая должна располагаться в определенном месте на диске. BIOS может загрузить и запустить MBR, и предполагается, что MBR может взять на себя остальную работу, связанную с загрузкой операционной системы.
+
+Выполняемую часть MBR обычно называют _менеджером загрузки (boot manager)_, в особенности если она взаимодействует с пользователем. В этом случае менеджер загрузки, как правило, занимает большее пространство на первом _треке_ диска или внутри файловой системы ОС. (Менеджер загрузки иногда называют _загрузчиком (boot loader)_, но во FreeBSD этот термин используется для описания более поздней фазы загрузки). Среди популярных менеджеров загрузки стоит отметить boot0 (он же Boot Easy, стандартный менеджер загрузки FreeBSD), Grub, GAG и LILO. Из перечисленных менеджеров загрузки в MBR помещается только boot0.
+
+Если на вашем диске установлена только одна операционная система, то стандартной MBR будет достаточно. Такая MBR выполняет поиск на диске первого загрузочного (активного) слайса, после чего запускает с этого слайса код загрузки оставшейся части операционной системы. Утилита man:fdisk[8] по умолчанию устанавливает именно такую MBR, на основе файла [.filename]#/boot/mbr#.
+
+Если на ваших дисках установлено несколько операционных систем, то вы можете установить другой менеджер загрузки, который может выдать список различных операционных систем и позволит вам выбрать одну из них для загрузки. Два варианта менеджеров загрузки будут описаны чуть ниже.
+
+Оставшаяся часть системы начальной загрузки FreeBSD разделяется на три этапа. Первый этап запускается из MBR, и он знает достаточно для перевода компьютера в особое состояние и загрузки второго этапа. Второй этап может делать несколько больше до запуска третьего этапа. Третий этап заканчивает работу по загрузке операционной системы. Работа разделена на эти три этапа, потому что стандарты ПК ограничивают размеры программ, которые могут быть запущены на первом и втором этапах. Последовательное выполнение работ позволяет FreeBSD получить более гибкий загрузчик.
+
+Затем стартует ядро, которое начинает опознавать устройства и выполняет их инициализацию. После завершения процесса своей загрузки, ядро передает управление пользовательскому процессу с именем man:init[8], который выполняет проверку дисков на возможность использования. Затем man:init[8] запускает пользовательский процесс настройки ресурсов, который монтирует файловые системы, выполняет настройку сетевых адаптеров для работы в сети и вообще осуществляет запуск всех процессов, обычно выполняемых в системе FreeBSD при загрузке.
+
+[[boot-blocks]]
+== Менеджер загрузки и этапы загрузки
+
+[[boot-boot0]]
+=== Менеджер загрузки
+
+Код MBR или менеджера загрузки время от времени называют _нулевой стадией_ процесса загрузки. В этом разделе мы обсудим два из упомянутых ранее менеджеров загрузки: boot0 и LILO.
+
+MBR для FreeBSD находится в [.filename]#/boot/boot0#. Это _копия_ MBR, так как настоящая MBR должна располагаться в специальном месте диска, вне области FreeBSD.
+
+[.filename]#boot0# очень прост, так как программа в может иметь размер, не превышающий 512 байт. Если вы установили MBR FreeBSD и несколько операционных систем на ваш жесткий диск, то во время загрузки вы увидите нечто похожее на следующее:
+
+*Менеджер загрузки boot0:* MBR, устанавливаемый программой установки FreeBSD или утилитой man:boot0cfg[8], основан на [.filename]#/boot/boot0#. ([.filename]#boot0# очень прост, так как программа в может иметь размер, не превышающий 446 байт, так как часть первого сектора диска занята таблицей слайсов и сигнатурой `0x55AA`). Если вы установили boot0 и несколько операционных систем на ваш жесткий диск, то во время загрузки вы увидите нечто похожее на следующее:
+
+[[boot-boot0-example]]
+.Образец экрана [.filename]#boot0#
+[example]
+====
+
+[source,bash]
+....
+F1 DOS
+F2 FreeBSD
+F3 Linux
+F4 ??
+F5 Drive 1
+
+Default: F2
+....
+
+====
+
+Известно, что другие операционные системы, в частности, Windows(R) 95, записывают поверх существующей MBR свою собственную. Если так случилось в вашем случае, или же вы хотите заменить существующую MBR на MBR от FreeBSD, то воспользуйтесь следующей командой:
+
+[source,bash]
+....
+# fdisk -B -b /boot/boot0 device
+....
+
+Здесь _device_ является устройством, с которого вы загружаетесь, таким, как [.filename]#ad0# в случае первого диска IDE, [.filename]#ad2# в случае первого диска IDE на втором контроллере IDE, [.filename]#da0# для первого диска SCSI и так далее. Если вы используете MBR нестандартного вида, воспользуйтесь man:boot0cfg[8].
+
+*Менеджер загрузки LILO:* Для того, чтобы этот менеджер загрузки мог загружать FreeBSD, загрузите Linux и добавьте к существующему файлу конфигурации [.filename]#/etc/lilo.conf# такие строки:
+
+[.programlisting]
+....
+other=/dev/hdXY
+table=/dev/hdb
+loader=/boot/chain.b
+label=FreeBSD
+....
+
+Укажите диск с основным разделом FreeBSD в терминах Linux, заменив _X_ буквой диска, используемой в Linux, а _Y_ - номером основного раздела. Если вы используете диски SCSI, замените _/dev/hd_ на _/dev/sd_. Строка `loader=/boot/chain.b` может быть опущена, если обе операционные системы находятся на одном диске. Теперь запустите `/sbin/lilo -v` для того, чтобы ваши изменения были восприняты системой, что должно быть подтверждено сообщениями на экране.
+
+[[boot-boot1]]
+=== Этап первый, [.filename]#/boot/boot1#, и этап второй, [.filename]#/boot/boot2#
+
+Концептуально первый и второй этапы загрузки являются частями одной и той же программы, в одной области диска. Из-за ограничений на объем дискового пространства они были разделены на две, но вы всегда должны устанавливать их вместе. Они копируются инсталлятором или утилитой bsdlabel (см. ниже) из общего файла [.filename]#/boot/boot#.
+
+Они располагаются вне файловых систем, на первом треке загрузочного слайса, то есть там, где <<boot-boot0,boot0>> или любой другой менеджер загрузки ожидает найти программу, которую следует запустить для продолжение процесса загрузки. Количество используемых секторов легко может быть вычислено из размера файла [.filename]#/boot/boot#.
+
+[.filename]#boot1# очень прост, так как он не может иметь размер, превышающий 512 байт, и знает лишь о _метке диска_ FreeBSD, хранящей информацию о слайсе, для того, чтобы найти и запустить [.filename]#boot2#.
+
+[.filename]#boot2# устроен несколько более сложно, и умеет работать с файловой системой FreeBSD в объёме, достаточном для нахождения в ней файлов, и может предоставлять простой интерфейс для выбора и передачи управления ядру или загрузчику.
+
+Так как <<boot-loader,загрузчик>> устроен гораздо более сложно, и дает удобный и простой способ настройки процесса загрузки, [.filename]#boot2# обычно запускает его, однако раньше его задачей был запуск непосредственно самого ядра.
+
+[[boot-boot2-example]]
+.Образец экрана [.filename]#boot2#
+[example]
+====
+
+[source,bash]
+....
+>> FreeBSD/i386 BOOT
+Default: 0:ad(0,a)/boot/loader
+boot:
+....
+
+====
+
+Если вам когда-либо понадобится заменить установленные [.filename]#boot1# и [.filename]#boot2#, то используйте утилиту man:bsdlabel[8]:
+
+[source,bash]
+....
+# bsdlabel -B diskslice
+....
+
+Здесь _diskslice_ являются диском и слайсом, с которых вы загружаетесь, например, [.filename]#ad0s1# в случае первого слайса на первом диске IDE.
+
+[WARNING]
+.Режим Dangerously Dedicated
+====
+Если вы используете только имя диска, к примеру, [.filename]#ad0#, в команде man:bsdlabel[8] вы создадите диск в режиме эксклюзивного использования, без слайсов. Это, скорее всего, вовсе не то, что вы хотите сделать, так что дважды проверьте параметры команды man:bsdlabel[8], прежде, чем нажать kbd:[Return].
+====
+
+[[boot-loader]]
+=== Третий этап, [.filename]#/boot/loader#
+
+Передача управления загрузчику является последним, третьим этапом в процессе начальной загрузки, а сам загрузчик находится в файловой системе, обычно как [.filename]#/boot/loader#.
+
+Загрузчик являет собой удобный в использовании инструмент для настройки при помощи простого набора команд, управляемого более мощным интерпретатором с более сложным набором команд.
+
+[[boot-loader-flow]]
+==== Процесс работы загрузчика
+
+Во время инициализации загрузчик пытается произвести поиск консоли, дисков и определить, с какого диска он был запущен. Соответствующим образом он задаёт значения переменных и запускает интерпретатор, которому могут передаваться пользовательские команды как из скрипта, так и в интерактивном режиме.
+
+Затем загрузчик читает файл [.filename]#/boot/loader.rc#, который по умолчанию использует файл [.filename]#/boot/defaults/loader.conf#, устанавливающий подходящие значения по умолчанию для переменных и читает файл [.filename]#/boot/loader.conf# для изменения в этих переменных. Затем с этими переменными работает [.filename]#loader.rc#, загружающий выбранные модули и ядро.
+
+И наконец, по умолчанию загрузчик выдерживает 10-секундную паузу, ожидая нажатия клавиши, и загружает ядро, если этого не произошло. Если ожидание было прервано, пользователю выдается приглашение, которое воспринимает простой набор команд, с помощью которых пользователь может изменить значения переменных, выгрузить все модули, загрузить модули и окончательно продолжить процесс загрузки или перезагрузить машину.
+
+[[boot-loader-commands]]
+==== Встроенные команды загрузчика
+
+Далее следуют наиболее часто используемые команды загрузчика. Полное описание всех имеющихся команд можно найти на странице справки о команде man:loader[8].
+
+autoboot _секунды_::
+Продолжает загрузку ядра, если не будет прерван в течение указанного в секундах промежутка времени. Он выводит счетчик, и по умолчанию выдерживается интервал в 10 секунд.
+
+boot [-параметры] [имя ядра]::
+Продолжить процесс загрузки указанного ядра, если оно было указано, и с указанными параметрами, если они были указаны. Загрузка и использование указанного ядра возможны лишь после выгрузки текущего ядра, а выгрузка текущего ядра производится командой _unload_.
+
+boot-conf::
+Повторно провести тот же самый процесс автоматической настройки модулей на основе переменных, что был произведен при загрузке. Это имеет смысл, если до этого вы выполнили команду `unload`, изменили некоторые переменные, например, наиболее часто меняемую `kernel`.
+
+help [тема]::
+Вывод сообщений подсказки из файла [.filename]#/boot/loader.help#. Если в качестве темы указано слово `index`, то выводится список имеющихся тем.
+
+include _имя файла_ ...::
+Выполнить файл с указанным именем. Файл считывается и его содержимое интерпретируется строчка за строчкой. Ошибка приводит к немедленному прекращению выполнения команды include.
+
+load [-t тип] имя файла::
+Загружает ядро, модуль ядра или файл указанного типа с указанным именем. Все аргументы после имени файла передаются в файл.
+
+ls [-l] [маршрут]::
+Выводит список файлов по указанному маршруту или в корневом каталоге, если маршрут не был указан. Если указан параметр `-l`, будут выводиться и размеры файлов.
+
+lsdev [-v]::
+Выводится список всех устройств, с которых могут быть загружены модули. Если указан параметр `-v`, выводится дополнительная информация.
+
+lsmod [-v]::
+Выводит список загруженных модулей. Если указан параметр `-v`, то выводится дополнительная информация.
+
+more _имя файла_::
+Вывод указанного файла с паузой при выводе каждой строки `LINES`.
+
+reboot::
+Выполнить немедленную перезагрузку машины.
+
+set _переменная_::
+Задает значения переменных окружения загрузчика.
+
+unload::
+Удаление из памяти всех загруженных модулей.
+
+[[boot-loader-examples]]
+==== Примеры использования загрузчика
+
+Вот несколько примеров практического использования загрузчика:
+
+* Чтобы просто загрузить ваше ядро обычным образом, но в однопользовательском режиме:
++
+[source,bash]
+....
+ boot -s
+....
+
+* Для выгрузки обычных ядра и модулей, а потом просто загрузить ваше старое (или другое) ядро:
++
+[source,bash]
+....
+unload
+load kernel.old
+....
++
+Вы можете использовать [.filename]#kernel.GENERIC# для обозначения стандартного ядра, поставляемого на установочном диске, или [.filename]#kernel.old# для обращения к ранее установленному ядру (после того, как, например, вы обновили или отконфигурировали новое ядро).
++
+[NOTE]
+====
+Для загрузки ваших обычных модулей с другим ядром используйте такие команды:
+
+[source,bash]
+....
+unload
+set kernel="kernel.old"
+boot-conf
+....
+
+====
+
+* Для загрузки скрипта конфигурации ядра (автоматизированный скрипт, который выполняет то, что вы обычно делаете в конфигураторе ядра во время загрузки):
++
+[source,bash]
+....
+ load -t userconfig_script /boot/kernel.conf
+....
+
+[[boot-splash]]
+==== Загрузочные экранные заставки
+
+Заставка создает более привлекательный вид процесса загрузки по сравнению с традиционными сообщениями загрузки. Изображение заставки будет отображаться до тех пор, пока не придет очередь приглашения ввода логина на консоли или в менеджере дисплеев.
+
+Есть два базовых окружения во FreeBSD. Первое - это окружение командной строки текстовой виртуальной консоли. По завершении загрузки системы вам предоставляется консольное приглашение ввода логина. Второе окружение - это графическое окружение рабочего стола X11. После установки crossref:x11[x-install,X11] и одной из графических оболочек, таких как GNOME, KDE или XFce, становится возможным запуск рабочего стола Х11 командой `startx`.
+
+Некоторые пользователи предпочитают графический интерфейс входа традиционному текстовому приглашению ввода логина. Менеджеры экранов, наподобие XDM для Xorg, gdm для GNOME, kdm для KDE (а также другие, доступные из коллекции портов), изначально предоставляют графический интерфейс входа. После успешного входа в систему они запускают соответствующий оконный менеджер.
+
+В текстовом окружении экранная заставка скрывает все подробности процесса загрузки и сообщения стартовых скриптов до момента выдачи приглашения ввода логина. Если используется экранная заставка перед входом в графическое окружение, то пользователи получают визуально более чистый старт системы, чем-то напоминающий опыт работы с Microsoft(R) Windows(R) или с иной не unix-подобной системой.
+
+[[boot-splash-function]]
+===== Экранная заставка в действии
+
+В качестве заставки можно использовать лишь содержащие 256 цветов изображения формата BMP ([.filename]#.bmp#) или изображения формата PCX ([.filename]#.pcx#) от ZSoft. К тому же, для вывода на стандартный VGA адаптер, файл изображения заставки должен иметь разрешение не более 320 на 200 пикселей.
+
+Чтобы можно было использовать изображения большего размера, вплоть до максимального 1024 на 768, активируйте поддержку VESA. Активация может быть осуществлена либо подключением модуля VESA во время загрузки системы, либо сборкой специализированного ядра с добавленной опцией `VESA` (смотрите crossref:kernelconfig[kernelconfig, Настройка ядра FreeBSD]). Поддержка режима VESA дает пользователям возможность отображать заставку, перекрывающую всю видимую область экрана.
+
+Отображаемая во время загрузки заставка может быть убрана нажатием любой клавиши на клавиатуре.
+
+С настройками по умолчанию заставка также становится хранителем экрана в консольном окружении. После некоторого бездействия экран сменится заставкой, яркость которой будет периодически изменяться от её максимального значения к минимальному и обратно. Подобное поведение заставки может быть переопределено добавлением строки `saver=` в [.filename]#/etc/rc.conf#. В качестве значения опции `saver=` можно выбрать одно из встроенных имен хранителей экранов, а с полным перечнем можно ознакомиться на странице справочника man:splash[4]. Хранитель экрана, используемый по умолчанию, называется "warp". Заметьте, что установка опции `saver=` в [.filename]#/etc/rc.conf# воздействует исключительно на текстовые виртуальные консоли. Она не влияет на менеджеры экранов X11.
+
+Несколько сообщений загрузчика, включая меню загрузки и счетчик, отображаются во время загрузки, даже если экран-заставка активирован.
+
+Файлы-примеры с изображениями для заставок могут быть скачаны из галереи по адресу http://artwork.freebsdgr.org/node/3/[http://artwork.freebsdgr.org]. Установив порт package:sysutils/bsd-splash-changer[], между загрузками вы получите автоматическую смену случайно выбираемых изображений заставок.
+
+[[boot-splash-enable]]
+===== Активация экранной заставки
+
+Файл изображения для заставки ([.filename]#.bmp# или [.filename]#.pcx#) следует разместить в корневой файловой системе, например в каталоге [.filename]#/boot#.
+
+Для работы заставки с разрешением, доступным при загрузке (256 цветов и не более 320х200 точек), отредактируйте [.filename]#/boot/loader.conf#, добавив в него следующие строки:
+
+[.programlisting]
+....
+splash_bmp_load="YES"
+bitmap_load="YES"
+bitmap_name="/boot/splash.bmp"
+....
+
+Для получения больших разрешений видео режима (вплоть до максимального 1024x768), внесите в [.filename]#/boot/loader.conf# следующие записи:
+
+[.programlisting]
+....
+vesa_load="YES"
+splash_bmp_load="YES"
+bitmap_load="YES"
+bitmap_name="/boot/splash.bmp"
+....
+
+Вышеприведённый пример подразумевает, что файл [.filename]#/boot/splash.bmp# содержит изображение заставки. Если же требуется выводить файл формата PCX, то используйте следующие строки (в зависимости от необходимого разрешения может также потребоваться строка `vesa_load="YES"`):
+
+[.programlisting]
+....
+splash_pcx_load="YES"
+bitmap_load="YES"
+bitmap_name="/boot/splash.pcx"
+....
+
+Возможное имя файла не ограничено одним лишь словом "splash". Оно может выбираться произвольно, например: [.filename]#splash_640x400.bmp# или [.filename]#blue_wave.pcx#. Важен лишь тип файла: он должен быть либо BMP, либо PCX.
+
+Далее приведены еще две полезные опции [.filename]#loader.conf#:
+
+`beastie_disable="YES"`::
+Эта опция отключит меню загрузчика, но приглашение с обратным отсчетом останется. Даже при не отображаемом меню во время отсчета возможен выбор номера варианта загрузки.
+
+`loader_logo="beastie"`::
+Эта установка заменит слова "FreeBSD", которые отображаются справа от меню загрузчика, цветным логотипом демона, который занимал это место в предыдущих релизах FreeBSD.
+
+За более детальной информацией обратитесь к следующим страницам справочника: man:splash[4], man:loader.conf[5] и man:vga[4].
+
+[[boot-kernel]]
+== Взаимодействие с ядром во время загрузки
+
+Как только ядро окажется загруженным при помощи <<boot-loader,загрузчика>> (обычный способ) или <<boot-boot1,boot2>> (минуя загрузчик), оно проверяет флаги загрузки, если они есть, и действует соответствующим образом.
+
+[[boot-kernel-bootflags]]
+=== Флаги загрузки ядра
+
+Вот наиболее часто используемые флаги загрузки:
+
+`-a`::
+во время инициализации ядра запрашивать устройство для его монтирования в качестве корневой файловой системы.
+
+`-C`::
+загрузка с компакт-диска.
+
+`-c`::
+запустить UserConfig для конфигурации ядра во время загрузки
+
+`-s`::
+после загрузки перейти в однопользовательский режим
+
+`-v`::
+во время запуска ядра выводить более подробную информацию
+
+[NOTE]
+====
+Есть и другие флаги загрузки, обратитесь к странице справочника по man:boot[8] для выяснения подробной информации по ним.
+====
+
+[[device-hints]]
+== Хинты устройств
+
+Во время начального запуска системы загрузчик man:loader[8] производит чтение файла man:device.hints[5]. В этом файле хранится необходимая для загрузки ядра информация, задаваемая в виде переменных, которую иногда называют хинтами для устройств ("device hints"). Эти "хинты устройств" используются драйверами устройств для их конфигурации.
+
+Хинты для устройств могут быть также заданы в приглашении <<boot-loader,начального загрузчика Стадии 3>>. Переменные могут быть добавлены при помощи команды `set`, удалены посредством `unset` и просмотрены командой `show`. В этот момент могут быть также переопределены переменные, заданные в файле [.filename]#/boot/device.hints#. Хинты для устройств, введённые в начальном загрузчике, не сохраняются, и при следующей перезагрузке будут утеряны.
+
+После загрузки системы для выдачи значений всех переменных можно воспользоваться командой man:kenv[1].
+
+Синтаксически в файле [.filename]#/boot/device.hints# в каждой строке определяется по одной переменной, в качестве метки начала комментария используется стандартный символ "#". Строки строятся следующим образом:
+
+[source,bash]
+....
+ hint.driver.unit.keyword="value"
+....
+
+Синтаксис для начального загрузчика Стадии 3 таков:
+
+[source,bash]
+....
+ set hint.driver.unit.keyword=value
+....
+
+`driver` определяет имя драйвера устройства, `unit` соответствует порядковому номеру модуля устройства, а `keyword` является ключевым словом хинта. В качестве ключевых слов могут применяться следующие опции:
+
+* `at`: задаёт шину, к которой подключено устройство.
+* `port`: задаёт начальный адрес используемого диапазона ввода/вывода (I/O).
+* `irq`: задаёт используемый номер запроса на прерывание.
+* `drq`: задаёт номер канала DMA.
+* `maddr`: задаёт физический адрес памяти, занимаемый устройством.
+* `flags`: устанавливает различные битовые флаги для устройства.
+* `disabled`: если установлено в значение "1", то устройство не используется.
+
+Драйверы устройств могут поддерживать (и даже требовать) другие хинты, здесь не перечисленные, поэтому рекомендуется просматривать справочные страницы по этим драйверам. Для получения дополнительной информации обратитесь к страницам справки по man:device.hints[5], man:kenv[1], man:loader.conf[5] и man:loader[8].
+
+[[boot-init]]
+== Init: инициализация управления процессами
+
+После того, как ядро завершит загрузку, оно передает управление пользовательскому процессу man:init[8], который расположен в файле [.filename]#/sbin/init# или в файле, маршрут к которому указан в переменной `init_path загрузчика`.
+
+[[boot-autoreboot]]
+=== Процесс автоматической перезагрузки
+
+Процесс автоматической перезагрузки проверяет целостность имеющихся файловых систем. Если это не так, и утилита man:fsck[8] не может исправить положение, то man:init[8] переводит систему в <<boot-singleuser,однопользовательский режим>> для того, чтобы системный администратор сам разобрался с возникающими проблемами.
+
+[[boot-singleuser]]
+=== Однопользовательский режим
+
+В этот режим можно перейти во время <<boot-autoreboot,процесса автоматической перезагрузки>>, при ручной загрузке с параметром `-s` или заданием переменной `boot_single` для программы `loader`.
+
+Этот режим может быть также вызван запуском программы man:shutdown[8] без параметров перезагрузки (`-r`) или останова (`-h`) из <<boot-multiuser,многопользовательского режима>>.
+
+Если режим доступа к системной консоли `console` установлен в файле [.filename]#/etc/ttys# в `insecure`, то система выведет запрос на ввод пароля пользователя `root` перед переходом в однопользовательский режим.
+
+[[boot-insecure-console]]
+.Незащищённая консоль в [.filename]#/etc/ttys#
+[example]
+====
+[.programlisting]
+....
+# name getty type status comments
+#
+# Если консоль помечена как "insecure", то init будет запрашивать пароль
+# пользователя root при переходе в однопользовательский режим.
+console none unknown off insecure
+....
+
+====
+
+[NOTE]
+====
+Обозначение консоли как `insecure` означает, что вы считаете физический доступ к консоли незащищённым, и хотите, чтобы только тот, кто знает пароль пользователя `root`, мог воспользоваться однопользовательским режимом, но это не значит, что вы хотите работать с консолью небезопасным способом. Таким образом, если вы хотите добиться защищённости, указывайте `insecure`, а не `secure`.
+====
+
+[[boot-multiuser]]
+=== Многопользовательский режим
+
+Если man:init[8] определит, что ваши файловые системы находятся в полном порядке, или после того, как пользователь выйдет из <<boot-singleuser,однопользовательского режима>>, система перейдет в многопользовательский режим, работа в котором начинается с настройки ресурсов системы.
+
+[[boot-rc]]
+==== Настройка ресурсов (rc)
+
+Система настройки ресурсов считывает настройки, применяемые по умолчанию, из файла [.filename]#/etc/defaults/rc.conf#, а настройки, специфичные для конкретной системы, из [.filename]#/etc/rc.conf#, после чего осуществляется монтирование файловых систем, перечисленных в файле [.filename]#/etc/fstab#, запуск сетевых служб, различных системных даемонов и, наконец, выполнение скриптов запуска дополнительно установленных пакетов.
+
+Страница справочника по man:rc[8] является хорошим источником информации о системе настройки ресурсов, так же, как и самостоятельное изучение скриптов.
+
+[[boot-shutdown]]
+== Процесс остановки системы
+
+Во время контролируемого процесса остановки системы через утилиту man:shutdown[8] программа man:init[8] будет пытаться запустить скрипт [.filename]#/etc/rc.shutdown#, после чего будет посылать всем процессам сигнал `TERM`, а затем и `KILL` тем процессам, которые ещё не завершили свою работу.
+
+Для выключения машины с FreeBSD на аппаратных платформах и системах, которые поддерживают управление электропитанием, просто воспользуйтесь командой `shutdown -p now` для немедленного отключения электропитания. Чтобы просто перезагрузить систему FreeBSD, воспользуйтесь командой `shutdown -r now`. Для запуска команды man:shutdown[8] вам необходимо быть пользователем `root` или членом группы `operator`. Кроме того, можно также воспользоваться командами man:halt[8] и man:reboot[8], пожалуйста, обратитесь к соответствующим страницам справки и справочной странице по команде man:shutdown[8] для получения дополнительной информации.
+
+[NOTE]
+====
+Для управления электропитанием требуется наличие поддержки man:acpi[4] в ядре или в виде загруженного модуля.
+====
diff --git a/documentation/content/ru/books/handbook/bsdinstall/_index.adoc b/documentation/content/ru/books/handbook/bsdinstall/_index.adoc
new file mode 100644
index 0000000000..433f92f82f
--- /dev/null
+++ b/documentation/content/ru/books/handbook/bsdinstall/_index.adoc
@@ -0,0 +1,1364 @@
+---
+title: Глава 3. Установка FreeBSD версий 9.X и более поздних
+part: Часть I. В начале
+prev: books/handbook/install
+next: books/handbook/basics
+---
+
+[[bsdinstall]]
+= Установка FreeBSD версий 9.X и более поздних
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 3
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../../images/books/handbook/bsdinstall/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/bsdinstall/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/bsdinstall/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[bsdinstall-synopsis]]
+== Краткий обзор
+
+FreeBSD поставляется с простой в использовании текстовой программой установки. FreeBSD 9.0-RELEASE и более поздние укомплектованы установщиком, называемым bsdinstall, в то время как в релизах, предшествующих FreeBSD 9.0-RELEASE, для установки используется sysinstall. В этом разделе описана работа с программой bsdinstall. Работа с установщиком sysinstall описана в crossref:install[install, Установка FreeBSD версий 8.X и более ранних].
+
+После прочтения этого раздела вы будете знать:
+
+* Как создавать установочные носители для FreeBSD.
+* Разбиение и именование разделов жестких дисков во FreeBSD.
+* Как запустить bsdinstall.
+* Вопросы, задаваемые утилитой bsdinstall, что они значат и как на них отвечать.
+
+Перед прочтением этого раздела вам необходимо:
+
+* Прочитать список поддерживаемого оборудования, который прилагается к устанавливаемой вами версии FreeBSD, а также убедиться, что ваше оборудование поддерживается.
+
+[NOTE]
+====
+В общем, эти инструкции по установке написаны для машин архитектуры i386(TM) ("PC-совместимая"). Там, где это необходимо, будут даны указания для других платформ. Между установщиком и этим документом могут быть незначительные различия, поэтому используйте эту главу как общее руководство, а не как точную пошаговую инструкцию.
+====
+
+[[bsdinstall-hardware]]
+== Аппаратные требования
+
+[[bsdinstall-hardware-minimal]]
+=== Минимальная конфигурация
+
+Минимальная аппаратная конфигурация, достаточная для установки FreeBSD, зависит от версии FreeBSD и от аппаратной архитектуры.
+
+Краткое изложение этой информации дано в следующих разделах. В зависимости от способа установки FreeBSD вам также может потребоваться поддерживаемый привод CDROM, а в некоторых случаях - сетевой адаптер. Об этом будет сказано в <<bsdinstall-installation-media>>.
+
+==== FreeBSD/i386
+
+Для FreeBSD/i386 необходим 486 процессор или выше, а также - как минимум 64 МБ ОЗУ. Для самой минимальной установки потребуется не менее 1.1 ГБ свободного места на жестком диске.
+
+[NOTE]
+====
+Для устаревших компьютеров более эффективным способом повышения производительности является увеличение объема ОЗУ и объема жесткого диска, нежели установка более быстродействующего процессора.
+====
+
+==== FreeBSD/amd64
+
+Существует два класса процессоров, на которых может работать FreeBSD/amd64. К первому принадлежат процессоры AMD64, включая AMD Athlon(TM)64, AMD Athlon(TM)64-FX, AMD Opteron(TM) и более новые.
+
+Ко второму классу процессоров, на которых работает FreeBSD/amd64, принадлежат процессоры архитектуры Intel(R) EM64T. Перечень процессоров включает следующие семейства: Intel(R) Core(TM) 2 Duo, Quad, Extreme, семейства Intel(R) Xeon(TM) 3000, 5000 и 7000, а также Intel(R) Core(TM) i3, i5 и i7.
+
+Если ваш компьютер построен на чипсете nVidia nForce3 Pro-150, то вам _необходимо_ отключить IO APIC в BIOS. Если для этого нет опции в BIOS, отключите ACPI в операционной системе. В чипсете Pro-150 содержатся ошибки, для которых пока не существует исправлений.
+
+==== FreeBSD/powerpc Apple(R) Macintosh(R)
+
+Поддерживаются все американские системы Apple(R) Macintosh(R) с встроенным USB. Для многопроцессорных машин есть поддержка SMP.
+
+Ядро (32-бит) может адресовать лишь первые 2 ГБ ОЗУ. На Blue & White PowerMac G3 не поддерживается FireWire(R).
+
+==== FreeBSD/sparc64
+
+Поддерживаемые FreeBSD/sparc64 системы перечислены в проекте http://www.freebsd.org/platforms/sparc/[ FreeBSD/sparc64].
+
+Для FreeBSD/sparc64 требуется отдельный жесткий диск. На данный момент нет возможности разделять диск с другой операционной системой.
+
+[[bsdinstall-hardware-supported]]
+=== Поддерживаемое оборудование
+
+Архитектуры и устройства, поддерживаемые каждым релизом FreeBSD, перечислены в файле Hardware Notes. Файл, как правило, называется [.filename]#HARDWARE.TXT#, и располагается в корневом каталоге установочного носителя. Также копии списка поддерживаемого оборудования находятся на странице http://www.FreeBSD.org/releases/[Release Information] веб сайта FreeBSD.
+
+[[bsdinstall-pre]]
+== Перед установкой
+
+=== Сделайте резервные копии данных
+
+Сделайте резервные копии всех важных данных с того компьютера, на который планируется установка FreeBSD. Проверьте пригодность резервных копий до начала установки. Перед внесением изменений на диск инсталлятор FreeBSD запросит подтверждение, но как только изменения будут внесены, то отменить их уже будет невозможно.
+
+[[bsdinstall-where]]
+=== Решите куда установить FreeBSD
+
+Если FreeBSD будет единственной установленной операционной системой, и она будет занимать весь жесткий диск, то можете смело пропустить этот раздел. Но если FreeBSD будет разделять диск с другими операционными системами, то во время установки вам понадобится понимание принципов разбиения дисков.
+
+[[bsdinstall-where-i386]]
+==== Разделы диска для FreeBSD/i386 и FreeBSD/amd64
+
+Весь объем жестких дисков может быть разделен на множество частей. Эти части называются _разделами_.
+
+Есть два способа деления диска на разделы. Традиционный способ - _Master Boot Record_ (MBR) - хранит таблицу разделов, вмещающую до четырех _первичных разделов_. (Так сложилось исторически, что во FreeBSD эти разделы называются _слайсами_.) Возможны ситуации, в которых четыре раздела недостаточно, поэтому один из первичных разделов может быть превращен в _расширенный раздел_. Внутри расширенного раздела может быть создано несколько _логических разделов_. Результирующая структура выглядит немного неуклюже, но такова она есть.
+
+Создание _Таблицы Разделов GUID_ (GUID Partition Table, GPT) - это более новый и простой способ деления диска. Также новый способ (GPT) по сравнению с традиционным способом разбиения (MBR) гораздо более гибкий. Распространённые реализации GPT позволяют создавать до 128 разделов на одном диске, тем самым исключая необходимость создания неудобных сущностей наподобие логических дисков.
+
+[WARNING]
+====
+
+Некоторые старые операционные системы, например Windows(R) XP, не совместимы со схемой GPT. Если на один диск необходимо установить FreeBSD совместно с такой операционной системой, то следует воспользоваться схемой MBR.
+====
+
+Стандартному загрузчику FreeBSD необходим первичный раздел (MBR) или GPT раздел. (Обратитесь к crossref:boot[boot, Процесс загрузки FreeBSD] за более подробной информацией о процессе загрузки FreeBSD.) Если все первичные или GPT разделы уже задействованы, то для FreeBSD один из них необходимо будет освободить.
+
+Минимальная установка FreeBSD занимает ни много ни мало - 1 ГБ дискового пространства. Однако, это _очень_ минимальная установка, практически не оставляющая свободного места. Более реалистичным минимумом является 3 ГБ без графической подсистемы, а если будет использоваться графическая подсистема, то 5 ГБ или более. Свободное пространство также потребуется приложениям от третьих лиц.
+
+Для создания разделов существует разнообразие свободно распространяемых и коммерческих http://en.wikipedia.org/wiki/List_of_disk_partitioning_software[утилит]. http://gparted.sourceforge.net/livecd.php[GParted Live] это свободно распространяемый загрузочный дистрибутив, в который включен редактор разделов GParted. Также GParted включен в многие другие дистрибутивы Live CD от Linux.
+
+[WARNING]
+====
+
+Утилиты для создания разделов могут повредить ваши данные. Поэтому сделайте полную резервную копию и проверьте её целостность перед модификацией разделов диска.
+====
+
+Определенные трудности составляет изменение размеров разделов Microsoft(R) Vista. В таких случаях может пригодиться установочный CDROM от самой Microsoft(R) Vista.
+
+.Использование существующего раздела
+[example]
+====
+Компьютер с ОС Windows(R) имеет жесткий диск размером 40 ГБ, диск разбит на два раздела по 20 ГБ. Windows(R) именует их дисками [.filename]#C:# и [.filename]#D:#. На диске [.filename]#C:# данными занято 10 ГБ, а на диске [.filename]#D:# - 5 ГБ.
+
+Перемещение данных с диска [.filename]#D:# на диск [.filename]#C:# освобождает второй раздел для установки FreeBSD.
+====
+
+.Уменьшение размера существующего раздела
+[example]
+====
+Компьютер с ОС Windows(R) имеет жесткий диск размером 40 ГБ, на котором создан один большой раздел, занимающий весь жесткий диск. Windows(R) именует этот раздел диском [.filename]#C:#. На этом разделе данные занимают 15 ГБ. Конечная цель - отвести для Windows(R) раздел размером 20 ГБ, а второй раздел размером 20 ГБ задействовать для установки FreeBSD.
+
+Подобное перераспределение можно выполнить одним из двух способов:
+
+. Сделайте резервную копию данных вашей Windows(R). Далее, переустановите Windows(R), создав во время инсталляции раздел размером 20 ГБ.
+. Используйте утилиту редактирования разделов (наподобие GParted) для уменьшения раздела Windows(R), а в освободившемся пространстве создайте новый раздел для установки FreeBSD.
+
+====
+
+Разделы диска, содержащие разные операционные системы, делают возможной загрузку по выбору одной из имеющихся операционных систем. Альтернативный способ, позволяющий загружать несколько операционных систем в одно и то же время, описан в разделе, называемом crossref:virtualization[virtualization, virtualization].
+
+[[bsdinstall-collect-network-information]]
+=== Соберите информацию о сетевых настройках
+
+Некоторым вариантам установки FreeBSD для загрузки файлов необходимо наличие соединения с сетью. Инсталлятор запросит информацию о подключении для настройки соединения с сетью через интерфейс Ethernet (через кабельный модем или к модем DSL с интерфейсом Ethernet).
+
+Для автоматического конфигурирования сетевых интерфейсов часто применяется протокол _DHCP_. Если в подключаемой сети сервис DHCP отсутствует, информацию о подключении к необходимо взять у системного администратора или провайдера Интернет.
+
+. IP адрес
+. Маска подсети
+. IP адрес шлюза по умолчанию
+. Доменное имя локальной сети
+. IP адрес DNS сервера/серверов
+
+=== Проверьте сведения об обнаруженных ошибках FreeBSD
+
+Хотя проект FreeBSD борется за то, чтобы каждый релиз FreeBSD был настолько стабильным, насколько это возможно, ошибки порой вкрадываются в процесс разработки. В очень редких случаях эти ошибки влияют на процесс установки. Как только эти проблемы обнаруживаются и исправляются, их описание попадает в link:https://www.FreeBSD.org/releases/{rel120-current}R/errata/[сообщения об ошибках FreeBSD], находящиеся на сайте FreeBSD. Проверьте сообщения об ошибках перед установкой и убедитесь, что отсутствуют проблемы, которые могут затронуть установку.
+
+Информация о всех релизах, включая сообщения об ошибках каждого релиза, может быть найдена на странице link:https://www.FreeBSD.org/releases/[информации о релизах] link:https://www.FreeBSD.org/[веб сайта FreeBSD].
+
+[[bsdinstall-installation-media]]
+=== Подготовка установочного носителя информации
+
+Установка FreeBSD начинается с загрузки компьютера с установочного носителя, будь то CD, DVD или USB флеш-накопитель. Инсталлятор - это не та программа, которую можно запустить из другой операционной системы.
+
+В дополнение к стандартному установочному носителю, который содержит копии всех установочных файлов FreeBSD, также существует вариант, предназначенный исключительно для загрузки и называемый _bootonly_. Установочный носитель bootonly не содержит копий инсталляционных файлов, а загружает их из сети во время установки. Поэтому образ bootonly CD гораздо меньше объемом, а также при его использовании загружаются лишь необходимые файлы, тем самым уменьшается нагрузка на сетевое соединение.
+
+Копии образов установочных носителей находятся на link:https://www.FreeBSD.org/where/[веб сайте FreeBSD]. Также, в каталоге с файлами установочных образов находится файл [.filename]#CHECKSUM.SHA256#, который понадобится вам для проверки целостности скачанного файла образа. Проверка целостности файла образа производится сравнением _контрольных сумм_. Для подсчета последних FreeBSD предоставляет man:sha256[1], другие операционные системы также располагают подобными программами. Сравните полученную контрольную сумму с одной из [.filename]#CHECKSUM.SHA256#. Контрольные суммы должны совпасть полностью. Несовпадение контрольных сумм значит, что файл поврежден и к использованию не пригоден.
+
+[TIP]
+====
+
+Если у вас уже имеется копия FreeBSD на CDROM, DVD, или USB флеш-накопителе, то нижеследующий текст можно опустить.
+====
+
+CD- и DVD-образы FreeBSD являются загрузочными. Для установки необходим один из них. Запишите образ на CD или DVD диск при помощи программы для записи CD, которая есть в вашей текущей операционной системе. Во FreeBSD запись дисков осуществляется утилитой man:cdrecord[1] из комплекта [.filename]#sysutils/cdrtools# Коллекции Портов.
+
+Для создания загрузочного флеш-накопителя выполните следующие шаги:
+
+[[bsdinstall-installation-media-memory-stick]]
+[.procedure]
+====
+
+. Получение образа для флеш-накопителя
++
+Образы для флеш-накопителя для FreeBSD 9.0-RELEASE и более поздних могут быть скачаны с каталога [.filename]#ISO-IMAGES/# по адресу `ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/_arch_/_arch_/ISO-IMAGES/_version_/FreeBSD-_version_-RELEASE-_arch_-memstick.img`. Замените _arch_ и _version_ соответственно на архитектуру и номер версии которую вы планируете установить. Например, образы для флеш-накопителей FreeBSD/i386 9.0-RELEASE находятся на link:ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/i386/ISO-IMAGES/9.0/FreeBSD-9.0-RELEASE-i386-memstick.img[ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/i386/ISO-IMAGES/9.0/FreeBSD-9.0-RELEASE-i386-memstick.img].
++
+[TIP]
+======
+
+Для FreeBSD 8._X_ и более ранних версий используется иной путь каталогов. Детали загрузки и установки FreeBSD 8._X_ и более ранних версий описаны в crossref:install[install, Установка FreeBSD версий 8.X и более ранних].
+======
++
+Имя образа для флеш-накопителя имеет суффикс [.filename]#.img#. Каталог [.filename]#ISO-IMAGES/# содержит определённое количество разных образов, и выбор конкретного образа зависит от устанавливаемой версии FreeBSD, а в некоторых случаях - и от аппаратного обеспечения.
++
+[IMPORTANT]
+======
+Перед продолжением _сделайте резервную копию_ данных с флеш-накопителя, так как следующая процедура _уничтожит_ их.
+======
++
+. Запись образа на флеш-накопитель
++
+[.procedure]
+======
+*Procedure: Использование FreeBSD для записи образа*
+
+[WARNING]
+****
+
+В нижеследующем примере показано использование [.filename]#/dev/da0# в качестве устройства, на которое производится запись. Удостоверьтесь в том, что целевое устройство выбрано верно, иначе вы можете повредить существующие данные.
+****
+.. Запись образа при помощи man:dd[1]
++
+Файл [.filename]#.img# не является обычным файлом. Это _образ_ всего содержимого флеш-накопителя. Этот файл _не может_ быть просто скопированным подобно обычному файлу, он должен быть записан непосредственно на целевое устройство при помощи man:dd[1]:
++
+[source,bash]
+....
+# dd if=FreeBSD-9.0-RELEASE-i386-memstick.img of=/dev/da0 bs=64k
+....
+======
++
+[.procedure]
+======
+*Procedure: Использование Windows(R) для записи образа*
+
+[WARNING]
+****
+
+Удостоверьтесь в правильности выбора буквы диска, указываемой как целевое устройство, иначе вы перезапишете и повредите существующие данные.
+****
+.. Получение Image Writer для Windows(R)
++
+Image Writer для Windows(R) - это свободно распространяемое приложение, при помощи которого можно корректно записать образ на флеш-накопитель. Скачайте его с https://launchpad.net/win32-image-writer/[https://launchpad.net/win32-image-writer/] и сохраните в любую директорию.
+.. Запись образа при помощи Image Writer
++
+Кликните дважды на иконке Win32DiskImager для запуска приложения. Удостоверьтесь, что буква диска, отображаемая в боксе `Device`, соответствует устройству флеш-накопителя. Кликните на иконке с папкой и выберите образ, который будет записан на флеш-накопитель. Нажмите кнопку btn:[Save] для подтверждения выбора имени файла. Проверьте, что всё верно, а также что нет открытых директорий с флеш-накопителя в других окнах. Когда всё готово, нажмите кнопку btn:[Write] для записи образа на флеш-накопитель.
+======
+====
+
+[NOTE]
+====
+Установка с дискет более не поддерживается.
+====
+
+Теперь вы готовы начать установку FreeBSD.
+
+[[bsdinstall-start]]
+== Начало установки
+
+[IMPORTANT]
+====
+По умолчанию, установщик не изменяет данные на ваших дисках до тех пор, пока вы не увидите следующее сообщение:
+
+....
+Your changes will now be written to disk. If you
+have chosen to overwrite existing data, it will
+be PERMANENTLY ERASED. Are you sure you want to
+commit your changes?
+....
+
+Установка может быть прервана в любой момент до появления этого предупреждения, при этом содержимое дисков изменено не будет. Если вы обеспокоены тем, что что-то было настроено неверно, то вы можете просто выключить компьютер до этого сообщения, при этом никаких повреждений существующих данных не произойдет.
+====
+
+[[bsdinstall-starting]]
+=== Загрузка
+
+[[bsdinstall-starting-i386]]
+==== Загрузка на i386(TM) и amd64
+
+[.procedure]
+====
+
+. Если вы подготовили "загрузочный" USB-накопитель, как описано в <<bsdinstall-installation-media>>, то вставьте его в USB гнездо перед включением компьютера.
++
+Если вы загружаетесь с CDROM, то вам необходимо будет включить компьютер и при первой возможности вставить CD диск.
+. Настройте вашу машину на загрузку с CDROM или с USB, в зависимости от того, какое устройство используется для установки. Настройки BIOS позволяют выбрать конкретное загрузочное устройство. Большинство систем также предоставляют возможность выбрать загрузочное устройство во время запуска, часто эта возможность активируется по нажатию клавиши kbd:[F10], kbd:[F11], kbd:[F12] или kbd:[Escape].
+. Если ваш компьютер загружается как обычно и запускает существующую операционную систему, то:
+.. Диск не был вставлен заблаговременно. Оставьте его в приводе и попробуйте перезагрузить ваш компьютер.
+.. Ранее внесенные изменения в BIOS не сработали. Попробуйте повторить шаг настройки BIOS пока не получите необходимый порядок загрузки.
+.. Ваш нынешний BIOS не поддерживает загрузку с имеющегося загрузочного накопителя. В этом случае можно использовать http://www.plop.at/en/bootmanager.html[Plop Boot Manager] для загрузки более старых машин с CD или USB.
++
+. FreeBSD начнет загружаться. Если вы загружаетесь с CDROM, вы увидите поток сообщений, подобный следующему (информация о версиях опущена):
++
+[source,bash]
+....
+Booting from CD-ROM...
+645MB medium detected
+CD Loader 1.2
+
+Building the boot loader arguments
+Looking up /BOOT/LOADER... Found
+Relocating the loader and the BTX
+Starting the BTX loader
+
+BTX loader 1.00 BTX version is 1.02
+Consoles: internal video/keyboard
+BIOS CD is cd0
+BIOS drive C: is disk0
+BIOS drive D: is disk1
+BIOS 636kB/261056kB available memory
+
+FreeBSD/i386 bootstrap loader, Revision 1.1
+
+Loading /boot/defaults/loader.conf
+/boot/kernel/kernel text=0x64daa0 data=0xa4e80+0xa9e40 syms=[0x4+0x6cac0+0x4+0x88e9d]
+\
+....
++
+. Отображается меню загрузчика FreeBSD:
++
+[[bsdinstall-boot-loader-menu]]
+.Меню загрузчика FreeBSD
+image::bsdinstall-boot-loader-menu.png[]
++
+Выждите десять секунд или нажмите kbd:[Enter].
+====
+
+==== Загрузка Macintosh(R) PowerPC(R)
+
+На большинстве машин удерживание клавиши kbd:[C] на клавиатуре во время начальной загрузки активирует загрузку с CD. Иначе, удерживайте kbd:[Command+Option+O+F], или kbd:[Windows+Alt+O+F] на не-Apple(R) клавиатурах. На приглашение `0 >` введите
+
+[source,bash]
+....
+ boot cd:,\ppc\loader cd:0
+....
+
+Для Xserves без клавиатур, ознакомьтесь с загрузкой в Open Firmware, которая описана на http://support.apple.com/kb/TA26930[сайте поддержки Apple(R)].
+
+==== Загрузка sparc64
+
+Большинство систем sparc64 настроены на автоматическую загрузку с жесткого диска. Для того, чтобы установить FreeBSD, вам потребуется выполнить загрузку по сети или с CDROM, что подразумевает получение доступа к PROM (OpenFirmware).
+
+Для того, чтобы получить доступ к PROM, перегрузите систему и дождитесь появления загрузочных сообщений. Вид сообщений зависит от модели машины, но должен выглядеть подобно следующему:
+
+[source,bash]
+....
+Sun Blade 100 (UltraSPARC-IIe), Keyboard Present
+Copyright 1998-2001 Sun Microsystems, Inc. All rights reserved.
+OpenBoot 4.2, 128 MB memory installed, Serial 51090132.
+Ethernet address 0:3:ba:b:92:d4, Host ID: 830b92d4.
+....
+
+Если ваша система продолжает загружаться с жесткого диска, то чтобы получить приглашение PROM вам необходимо нажать на клавиатуре kbd:[L1+A] или kbd:[Stop+A], или же послать сигнал `BREAK` через последовательную консоль (используя, например, `~#` в man:tip[1] или man:cu[1]). Приглашение выглядит подобно следующему:
+
+[source,bash]
+....
+ok <.>
+ok {0} <.>
+....
+
+<.> Приглашение, отображающееся на системах с одним центральным процессором.
+
+<.> Приглашение, отображающееся на многопроцессорных (SMP) системах, цифра указывает на количество активных центральных процессоров.
+
+На этом этапе вставьте CDROM в привод и наберите `boot cdrom` в приглашении PROM.
+
+[[bsdinstall-view-probe]]
+=== Просмотр результата определения устройств (device probe)
+
+Выводимые на экран во время начальной загрузки системы последние пару сотен строк сохраняются, и при необходимости могут быть просмотрены.
+
+Чтобы просмотреть содержимое буфера, нажмите kbd:[Scroll Lock]. Это включит режим буфера прокрутки. Далее, для просмотра сохраненных сообщений вы можете использовать клавиши навигации или клавиши kbd:[PageUp] и kbd:[PageDown]. Чтобы выйти из режима просмотра буфера нажмите еще раз kbd:[Scroll Lock].
+
+Включите прокрутку экранного буфера и просмотрите сообщения, которые были вытеснены с экрана во время определения устройств ядром. Вы увидите текст, подобный к <<bsdinstall-dev-probe>>, однако его содержимое будет отличаться в зависимости от комплекта устройств, установленных в ваш компьютер.
+
+[[bsdinstall-dev-probe]]
+.Типичный вывод сообщений определения устройств
+[source,bash]
+....
+Copyright (c) 1992-2011 The FreeBSD Project.
+Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
+ The Regents of the University of California. All rights reserved.
+FreeBSD is a registered trademark of The FreeBSD Foundation.
+FreeBSD 9.0-RELEASE #0 r225473M: Sun Sep 11 16:07:30 BST 2011
+ root@psi:/usr/obj/usr/src/sys/GENERIC amd64
+CPU: Intel(R) Core(TM)2 Duo CPU T9400 @ 2.53GHz (2527.05-MHz K8-class CPU)
+ Origin = "GenuineIntel" Id = 0x10676 Family = 6 Model = 17 Stepping = 6
+ Features=0xbfebfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,DTS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE>
+ Features2=0x8e3fd<SSE3,DTES64,MON,DS_CPL,VMX,SMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,SSE4.1>
+ AMD Features=0x20100800<SYSCALL,NX,LM>
+ AMD Features2=0x1<LAHF>
+ TSC: P-state invariant, performance statistics
+real memory = 3221225472 (3072 MB)
+avail memory = 2926649344 (2791 MB)
+Event timer "LAPIC" quality 400
+ACPI APIC Table: <TOSHIB A0064 >
+FreeBSD/SMP: Multiprocessor System Detected: 2 CPUs
+FreeBSD/SMP: 1 package(s) x 2 core(s)
+ cpu0 (BSP): APIC ID: 0
+ cpu1 (AP): APIC ID: 1
+ioapic0: Changing APIC ID to 1
+ioapic0 <Version 2.0> irqs 0-23 on motherboard
+kbd1 at kbdmux0
+acpi0: <TOSHIB A0064> on motherboard
+acpi0: Power Button (fixed)
+acpi0: reservation of 0, a0000 (3) failed
+acpi0: reservation of 100000, b6690000 (3) failed
+Timecounter "ACPI-safe" frequency 3579545 Hz quality 850
+acpi_timer0: <24-bit timer at 3.579545MHz> port 0xd808-0xd80b on acpi0
+cpu0: <ACPI CPU> on acpi0
+ACPI Warning: Incorrect checksum in table [ASF!] - 0xFE, should be 0x9A (20110527/tbutils-282)
+cpu1: <ACPI CPU> on acpi0
+pcib0: <ACPI Host-PCI bridge> port 0xcf8-0xcff on acpi0
+pci0: <ACPI PCI bus> on pcib0
+vgapci0: <VGA-compatible display> port 0xcff8-0xcfff mem 0xff400000-0xff7fffff,0xe0000000-0xefffffff irq 16 at device 2.0 on pci0
+agp0: <Intel GM45 SVGA controller> on vgapci0
+agp0: aperture size is 256M, detected 131068k stolen memory
+vgapci1: <VGA-compatible display> mem 0xffc00000-0xffcfffff at device 2.1 on pci0
+pci0: <simple comms> at device 3.0 (no driver attached)
+em0: <Intel(R) PRO/1000 Network Connection 7.2.3> port 0xcf80-0xcf9f mem 0xff9c0000-0xff9dffff,0xff9fe000-0xff9fefff irq 20 at device 25.0 on pci0
+em0: Using an MSI interrupt
+em0: Ethernet address: 00:1c:7e:6a:ca:b0
+uhci0: <Intel 82801I (ICH9) USB controller> port 0xcf60-0xcf7f irq 16 at device 26.0 on pci0
+usbus0: <Intel 82801I (ICH9) USB controller> on uhci0
+uhci1: <Intel 82801I (ICH9) USB controller> port 0xcf40-0xcf5f irq 21 at device 26.1 on pci0
+usbus1: <Intel 82801I (ICH9) USB controller> on uhci1
+uhci2: <Intel 82801I (ICH9) USB controller> port 0xcf20-0xcf3f irq 19 at device 26.2 on pci0
+usbus2: <Intel 82801I (ICH9) USB controller> on uhci2
+ehci0: <Intel 82801I (ICH9) USB 2.0 controller> mem 0xff9ff800-0xff9ffbff irq 19 at device 26.7 on pci0
+usbus3: EHCI version 1.0
+usbus3: <Intel 82801I (ICH9) USB 2.0 controller> on ehci0
+hdac0: <Intel 82801I High Definition Audio Controller> mem 0xff9f8000-0xff9fbfff irq 22 at device 27.0 on pci0
+pcib1: <ACPI PCI-PCI bridge> irq 17 at device 28.0 on pci0
+pci1: <ACPI PCI bus> on pcib1
+iwn0: <Intel(R) WiFi Link 5100> mem 0xff8fe000-0xff8fffff irq 16 at device 0.0 on pci1
+pcib2: <ACPI PCI-PCI bridge> irq 16 at device 28.1 on pci0
+pci2: <ACPI PCI bus> on pcib2
+pcib3: <ACPI PCI-PCI bridge> irq 18 at device 28.2 on pci0
+pci4: <ACPI PCI bus> on pcib3
+pcib4: <ACPI PCI-PCI bridge> at device 30.0 on pci0
+pci5: <ACPI PCI bus> on pcib4
+cbb0: <RF5C476 PCI-CardBus Bridge> at device 11.0 on pci5
+cardbus0: <CardBus bus> on cbb0
+pccard0: <16-bit PCCard bus> on cbb0
+isab0: <PCI-ISA bridge> at device 31.0 on pci0
+isa0: <ISA bus> on isab0
+ahci0: <Intel ICH9M AHCI SATA controller> port 0x8f58-0x8f5f,0x8f54-0x8f57,0x8f48-0x8f4f,0x8f44-0x8f47,0x8f20-0x8f3f mem 0xff9fd800-0xff9fdfff irq 19 at device 31.2 on pci0
+ahci0: AHCI v1.20 with 4 3Gbps ports, Port Multiplier not supported
+ahcich0: <AHCI channel> at channel 0 on ahci0
+ahcich1: <AHCI channel> at channel 1 on ahci0
+ahcich2: <AHCI channel> at channel 4 on ahci0
+acpi_lid0: <Control Method Lid Switch> on acpi0
+battery0: <ACPI Control Method Battery> on acpi0
+acpi_button0: <Power Button> on acpi0
+acpi_acad0: <AC Adapter> on acpi0
+acpi_toshiba0: <Toshiba HCI Extras> on acpi0
+acpi_tz0: <Thermal Zone> on acpi0
+attimer0: <AT timer> port 0x40-0x43 irq 0 on acpi0
+Timecounter "i8254" frequency 1193182 Hz quality 0
+Event timer "i8254" frequency 1193182 Hz quality 100
+atkbdc0: <Keyboard controller (i8042)> port 0x60,0x64 irq 1 on acpi0
+atkbd0: <AT Keyboard> irq 1 on atkbdc0
+kbd0 at atkbd0
+atkbd0: [GIANT-LOCKED]
+psm0: <PS/2 Mouse> irq 12 on atkbdc0
+psm0: [GIANT-LOCKED]
+psm0: model GlidePoint, device ID 0
+atrtc0: <AT realtime clock> port 0x70-0x71 irq 8 on acpi0
+Event timer "RTC" frequency 32768 Hz quality 0
+hpet0: <High Precision Event Timer> iomem 0xfed00000-0xfed003ff on acpi0
+Timecounter "HPET" frequency 14318180 Hz quality 950
+Event timer "HPET" frequency 14318180 Hz quality 450
+Event timer "HPET1" frequency 14318180 Hz quality 440
+Event timer "HPET2" frequency 14318180 Hz quality 440
+Event timer "HPET3" frequency 14318180 Hz quality 440
+uart0: <16550 or compatible> port 0x3f8-0x3ff irq 4 flags 0x10 on acpi0
+sc0: <System console> at flags 0x100 on isa0
+sc0: VGA <16 virtual consoles, flags=0x300>
+vga0: <Generic ISA VGA> at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0
+ppc0: cannot reserve I/O port range
+est0: <Enhanced SpeedStep Frequency Control> on cpu0
+p4tcc0: <CPU Frequency Thermal Control> on cpu0
+est1: <Enhanced SpeedStep Frequency Control> on cpu1
+p4tcc1: <CPU Frequency Thermal Control> on cpu1
+Timecounters tick every 1.000 msec
+hdac0: HDA Codec #0: Realtek ALC268
+hdac0: HDA Codec #1: Lucent/Agere Systems (Unknown)
+pcm0: <HDA Realtek ALC268 PCM #0 Analog> at cad 0 nid 1 on hdac0
+pcm1: <HDA Realtek ALC268 PCM #1 Analog> at cad 0 nid 1 on hdac0
+usbus0: 12Mbps Full Speed USB v1.0
+usbus1: 12Mbps Full Speed USB v1.0
+usbus2: 12Mbps Full Speed USB v1.0
+usbus3: 480Mbps High Speed USB v2.0
+ugen0.1: <Intel> at usbus0
+uhub0: <Intel UHCI root HUB, class 9/0, rev 1.00/1.00, addr 1> on usbus0
+ugen1.1: <Intel> at usbus1
+uhub1: <Intel UHCI root HUB, class 9/0, rev 1.00/1.00, addr 1> on usbus1
+ugen2.1: <Intel> at usbus2
+uhub2: <Intel UHCI root HUB, class 9/0, rev 1.00/1.00, addr 1> on usbus2
+ugen3.1: <Intel> at usbus3
+uhub3: <Intel EHCI root HUB, class 9/0, rev 2.00/1.00, addr 1> on usbus3
+uhub0: 2 ports with 2 removable, self powered
+uhub1: 2 ports with 2 removable, self powered
+uhub2: 2 ports with 2 removable, self powered
+uhub3: 6 ports with 6 removable, self powered
+ugen2.2: <vendor 0x0b97> at usbus2
+uhub8: <vendor 0x0b97 product 0x7761, class 9/0, rev 1.10/1.10, addr 2> on usbus2
+ugen1.2: <Microsoft> at usbus1
+ada0 at ahcich0 bus 0 scbus1 target 0 lun 0
+ada0: <Hitachi HTS543225L9SA00 FBEOC43C> ATA-8 SATA 1.x device
+ada0: 150.000MB/s transfers (SATA 1.x, UDMA6, PIO 8192bytes)
+ada0: Command Queueing enabled
+ada0: 238475MB (488397168 512 byte sectors: 16H 63S/T 16383C)
+ada0: Previously was known as ad4
+ums0: <Microsoft Microsoft 3-Button Mouse with IntelliEyeTM, class 0/0, rev 1.10/3.00, addr 2> on usbus1
+SMP: AP CPU #1 Launched!
+cd0 at ahcich1 bus 0 scbus2 target 0 lun 0
+cd0: <TEAC DV-W28S-RT 7.0C> Removable CD-ROM SCSI-0 device
+cd0: 150.000MB/s transfers (SATA 1.x, ums0: 3 buttons and [XYZ] coordinates ID=0
+UDMA2, ATAPI 12bytes, PIO 8192bytes)
+cd0: cd present [1 x 2048 byte records]
+ugen0.2: <Microsoft> at usbus0
+ukbd0: <Microsoft Natural Ergonomic Keyboard 4000, class 0/0, rev 2.00/1.73, addr 2> on usbus0
+kbd2 at ukbd0
+uhid0: <Microsoft Natural Ergonomic Keyboard 4000, class 0/0, rev 2.00/1.73, addr 2> on usbus0
+Trying to mount root from cd9660:/dev/iso9660/FREEBSD_INSTALL [ro]...
+....
+
+Внимательно просмотрите вывод определения устройств и убедитесь, что FreeBSD обнаружила все ожидаемые вами устройства. Если устройство не было найдено, то оно не будет упомянуто в выводе. crossref:kernelconfig[kernelconfig-custom-kernel,Модули ядра] позволяют вам добавить поддержку устройств, драйвера которых отсутствуют в ядре [.filename]#GENERIC#.
+
+После процедуры определения устройств вы увидите <<bsdinstall-choose-mode>>. Установочный носитель может использоваться одним из трёх способов: для установки FreeBSD, как <<using-live-cd,Live CD>>, или просто для доступа к оболочке FreeBSD. Используйте клавиши навигации для выбора опции, а kbd:[Enter] - для подтверждения выбора.
+
+[[bsdinstall-choose-mode]]
+.Выбор вариантов работы установочного носителя
+image::bsdinstall-choose-mode.png[]
+
+Выбор опции btn:[Install] вызовет программу-установщик.
+
+[[using-bsdinstall]]
+== Введение в bsdinstall
+
+bsdinstall это текстовая программа для установки FreeBSD, созданная {nwhitehorn} и представленная в 2011 году для FreeBSD 9.0.
+
+[NOTE]
+====
+В комплекте с http://pcbsd.org[PC-BSD] есть программа pc-sysinstall от {kmoore}, которая также может использоваться для http://wiki.pcbsd.org/index.php/Use_PC-BSD_Installer_to_Install_FreeBSD[ установки FreeBSD]. Несмотря на то, что эту программу путают с bsdinstall, обе они между собой никак не связаны.
+====
+
+Система меню bsdinstall контролируется клавишами навигации, а также kbd:[Enter], kbd:[Tab], kbd:[Space] и другими.
+
+[[bsdinstall-keymap]]
+=== Выбор раскладки клавиатуры (Keymap)
+
+В зависимости от используемой системной консоли, bsdinstall может предложить выбрать отличную от настроенной по умолчанию раскладку клавиатуры.
+
+[[bsdinstall-keymap-select-default]]
+.Выбор раскладки клавиатуры
+image::bsdinstall-keymap-select-default.png[]
+
+Если нажата кнопка btn:[YES], отобразится следующее меню выбора раскладки клавиатуры. Иначе, это меню выбора отображено не будет, а будет использоваться раскладка клавиатуры по умолчанию.
+
+[[bsdinstall-config-keymap]]
+.Меню выбора раскладки клавиатуры
+image::bsdinstall-config-keymap.png[]
+
+Используя клавиши навигации и клавишу kbd:[Enter] выберите раскладку, которая наиболее близко соответствует клавиатуре, подключенной к системе.
+
+[NOTE]
+====
+Нажатие kbd:[Esc] приведет к выбору раскладки по умолчанию. Выбор опции [.guimenuitem]#United States of America ISO-8859-1# тоже является безопасным в том случае, если возникают трудности с определением раскладки.
+====
+
+[[bsdinstall-hostname]]
+=== Установка имени хоста
+
+Далее, bsdinstall предложит указать имя хоста для устанавливаемой системы.
+
+[[bsdinstall-config-hostname]]
+.Установка имени хоста
+image::bsdinstall-config-hostname.png[]
+
+Вводимое имя хоста должно быть полным (fully-qualified), например: `machine3.example.com`.
+
+[[bsdinstall-components]]
+=== Выбор устанавливаемых компонентов
+
+Далее, bsdinstall предложит выбрать дополнительные компоненты для установки.
+
+[[bsdinstall-config-components]]
+.Выбор устанавливаемых компонентов
+image::bsdinstall-config-components.png[]
+
+Определение перечня компонентов для установки в наибольшей мере зависит от планируемого использования системы и от количества доступного дискового пространства. Ядро и набор утилит FreeBSD (вместе называемые "базовой системой") устанавливаются всегда.
+
+В зависимости от типа установки, некоторые из следующих компонентов могут не появляться.
+
+.Дополнительные компоненты
+* `doc` - Дополнительная документация, преимущественно исторического характера. Документация, предоставляемая Проектом Документирования FreeBSD может быть установлена позже.
+* `games` - Несколько традиционных игр BSD, в том числе fortune, rot13, и другие.
+* `lib32` - Библиотеки совместимости для запуска 32-битных приложений на 64-битных версиях FreeBSD.
+* `ports` - Коллекция Портов FreeBSD.
++
+Коллекция Портов - это простой и удобный способ установки программ. Она не содержит исходных кодов, необходимых для компиляции приложений. Коллекция Портов - это множество файлов, при помощи которого автоматизируется загрузка, компиляция и установка программных пакетов сторонних разработчиков. В crossref:ports[ports, Установка приложений. порты и пакеты] описано, как использовать коллекцию портов.
++
+[WARNING]
+====
+
+Программа установки не проверяет наличие свободного места. Поэтому выбирайте эту опцию лишь тогда, когда имеется достаточно свободного места на жестком диске. Что касается FreeBSD 9.0, Коллекция Портов занимает около {ports-size} дискового пространства. Учтите, что для более новых версий FreeBSD занимаемое Коллекцией Портов дисковое пространство будет расти.
+====
+
+* `src` - Исходный код системы.
++
+FreeBSD распространяется с полным исходным кодом как для ядра, так и для программ базовой системы. Для большинства приложений исходный код системы не нужен, однако он может потребоваться при построении некоторых программ, распространяемых в виде исходных кодов (например, драйверов или модулей ядра), или для разработки FreeBSD.
++
+Полное дерево исходных кодов требует 1 ГБ дискового пространства, пересборка всей системы FreeBSD требует дополнительно 5 ГБ пространства.
+
+[[bsdinstall-netinstall]]
+== Установка по сети
+
+Установочный носитель _bootonly_ не содержит копий установочных файлов. В случае использования такого носителя необходимые файлы должны быть получены загрузкой из сети.
+
+[[bsdinstall-netinstall-notify]]
+.Установка по сети
+image::bsdinstall-netinstall-files.png[]
+
+После настройки сетевого соединения, которая детально описана в <<bsdinstall-config-network-dev>>, выбирается зеркало сайта. Зеркала сайта содержат копии файлов FreeBSD. Выберите зеркало, размещенное в том регионе мира, что и компьютер, на который устанавливается FreeBSD. Если зеркало расположено ближе к целевому компьютеру, то файлы могут быть получены быстрее, тем самым уменьшится время установки.
+
+[[bsdinstall-netinstall-mirror]]
+.Выбор зеркала сайта
+image::bsdinstall-netinstall-mirrorselect.png[]
+
+Дальнейший сценарий одинаков для всех способов установки.
+
+[[bsdinstall-partitioning]]
+== Выделение дискового пространства
+
+Есть три способа осуществить разбиение дискового пространства для FreeBSD. _Шаблонное_ (_guided_) разбиение автоматически настраивает разделы диска, _ручное_ (_manual_) разбиение позволяет опытным пользователям создавать разделы согласно своим требованиям. И наконец, есть возможность вызвать командный интерпретатор, в котором можно будет непосредственно запускать утилиты наподобие man:gpart[8], man:fdisk[8] и man:bsdlabel[8].
+
+[[bsdinstall-part-guided-manual]]
+.Выбор способа разбиения: шаблонное (guided) или ручное (manual)
+image::bsdinstall-part-guided-manual.png[]
+
+[[bsdinstall-part-guided]]
+=== Шаблонное (guided) разбиение
+
+Если в системе есть несколько дисков, то выберите один, на который будет устанавливаться FreeBSD.
+
+[[bsdinstall-part-guided-disk]]
+.Выбор из множества дисков
+image::bsdinstall-part-guided-disk.png[]
+
+Для FreeBSD может быть выделен весь диск или только его часть. Если выбирается btn:[Entire Disk], то создается стандартное разбиение, занимающее весь диск. Выбрав btn:[Partition], вы получите создание разделов в неиспользуемой области диска.
+
+[[bsdinstall-part-entire-part]]
+.Выбор всего диска или раздела
+image::bsdinstall-part-entire-part.png[]
+
+По завершении разбиения дискового пространства внимательно просмотрите результат. Если была допущена ошибка, то вам предоставляется возможность либо вернуть конфигурацию к исходному состоянию нажав btn:[Revert], либо выполнить автоматическое переразбиение выбрав btn:[Auto]. Также разделы могут быть созданы, изменены или удалены вручную. Если результат разбиения корректен, выберите btn:[Finish] для продолжения установки.
+
+[[bsdinstall-part-review]]
+.Просмотр созданных разделов
+image::bsdinstall-part-review.png[]
+
+[[bsdinstall-part-manual]]
+=== Ручное (manual) разбиение
+
+Ручное разбиение начинается с редактора разделов.
+
+[[bsdinstall-part-manual-create]]
+.Ручное создание разделов
+image::bsdinstall-part-manual-create.png[]
+
+Перемещение подсвечивания на имя устройства (в этом примере - [.filename]#ada0#) и выбор btn:[Create] приведет вас к меню с перечнем _схем разбиения_.
+
+[[bsdinstall-part-manual-partscheme]]
+.Выбор схемы разбиения
+image::bsdinstall-part-manual-partscheme.png[]
+
+Как правило, схема GPT является наиболее подходящей для PC-совместимых компьютеров. Для более старых операционных систем, которые несовместимы с GPT, может потребоваться разбиение MBR. Остальные схемы разбиения в общем используются для нераспространенных или старых компьютерных систем.
+
+.Схемы разбиения
+[cols="1,1", frame="none", options="header"]
+|===
+<| Аббревиатура
+<| Описание
+
+|APM
+|http://support.apple.com/kb/TA21692[Apple Partition Map], используемая на PowerPC(R) Macintosh(R).
+
+|BSD
+|Метки BSD без MBR, иногда называемые "dangerously dedicated mode". За подробностями обратитесь к man:bsdlabel[8].
+
+|GPT
+|http://en.wikipedia.org/wiki/GUID_Partition_Table[Таблица разделов GUID.]
+
+|MBR
+|http://en.wikipedia.org/wiki/Master_boot_record[Master Boot Record.]
+
+|PC98
+|http://en.wikipedia.org/wiki/Pc9801[Разновидность MBR, используемая компьютерами NEC PC-98.]
+
+|VTOC8
+|Volume Table Of Contents, используемая компьютерами Sun SPARC64 и UltraSPARC.
+|===
+
+После того, как схема разбиения определена, повторный выбор btn:[Create] приводит к созданию новых разделов диска.
+
+[[bsdinstall-part-manual-addpart]]
+.Создание нового раздела
+image::bsdinstall-part-manual-addpart.png[]
+
+Стандартная установка FreeBSD со схемой GPT создаст как минимум три раздела:
+
+.Стандартные GPT разделы FreeBSD
+* `freebsd-boot` - загрузочный код FreeBSD.
+* `freebsd-ufs` - файловая система UFS FreeBSD.
+* `freebsd-swap` - FreeBSD область подкачки.
+
+Также необходимо упомянуть, что для разделов, которые будут содержать файловую систему ZFS FreeBSD следует задействовать тип раздела `freebsd-zfs`. Обратитесь к crossref:disks[filesystems-zfs,Файловая система ZFS]. Сведения об имеющихся в наличии типах разделов GPT содержатся в man:gpart[8].
+
+Разумеется, возможно создание большего количества разделов с файловыми системами, и некоторые пользователи предпочитают выделять отдельные разделы для таких файловых систем, как [.filename]#/#, [.filename]#/var#, [.filename]#/tmp#, и [.filename]#/usr#. Иллюстрация подобного разбиения приведена в <<bsdinstall-part-manual-splitfs>>.
+
+При указании размеров допускается использование общепринятых аббревиатур, таких как _K_ для килобайт, _M_ для мегабайт, или _G_ для гигабайт.
+
+[TIP]
+====
+
+Должное выравнивание секторов обеспечивает наилучшую производительность, а создание разделов с размерами, кратными 4 Кбайт, помогает обеспечить правильное выравнивание как на дисках с размером сектора 512 байт, так и на устройствах с размером сектора 4 Кбайт. В общем, задание размеров, кратных 1 Мбайт или 1 Гбайт - это наиболее простой способ выполнить выравнивание начал разделов на позицию, кратную 4 Кбайт. Исключение: на данный момент размер раздела _freebsd-boot_ не должен превышать 512 Кбайт из-за ограничений загрузочного кода.
+====
+
+В случае, если раздел будет содержать файловую систему, ей потребуется точка монтирования. Если планируется создать единственный раздел UFS, то точка монтирования должна быть [.filename]#/#.
+
+Также будет запрошена _метка_. Метка - это имя, присвоенное разделу. Имя устройства или его номер может измениться если устройство будет подключено к другому контроллеру или порту, а метка раздела останется неизменной. Ссылки на метки вместо имён устройств и номеров разделов в файлах типа [.filename]#/etc/fstab# делают систему более толерантной к замене оборудования. Метки GPT появляются после подключения диска в каталоге [.filename]#/dev/gpt/#. У других схем разбиения есть свои особенности поддержки меток, и их метки располагаются в других подкаталогах каталога [.filename]#/dev/#.
+
+[TIP]
+====
+
+Во избежание конфликтов имен меток используйте уникальные имена для каждой файловой системы. Несколько букв, взятых от имени компьютера, его назначения или размещения может быть добавлено к метке. Например, корневому разделу UFS для компьютера в лаборатории можно присвоить метку `labroot` или `rootfs-lab`.
+====
+
+[[bsdinstall-part-manual-splitfs]]
+.Создание традиционного разбиения под файловые системы.
+[example]
+====
+Для традиционного разбиения, в котором каталоги [.filename]#/#, [.filename]#/var#, [.filename]#/tmp# и [.filename]#/usr# представляют собой отдельные файловые системы на их собственных разделах, создайте схему разбиения GPT, потом создайте разделы, как это указано ниже. Показанные размеры разделов являются типичными для жесткого диска размером 20Гб. Если диск большего размера, то будет уместным отвести больше места для раздела подкачки или для раздела с файловой системой [.filename]#/var#. Задействованные в этом примере метки имеют префикс `ex`, от слова "example", вам же рекомендуется использовать другие уникальные имена меток.
+
+По умолчанию, загрузчик [.filename]#gptboot# FreeBSD ожидает, что первый найденный раздел UFS будет корневым разделом ([.filename]#/#).
+
+[.informaltable]
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Тип раздела
+| Размер
+| Точка монтирования
+| Метка
+
+|`freebsd-boot`
+|`512K`
+
+|`freebsd-ufs`
+|`2G`
+|[.filename]#/#
+|`exrootfs`
+
+|`freebsd-swap`
+|`4G`
+|
+|`exswap`
+
+|`freebsd-ufs`
+|`2G`
+|[.filename]#/var#
+|`exvarfs`
+
+|`freebsd-ufs`
+|`1G`
+|[.filename]#/tmp#
+|`extmpfs`
+
+|`freebsd-ufs`
+|соглашайтесь со значением по умолчанию (оставшаяся часть объема диска)
+|[.filename]#/usr#
+|`exusrfs`
+|===
+====
+
+Для продолжения установки по завершении создания необходимых разделов выберите btn:[Finish].
+
+[[bsdinstall-final-warning]]
+== Завершение установки
+
+Следующий шаг - ваш последний шанс прервать установку и предотвратить изменение данных на жестком диске.
+
+[[bsdinstall-final-confirmation]]
+.Заключительное подтверждение
+image::bsdinstall-final-confirmation.png[]
+
+Для продолжения выберите btn:[Commit]. Если необходимо внести изменения, для возвращения к редактору разделов нажмите btn:[Back]. Выбор btn:[Revert & Exit] дает возможность выйти из установщика без внесения изменений на жесткий диск.
+
+Продолжительность установки варьируется в зависимости от выбранного дистрибутива, способа установки и быстродействия компьютера. Далее последует очередь сообщений, информирующих о ходе установки.
+
+Первым делом установщик запишет информацию о разделах на диск и отформатирует разделы посредством `newfs`.
+
+Если выполняется установка по сети, то bsdinstall продолжит загрузку необходимых файлов дистрибутива.
+
+[[bsdinstall-distfile-fetching]]
+.Загрузка файлов дистрибутива
+image::bsdinstall-distfile-fetching.png[]
+
+Далее последует проверка целостности файлов дистрибутива, чтобы удостовериться, что они не были повреждены во время загрузки или чтения с установочного носителя.
+
+[[bsdinstall-distfile-verify]]
+.Проверка файлов дистрибутива
+image::bsdinstall-distfile-verifying.png[]
+
+И в заключение, проверенные файлы распаковываются на диск.
+
+[[bsdinstall-distfile-extract]]
+.Извлечение файлов дистрибутива
+image::bsdinstall-distfile-extracting.png[]
+
+Как только запрошенные файлы дистрибутива распакуются, bsdinstall приступит к выполнению послеустановочных конфигурационных задач (смотрите <<bsdinstall-post>>).
+
+[[bsdinstall-post]]
+== После установки
+
+После успешной установки FreeBSD последуют меню настройки различных опций. Настройки опций могут быть изменены путем повторного входа в соответствующие разделы финального конфигурационного меню перед загрузкой в свежеустановленную систему FreeBSD.
+
+[[bsdinstall-post-root]]
+=== Установка пароля пользователя `root`
+
+Установка пароля пользователя `root` - обязательна. Заметьте, что во время ввода пароля набираемые символы не отображаются на экране. После ввода будет запрошен повторный ввод пароля. Это помогает предотвратить опечатки при наборе.
+
+[[bsdinstall-post-set-root-passwd]]
+.Установка пароля пользователя `root`
+image::bsdinstall-post-root-passwd.png[]
+
+Настройки опций продолжатся после успешной установки пароля.
+
+[[bsdinstall-config-network-dev]]
+=== Настройка сетевых интерфейсов
+
+[NOTE]
+====
+Настройка сетевых интерфейсов будет опущена в случае, если она уже была выполнена как часть подготовки при установке _bootonly_.
+====
+
+Далее будет отображен перечень всех сетевых интерфейсов, найденных на компьютере. Выберите тот, который планируете настроить.
+
+[[bsdinstall-configure-net-interface]]
+.Выберите сетевой интерфейс
+image::bsdinstall-configure-network-interface.png[]
+
+[[bsdinstall-configure-net-wireless]]
+==== Настройка беспроводного сетевого интерфейса
+
+Если выбран беспроводной сетевой интерфейс, то для подключения к сети потребуется ввести параметры сетевой идентификации и безопасности.
+
+Беспроводные сети распознаются по так называемому Service Set Identifier, или SSID. SSID - это краткое уникальное имя, присваиваемое каждой сети.
+
+Большинство беспроводных сетей шифруют передаваемые данные чтобы защитить их от неавторизированного прослушивания. Настоятельно рекомендуется применять стандарт WPA2. Более старые стандарты, например WEP, не обеспечивают достаточного уровня безопасности.
+
+Первым делом, при подключении к беспроводной сети необходимо выполнить поиск беспроводных точек доступа.
+
+[[bsdinstall-wireless-scan]]
+.Поиск беспроводных точек доступа
+image::bsdinstall-configure-wireless-scan.png[]
+
+Список найденных сетей будет содержать несколько SSID с описанием типов шифрования, поддерживаемых обнаруженными беспроводными сетями. Если искомый SSID не появляется в списке, то запустите сканирование повторно, выбрав btn:[Rescan]. Если искомая сеть снова не появится в списке, проверьте соединение с антенной или попробуйте разместить компьютер ближе к точке доступа. Запускайте повторный поиск после каждого вашего действия.
+
+[[bsdinstall-wireless-accesspoints]]
+.Выбор беспроводной сети
+image::bsdinstall-configure-wireless-accesspoints.png[]
+
+После выбора сети потребуется ввести дополнительную информацию о соединении. Для WPA2 потребуется пароль (также известный как Pre-Shared Key или PSK). В целях безопасности набираемые в поле ввода пароля символы на экране отображаются звездочками.
+
+[[bsdinstall-wireless-wpa2]]
+.Настройка WPA2
+image::bsdinstall-configure-wireless-wpa2setup.png[]
+
+После выбора беспроводной сети и ввода сопутствующих параметров безопасности последует настройка сетевых протоколов.
+
+[[bsdinstall-ipv4]]
+==== Настройка сетевых протоколов: IPv4
+
+Определитесь, есть ли необходимость в подключении к сети IPv4. Это наиболее распространённый сетевой протокол.
+
+[[bsdinstall-configure-net-ipv4]]
+.Выберите настройку протокола IPv4
+image::bsdinstall-configure-network-interface-ipv4.png[]
+
+Существует два способа настройки протокола IPv4 на сетевом интерфейсе. Сервис _DHCP_ автоматически установит корректную конфигурацию сетевого интерфейса, и это - предпочтительный способ настройки. _Статическая_ конфигурация требует ручного ввода настроек протокола IPv4.
+
+[NOTE]
+====
+Не пытайтесь ввести произвольные данные, они работать не будут. Получите перечисленную в <<bsdinstall-collect-network-information>> информацию у сетевого администратора или поставщика услуг Интернет.
+====
+
+[[bsdinstall-net-ipv4-dhcp-config]]
+===== Настройка протокола IPv4 на сетевом интерфейсе посредством DHCP
+
+Если в сети есть сервис DHCP, то для автоматического конфигурирования сетевого интерфейса выберите btn:[Yes].
+
+[[bsdinstall-net-ipv4-dhcp]]
+.Выбор настройки протокола IPv4 посредством DHCP
+image::bsdinstall-configure-network-interface-ipv4-dhcp.png[]
+
+[[bsdinstall-net-ipv4-static-config]]
+===== Статическая настройка протокола IPv4 на сетевом интерфейсе
+
+Статическая настройка сетевого интерфейса требует ввода некоторой информации о подключении IPv4.
+
+[[bsdinstall-net-ipv4-static]]
+.Статическая настройка IPv4 на сетевом интерфейсе
+image::bsdinstall-configure-network-interface-ipv4-static.png[]
+
+* `IP Address` - адрес IPv4, который должен быть установлен на этом компьютере. Этот адрес должен быть уникальным и не должен использоваться другим оборудованием в локальной сети.
+* `Subnet Mask` - маска, используемая в локальной сети. Часто маска имеет значение `255.255.255.0`.
+* `Default Router` - IP адрес маршрутизатора для этого подключения. Обычно этот адрес установлен на маршрутизаторе или ином сетевом оборудовании, которое соединяет локальную сеть с сетью Интернет. Также известен, как _шлюз по умолчанию (default gateway)_.
+
+[[bsdinstall-ipv6]]
+==== Настройка сетевых протоколов: IPv6
+
+IPv6 это более новый сетевой протокол. Если есть необходимость и возможность подключения к сети IPv6, выберите в этом меню btn:[Yes].
+
+[[bsdinstall-net-ipv6]]
+.Выберите настройку протокола IPv6 на сетевом интерфейсе
+image::bsdinstall-configure-network-interface-ipv6.png[]
+
+Для протокола IPv6 также возможны два способа настройки сетевого интерфейса. _SLAAC_ или _StateLess Address AutoConfiguration_ автоматически установит корректные настройки сетевого интерфейса. _Статическая_ конфигурация требует ручного ввода настроек протокола IPv6.
+
+[[bsdinstall-net-ipv6-slaac-config]]
+===== IPv6 SLAAC
+
+SLAAC позволяет сетевому элементу запросить у локального маршрутизатора необходимую для автоматической настройки информацию. За подробностями обратитесь к http://tools.ietf.org/html/rfc4862[RFC4862].
+
+[[bsdinstall-net-ipv6-slaac]]
+.Выберите настройку протокола IPv6 посредством SLAAC
+image::bsdinstall-configure-network-interface-slaac.png[]
+
+[[bsdinstall-net-ipv6-static-config]]
+===== Статическая настройка протокола IPv6 на сетевом интерфейсе
+
+Статическая настройка сетевого интерфейса требует ручного ввода информации о IPv6 подключении.
+
+[[bsdinstall-net-ipv6-static]]
+.Статическая настройка протокола IPv6
+image::bsdinstall-configure-network-interface-ipv6-static.png[]
+
+* `IPv6 Address` - вводимый вручную IP адрес, который присвоен этому компьютеру. Этот адрес должен быть уникальным и не должен быть занят другим оборудованием в локальной сети.
+* `Default Router` - IPv6 адрес маршрутизатора для этой сети. Обычно, это адрес маршрутизатора или другого сетевого оборудования, которое соединяет локальную сеть с сетью Интернет. Также известен как _шлюз по умолчанию_.
+
+[[bsdinstall-net-dns]]
+==== Настройка Резолвера DNS
+
+_Domain Name System_ (или _DNS_) Резолвер выполняет преобразования имен хостов в сетевые адреса, а также преобразования сетевых адресов в имена хостов. Если для автоматического конфигурирования сетевого интерфейса использовался DHCP или SLAAC, то информация о Резолвере может уже присутствовать в системе. Иначе, впишите в поле Search имя локального домена. DNS #1 и DNS #2 - это IP адреса локальных серверов DNS. По крайней мере один сервер должен быть указан.
+
+[[bsdinstall-net-dns-config]]
+.Конфигурирование Резолвера DNS
+image::bsdinstall-configure-network-ipv4-dns.png[]
+
+[[bsdinstall-timezone]]
+=== Установка часового пояса
+
+Установка часового пояса для вашей машины позволит ей автоматически корректировать время согласно местным законам и правильно выполнять остальные зависимые от часового пояса функции.
+
+Данный пример верен для машины, находящейся в восточном часовом поясе Соединенных Штатов. Разумеется, ваши настройки должны соответствовать вашему географическому местоположению.
+
+[[bsdinstall-local-utc]]
+.Выбор местного времени или времени UTC
+image::bsdinstall-set-clock-local-utc.png[]
+
+Выберите btn:[Yes] или btn:[No] согласно тому, как настроены часы вашего компьютера, далее нажмите kbd:[Enter]. Если вы не знаете какое значение выбрать, UTC или местное, то нажмите btn:[No] для того, чтобы выбрать наиболее распространённую конфигурацию - местное время.
+
+[[bsdinstall-timezone-region]]
+.Выберите регион
+image::bsdinstall-timezone-region.png[]
+
+Соответствующий регион выбирается при помощи клавиш навигации и подтверждается нажатием клавиши kbd:[Enter].
+
+[[bsdinstall-timezone-country]]
+.Выберите страну
+image::bsdinstall-timezone-country.png[]
+
+Выберите необходимую страну при помощи клавиш навигации и подтвердите выбор клавишей kbd:[Enter].
+
+[[bsdinstall-timezone-zone]]
+.Выберите часовой пояс
+image::bsdinstall-timezone-zone.png[]
+
+Соответствующий часовой пояс выбирается клавишами навигации и подтверждается нажатием клавиши kbd:[Enter].
+
+[[bsdinstall-timezone-confirmation]]
+.Подтверждение выбора часового пояса
+image::bsdinstall-timezone-confirm.png[]
+
+Подтвердите, что аббревиатура для часового пояса является приемлемой. Если данная опция настроена верно, то нажмите клавишу kbd:[Enter] для продолжения послеустановочного конфигурирования.
+
+[[bsdinstall-sysconf]]
+=== Активирование дополнительных сетевых сервисов
+
+На данном этапе установщик предлагает отметить дополнительные сетевые сервисы, которые будут запускаться при загрузке системы. Все нижеследующие сервисы не являются обязательными.
+
+[[bsdinstall-config-serv]]
+.Выбор дополнительных активируемых сервисов
+image::bsdinstall-config-services.png[]
+
+.Дополнительные сервисы
+* `sshd` - Secure Shell (SSH) демон для безопасного удаленного доступа.
+* `moused` - Обеспечивает использование мыши в системной консоли.
+* `ntpd` - Network Time Protocol (NTP) демон для автоматической синхронизации времени.
+* `powerd` - Системная утилита для контроля потребляемой мощности и профилей энергосбережения.
+
+[[bsdinstall-crashdump]]
+=== Разрешение сохранения аварийных дампов
+
+Далее, bsdinstall запросит, будет ли разрешено создание аварийных дампов (crash dump) на целевой системе. Сохранение аварийных дампов может быть весьма полезным при поиске неполадок в системе, поэтому пользователям рекомендуется при всякой возможности включать сохранение аварийных дампов. Выберите btn:[Yes] для разрешения сохранения аварийных дампов или btn:[No] для отмены их сохранения и продолжения послеустановочной настройки.
+
+[[bsdinstall-config-crashdump]]
+.Разрешение сохранения аварийных дампов
+image::bsdinstall-config-crashdump.png[]
+
+[[bsdinstall-addusers]]
+=== Добавление пользователей
+
+Добавление хотя бы одного пользователя в процессе установки позволит эксплуатировать систему исключая необходимость входа под учетной записью `root`. Работа в системе с правами пользователя `root` особенна тем, что по существу нет ограничений или защиты от действий пользователя. Вход под обычным пользователем является более благоразумным и безопасным.
+
+Для добавления новых пользователей выберите btn:[Yes].
+
+[[bsdinstall-add-user1]]
+.Добавление пользовательских учетных записей
+image::bsdinstall-adduser1.png[]
+
+Введите информацию о новом пользователе.
+
+[[bsdinstall-add-user2]]
+.Ввод информации о пользователе
+image::bsdinstall-adduser2.png[]
+
+.Информация о пользователе
+* `Username` - Имя, которое будет набирать пользователь для входа в систему. Часто оно формируется из объединенных вместе первой буквы имени и фамилии.
+* `Full name` - Полное имя пользователя.
+* `Uid` - Идентификатор пользователя. Обычно это поле не заполняется, система сама присвоит ему значение.
+* `Login group` - Имя группы для этого пользователя. Обычно это поле также не заполняется, система поставит значение по умолчанию.
+* `Invite _user_ into other groups?` - Перечень групп, в которые будет внесен пользователь.
+* `Login class` - Обычно оставляется пустым для принятия значения по умолчанию.
+* `Shell` - Интерактивная оболочка для этого пользователя. В данном примере была выбрана оболочка man:csh[1].
+* `Home directory` - Домашний каталог пользователя. Как правило, значение по умолчанию является корректным.
+* `Home directory permissions` - Права на домашний каталог пользователя. Значение по умолчанию является корректным в большинстве случаев.
+* `Use password-based authentication?` - Обычно "yes".
+* `Use an empty password?` - Обычно "no".
+* `Use a random password?` - Обычно "no".
+* `Enter password` - Пароль для этого пользователя. Набираемые символы не отображаются на экране.
+* `Enter password again` - Пароль необходимо ввести еще раз (для сверки).
+* `Lock out the account after creation?` - Обычно "no".
+
+После заполнения необходимых полей будет отображен итог и система переспросит, корректны ли введённые данные. Если во время ввода информации была допущена ошибка, то необходимо ответить `no` и ввести данные еще раз. Если вас всё устраивает, выберите `yes` для создания новой учетной записи пользователя.
+
+[[bsdinstall-add-user3]]
+.Заполненная форма ввода информации о новом пользователе
+image::bsdinstall-adduser3.png[]
+
+Ответьте `yes` на вопрос "Add another user?" если необходимо добавить другие учетные записи. Для завершения добавления пользователей и продолжения послеустановочной настройки выберите `no`.
+
+За более детальной информацией об управлении учетными записями обратитесь к crossref:basics[users-synopsis,Пользователи и основы управления учетными записями].
+
+[[bsdinstall-final-conf]]
+=== Завершение настройки
+
+После того, как установка и конфигурирование завершены, вам предоставляется заключительная возможность подкорректировать настройки.
+
+[[bsdinstall-final-config]]
+.Финальное конфигурационное меню
+image::bsdinstall-finalconfiguration.png[]
+
+Используйте это меню для внесения любых изменений или для выполнения дополнительного конфигурирования перед завершением установки.
+
+.Опции финального конфигурационного меню
+* `Add User` - Описано в <<bsdinstall-addusers>>.
+* `Root Password` - Описано в <<bsdinstall-post-root>>.
+* `Hostname` - Описано в <<bsdinstall-hostname>>.
+* `Network` - Описано в <<bsdinstall-config-network-dev>>.
+* `Services` - Описано в <<bsdinstall-sysconf>>.
+* `Time Zone` - Описано в <<bsdinstall-timezone>>.
+* `Handbook` - Загрузка и установка Руководства FreeBSD (которое вы в данный момент читаете).
+
+По завершении настройки для выхода из финального конфигурационного меню выберите btn:[Exit].
+
+[[bsdinstall-final-modification-shell]]
+.Ручная настройка
+image::bsdinstall-final-modification-shell.png[]
+
+bsdinstall уточнит, есть ли какие настройки, которые необходимо выполнить до перезагрузки в свежеустановленную систему. Для входа в командный интерпретатор новой системы выберите btn:[Yes], для перехода к последнему шагу установки нажмите btn:[No].
+
+[[bsdinstall-final-main]]
+.Завершение установки
+image::bsdinstall-mainexit.png[]
+
+Если необходимо дальнейшее конфигурирование или особая установка, то выбор btn:[Live CD] загрузит установочный носитель в режим Live CD.
+
+После того, как установка завершена, для перезагрузки компьютера и запуска новой системы FreeBSD выберите btn:[Reboot]. Не забудьте извлечь установочный CD, DVD или USB-накопитель, иначе компьютер может снова с него загрузиться.
+
+[[bsdinstall-freebsdboot]]
+=== Загрузка и завершение работы FreeBSD
+
+[[bsdinstall-freebsdboot-i386]]
+==== (FreeBSD/i386 Booting) Загрузка FreeBSD/i386
+
+Во время загрузки FreeBSD отображается множество информационных сообщений. Большинство из них вытеснится за пределы экрана; это нормально. По завершении загрузки системы будет отображено приглашение ко входу (login prompt). Сообщения, которые переместились за пределы экрана, могут быть просмотрены: при нажатии kbd:[Scroll-Lock] включается режим _буфера прокрутки_. Клавиши kbd:[PgUp], kbd:[PgDn], а также клавиши навигации могут быть задействованы для прокручивания буфера. Повторное нажатие kbd:[Scroll-Lock] разблокирует дисплей и вернет его в нормальный режим.
+
+На приглашение `login:` введите добавленное во время установки имя пользователя, в этом примере - `asample`. За исключением случаев крайней необходимости избегайте входа под учетной записью `root`.
+
+Упомянутый выше буфер прокрутки ограничен в размере, поэтому в него могут умещаться не все сообщения. После входа в систему большинство из них можно просмотреть подав команду `dmesg | less` из командной строки. Для возврата к командной строке после просмотра сообщений нажмите kbd:[q].
+
+Типичные сообщения загрузки (информация о версиях опущена):
+
+[source,bash]
+....
+Copyright (c) 1992-2011 The FreeBSD Project.
+Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
+ The Regents of the University of California. All rights reserved.
+FreeBSD is a registered trademark of The FreeBSD Foundation.
+
+ root@farrell.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC amd64
+CPU: Intel(R) Core(TM)2 Duo CPU E8400 @ 3.00GHz (3007.77-MHz K8-class CPU)
+ Origin = "GenuineIntel" Id = 0x10676 Family = 6 Model = 17 Stepping = 6
+ Features=0x783fbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,MMX,FXSR,SSE,SSE2>
+ Features2=0x209<SSE3,MON,SSSE3>
+ AMD Features=0x20100800<SYSCALL,NX,LM>
+ AMD Features2=0x1<LAHF>
+real memory = 536805376 (511 MB)
+avail memory = 491819008 (469 MB)
+Event timer "LAPIC" quality 400
+ACPI APIC Table: <VBOX VBOXAPIC>
+ioapic0: Changing APIC ID to 1
+ioapic0 <Version 1.1> irqs 0-23 on motherboard
+kbd1 at kbdmux0
+acpi0: <VBOX VBOXXSDT> on motherboard
+acpi0: Power Button (fixed)
+acpi0: Sleep Button (fixed)
+Timecounter "ACPI-fast" frequency 3579545 Hz quality 900
+acpi_timer0: <32-bit timer at 3.579545MHz> port 0x4008-0x400b on acpi0
+cpu0: <ACPI CPU> on acpi0
+pcib0: <ACPI Host-PCI bridge> port 0xcf8-0xcff on acpi0
+pci0: <ACPI PCI bus> on pcib0
+isab0: <PCI-ISA bridge> at device 1.0 on pci0
+isa0: <ISA bus> on isab0
+atapci0: <Intel PIIX4 UDMA33 controller> port 0x1f0-0x1f7,0x3f6,0x170-0x177,0x376,0xd000-0xd00f at device 1.1 on pci0
+ata0: <ATA channel 0> on atapci0
+ata1: <ATA channel 1> on atapci0
+vgapci0: <VGA-compatible display> mem 0xe0000000-0xe0ffffff irq 18 at device 2.0 on pci0
+em0: <Intel(R) PRO/1000 Legacy Network Connection 1.0.3> port 0xd010-0xd017 mem 0xf0000000-0xf001ffff irq 19 at device 3.0 on pci0
+em0: Ethernet address: 08:00:27:9f:e0:92
+pci0: <base peripheral> at device 4.0 (no driver attached)
+pcm0: <Intel ICH (82801AA)> port 0xd100-0xd1ff,0xd200-0xd23f irq 21 at device 5.0 on pci0
+pcm0: <SigmaTel STAC9700/83/84 AC97 Codec>
+ohci0: <OHCI (generic) USB controller> mem 0xf0804000-0xf0804fff irq 22 at device 6.0 on pci0
+usbus0: <OHCI (generic) USB controller> on ohci0
+pci0: <bridge> at device 7.0 (no driver attached)
+acpi_acad0: <AC Adapter> on acpi0
+atkbdc0: <Keyboard controller (i8042)> port 0x60,0x64 irq 1 on acpi0
+atkbd0: <AT Keyboard> irq 1 on atkbdc0
+kbd0 at atkbd0
+atkbd0: [GIANT-LOCKED]
+psm0: <PS/2 Mouse> irq 12 on atkbdc0
+psm0: [GIANT-LOCKED]
+psm0: model IntelliMouse Explorer, device ID 4
+attimer0: <AT timer> port 0x40-0x43,0x50-0x53 on acpi0
+Timecounter "i8254" frequency 1193182 Hz quality 0
+Event timer "i8254" frequency 1193182 Hz quality 100
+sc0: <System console> at flags 0x100 on isa0
+sc0: VGA <16 virtual consoles, flags=0x300>
+vga0: <Generic ISA VGA> at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0
+atrtc0: <AT realtime clock> at port 0x70 irq 8 on isa0
+Event timer "RTC" frequency 32768 Hz quality 0
+ppc0: cannot reserve I/O port range
+Timecounters tick every 10.000 msec
+pcm0: measured ac97 link rate at 485193 Hz
+em0: link state changed to UP
+usbus0: 12Mbps Full Speed USB v1.0
+ugen0.1: <Apple> at usbus0
+uhub0: <Apple OHCI root HUB, class 9/0, rev 1.00/1.00, addr 1> on usbus0
+cd0 at ata1 bus 0 scbus1 target 0 lun 0
+cd0: <VBOX CD-ROM 1.0> Removable CD-ROM SCSI-0 device
+cd0: 33.300MB/s transfers (UDMA2, ATAPI 12bytes, PIO 65534bytes)
+cd0: Attempt to query device size failed: NOT READY, Medium not present
+ada0 at ata0 bus 0 scbus0 target 0 lun 0
+ada0: <VBOX HARDDISK 1.0> ATA-6 device
+ada0: 33.300MB/s transfers (UDMA2, PIO 65536bytes)
+ada0: 12546MB (25694208 512 byte sectors: 16H 63S/T 16383C)
+ada0: Previously was known as ad0
+Timecounter "TSC" frequency 3007772192 Hz quality 800
+Root mount waiting for: usbus0
+uhub0: 8 ports with 8 removable, self powered
+Trying to mount root from ufs:/dev/ada0p2 [rw]...
+Setting hostuuid: 1848d7bf-e6a4-4ed4-b782-bd3f1685d551.
+Setting hostid: 0xa03479b2.
+Entropy harvesting: interrupts ethernet point_to_point kickstart.
+Starting file system checks:
+/dev/ada0p2: FILE SYSTEM CLEAN; SKIPPING CHECKS
+/dev/ada0p2: clean, 2620402 free (714 frags, 327461 blocks, 0.0% fragmentation)
+Mounting local file systems:.
+vboxguest0 port 0xd020-0xd03f mem 0xf0400000-0xf07fffff,0xf0800000-0xf0803fff irq 20 at device 4.0 on pci0
+vboxguest: loaded successfully
+Setting hostname: machine3.example.com.
+Starting Network: lo0 em0.
+lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
+ options=3<RXCSUM,TXCSUM>
+ inet6 ::1 prefixlen 128
+ inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
+ inet 127.0.0.1 netmask 0xff000000
+ nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
+em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
+ options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM>
+ ether 08:00:27:9f:e0:92
+ nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
+ media: Ethernet autoselect (1000baseT <full-duplex>)
+ status: active
+Starting devd.
+Starting Network: usbus0.
+DHCPREQUEST on em0 to 255.255.255.255 port 67
+DHCPACK from 10.0.2.2
+bound to 192.168.1.142 -- renewal in 43200 seconds.
+add net ::ffff:0.0.0.0: gateway ::1
+add net ::0.0.0.0: gateway ::1
+add net fe80::: gateway ::1
+add net ff02::: gateway ::1
+ELF ldconfig path: /lib /usr/lib /usr/lib/compat /usr/local/lib
+32-bit compatibility ldconfig path: /usr/lib32
+Creating and/or trimming log files.
+Starting syslogd.
+No core dumps found.
+Clearing /tmp (X related).
+Updating motd:.
+Configuring syscons: blanktime.
+Generating public/private rsa1 key pair.
+Your identification has been saved in /etc/ssh/ssh_host_key.
+Your public key has been saved in /etc/ssh/ssh_host_key.pub.
+The key fingerprint is:
+10:a0:f5:af:93:ae:a3:1a:b2:bb:3c:35:d9:5a:b3:f3 root@machine3.example.com
+The key's randomart image is:
++--[RSA1 1024]----+
+| o.. |
+| o . . |
+| . o |
+| o |
+| o S |
+| + + o |
+|o . + * |
+|o+ ..+ . |
+|==o..o+E |
++-----------------+
+Generating public/private dsa key pair.
+Your identification has been saved in /etc/ssh/ssh_host_dsa_key.
+Your public key has been saved in /etc/ssh/ssh_host_dsa_key.pub.
+The key fingerprint is:
+7e:1c:ce:dc:8a:3a:18:13:5b:34:b5:cf:d9:d1:47:b2 root@machine3.example.com
+The key's randomart image is:
++--[ DSA 1024]----+
+| .. . .|
+| o . . + |
+| . .. . E .|
+| . . o o . . |
+| + S = . |
+| + . = o |
+| + . * . |
+| . . o . |
+| .o. . |
++-----------------+
+Starting sshd.
+Starting cron.
+Starting background file system checks in 60 seconds.
+
+Thu Oct 6 19:15:31 MDT 2011
+
+FreeBSD/amd64 (machine3.example.com) (ttyv0)
+
+login:
+....
+
+На медленных машинах генерирование ключей RSA и DSA может занять ощутимое время. Это происходит лишь при первой загрузке новой системы, и лишь в случае, когда sshd настроен на автоматический запуск. Последующие загрузки будут проходить быстрее.
+
+По умолчанию во FreeBSD не устанавливается никаких графических оболочек, однако в наличии они имеются. За более подробной информацией обратитесь к crossref:x11[x11, X Window System].
+
+[[bsdinstall-shutdown]]
+=== Завершение работы FreeBSD
+
+Корректное завершение работы компьютера с FreeBSD помогает защитить от повреждений не только данные, но даже и аппаратное обеспечение. Не стоит просто выключать питание. Если вы входите в группу `wheel`, то станьте суперпользователем набрав в командной строке команду `su` и введя пароль пользователя `root`. Или же, войдите в систему как `root` и наберите команду `shutdown -p now`. Система корректно завершит работу и выключится.
+
+Комбинация клавиш kbd:[Ctrl+Alt+Del] может быть задействована для перезагрузки системы, однако во время нормальной работы пользоваться ею не рекомендуется.
+
+[[bsdinstall-install-trouble]]
+== Решение проблем
+
+Нижеследующий раздел описывает часто встречающиеся и сообщенные пользователями проблемы, возникающие в ходе установки.
+
+=== Что делать, если что-то идет не так
+
+По причине различных ограничений архитектуры PC, определение периферийных устройств (device probing) не может быть достоверным на все 100%, однако, есть несколько шагов, которые вы можете предпринять, если определение завершится неудачно.
+
+Просмотрите http://www.FreeBSD.org/releases/[Информацию об оборудовании (Hardware Notes)] для вашей версии FreeBSD чтобы убедиться, что ваше оборудование поддерживается.
+
+Если ваше оборудование поддерживается, а зависания или другие проблемы продолжаются, то вам необходимо будет построить crossref:kernelconfig[kernelconfig,собственное ядро]. Это позволит вам добавить поддержку устройств, которые отсутствуют в ядре [.filename]#GENERIC#. Ядро на установочных дисках сконфигурировано исходя из предположения, что большинство устройств находятся в настройках по умолчанию касательно прерываний, адресов ввода/вывода, каналов DMA. Если ваше оборудование было перенастроено, то вам скорее всего необходимо будет отредактировать конфигурационный файл ядра и пересобрать его, чтобы сообщить FreeBSD о настройках, отличных от предполагаемых.
+
+Также возможны случаи, когда процедура определения (probe) для отсутствующего устройства приводит к сбою процедуры определения для другого устройства, присутствующего в аппаратной конфигурации. В этом случае необходимо отключить процедуру (процедуры) определения для конфликтующего драйвера (драйверов).
+
+[NOTE]
+====
+Некоторое количество проблем с установкой может быть устранено или уменьшено путем обновления встроенного программного обеспечения различных аппаратных компонентов, особенно - материнской платы. Встроенное программное обеспечение материнской платы обычно называется BIOS. У большинства производителей материнских плат и компьютеров есть Web-сайты, содержащие как информацию об обновлениях, так и сами обновления.
+
+В общем, производители не рекомендуют обновлять BIOS материнской платы, если на то нет веских причин, например, таких как появление критически важного обновления. Процесс обновления _может_ потерпеть неудачу, тем самым оставив BIOS поврежденным, а компьютер - нерабочим.
+====
+
+=== Решение проблем: вопросы и ответы
+
+==== Моя система зависает во время загрузки на этапе определения устройств (probing), или она ведет себя странно во время установки.
+
+Касательно платформ i386, amd64 и ia64: если во время загрузки была обнаружена система ACPI, то FreeBSD повсеместно использует её для конфигурирования оборудования. К сожалению, до сих пор существуют неполадки как в драйвере ACPI, так и среди материнских плат и их BIOS. ACPI может быть отключена путём установки значения переменной `hint.acpi.0.disabled` на третьем этапе загрузки:
+
+[source,bash]
+....
+ set hint.acpi.0.disabled="1"
+....
+
+Это значение сбрасывается каждый раз при загрузке системы, поэтому строку `hint.acpi.0.disabled="1"` необходимо добавить в файл [.filename]#/boot/loader.conf#. Информация о загрузчике приведена в crossref:boot[boot-synopsis,Описание].
+
+[[using-live-cd]]
+== Использование Live CD
+
+FreeBSD Live CD находится на том же CD диске, что и установочная программа. Это удобно для тех пользователей, которые всё еще размышляют о пригодности для них ОС FreeBSD и желают проверить некоторые функциональные возможности до начала установки.
+
+[NOTE]
+====
+При работе с Live CD следует учесть следующее:
+
+* Для получения доступа к системе необходимо осуществить аутентификацию. Допустимое имя пользователя - `root`, пароль - пустой.
+* Так как система работает непосредственно с CD, производительность будет заметно ниже чем у системы, установленной на жесткий диск.
+* Live CD предоставляет в распоряжение командную строку, а не графический интерфейс.
+
+====
diff --git a/documentation/content/ru/books/handbook/chapters-order.adoc b/documentation/content/ru/books/handbook/chapters-order.adoc
new file mode 100644
index 0000000000..536c511513
--- /dev/null
+++ b/documentation/content/ru/books/handbook/chapters-order.adoc
@@ -0,0 +1,37 @@
+preface/_index.adoc
+parti.adoc
+introduction/_index.adoc
+install/_index.adoc
+bsdinstall/_index.adoc
+basics/_index.adoc
+ports/_index.adoc
+x11/_index.adoc
+partii.adoc
+desktop/_index.adoc
+multimedia/_index.adoc
+kernelconfig/_index.adoc
+printing/_index.adoc
+linuxemu/_index.adoc
+partiii.adoc
+config/_index.adoc
+boot/_index.adoc
+security/_index.adoc
+mac/_index.adoc
+audit/_index.adoc
+disks/_index.adoc
+geom/_index.adoc
+filesystems/_index.adoc
+l10n/_index.adoc
+cutting-edge/_index.adoc
+partiv.adoc
+serialcomms/_index.adoc
+ppp-and-slip/_index.adoc
+mail/_index.adoc
+network-servers/_index.adoc
+firewalls/_index.adoc
+advanced-networking/_index.adoc
+partv.adoc
+mirrors/_index.adoc
+bibliography/_index.adoc
+eresources/_index.adoc
+pgpkeys/_index.adoc
diff --git a/documentation/content/ru/books/handbook/config/_index.adoc b/documentation/content/ru/books/handbook/config/_index.adoc
new file mode 100644
index 0000000000..b0d3f7143a
--- /dev/null
+++ b/documentation/content/ru/books/handbook/config/_index.adoc
@@ -0,0 +1,1297 @@
+---
+title: Глава 12. Настройка и оптимизация
+part: Часть III. Системное администрирование
+prev: books/handbook/partiii
+next: books/handbook/boot
+---
+
+[[config-tuning]]
+= Настройка и оптимизация
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 12
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/config/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/config/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/config/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[config-synopsis]]
+== Введение
+
+Один из важных аспектов FreeBSD это настройка системы. Правильная настройка системы поможет избежать головной боли при последующих обновлениях. Эта глава описывает большую часть процесса настройки FreeBSD, включая некоторые параметры, которые можно установить для оптимизации системы FreeBSD.
+
+После прочтения этой главы вы узнаете:
+
+* Как эффективно работать с файловыми системами и разделами подкачки.
+* Основы настройки [.filename]#rc.conf# и системы запуска приложений [.filename]#/usr/local/etc/rc.d#.
+* Как настроить и протестировать сетевую карту.
+* Как настроить виртуальные хосты на сетевых устройствах.
+* Как использовать различные файлы конфигурации в [.filename]#/etc#.
+* Как оптимизировать FreeBSD, используя переменные `sysctl`.
+* Как увеличить скорость работы дисков и изменить ограничения, накладываемые ядром.
+
+Перед прочтением этой главы вам следует:
+
+* Понять основы UNIX(R) и FreeBSD (crossref:basics[basics, Основы UNIX]).
+* Ознакомиться с основами конфигурации/компиляции ядра (crossref:kernelconfig[kernelconfig, Настройка ядра FreeBSD]).
+
+[[configtuning-initial]]
+== Начальное конфигурирование
+
+=== Разделы диска
+
+==== Основы построения разделов
+
+Во время разметки жёсткого диска с помощью man:bsdlabel[8] или man:sysinstall[8], важно помнить, что скорость чтения и записи данных уменьшается от внешних к внутренним трекам диска. Самые маленькие и самые часто используемые файловые системы (корневая и раздел подкачки) должны быть расположены в начале диска, в то время как самые большие, такие, как [.filename]#/usr#, в конце. Самым оптимальным считается следующий порядок расположения файловых систем: root, swap, [.filename]#/var#, [.filename]#/usr#.
+
+Размер файловой системы [.filename]#/var# определяется предназначением машины. [.filename]#/var# используется для хранения почтовых ящиков, очередей печати и лог файлов. Размер почтовых ящиков и лог файлов может расти неограниченно в зависимости от количества пользователей системы и от того, как долго хранятся лог-файлы. Большинству пользователей никогда не потребуется гигабайт, но помните, что [.filename]#/var/tmp# должен быть достаточно большим для пакетов.
+
+В разделе [.filename]#/usr# содержит большинство файлов, необходимых для поддержки системы, порты (man:ports[7], рекомендуется) и исходные тексты (опционально). Оба эти каталога опциональны при установке. Для этого раздела рекомендуется как минимум 2 гигабайта.
+
+При установке размера разделов, не забудьте принять во внимание рост размера требуемого системе дискового пространства. Переполнение одного раздела даже при наличии свободного места на другом может вызвать затруднения.
+
+[NOTE]
+====
+Многие пользователи обнаружили, что размер разделов, предлагаемый man:sysinstall[8]'ом по умолчанию, иногда меньше подходящего для разделов [.filename]#/var# и [.filename]#/#. Тщательно планируйте размер разделов и не жалейте места.
+====
+
+[[swap-design]]
+==== Раздел подкачки
+
+Как правило, размер раздела подкачки должен быть равен удвоенному размеру оперативной памяти. Например, если на машине установлено 128 мегабайт памяти, раздел подкачки должен быть 256 мегабайт. Системы с меньшим количеством памяти могут работать лучше с большим объёмом раздела подкачки. Не рекомендуется устанавливать размер раздела подкачки меньше 256 мегабайт, необходимо также принять во внимание возможное наращивание объема установленной на машине памяти. Алгоритмы кэширования VM настроены на максимальное быстродействие, когда размер раздела подкачки равен как минимум удвоенному размеру памяти. Заниженный размер раздела подкачки может привести к неэффективной работе постраничного сканирования VM и вызвать проблемы при увеличении объёма памяти.
+
+На больших системах с несколькими SCSI дисками (или несколькими IDE дисками, находящимися на разных контроллерах), рекомендуется создавать раздел подкачки на каждом диске (до четырёх дисков). Разделы подкачки должны быть примерно одного размера. Ядро не накладывает ограничений на размер раздела подкачки, но внутренние структуры позволяют иметь общий размер разделов подкачки, равный наибольшему, умноженному на четыре. Выделение под разделы подкачки примерно одинакового места позволить ядру оптимально расположить разделы подкачки. Установка размера подкачки больше требуемого нормальна, даже если этот объем не используется. В этих условиях может быть проще восстановиться после зависания программы перед тем, как возникнет необходимость перезагрузки.
+
+==== Зачем нужны разделы?
+
+Некоторые пользователи считают, что лучше использовать один большой раздел, но есть несколько причин, по которым этого лучше не делать. Во-первых, у каждого раздела свои характеристики, и отделяя их, можно выполнить соответствующие настройки. Например, корневая и файловая система и [.filename]#/usr# в основном предназначены для чтения, без большого объема записи. В то же время множество операций чтения и записи выполняется в [.filename]#/var# и [.filename]#/var/tmp#.
+
+При правильном размещении и выборе размера разделов системы, фрагментация в более маленьких разделах, куда часто записываются данные, не перенесётся на остальные разделы. Размещение самых часто используемых разделов ближе к началу диска увеличит скорость ввода/вывода там, где она нужна больше всего. Хотя производительность важна и для больших дисков, передвижение их ближе к концу диска не повлечёт значительного уменьшения быстродействия по сравнению с перемещением ближе к концу диска [.filename]#/var#. И, наконец, разделы существуют и из соображений безопасности. Наличие маленького аккуратного корневого раздела, доступного только для чтения даёт значительные шансы на "выживание" после краха системы.
+
+[[configtuning-core-configuration]]
+== Основные настройки
+
+Основные настройки системы располагаются в [.filename]#/etc/rc.conf#. Этот файл вмещает широкий спектр конфигурационной информации, используемой при загрузке системы. Имя этого файла прямо отражает его назначение, это файл настройки для файлов [.filename]#rc*#.
+
+Администратор должен сделать записи в [.filename]#rc.conf#, чтобы переопределить строки по умолчанию из [.filename]#/etc/defaults/rc.conf#. Файлы по умолчанию нельзя копировать в [.filename]#/etc# - они вмещают значения по умолчанию, а не примеры значений. Все специфичные для данной системы изменения должны быть сделаны в файле [.filename]#rc.conf#.
+
+Существует несколько методов для отделения общей конфигурации для группы систем от конкретной для данной системы в целях уменьшения объема работы администратора. Рекомендуемый метод - прописать общую конфигурацию в отдельный файл, например, в [.filename]#/etc/rc.conf.site#, и включить его название в [.filename]#/etc/rc.conf#, который вмещает только специфичную для данной системы информацию.
+
+Поскольку [.filename]#rc.conf# читается man:sh[1], есть тривиальный способ сделать это. Например:
+
+* rc.conf:
++
+[.programlisting]
+....
+ . /etc/rc.conf.site
+ hostname="node15.example.com"
+ network_interfaces="fxp0 lo0"
+ ifconfig_fxp0="inet 10.1.1.1"
+....
+
+* rc.conf.site:
++
+[.programlisting]
+....
+ defaultrouter="10.1.1.254"
+ saver="daemon"
+ blanktime="100"
+....
+
+Файл [.filename]#rc.conf.site# может быть распространён на все системы, используя `rsync` или подобную ей программу, в то время, как [.filename]#rc.conf# должен остаться только на одной машине.
+
+Обновление системы с помощью man:sysinstall[8] или `make world` не повлекут за собой перезапись [.filename]#rc.conf#. Вся информация в этом файле сохранится.
+
+[[configtuning-appconfig]]
+== Настройка приложений
+
+Обычно, установленные приложения имеют свои конфигурационные файлы, со своим собственным синтаксисом. Важно хранить эти файлы отдельно от файлов основной системы, чтобы их можно было легко администрировать с помощью средств управления пакетами.
+
+Обычно эти файлы устанавливаются в [.filename]#/usr/local/etc#. В случае, если приложению нужно большое количество конфигурационных файлов, для их хранения будет создан подкаталог.
+
+Обычно, вместе с установкой портов и пакетов, устанавливаются и примеры конфигурационных файлов. Обычно они имеют расширение [.filename]#.default#. Если не существует конфигурационных файлов для этого приложения, они будут созданы путём копирования [.filename]#.default# файлов.
+
+Например, [.filename]#/usr/local/etc/apache#:
+
+....
+-rw-r--r-- 1 root wheel 2184 May 20 1998 access.conf
+-rw-r--r-- 1 root wheel 2184 May 20 1998 access.conf.default
+-rw-r--r-- 1 root wheel 9555 May 20 1998 httpd.conf
+-rw-r--r-- 1 root wheel 9555 May 20 1998 httpd.conf.default
+-rw-r--r-- 1 root wheel 12205 May 20 1998 magic
+-rw-r--r-- 1 root wheel 12205 May 20 1998 magic.default
+-rw-r--r-- 1 root wheel 2700 May 20 1998 mime.types
+-rw-r--r-- 1 root wheel 2700 May 20 1998 mime.types.default
+-rw-r--r-- 1 root wheel 7980 May 20 1998 srm.conf
+-rw-r--r-- 1 root wheel 7933 May 20 1998 srm.conf.default
+....
+
+Размеры файлов показывают, что только файл [.filename]#srm.conf# был изменён. При следующем обновлении Apache этот файл уже не будет перезаписан.
+
+[[configtuning-starting-services]]
+== Запуск сервисов
+
+Многие пользователи предпочитают устанавливать программы сторонних производителей в FreeBSD из набора портов. В подобных случаях может потребоваться сконфигурировать программы так, чтобы они запускались при инициализации системы. Сервисы, такие как package:mail/postfix[] или package:www/apache13[], - это лишь два примера множества программных пакетов, которые можно запускать при инициализации системы. В этом разделе описывается процедура, предназначенная для запуска программ сторонних разработчиков.
+
+Большинство входящих в FreeBSD сервисов, таких как man:cron[8], запускается с помощью стартовых скриптов системы. Эти скрипты могут различаться в зависимости от версии FreeBSD или ее производителя; однако важнее всего учитывать, что их начальную конфигурацию можно задать с помощью простых стартовых скриптов.
+
+До появления [.filename]#rc.d# приложения должны были помещать простой стартовый скрипт в каталог [.filename]#/usr/local/etc/rc.d#, который затем читался скриптами инициализации системы. Эти скрипты затем выполнялись в ходе последующих стадий запуска системы.
+
+Хотя много разработчиков потратили часы на попытки внедрить старый стиль конфигурирования в новую систему, остаётся фактом, что для некоторых утилит сторонних производителей по-прежнему необходим скрипт, помещённый в указанный выше каталог. Незначительные различия в скриптах зависят от того, используется ли [.filename]#rc.d#. До версии FreeBSD 5.1 использовались скрипты в старом стиле, и почти во всех случаях скрипты в новом стиле должны подойти так же хорошо.
+
+Хотя каждый скрипт должен соответствовать некоторым минимальным требованиям, в большинстве случаев эти требования не зависят от версии FreeBSD. Каждый скрипт должен иметь в конце расширение [.filename]#.sh# и каждый скрипт должен быть выполняемым. Последнее требование может быть выполнено путем установки командой `chmod` уникальных прав доступа `755`. Также, как минимум, должна быть опция `start` для запуска приложения и опция `stop` для его остановки.
+
+Простейший стартовый скрипт, пожалуй, будет похож на следующий:
+
+[.programlisting]
+....
+#!/bin/sh
+echo -n ' utility'
+
+case "$1" in
+start)
+ /usr/local/bin/utility
+ ;;
+stop)
+ kill -9 `cat /var/run/utility.pid`
+ ;;
+*)
+ echo "Usage: `basename $0` {start|stop}" 2
+ exit 64
+ ;;
+esac
+
+exit 0
+....
+
+Этот скрипт поддерживает опции `stop` и `start` для приложения, которое мы здесь называем просто - `utility`.
+
+А можно запускать его и вручную, с помощью команды:
+
+[source,bash]
+....
+# /usr/local/etc/rc.d/utility.sh start
+....
+
+Хотя и не все программы сторонних производителей требуют добавления строки в файл [.filename]#rc.conf#, практически каждый день очередной новый порт меняется так, чтобы поддерживать подобную конфигурацию. Поищите в результатах, выдаваемых после установки более детальную информацию по конкретному приложению. Некоторые программы сторонних производителей будут включать стартовые скрипты, позволяющие использовать приложение с [.filename]#rc.d#; но это мы еще обсудим в следующем разделе.
+
+=== Расширенное конфигурирование приложения
+
+Теперь, когда FreeBSD включает [.filename]#rc.d#, конфигурирование запуска приложений стало более оптимальным; фактически, оно стало более тщательным. С помощью ключевых слов, рассмотренных в разделе <<configtuning-rcd,rc.d>>, приложения теперь можно настроить для запуска после других заданных сервисов, например, DNS; можно разрешить передачу дополнительных флагов через [.filename]#rc.conf# вместо жесткого задания флагов в стартовых скриптах, и т.д. Простой скрипт может иметь следующий вид:
+
+[.programlisting]
+....
+#!/bin/sh
+#
+# PROVIDE: utility
+# REQUIRE: DAEMON
+# KEYWORD: shutdown
+
+. /etc/rc.subr
+
+name=utility
+rcvar=utility_pidfile
+
+command="/usr/local/sbin/utility"
+
+load_rc_config $name
+
+#
+# НЕ МЕНЯЙТЕ ЗДЕСЬ ЭТИ СТАНДАРТНЫЕ ЗНАЧЕНИЯ
+# ЗАДАВАЙТЕ ИХ В ФАЙЛЕ /etc/rc.conf
+#
+utility_enable=${utility_enable-"NO"}
+pidfile=${utility_pidfile-"/var/run/utility.pid"}
+
+run_rc_command "$1"
+....
+
+Этот скрипт будет гарантировать, что указанное приложение utility будет запущено после сервиса `daemon`. Он также предоставляет метод для создания и отслеживания файла идентификатора процесса, PID.
+
+Для этого приложения затем можно поместить следующую строку в файл [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+utility_enable="YES"
+....
+
+Этот новый метод также позволяет легко работать с аргументами командной строки, включать стандартные функции из файла [.filename]#/etc/rc.subr#, обеспечивает совместимость с утилитой man:rcorder[8] и упрощает конфигурирование с помощью файла [.filename]#rc.conf#.
+
+=== Использование сервисов для запуска сервисов
+
+Другие сервисы, такие как даемоны сервера POP3, IMAP, и т.п. могут быть запущены с помощью man:inetd[8]. Для этого необходимо установить сервисную утилиту из набора портов и добавить соответствующую строчку конфигурации в файл [.filename]#/etc/inetd.conf# или раскомментировать подходящую строку конфигурации из уже имеющихся. Работа с даемоном inetd и его конфигурирование подробно описаны в разделе crossref:network-servers[network-inetd,inetd].
+
+В некоторых случаях использование для запуска системных служб даемона man:cron[8] может оказаться более приемлемым. Этот подход имеет несколько преимуществ, поскольку даемон `cron` запускает эти процессы от имени владельца файла [.filename]#crontab#. Это позволяет обычным пользователям запускать и поддерживать некоторые приложения.
+
+Утилита `cron` поддерживает уникальную возможность, `@reboot`, - это значение можно использовать вместо спецификации времени. В результате, задание будет выполнено при запуске man:cron[8], обычно - в ходе инициализации системы.
+
+[[configtuning-cron]]
+== Настройка утилиты `cron`
+
+Одна из наиболее полезных утилит FreeBSD это man:cron[8]. Утилита `cron` работает в фоновом режиме и постоянно проверяет файл [.filename]#/etc/crontab#. Утилита `cron` проверяет также каталог [.filename]#/var/cron/tabs# в поиске новых файлов [.filename]#crontab#. Файлы [.filename]#crontab# содержат информацию об определенных функциях, которые `cron` выполняет в указанное время.
+
+Утилита `cron` использует два разных типа конфигурационных файлов, системный и пользовательский. Все различие между этими двумя форматами заключается в шестом поле. В системном файле шестое поля это имя пользователя, с правами которого будет запущена команда. Это позволяет запускать команды из системного crontab от любого пользователя. В пользовательском файле шестое поле указывает запускаемую команду, и все команды запускаются от пользователя, который создал crontab; это важно для безопасности.
+
+[NOTE]
+====
+Пользовательские crontab позволяют индивидуальным пользователям планировать задачи без привилегий суперпользователя (`root`). Команды из crontab пользователя запускаются с привилегиями этого пользователя.
+
+Пользователь `root` может использовать собственный crontab, как и любой другой пользователь. Он будет отличаться от системного crontab [.filename]#/etc/crontab#. Поскольку существует системный crontab, обычно не требуется создавать пользовательский crontab для `root`.
+====
+
+Давайте заглянем в файл [.filename]#/etc/crontab# (системный crontab):
+
+[.programlisting]
+....
+# /etc/crontab - root's crontab for FreeBSD
+#
+# $FreeBSD: src/etc/crontab,v 1.32 2002/11/22 16:13:39 tom Exp $
+## <.>
+#
+SHELL=/bin/sh
+PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin <.>
+HOME=/var/log
+#
+#
+#minute hour mday month wday who command <.>
+#
+#
+*/5 * * * * root /usr/libexec/atrun <.>
+....
+
+<.> Как и в большинстве файлов настройки FreeBSD, символы "#" означают комментарии. Комментарии нужны для напоминания о том, что означает строка и зачем она добавлена. Комментарии не могут находиться на той же строке, что и команда, или они будут восприняты как часть команды; располагайте их на новой строке. Пустые строки игнорируются.
+
+<.> Сначала должны быть заданы переменные окружения. Знак равно (`=`) используется для задания переменных окружения, в этом примере `SHELL`, `PATH`, и `HOME`. Если переменная для оболочки не задана, `cron` использует оболочку по умолчанию, `sh`. Если не задана переменная `PATH`, значение по умолчанию не устанавливается и пути к файлам должны быть полными. Если не задана переменная `HOME`, `cron` будет использовать домашний каталог соответствующего пользователя.
+
+<.> В строке всего семь полей. Их значения `minute`, `hour`, `mday`, `month`, `wday`, `who` (кто), и `command`. Значение полей почти очевидно. `minute` это время в минутах, когда будет запущена команда. `hour` означает то же самое для часов. `mday` означает день месяца. `month`, это то же самое, что час и минута, но для месяцев. Параметр `wday` это день недели. Все эти поля должны быть в числовом формате, время в двадцатичетырехчасовом исчислении. Поле `who` имеет специальное значение, и присутствует только в файле [.filename]#/etc/crontab#. Это поле определяет пользователя, с правами которого должна быть запущена команда. Когда пользователь устанавливает собственный файл [.filename]#crontab#, он не указывает этот параметр. Последний параметр `command`. Он указывает команду, которая должна быть запущена.
+
+<.> Последняя строка определяет параметры, описанные выше. Здесь задано значение `\*/5`, и несколько символов `\*`. Эти символы `*` означают "первый-последний", и могут быть интерпретированы как _каждый_. Таким образом, для этой строки соответствующая команда `atrun` вызывается под пользователем `root` каждые пять минут независимо от дня или месяца. За дополнительной информацией по команде `atrun` обращайтесь к странице справочника man:atrun[8].Команды могут принимать любое количество параметров; однако команды, состоящие из нескольких строк, должны быть объединены символом "\".
+
+Этот формат одинаков для каждого файла [.filename]#crontab#, за исключением одной детали. Шестое поле, где указано имя пользователя, присутствует только в файле [.filename]#/etc/crontab#. Это поле должно быть исключено из [.filename]#crontab# файлов пользователей.
+
+[[configtuning-installcrontab]]
+=== Установка crontab
+
+[IMPORTANT]
+====
+Вы не должны использовать процедуру, описанную здесь, для установки системного crontab. Просто используйте свой любимый текстовый редактор: утилита `cron` узнает о том, что файл изменился и сразу начнет использовать обновленную версию. Обратитесь к link:{faq}#ROOT-NOT-FOUND-CRON-ERRORS[этой части FAQ] за дальнейшей информацией.
+====
+
+Для установки готового [.filename]#crontab# пользователя, сначала создайте в вашем любимом редакторе файл соответствующего формата, а затем воспользуйтесь утилитой `crontab`. Обычно она запускается так:
+
+[source,bash]
+....
+% crontab crontab-file
+....
+
+В этом примере, [.filename]#crontab-file# это имя файла crontab, который только что был создан.
+
+Существует также параметр для просмотра установленных файлов [.filename]#crontab#: задайте `crontab` параметр `-l`.
+
+Для пользователей, составляющих crontab вручную, без временного файла, существует параметр `crontab -e`. Она вызовет редактор с пустым файлом. Когда файл будет сохранен, `crontab` автоматически установит его.
+
+Если позднее вы захотите полностью удалить свой [.filename]#crontab#, используйте `crontab` с параметром `-r`.
+
+[[configtuning-rcd]]
+== Использование rc во FreeBSD 5.X и последующих версиях
+
+Во FreeBSD недавно была интегрирована из NetBSD система [.filename]#rc.d#, используемая для старта системы. Многие из файлов в каталоге [.filename]#/etc/rc.d# предназначены для основных сервисов, они могут управляться параметрами `start`, `stop`, и `restart`. Например, man:sshd[8] может быть перезапущен следующей командой:
+
+[source,bash]
+....
+# /etc/rc.d/sshd restart
+....
+
+Эта процедура похожа для других сервисов. Конечно, сервисы обычно запускаются автоматически при загрузке системы, как указано в man:rc.conf[5]. Например, включение даемона Network Address Translation при запуске выполняется простым добавлением следующей строки в [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+natd_enable="YES"
+....
+
+Если `natd_enable="NO"` уже присутствует, просто измените `NO` на `YES`. Скрипты rc автоматически загрузят все другие зависимые сервисы, как описано ниже.
+
+Поскольку система [.filename]#rc.d# в основном предназначена для запуска/отключения сервисов во время запуска/отключения системы, стандартные параметры `start`, `stop` и `restart` будут работать только если установлена соответствующая переменная в [.filename]#/etc/rc.conf#. Например, команда выше `sshd restart` будет работать только если переменная `sshd_enable` в файле [.filename]#/etc/rc.conf# установлена в `YES`. Для выполнения скриптов независимо от установок в [.filename]#/etc/rc.conf#, параметры `start`, `stop` или `restart` необходимо задавать с префиксом "force". Например, для перезапуска `sshd` независимо от установок в [.filename]#/etc/rc.conf#, выполните следующую команду:
+
+[source,bash]
+....
+# /etc/rc.d/sshd forcerestart
+....
+
+Проверить состояние переменной в файле [.filename]#/etc/rc.conf# легко: запустите соответствующий скрипт из [.filename]#rc.d# с параметром `rcvar`. Проверка переменной для `sshd` выполняется следующей командой:
+
+[source,bash]
+....
+# /etc/rc.d/sshd rcvar
+# sshd
+$sshd_enable=YES
+....
+
+[NOTE]
+====
+Вторая строка (`# sshd`) это вывод команды `sshd`, а не консоль `root`.
+====
+
+Чтобы определить, запущен ли сервис, существует параметр `status`. Например для проверки того, запущен ли `sshd`, выполните:
+
+[source,bash]
+....
+# /etc/rc.d/sshd status
+sshd is running as pid 433.
+....
+
+В некоторых случаях возможна также перегрузка (`reload`) сервиса. Скрипт, запущенный с этим параметром, попытается отправить сервису сигнал, вызывающий перезагрузку файлов настройки. В большинстве случаев это означает отправку сервису сигнала `SIGHUP`. Следует помнить, что эту функцию поддерживают не все сервисы.
+
+Система [.filename]#rc.d# используется не только для сетевых серверов, она отвечает также за большую часть инициализации системы. Рассмотрим, к примеру, файл [.filename]#bgfsck#. Во время выполнения этот скрипт выводит следующее сообщение:
+
+[source,bash]
+....
+Starting background file system checks in 60 seconds.
+....
+
+Следовательно, этот файл используется для фоновой проверки файловых систем, которая выполняется только в процессе инициализации системы.
+
+Функционирование многих сервисов системы зависит от корректной работы других сервисов. Например, NIS и другие основанные на RPC сервисы могут не запуститься, пока не загрузится `rpcbind` (portmapper). Для разрешения этой проблемы, в начале каждого скрипта в комментарии включаются информация о зависимостях и другие метаданные. Программа man:rcorder[8] используется для разбора этих комментариев во время старта системы для определения порядка, в котором должны вызываться системные сервисы в соответствии с зависимостями. В начало каждого стартового файла должны быть включены следующие строки:
+
+* `PROVIDE`: Задает имя сервиса, предоставляемого этим файлом.
+* `REQUIRE`: Список сервисов, необходимых этому сервису. Этот файл будет запущен _после_ указанных сервисов.
+* `BEFORE`: Список сервисов, зависящих от этого сервиса. Этот файл будет запущен _до_ указанных сервисов.
+
+Используя этот метод, администратор может легко контролировать системные сервисы без использования "уровней запуска", как в некоторых других операционных системах UNIX(R).
+
+Дополнительную информацию о системе [.filename]#rc.d# можно найти на страницах справочника man:rc[8] и man:rc.subr[8].
+
+[[config-network-setup]]
+== Настройка карт сетевых интерфейсов
+
+В наши дни мы не представляем себе компьютера без сетевого подключения. Добавление и настройка сетевой карты это обычная задача любого администратора FreeBSD.
+
+=== Поиск подходящего драйвера
+
+В первую очередь определите тип используемой карты (PCI или ISA), модель карты и используемый в ней чип. FreeBSD поддерживает многие PCI и ISA карты. Обратитесь к Списку поддерживаемого оборудования вашего релиза чтобы узнать, поддерживается ли карта.
+
+Как только вы убедились, что карта поддерживается, потребуется определить подходящий драйвер. В файлах [.filename]#/usr/src/sys/conf/NOTES# и [.filename]#/usr/src/sys/arch/conf/NOTES# находится список драйверов сетевых интерфейсов с информацией о поддерживаемых чипсетах/картах. Если вы сомневаетесь в том, какой драйвер подойдет, прочтите страницу справочника к драйверу. Страница справочника содержит больше информации о поддерживаемом оборудовании и даже о проблемах, которые могут возникнуть.
+
+Если ваша карта широко распространена, вам скорее всего не потребуется долго искать драйвер. Драйверы для широко распространенных карт представлены в ядре [.filename]#GENERIC#, так что ваша карта должна определиться при загрузке, примерно так:
+
+[source,bash]
+....
+dc0: <82c169 PNIC 10/100BaseTX> port 0xa000-0xa0ff mem 0xd3800000-0xd38
+000ff irq 15 at device 11.0 on pci0
+dc0: Ethernet address: 00:a0:cc:da:da:da
+miibus0: <MII bus> on dc0
+ukphy0: <Generic IEEE 802.3u media interface> on miibus0
+ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
+dc1: <82c169 PNIC 10/100BaseTX> port 0x9800-0x98ff mem 0xd3000000-0xd30
+000ff irq 11 at device 12.0 on pci0
+dc1: Ethernet address: 00:a0:cc:da:da:db
+miibus1: <MII bus> on dc1
+ukphy1: <Generic IEEE 802.3u media interface> on miibus1
+ukphy1: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
+....
+
+В этом примере две карты используют имеющийся в системе драйвер man:dc[4].
+
+Если драйвер вашей сетевой карты отсутствует в [.filename]#GENERIC#, для ее использования потребуется загрузить подходящий драйвер. Это может быть сделано одним из двух способов:
+
+* Простейший способ - просто загрузить модуль ядра сетевой карты с помощью man:kldload[8]. Не все драйверы доступны в виде модулей; например, модули отсутствуют для ISA карт.
+* Вместо этого, вы можете статически включить поддержку карты, скомпилировав собственное ядро. Информацию о том, какие параметры нужно включать в ядро, можно получить из [.filename]#/usr/src/sys/conf/NOTES#, [.filename]#/usr/src/sys/arch/conf/NOTES# и страницы справочника драйвера сетевой карты. За более подробной информацией о сборке собственного ядра обращайтесь к crossref:kernelconfig[kernelconfig, Настройка ядра FreeBSD]. Если карта была обнаружена вашим ядром ([.filename]#GENERIC#) во время загрузки, собирать ядро не потребуется.
+
+=== Настройка сетевой карты
+
+Как только для сетевой карты загружен подходящий драйвер, ее потребуется настроить. Как и многое другое, сетевая карта может быть настроена во время установки с помощью sysinstall.
+
+Для вывода информации о настройке сетевых интерфейсов системы, введите следующую команду:
+
+[source,bash]
+....
+% ifconfig
+dc0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
+ inet 192.168.1.3 netmask 0xffffff00 broadcast 192.168.1.255
+ ether 00:a0:cc:da:da:da
+ media: Ethernet autoselect (100baseTX <full-duplex>)
+ status: active
+dc1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
+ inet 10.0.0.1 netmask 0xffffff00 broadcast 10.0.0.255
+ ether 00:a0:cc:da:da:db
+ media: Ethernet 10baseT/UTP
+ status: no carrier
+lp0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> mtu 1500
+lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
+ inet 127.0.0.1 netmask 0xff000000
+tun0: flags=8010<POINTOPOINT,MULTICAST> mtu 1500
+....
+
+[NOTE]
+====
+Старые версии FreeBSD могут потребовать запуска man:ifconfig[8] с параметром `-a`, за более подробным описанием синтаксиса man:ifconfig[8] обращайтесь к странице справочника. Учтите также, что строки, относящиеся к IPv6 (`inet6` и т.п.) убраны из этого примера.
+====
+
+В этом примере были показаны следующие устройства:
+
+* [.filename]#dc0#: первый Ethernet интерфейс
+* [.filename]#dc1#: второй Ethernet интерфейс
+* [.filename]#lp0#: интерфейс параллельного порта
+* [.filename]#lo0#: устройство loopback
+* [.filename]#tun0#: туннельное устройство, используемое ppp
+
+Для присвоения имени сетевой карте FreeBSD использует имя драйвера и порядковый номер, в котором карта обнаруживается при инициализации устройств. Например, [.filename]#sis2# это третья сетевая карта, использующая драйвер man:sis[4].
+
+В этом примере, устройство [.filename]#dc0# включено и работает. Ключевые признаки таковы:
+
+. `UP` означает, что карта настроена и готова.
+. У карты есть интернет (`inet`) адрес (в данном случае `192.168.1.3`).
+. Установлена маска подсети (`netmask`; `0xffffff00`, то же, что и `255.255.255.0`).
+. Широковещательный адрес (в данном случае, `192.168.1.255`).
+. Значение MAC адреса карты (`ether`) `00:a0:cc:da:da:da`
+. Выбор физической среды передачи данных в режиме автовыбора (`media: Ethernet autoselect (100baseTX full-duplex)`). Мы видим, что [.filename]#dc1# была настроена для работы с `10baseT/UTP`. За более подробной информацией о доступных драйверу типах среды обращайтесь к странице справочника.
+. Статус соединения (`status`) `active`, т.е. несущая обнаружена. Для [.filename]#dc1#, мы видим `status: no carrier`. Это нормально, когда Ethernet кабель не подключен к карте.
+
+Если man:ifconfig[8] показывает примерно следующее:
+
+[source,bash]
+....
+dc0: flags=8843<BROADCAST,SIMPLEX,MULTICAST> mtu 1500
+ ether 00:a0:cc:da:da:da
+....
+
+это означает, что карта не была настроена.
+
+Для настройки карты вам потребуются привилегии пользователя `root`. Настройка сетевой карты может быть выполнена из командной строки с помощью man:ifconfig[8], но вам потребуется делать это после каждой перезагрузки системы. Подходящее место для настройки сетевых карт это файл [.filename]#/etc/rc.conf#.
+
+Откройте [.filename]#/etc/rc.conf# в текстовом редакторе. Вам потребуется добавить строку для каждой сетевой карты, имеющейся в системе, например, в нашем случае, было добавлено две строки:
+
+[.programlisting]
+....
+ifconfig_dc0="inet 192.168.1.3 netmask 255.255.255.0"
+ifconfig_dc1="inet 10.0.0.1 netmask 255.255.255.0 media 10baseT/UTP"
+....
+
+Замените [.filename]#dc0#, [.filename]#dc1#, и так далее на соответствующие имена ваших карт, подставьте соответствующие адреса. Обратитесь к страницам справочника сетевой карты и man:ifconfig[8], за подробной информацией о доступных опциях и к странице справочника man:rc.conf[5] за дополнительной информацией о синтаксисе [.filename]#/etc/rc.conf#.
+
+Если вы настроили сетевую карту в процессе установки системы, некоторые строки, касающиеся сетевой карты, могут уже присутствовать. Внимательно проверьте [.filename]#/etc/rc.conf# перед добавлением каких-либо строк.
+
+Отредактируйте также файл [.filename]#/etc/hosts# для добавления имен и IP адресов различных компьютеров сети, если их еще там нет. За дополнительной информацией обращайтесь к man.hosts.5; и к [.filename]#/usr/shared/examples/etc/hosts#.
+
+=== Тестирование и решение проблем
+
+Как только вы внесете необходимые изменения в [.filename]#/etc/rc.conf#, перегрузите компьютер. Изменения настроек интерфейсов будут применены, кроме того будет проверена правильность настроек.
+
+Как только система перезагрузится, проверьте сетевые интерфейсы.
+
+==== Проверка Ethernet карты
+
+Для проверки правильности настройки сетевой карты, попробуйте выполнить ping для самого интерфейса, а затем для другой машины в локальной сети.
+
+Сначала проверьте локальный интерфейс:
+
+[source,bash]
+....
+% ping -c5 192.168.1.3
+PING 192.168.1.3 (192.168.1.3): 56 data bytes
+64 bytes from 192.168.1.3: icmp_seq=0 ttl=64 time=0.082 ms
+64 bytes from 192.168.1.3: icmp_seq=1 ttl=64 time=0.074 ms
+64 bytes from 192.168.1.3: icmp_seq=2 ttl=64 time=0.076 ms
+64 bytes from 192.168.1.3: icmp_seq=3 ttl=64 time=0.108 ms
+64 bytes from 192.168.1.3: icmp_seq=4 ttl=64 time=0.076 ms
+
+--- 192.168.1.3 ping statistics ---
+5 packets transmitted, 5 packets received, 0% packet loss
+round-trip min/avg/max/stddev = 0.074/0.083/0.108/0.013 ms
+....
+
+Затем проверьте другую машину в локальной сети:
+
+[source,bash]
+....
+% ping -c5 192.168.1.2
+PING 192.168.1.2 (192.168.1.2): 56 data bytes
+64 bytes from 192.168.1.2: icmp_seq=0 ttl=64 time=0.726 ms
+64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.766 ms
+64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.700 ms
+64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.747 ms
+64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=0.704 ms
+
+--- 192.168.1.2 ping statistics ---
+5 packets transmitted, 5 packets received, 0% packet loss
+round-trip min/avg/max/stddev = 0.700/0.729/0.766/0.025 ms
+....
+
+Вы можете также использовать имя машины вместо `192.168.1.2`, если настроен файл [.filename]#/etc/hosts#.
+
+==== Решение проблем
+
+Решение проблем с аппаратным и программным обеспечением всегда вызывает сложности, которые можно уменьшить, проверив сначала самые простые варианты. Подключен ли сетевой кабель? Правильно ли настроены сетевые сервисы? Правильно ли настроен брандмауэр? Поддерживается ли используемая карта в FreeBSD? Всегда проверяйте информацию об оборудовании перед отправкой сообщения об ошибке. Обновите FreeBSD до последней версии STABLE. Просмотрите архивы списков рассылки, или поищите информацию в интернет.
+
+Если карта работает, но производительность низка, может помочь чтение страницы справочника man:tuning[7]. Проверьте также настройки сети, поскольку неправильные настройки могут стать причиной низкой скорости соединения.
+
+Некоторые пользователи встречаются с несколькими `device timeouts`, что нормально для некоторых сетевых карт. Если это продолжается и надоедает, убедитесь, что устройство не конфликтует с другим устройством. Внимательно проверьте подключение кабеля. Возможно также, что вам просто надо установить другую карту.
+
+Время от времени, пользователи видят несколько ошибок `watchdog timeout`. Первое, что требуется сделать, это проверить сетевой кабель. Многие карты требуют поддержки Bus Mastering слотом PCI. На некоторых старых материнских платах, только один PCI слот имеет такую поддержку (обычно слот 0). Сверьтесь с документацией на сетевую карту и материнскую плату, чтобы определить, может ли это быть проблемой.
+
+Сообщение `No route to host` появляются, если система не в состоянии доставить пакеты к хосту назначения. Это может случиться, если не определен маршрут по умолчанию, или кабель не подключен. Проверьте вывод команды `netstat -rn` и убедитесь, что к соответствующему хосту есть работающий маршрут. Если это не так, прочтите crossref:advanced-networking[advanced-networking, Сложные вопросы работы в сети].
+
+Сообщения `ping: sendto: Permission denied` зачастую появляются при неправильно настроенном брандмауэре. Если `ipfw` включен в ядре, но правила не определены, правило по умолчанию блокирует весь трафик, даже запросы ping! Прочтите crossref:firewalls[firewalls, Межсетевые экраны] с более подробной информацией.
+
+Иногда скорость карты недостаточна, или ниже среднего. В этих случаях лучше всего изменить режим выбора типа подключения с `autoselect` на правильный тип. Обычно это работает для большинства оборудования, но не может решить проблему во всех случаях. Проверьте еще раз настройки сети и прочтите страницу справочника man:tuning[7].
+
+[[configtuning-virtual-hosts]]
+== Настройка виртуальных серверов
+
+Очень часто FreeBSD используется для размещения сайтов, когда один сервер работает в сети как несколько серверов. Это достигается присвоением нескольких сетевых адресов одному интерфейсу.
+
+У сетевого интерфейса всегда есть один "настоящий" адрес, хотя он может иметь любое количество "синонимов" (alias). Эти синонимы обычно добавляются путём помещения соответствующих записей в [.filename]#/etc/rc.conf#.
+
+Синоним для интерфейса [.filename]#fxp0# выглядит следующим образом:
+
+[.programlisting]
+....
+ifconfig_fxp0_alias0="inet xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx"
+....
+
+Заметьте, что записи синонимов должны начинаться с `alias0` и идти далее в определенном порядке (например, `_alias1`, `_alias2`, и т.д.). Конфигурационный процесс остановится на первом по порядку отсутствующем числе.
+
+Определение маски подсети для синонима очень важно, но к счастью, так же просто. Для каждого интерфейса должен быть один адрес с истинной маской подсети. Любой другой адрес в сети должен иметь маску подсети, состоящую из всех единичек (что выражается как `255.255.255.255` или как `0xffffffff`).
+
+Например, рассмотрим случай, когда интерфейс [.filename]#fxp0# подключён к двум сетям, к сети `10.1.1.0` с маской подсети `255.255.255.0` и к сети `202.0.75.16` с маской `255.255.255.240`. Мы хотим, чтобы система была видна по IP, начиная с `10.1.1.1` по `10.1.1.5` и с `202.0.75.17` по `202.0.75.20`. Как было сказано выше, только первый адрес в заданном диапазоне (в данном случае, `10.0.1.1` и `202.0.75.17`) должен иметь реальную маску сети; все остальные (с `10.1.1.2` по `10.1.1.5` и с `202.0.75.18` по `202.0.75.20`) должны быть сконфигурированы с маской сети `255.255.255.255`.
+
+Для этого в файл [.filename]#/etc/rc.conf# должны быть внесены следующие записи:
+
+[.programlisting]
+....
+ifconfig_fxp0="inet 10.1.1.1 netmask 255.255.255.0"
+ifconfig_fxp0_alias0="inet 10.1.1.2 netmask 255.255.255.255"
+ifconfig_fxp0_alias1="inet 10.1.1.3 netmask 255.255.255.255"
+ifconfig_fxp0_alias2="inet 10.1.1.4 netmask 255.255.255.255"
+ifconfig_fxp0_alias3="inet 10.1.1.5 netmask 255.255.255.255"
+ifconfig_fxp0_alias4="inet 202.0.75.17 netmask 255.255.255.240"
+ifconfig_fxp0_alias5="inet 202.0.75.18 netmask 255.255.255.255"
+ifconfig_fxp0_alias6="inet 202.0.75.19 netmask 255.255.255.255"
+ifconfig_fxp0_alias7="inet 202.0.75.20 netmask 255.255.255.255"
+....
+
+[[configtuning-configfiles]]
+== Файлы настройки
+
+=== Каталог [.filename]#/etc#
+
+Во FreeBSD определён ряд каталогов, предназначенных для хранения конфигурационных файлов. Это:
+
+[.informaltable]
+[cols="1,1", frame="none"]
+|===
+
+|[.filename]#/etc#
+|Основные файлы конфигурации системы. Тут размещены системно-зависимые данные.
+
+|[.filename]#/etc/defaults#
+|Версии системных конфигурационных файлов по умолчанию.
+
+|[.filename]#/etc/mail#
+|Дополнительные конфигурационные файлы man:sendmail[8], другие конфигурационные файлы MTA.
+
+|[.filename]#/etc/ppp#
+|Настройка для user- и kernel-ppp программ.
+
+|[.filename]#/etc/namedb#
+|Основное место расположения данных man:named[8]. Обычно [.filename]#named.conf# и файлы зон расположены здесь.
+
+|[.filename]#/usr/local/etc#
+|Конфигурационные файлы установленных приложений. Могут содержать подкаталоги приложений.
+
+|[.filename]#/usr/local/etc/rc.d#
+|Скрипты запуска/остановки установленных приложений.
+
+|[.filename]#/var/db#
+|Автоматически генерируемые системно-специфичные файлы баз данных, такие как база данных пакетов, и так далее
+|===
+
+=== Имена хостов
+
+==== [.filename]#/etc/resolv.conf#
+
+[.filename]#/etc/resolv.conf# определяет, как резолвер (resolver) FreeBSD получает доступ к Системе Доменных Имён (DNS).
+
+Основные записи [.filename]#resolv.conf#:
+
+[.informaltable]
+[cols="1,1", frame="none"]
+|===
+
+|`nameserver`
+|IP адрес сервера имён. Сервера опрашиваются в порядке описания. Максимальное количество адресов - три.
+
+|`search`
+|Список доменов для поиска с помощью hostname lookup. Обычно определяется доменом, в котором находится компьютер.
+
+|`domain`
+|Домен, в котором находится компьютер.
+|===
+
+Типичный вид [.filename]#resolv.conf#:
+
+[.programlisting]
+....
+search example.com
+nameserver 147.11.1.11
+nameserver 147.11.100.30
+....
+
+[NOTE]
+====
+Опции `search` и `domain` нельзя использовать совместно.
+====
+
+Если вы используете DHCP, man:dhclient[8] обычно перезаписывает [.filename]#resolv.conf# информацией, полученной от серверов DHCP.
+
+==== [.filename]#/etc/hosts#
+
+[.filename]#/etc/hosts# - простая текстовая база данных, напоминающая старый Интернет. Она работает совместно с DNS и NIS, сопоставляя доменные имена IP адресу. Отдельные компьютеры, соединённые с помощью локальной сети, могут быть записаны тут вместо man:named[8] сервера с целью упрощения. Кроме того, [.filename]#/etc/hosts# используется для записи IP адресов и соответствующих им доменов, избавляя от внешнего трафика, используемого для запросов к DNS серверам.
+
+[.programlisting]
+....
+# $FreeBSD$
+#
+# Host Database
+# This file should contain the addresses and aliases
+# for local hosts that share this file.
+# In the presence of the domain name service or NIS, this file may
+# not be consulted at all; see /etc/nsswitch.conf for the resolution order.
+#
+#
+::1 localhost localhost.my.domain myname.my.domain
+127.0.0.1 localhost localhost.my.domain myname.my.domain
+
+#
+# Imaginary network.
+#10.0.0.2 myname.my.domain myname
+#10.0.0.3 myfriend.my.domain myfriend
+#
+# According to RFC 1918, you can use the following IP networks for
+# private nets which will never be connected to the Internet:
+#
+# 10.0.0.0 - 10.255.255.255
+# 172.16.0.0 - 172.31.255.255
+# 192.168.0.0 - 192.168.255.255
+#
+# In case you want to be able to connect to the Internet, you need
+# real official assigned numbers. PLEASE PLEASE PLEASE do not try
+# to invent your own network numbers but instead get one from your
+# network provider (if any) or from the Internet Registry (ftp to
+# rs.internic.net, directory `/templates').
+#
+....
+
+Формат [.filename]#/etc/hosts#:
+
+[.programlisting]
+....
+[IP адрес в Интернете] [имя компьютера] [alias1] [alias2] ...
+....
+
+Например:
+
+[.programlisting]
+....
+10.0.0.1 myRealHostname.example.com myRealHostname foobar1 foobar2
+....
+
+За дополнительной информацией обращайтесь к man:hosts[5].
+
+=== Настройка лог файлов
+
+==== [.filename]#syslog.conf#
+
+[.filename]#syslog.conf# is является файлом конфигурации для man:syslogd[8]. В нём указываются, типы сообщений генерируемые `syslog`, и лог файлы, в которые они записываются.
+
+[.programlisting]
+....
+# $FreeBSD$
+#
+# Spaces ARE valid field separators in this file. However,
+# other *nix-like systems still insist on using tabs as field
+# separators. If you are sharing this file between systems, you
+# may want to use only tabs as field separators here.
+# Consult the syslog.conf(5) manual page.
+*.err;kern.debug;auth.notice;mail.crit /dev/console
+*.notice;kern.debug;lpr.info;mail.crit;news.err /var/log/messages
+security.* /var/log/security
+mail.info /var/log/maillog
+lpr.info /var/log/lpd-errs
+cron.* /var/log/cron
+*.err root
+*.notice;news.err root
+*.alert root
+*.emerg *
+# uncomment this to log all writes to /dev/console to /var/log/console.log
+#console.info /var/log/console.log
+# uncomment this to enable logging of all log messages to /var/log/all.log
+#*.* /var/log/all.log
+# uncomment this to enable logging to a remote log host named loghost
+#*.* @loghost
+# uncomment these if you're running inn
+# news.crit /var/log/news/news.crit
+# news.err /var/log/news/news.err
+# news.notice /var/log/news/news.notice
+!startslip
+*.* /var/log/slip.log
+!ppp
+*.* /var/log/ppp.log
+....
+
+За более полной информацией обратитесь к man:syslog.conf[5].
+
+==== [.filename]#newsyslog.conf#
+
+[.filename]#newsyslog.conf# - конфигурационный файл man:newsyslog[8], программы, обычно контролируемой man:cron[8]. man:newsyslog[8] определяет, когда лог-файлы нуждаются в архивировании и перегруппировке. [.filename]#logfile# перемещается в [.filename]#logfile.0#, [.filename]#logfile.0# перемещается в [.filename]#logfile.1#, и так далее. Другое именование получится при архивировании с помощью man:gzip[1]: [.filename]#logfile.0.gz#, [.filename]#logfile.1.gz#, и т.д.
+
+[.filename]#newsyslog.conf# показывает, какие лог файлы должны быть проинспектированы, сколько их должно быть сохранено, и когда они должны быть пересмотрены. Лог файлы могут быть перегруппированы и/или заархивированы, когда они либо достигнут определённого размера, либо при достижении определённых даты/времени.
+
+[.programlisting]
+....
+# configuration file for newsyslog
+# $FreeBSD$
+#
+# filename [owner:group] mode count size when [ZB] [/pid_file] [sig_num]
+/var/log/cron 600 3 100 * Z
+/var/log/amd.log 644 7 100 * Z
+/var/log/kerberos.log 644 7 100 * Z
+/var/log/lpd-errs 644 7 100 * Z
+/var/log/maillog 644 7 * @T00 Z
+/var/log/sendmail.st 644 10 * 168 B
+/var/log/messages 644 5 100 * Z
+/var/log/all.log 600 7 * @T00 Z
+/var/log/slip.log 600 3 100 * Z
+/var/log/ppp.log 600 3 100 * Z
+/var/log/security 600 10 100 * Z
+/var/log/wtmp 644 3 * @01T05 B
+/var/log/daily.log 640 7 * @T00 Z
+/var/log/weekly.log 640 5 1 $W6D0 Z
+/var/log/monthly.log 640 12 * $M1D0 Z
+/var/log/console.log 640 5 100 * Z
+....
+
+За дополнительной информацией обращайтесь к man:newsyslog[8].
+
+[[configtuning-sysctlconf]]
+=== [.filename]#sysctl.conf#
+
+[.filename]#sysctl.conf# очень похож на [.filename]#rc.conf#. Значения устанавливаются в виде `variable=value`. Указанные значения устанавливаются после перевода системы в многопользовательский режим. Однако не все переменные могут быть установлены в этом режиме.
+
+Пример [.filename]#sysctl.conf#, настроенного для выключения протоколирования фатальных ошибок программ и разрешения Linux-программам определять, что они запускаются под FreeBSD:
+
+[.programlisting]
+....
+kern.logsigexit=0 # Do not log fatal signal exits (e.g. sig 11)
+compat.linux.osname=FreeBSD
+compat.linux.osrelease=4.3-STABLE
+....
+
+[[configtuning-sysctl]]
+== Настройка с помощью sysctl
+
+man:sysctl[8] - это интерфейс, позволяющий вам вносить изменения в работающую систему FreeBSD. Эти изменения касаются многих опций стека TCP/IP и виртуальной памяти; опытный системный администратор может использовать их для существенного увеличения производительности. Более пяти тысяч системных переменных могут быть прочитаны и записаны с помощью man:sysctl[8].
+
+По своей сути, man:sysctl[8] выполняет две функции: чтение и изменение настроек системы.
+
+Для просмотра всех доступных для чтения переменных:
+
+[source,bash]
+....
+% sysctl -a
+....
+
+Чтобы прочитать определённую переменную, например, `kern.maxproc`, введите:
+
+[source,bash]
+....
+% sysctl kern.maxproc
+kern.maxproc: 1044
+....
+
+Для присвоения значения переменной, используйте выражение вида _переменная_=_значение_:
+
+[source,bash]
+....
+# sysctl kern.maxfiles=5000
+kern.maxfiles: 2088 -> 5000
+....
+
+Изменяемые с помощью sysctl переменные обычно принимают значения либо строкового, либо целого, либо булевого типа. Переменные булевого типа могут принимать два значения (`1` (истина) и `0` (ложь)).
+
+Если вы хотите устанавливать некоторые переменные автоматически при каждой загрузке компьютера, добавьте их в файл [.filename]#/etc/sysctl.conf#. За дополнительной информацией обращайтесь к странице справочника man:sysctl.conf[5] и к <<configtuning-sysctlconf>>.
+
+[[sysctl-readonly]]
+=== Переменные man:sysctl[8] только для чтения
+
+В некоторых случаях желательно изменить переменные man:sysctl[8] только для чтения. Иногда другого способа решить проблему нет; при этом, результат может быть достигнут только на этапе начальной загрузки.
+
+Например, на некоторых моделях лэптопов диапазон памяти устройства man:cardbus[4] не определяется и выдается приблизительно такая ошибка:
+
+[source,bash]
+....
+cbb0: Could not map register memory
+device_probe_and_attach: cbb0 attach returned 12
+....
+
+Ситуации, похожие на эту, требуют изменения некоторых значений man:sysctl[8], модификация которых запрещена. Для разрешения этой ситуации пользователь может поместить man:sysctl[8] "OID" в файл [.filename]#/boot/loader.conf#. Значения по умолчанию хранятся в файле [.filename]#/boot/defaults/loader.conf#.
+
+Решение проблемы, приведенной выше, потребует помещения строки `hw.pci.allow_unsupported_io_range=1` в вышеупомянутый файл. Теперь man:cardbus[4] будет работать нормально.
+
+[[configtuning-disk]]
+== Оптимизация дисков
+
+=== Переменные Sysctl
+
+==== `vfs.vmiodirenable`
+
+Значением переменной `vfs.vmiodirenable` может быть установлено в 0 (выключено) или 1 (включено); по умолчанию 1. Эта переменная отвечает за метод кэширования каталогов. Размер большинства каталогов невелик. Они могут поместиться в одном фрагменте (обычно 1K), и могут занимать ещё меньше места (обычно 512 байт) в кэше буфера. При отключении этой переменной (при установке значения 0) буфер прокэширует только заданное число каталогов даже если у вас много памяти. При включении (при установке значения 1) эта переменная sysctl позволит использовать страничное кэширование VM, делая доступным для кэширования каталогов весь объём памяти. Однако, минимальный объём памяти, используемой для кэширования каталогов стал равен объёму страницы (обычно 4 K) вместо 512 байт. Мы рекомендуем оставлять эту опцию включенной, если ваш компьютер исполняет программы, манипулирующие значительным количеством файлов. Примером таких программ могут быть кэширующие прокси-серверы, большие почтовые серверы и серверы новостей. Обычно включение этой опции не понижает производительности, однако лучше поэкспериментировать, чтобы узнать оптимальное значение для вашей машины.
+
+==== `vfs.write_behind`
+
+Переменная sysctl `vfs.write_behind` по умолчанию установлена в `1` (включено). Она указывает системе выполнять запись на носитель по кластерам, что обычно делается для больших файлов. Идея в том, чтобы избежать заполнения кэша неполными буферами, когда это не увеличивает производительность. Однако, это может заблокировать процессы и в некоторых случаях вам может понадобиться отключить этот параметр.
+
+==== `vfs.hirunningspace`
+
+Переменная sysctl `vfs.hirunningspace` определяет число запросов записи на диск, которые могут быть поставлены в очередь. Значение по умолчанию обычно подходит, но на компьютерах с большим количеством дисков вы можете увеличить его до четырех или пяти _мегабайт_. Учтите, что установка слишком большого значения (превышающего размер буфера записи) может привести к очень значительному падению общей производительности. Не делайте это значение произвольно большим! Большие значения могут привести к задержкам чтения, выполняемого в то же время
+
+Есть много других переменных sysctl, относящихся к кэшированию в буфер и страничному кэшированию VM. Мы не рекомендуем изменять эти значения, поскольку система VM делает отличную работу по автоматической самонастройке.
+
+==== `vm.swap_idle_enabled`
+
+Переменная sysctl `vm.swap_idle_enabled` полезна в больших многопользовательских системах, где есть много пользователей, входящих и выходящих из системы, и множество ожидающих процессов. Такие системы обычно генерируют большое количество запросов на выделение памяти. Включение этой переменной и настройка задержки выгрузки (swapout hysteresis, в секундах) установкой переменных `vm.swap_idle_threshold1` и `vm.swap_idle_threshold2` позволит освобождать страницы памяти, занятые ожидающими процессами, более быстро, чем при нормальном алгоритме выгрузки. Это помогает даемону выгрузки страниц. Не включайте этот параметр, пока он на самом деле вам не понадобится, поскольку его действие в сущности заключается в более ранней выгрузке страниц из памяти; это повышает нагрузку на подкачку и диск. В малых системах эффект от включения этого параметра предсказуем, но в больших системах нагруженной на подкачкой этот параметр позволяет системе VM проще загружать и выгружать процессы из памяти.
+
+==== `hw.ata.wc`
+
+Во FreeBSD 4.3 кэширование записи на IDE диски было отключено. Это понижало производительность IDE дисков в тестах, но было необходимо для лучшей сохранности данных. Проблема состоит в том, что IDE диски неправильно указывают время завершения записи на диск. При включенном кэшировании IDE диски могут не только записать данные в неправильном порядке - при большой нагрузке на диск некоторые блоки могут задержаться до бесконечности. Сбой, или отключение питания могут могут стать причиной серьёзных повреждений в файловой системе. Поэтому для безопасности системы значение по умолчанию этого параметра было изменено. К сожалению, результатом этого стало столь значительная потеря производительности, что после выхода релиза значение этого параметра было возвращено в первоначальное состояние. Вам следует проверить значение переменной sysctl `hw.ata.wc` на вашей машине. Если кэширование выключено - вы можете включить его, установив значение переменной ядра, равное 1. Это должно быть сделано при помощи загрузчика при загрузке. Если вы сделаете это позже - изменения не будут иметь силы.
+
+За более подробной информацией обращайтесь к man:ata[4].
+
+==== `SCSI_DELAY` (`kern.cam.scsi_delay`)
+
+Параметр настройки ядра `SCSI_DELAY` может использоваться для уменьшения времени загрузки системы. Значение по умолчанию велико и может составлять более `15` секунд в процессе загрузки. Уменьшение его до `5` секунд обычно работает (особенно с современными дисками). В новых версиях FreeBSD (5.0 и выше) должен использоваться параметр `kern.cam.scsi_delay`, настраиваемый во время загрузки. Этот параметр и параметр настройки ядра принимают значения в _миллисекундах_, а _не_ в _секундах_.
+
+[[soft-updates]]
+=== Soft Updates
+
+Программа man:tunefs[8] используется для настройки файловой системы. Эта программа может принимать большое количество параметров, но мы рассмотрим лишь один из них - включение и выключение Soft Updates, что может быть достигнуто следующим образом:
+
+[source,bash]
+....
+# tunefs -n enable /filesystem
+# tunefs -n disable /filesystem
+....
+
+Нельзя изменять файловую систему с помощью man:tunefs[8] когда она смонтирована. Самое подходящее время для включения "Soft Updates" - перед монтированием разделов, в однопользовательском режиме.
+
+Soft Updates существенно увеличивают скорость создания и удаления файлов путём использования кэширования. Мы рекомендуем использовать Soft Updates на всех ваших файловых системах. Однако у Soft Updates есть и обратные стороны: во-первых, Soft Updates гарантирует целостность файловой системы в случае сбоя, но может наблюдаться задержка в несколько секунд (или даже минуту!) перед записью на жесткий диск. Если система зависнет - вы можете потерять больше, чем, если бы вы не включили Soft Updates. Во-вторых, Soft Updates задерживает освобождение блоков файловой системы. Если ваша файловая система заполнена, выполнение значительного обновления, например, `make installworld`, может вызвать переполнение.
+
+==== Дополнительная информация о Soft Updates
+
+Есть два традиционных способа записи метаданных файловых систем на диск (пример метаданных: индексные дескрипторы и каталоги).
+
+Исторически, поведение по умолчанию заключается в синхронном обновлении метаданных. Если каталог был изменен, система ждет, пока изменение не будет физически записано на диск. Содержимое файлов проходит через кэш и записывается на диск асинхронно. Преимущество этого способа в его надежности. При сбое во время обновления метаданные остаются в нормальном состоянии. Файл либо создается целиком, либо вообще не создается. Если блоки данных не были записаны в файл из буфера во время сбоя, man:fsck[8] сможет определить это и восстановить файловую систему, установив длину файла в 0. Кроме того, реализация этого способа проста и понятна. Недостаток в том, что обновление метаданных занимает много времени. Команда `rm -r`, например, последовательно удаляет все файлы в каталоге, и каждое изменение в каталоге (удаление файла) будет синхронно записано на диск. Сюда включаются обновления самого каталога, таблицы индексных дескрипторов, и возможно блоков, занятых файлом. Те же соглашения работают при распаковке больших иерархий (`tar -x`).
+
+Другой вариант это асинхронное обновление метаданных. Это поведение по умолчанию для Linux/ext2fs и *BSD ufs с параметром `mount -o async`. Все обновления метаданных просто пропускаются через кэш буфера, как и содержимое файлов. Преимущество этой реализации в том, что нет необходимости ждать каждый раз, пока метаданные будут записаны на диск, поэтому все операции с большим объемом обновления метаданных будут происходить гораздо быстрее, чем при синхронном обновлении. Кроме того, реализация все еще проста и понятна, поэтому риск появления ошибок в коде невелик. Недостаток в том, что нет никаких гарантий исправности файловой системы. Если во время обновления большого объема метаданных произойдет сбой (например, отключение питания, или нажатие кнопки reset), файловая система останется в непредсказуемом состоянии. Нет возможности определить состояние файловой системы после такого сбоя; блоки данных файла могут быть уже записаны на диск, а обновления таблицы индексных дескрипторов нет. Невозможно реализовать `fsck`, которая могла бы исправить получившийся хаос (поскольку необходимой информации нет на диске). Если файловая система была уничтожена во время восстановления, единственный способ восстановления - запустить man:newfs[8] и воспользоваться резервной копией.
+
+Обычное решение этой проблемы состояло в реализации _протоколировании проблемной области (dirty region logging)_, известном как _журналирование_, хотя этот термин использовался неправильно и порой также применялся к другим формам протоколирования транзакций. Обновление метаданных как и прежде происходит синхронно, но в отдельную область диска. Позже они перемещаются туда, где должны быть. Поскольку область протоколирования это небольшая, последовательная область диска, головкам жесткого диска не приходится перемещаться на большие расстояния даже во время значительных обновлений, поэтому такой способ быстрее, чем синхронные обновления. Кроме того, сложность реализации довольно ограничена, поэтому риск внесения ошибок невелик. Недостаток в том, что все обновления метаданных записываются дважды (один раз в область протоколирования и один раз окончательно), поэтому при обычной работе производительность может понизиться. С другой стороны, в случае сбоя все незаконченные действия с метаданными могут быть быстро отменены, или завершены после загрузки системы, поэтому система после сбоя загружается быстрее.
+
+Kirk McKusick, разработчик Berkeley FFS, решил эту проблему с помощью Soft Updates: все незавершенные обновления метаданных находятся в памяти и записываются на диск в упорядоченном виде ("упорядоченное обновления метаданных"). При значительных обновлениях метаданных более поздние обновления "присоединяются" к предыдущим, если они все еще находятся в памяти и еще не записаны на диск. Поэтому все операции, скажем, над каталогом, обычно выполняются в памяти перед записью обновления на диск (блоки данных сортируются в соответствии с их положением, так что они не будут записаны на диск до метаданных. При крахе операционной системы выполняется "откат": считается, что все операции, не записанные на диск, никогда не происходили. Файловая система находится в том состоянии, в котором она была за 30-60 секунд до сбоя. Используемый алгоритм гарантирует, что все используемые ресурсы маркированы соответствующим образом в своих областях: блоки и индексные дескрипторы. После сбоя могут остаться только ошибки выделения ресурсов, они помечаются как "используемые", хотя на самом деле "свободны". man:fsck[8] разбирается в ситуации и освобождает более не используемые ресурсы. После сбоя система может быть безопасно смонтирована с опцией `mount -f`. Для освобождения ресурсов, которые могут не использоваться, в дальнейшем потребуется запустить man:fsck[8]. Эта идея лежит в основе _background (фоновая) fsck_: во время запуска системы записывается только _снимок_ файловой системы. Все системы могут быть смонтированы в "грязном" состоянии, и система загружается в многопользовательский режим. Затем, фоновые `fsck` ставятся в очередь для всех систем, где это требуется, чтобы освободить неиспользуемые ресурсы. (Файловые системы, где не используются Soft Updates, все еще требуют запуска `fsck` в обычном режиме).
+
+Преимущество этого способа в том, что обновления метаданных происходят почти так же быстро, как при асинхронных обновлениях (т.е. быстрее, чем при _журналировании_, когда метаданные записываются дважды). Недостаток в сложности кода (подразумевающим больший риск появления ошибок в области, где вероятность потери данных пользователя особенно высока) и в более высоких требованиях к объему памяти. К тому же могут возникнуть некоторые странные на первый взгляд ситуации. После сбоя состояние файловой системы несколько более "старое". В ситуации, когда стандартный способ синхронизации оставит несколько файлов нулевой длины после выполнения `fsck`, в файловой системе с Soft Updates их не останется вовсе, поскольку ни метаданные, ни содержимое файлов не были записаны на диск. Дисковое пространство не будет освобождено пока обновления не будут записаны на диск, что может занять некоторое время после выполнения `rm`. Это может повлечь проблемы при установке большого количества файлов на файловую систему, где не хватает места для помещения всех файлов дважды.
+
+[[configtuning-kernel-limits]]
+== Изменение ограничений, накладываемых ядром
+
+[[file-process-limits]]
+=== Ограничения на Файлы/Процессы
+
+[[kern-maxfiles]]
+==== `kern.maxfiles`
+
+Значение `kern.maxfiles` может быть увеличено или уменьшено в зависимости от потребностей вашей системы. Эта переменная определяет максимальное число дескрипторов файлов. Когда таблица дескрипторов файлов полна, в очереди системных сообщений появится сообщение `file: table is full`. Это сообщение может быть прочитано с помощью команды `dmesg`.
+
+Каждый открытый файл, сокет или буфер использует дескриптор файла. Широкомасштабному серверу может понадобиться много тысяч дескрипторов файлов, в зависимости от количества программ, одновременно выполняемых на сервере.
+
+Стандартное значение `kern.maxfile` определяется переменной `maxusers` в вашем файле конфигурации ядра. Значение `kern.maxfiles` увеличивается пропорционально значению `maxusers`. При компилировании ядра, нужно установить эту переменную согласно потребностям вашей системы. Исходя из значения этой переменной, ядро устанавливает значения большинства предопределённых переменных. Даже если предполагается, что к компьютеру не будут одновременно подсоединяться 256 пользователей, требуемые ресурсы могут быть такими же, как у крупномасштабного сервера.
+
+Система автоматически настроит `maxusers`, если вы явно установите его в `0`. Если вы желаете выставить значение самостоятельно, то задайте `maxusers` по меньшей мере равным 4, особенно если вы используйте X Window System или компилируйте программное обеспечение. Причина в том, что самая значимая таблица, устанавливаемая `maxusers` - это максимальное количество процессов, которая устанавливается равным `20 + 16 * maxusers`, и поэтому, если вы установите `maxusers` в 1, то вы сможете иметь только 36 одновременных процессов, включая 18 или около того, что система запустит во время загрузки и 15 или около того, что вы создадите при запуске X Window System. Даже простая задача, как чтение страницы справочника породит 9 процессов для фильтрации, декомпрессии и её просмотра. Установка `maxusers` в 64 позволит иметь вам до 1044 одновременных процессов, чего должно быть достаточно примерно для всех использований. Если, тем не менее, вы увидите пугающую ошибку при попытке запуска другой программы, или вы используйте сервер с большим количеством одновременных пользователей (как `ftp.FreeBSD.org`), то вы всегда можете увеличить значение и пересобрать систему.
+
+[NOTE]
+====
+`maxusers` _не_ ограничивает количество пользователей, которые могут заходить на вашу машину. Оно просто устанавливает различные размеры таблиц в разумные значения, учитывая максимальное количество пользователей, вы вероятно будете иметь на вашей системе и как много процессов каждый из них сможет запускать. Ключевое слово, которое ограничивает количество одновременных удаленных входов и терминальных X окон - это crossref:kernelconfig[kernelconfig-ptys,`pseudo-device pty 16`]. С FreeBSD 5.X вам не надо беспокоиться об этом значении, так как man:pty[4] драйвер является "автоматически клонирующим"; вы просто используйте `device pty` в вашем конфигурационном файле.
+====
+
+==== `kern.ipc.somaxconn`
+
+Переменная sysctl `kern.ipc.somaxconn` ограничивает размер очереди для приема новых TCP соединений. Значение по умолчанию `128` слишком мало для надежной обработки новых соединений для нагруженного web сервера. Для такого сервера рекомендуется увеличить это значение до `1024` или выше. Даемон сервиса может сам ограничивать очередь приема новых соединений (например, man:sendmail[8], или Apache), но обычно в файле настройки даемона есть директива для настройки длины очереди. Более длинная очередь также помогает избежать атак Denial of Service ().
+
+[[nmbclusters]]
+=== Сетевые Ограничения
+
+Опция ядра `NMBCLUSTERS` обуславливает количество Mbuf, доступных на машине. На сервере с большим трафиком и маленьким Mbuf производительность будет пониженной. Каждый кластер представлен двумя килобайтами памяти, поэтому значение 1024 означает 2 мегабайта памяти ядра, зарезервированной для сетевых буферов. Для определения оптимального значения необходимо провести простые вычисления. Если у вас веб сервер, который может обслуживать 1000 одновременных соединений, и каждое соединение "съедает" 16 K буфера приема и 16 K буфера отправки, вам потребуется 32 MB памяти под буферы. Хорошее правило - умножение этого значения на 2, 2x32 MB / 2 KB = 64 MB / 2 kB = 32768. Мы рекомендуем значения между 4096 и 32768 для машин с большим объемом памяти. Не указывайте произвольно большое значение параметра, это может привести к падению системы при загрузке. Используйте man:netstat[1] с опцией `-m` для определения количества используемых сетевых кластеров.
+
+Для настройки в процессе загрузки используйте в loader переменную `kern.ipc.nmbclusters`. Только в старых версиях FreeBSD потребуется пересобрать ядро (man:config[8]) с измененным параметром `NMBCLUSTERS`.
+
+Для нагруженных серверов, интенсивно использующих системный вызов man:sendfile[2], может потребоваться увеличения буферов man:sendfile[2] с помощью параметра конфигурации ядра `NSFBUFS`, или изменения значения путем установки переменной в [.filename]#/boot/loader.conf# (обратитесь к man:loader[8] за подробностями). Общий признак того, что параметр требуется изменить - состояние процессов `sfbufa`. Переменная sysctl `kern.ipc.nsfbufs` установлена только для чтения. Этот параметр увеличивается вместе с `kern.maxusers`, хотя может потребоваться увеличить его отдельно.
+
+[IMPORTANT]
+====
+Даже если сокет помечен как неблокирующий, вызов man:sendfile[2] на неблокирующем сокете может вызвать блокирование man:sendfile[2], пока не станет доступным достаточное количество `struct sf_buf`.
+====
+
+==== `net.inet.ip.portrange.*`
+
+Переменные sysctl `net.inet.ip.portrange.*` контролируют диапазоны номеров портов, автоматически привязываемых к TCP и UDP сокетам. Есть три диапазона: нижний диапазон, диапазон по умолчанию и верхний диапазон. Большинство сетевых программ используют диапазон по умолчанию, контролируемый `net.inet.ip.portrange.first` и `net.inet.ip.portrange.last`, установленными соответственно в 1024 и 5000. Диапазоны портов привязки используются для исходящих соединений и при некоторых условиях портов может не хватить. Это чаще всего происходит на сильно загруженном прокси сервере. Диапазон портов не становится проблемой при работе серверов, которые обрабатывают в основном входящие соединения, или с небольшим количеством исходящих соединений, например mail relay. Для ситуаций, когда возможен недостаток портов, рекомендуется немного увеличить `net.inet.ip.portrange.last`. Может подойти значение `10000`, `20000`, или `30000`. Учтите также возможное влияние брандмауэра при изменении диапазона портов. Некоторые могут блокировать большие диапазоны портов (обычно с небольшими номерами) и вынуждают использовать более высокие диапазоны для исходящих соединений. По этой причине не рекомендуется уменьшать значение `net.inet.ip.portrange.first`.
+
+==== TCP Bandwidth Delay Product
+
+TCP Bandwidth Delay Product Limiting похоже на TCP/Vegas в NetBSD. Оно может быть включено установкой переменной sysctl `net.inet.tcp.inflight.enable` в `1`. Система попытается вычислить задержку пакетов для каждого соединения и ограничить объем данных в очереди сети до значения, требуемого для поддержания оптимальной пропускной способности.
+
+Эта возможность полезна при передаче данных через модемы, Gigabit Ethernet, или даже через высокоскоростные WAN соединения (или любые другие соединения с большой задержкой передачи), особенно если вы также используете изменение размера окна или настроили большое окно передачи. Если вы включили этот параметр, убедитесь также, что переменная `net.inet.tcp.inflight.debug` установлена в `0` (отладка выключена), а для использования в реальных задачах может понадобиться установка переменной `net.inet.tcp.inflight.min` к значению как минимум `6144`. Но учтите, что установка большого значения этой переменной может фактически отключить ограничение в зависимости от вида соединения. Ограничение уменьшает количество данных на определенном маршруте и управляет очередью пакетов, как и уменьшает общее количество данных в очереди локального интерфейса хоста. С меньшим количеством пакетов в очереди двусторонние интерактивные соединения, особенно на медленных линиях, могут проходить быстрее. Но имейте ввиду, что эта функция работает только при передаче данных (передача данных / сторона сервера). Она не работает при получении данных (загрузке).
+
+Изменение значения переменной `net.inet.tcp.inflight.stab` _не_ рекомендуется. Этот параметр по умолчанию равен 20, что означает добавление 2 пакетов к вычислению задержки передачи. Дополнительное окно требуется для стабилизации алгоритма и улучшения ответной реакции на изменение условий, но также приводит к большему времени ping на медленных соединениях (задержка все же гораздо меньше, чем без алгоритма inflight). Вы можете попробовать уменьшить этот параметр до 15, 10 или 5; а также уменьшить `net.inet.tcp.inflight.min` (например, до 3500) для получения желаемого эффекта. Уменьшение значений этих параметров может использоваться только как крайняя мера.
+
+=== Виртуальная память
+
+==== `kern.maxvnodes`
+
+Файлы и каталоги в ядре представлены при помощи vnode (виртуальных узлов). Увеличение их числа может помочь уменьшить нагрузку на дисковую подсистему. Как правило, специальной настройки это значение не требует, однако, в некоторых случаях дисковая активность является узким местом, и система исчерпывает таблицу vnode, значение этой переменной следует увеличить. При этом необходимо оценить объем неактивной и свободной памяти.
+
+Текущее количество использованных vnode можно посмотреть при помощи команды:
+
+[.programlisting]
+....
+# sysctl vfs.numvnodes
+vfs.numvnodes: 91349
+....
+
+Максимальное количество vnode, доступных системе:
+
+[.programlisting]
+....
+# sysctl kern.maxvnodes
+kern.maxvnodes: 100000
+....
+
+Если количество использованных vnode близко к максимуму, значение переменной `kern.maxvnodes` следует увеличить на 1000. Следите за динамикой изменения `vfs.numvnodes`. Если оно увеличивается, приближаясь к вновь установленному максимуму, процесс следует повторить. Изменение в распределении памяти должно быть видно в выводе утилиты man:top[1]: больше памяти перейдет в разряд активной.
+
+[[adding-swap-space]]
+== Увеличение объема подкачки
+
+Вне зависимости от того, что вы планировали, иногда система ведет себя неожиданно. Если вам потребовался дополнительный объем подкачки, его довольно просто добавить. Есть три способа увеличения объема подкачки: добавить новый жесткий диск, включить подкачку по NFS, или создать файл подкачки на существующем разделе.
+
+За информацией о криптовании раздела подкачки обращайтесь к crossref:disks[swap-encrypting,Шифрование области подкачки] данного Руководства.
+
+[[new-drive-swap]]
+=== Подкачка на новом жестком диске
+
+Лучший способ добавить подкачку, конечно, использовать еще один жесткий диск. Вы можете сделать это в любой момент. Если такой способ подходит, прочтите еще раз информацию по пространству подкачки в <<configtuning-initial>> Руководства, где рассказывается о наилучшем способе организации раздела подкачки.
+
+[[nfs-swap]]
+=== Подкачка через NFS
+
+Подкачка через NFS рекомендуется только в том случае, если в системе отсутствует жесткий диск; подкачка через NFS ограничена скоростью сетевого подключения и к тому же дополнительно нагружает NFS сервер.
+
+[[create-swapfile]]
+=== Файлы подкачки
+
+Вы можете создать файл определенного размера и использовать его как файл подкачки. В нашем примере будет использован файл [.filename]#/usr/swap0# размером 64MB. Конечно, вы можете использовать любое имя.
+
+.Создание файла подкачки в FreeBSD
+[example]
+====
+. Убедитесь, что в файле настройки ядра присутствует драйвер виртуального диска (man:md[4]). Он есть в ядре [.filename]#GENERIC#.
++
+[.programlisting]
+....
+device md # Memory "disks"
+....
+
+. Создайте файл подкачки ([.filename]#/usr/swap0#):
++
+[source,bash]
+....
+# dd if=/dev/zero of=/usr/swap0 bs=1024k count=64
+....
+
+. Установите подходящие права на ([.filename]#/usr/swap0#):
++
+[source,bash]
+....
+# chmod 0600 /usr/swap0
+....
+
+. Включите файл подкачки в [.filename]#/etc/rc.conf#:
++
+[.programlisting]
+....
+swapfile="/usr/swap0" # Set to name of swapfile if aux swapfile desired.
+....
+
+. Перегрузите компьютер или для включения подкачки прямо сейчас введите:
++
+[source,bash]
+....
+# mdconfig -a -t vnode -f /usr/swap0 -u 0 swapon /dev/md0
+....
+
+====
+
+[[acpi-overview]]
+== Управление питанием и ресурсами
+
+Очень важно использовать аппаратные ресурсы эффективно. До того, как появился ACPI, управление потреблением питания и температурными характеристиками системы было очень сложной для операционной системы задачей. Аппаратное обеспечение контролировалось одним из видов встроенного интерфейса BIOS, таким как: _Plug and Play BIOS (PNPBIOS)_, _Advanced Power Management (APM)_ и так далее. Управление питанием и ресурсами это один из ключевых компонентов современной операционной системы. Например, вам может потребоваться, чтобы операционная система следила за температурными ограничениями и возможно, предупреждала при неожиданном росте температуры.
+
+В этом разделе Руководства FreeBSD, мы предоставим исчерпывающую информацию о ACPI. В конце раздела есть ссылки для дальнейшего чтения.
+
+[[acpi-intro]]
+=== Что такое ACPI?
+
+Advanced Configuration and Power Interface (ACPI) это стандарт, написанный объединением поставщиков в целях предоставления стандартного интерфейса для аппаратных ресурсов и управления питанием (отсюда и название). Это ключевой элемент _Operating System-directed configuration and Power Management_, т.е.: он предоставляет операционной системе (OS) больше контроля и более универсален. Современные системы вышли за пределы ограничений существующих Plug and Play интерфейсов до появления ACPI. ACPI это прямой наследник APM (Advanced Power Management).
+
+[[acpi-old-spec]]
+=== Недостатки Advanced Power Management (APM)
+
+Средства _Advanced Power Management (APM)_ управляют энергопотреблением системы в зависимости от нагрузки. APM BIOS предоставляется поставщиком системы и специфичен для данной аппаратной платформы. Драйвер APM в OS обеспечивает доступ к _APM Software Interface_, который позволяет управлять уровнями потребления питания.
+
+В APM имеется четыре основных проблемы. Во-первых, управление энергопотреблением осуществляется через зависимый от поставщика BIOS, и OS ничего не знает нем. Один пример: когда пользователь устанавливает время ожидания для жесткого диска в APM BIOS, и это время истекает, BIOS останавливает жесткий диск без согласования с OS. Во-вторых, алгоритм APM встроен в BIOS, и все действия происходят вне контроля OS. Это означает, что пользователи могут решить проблемы с APM BIOS только путем перепрошивки его ROM; это очень опасная процедура, и если она завершится неудачно, система может оказаться в невосстановимом состоянии. В-третьих, реализация технологии APM зависит от поставщика, что означает дублирование усилий и если в BIOS одного из поставщиков будет найдена и исправлена ошибка, ее могли не исправить другие поставщики. Наконец, объем APM BIOS недостаточно велик для реализации сложной политики управления питанием, или такой политики, которая может хорошо адаптироваться к потребностям компьютера.
+
+_Plug and Play BIOS (PNPBIOS)_ был неудобен во многих ситуациях. PNPBIOS это 16-битная технология, поэтому OS требовалось использовать 16-битную эмуляцию для "взаимодействия" с методами PNPBIOS.
+
+FreeBSD драйвер APM документирован в странице справочника man:apm[4].
+
+[[acpi-config]]
+=== Настройка ACPI
+
+man:loader[8] загружает драйвер [.filename]#acpi.ko# по умолчанию, его _не_ надо встраивать в ядро. Причина в том, что с модулями проще работать, например переключиться на другой [.filename]#acpi.ko# без пересборки ядра. Преимущество в упрощении тестирования. Другая причина в том, что запуск ACPI после старта системы не очень полезен и при некоторых условиях может приводить к краху. Если вы сомневаетесь, отключите ACPI совсем. Драйвер не должен и не может быть выгружен, поскольку системная шина используется для различных взаимодействий оборудования. ACPI может быть выключен с помощью утилиты man:acpiconf[8]. Фактически большинство взаимодействий с ACPI может быть выполнено через man:acpiconf[8]. В основном это означает, что если в выводе man:dmesg[8] есть что-то об ACPI, он скорее всего работает.
+
+[NOTE]
+====
+ACPI и APM не могут сосуществовать и должны использоваться раздельно. Каждый из них прервет загрузку, если обнаружит загруженный драйвер другого.
+====
+
+В простейшей форме, ACPI может использоваться для перевода системы в спящий режим с помощью man:acpiconf[8], с флагом `-s` и параметром `1-5`. Большинству пользователей нужен только параметр `1`. Параметр `5` сделает "мягкое" завершение работы, так же как и:
+
+[source,bash]
+....
+# halt -p
+....
+
+Доступны и другие параметры. Обратитесь к странице справочника man:acpiconf[8] за дополнительной информацией.
+
+[[ACPI-debug]]
+== Использование и отладка FreeBSD ACPI
+
+ACPI это фундаментально новый способ обнаружения устройств, управления энергопотреблением и предоставления стандартизированного доступа к различному оборудованию, ранее управлявшемуся BIOS. Был достигнут определенный прогресс в приспособлении ACPI к работе со всеми системами, но все еще встречаются ошибки в байткоде _ACPI Machine Language_ (AML) некоторых материнских плат, незавершенные участки кода в подсистемах ядра FreeBSD и ошибки в интерпретаторе Intel(R) ACPI-CA.
+
+Этот раздел предназначен для того, чтобы упростить ваше содействие разработчикам FreeBSD ACPI в определении причин наблюдаемых вами проблем, выполнении отладки и выработке решения. Спасибо за помощь и надеемся, что мы сможем помочь в решении проблем вашей системы.
+
+[[ACPI-submitdebug]]
+=== Отправка отладочной информации
+
+[NOTE]
+====
+Перед отправкой сообщения об ошибке убедитесь, что у вас последняя версия BIOS, и, если доступна, последняя версия firmware встроенного контроллера.
+====
+
+Те из вас, кто желает составить сообщение о проблеме прямо сейчас, могут воспользоваться адресом link:mailto:freebsd-acpi@FreeBSD.org[ freebsd-acpi@FreeBSD.org], отправив на него следующую информацию:
+
+* Описание неправильного поведения, включая тип системы, модель и все, что приводит к появлению ошибки. Кроме того, сообщите настолько точно, насколько возможно, когда появилась ошибка, если ранее вы ее не видели.
+* Вывод man:dmesg[8] после "boot ``-v``", включая все сообщения, появившиеся при изучении ошибки.
+* Вывод man:dmesg[8] после "boot ``-v``" с выключенным ACPI, если его отключение помогает решить проблему.
+* Вывод `sysctl hw.acpi`. Это также хороший способ получения списка возможностей системы.
+* URL где можно найти ваш _ACPI Source Language_ (ASL). _Не_ отправляйте ASL непосредственно в список рассылки, поскольку он может быть очень большим. Копия ASL может быть создана командой:
++
+[source,bash]
+....
+# acpidump -t -d name-system.asl
+....
++
+(Замените вашим логином [.filename]#name# и производителем/моделью [.filename]#system#. Пример: [.filename]#njl-FooCo6000.asl#)
+
+Большинство разработчиков читают {freebsd-current}, но для уверенности, что проблему увидят, отправьте ее в {freebsd-acpi}. Будьте терпеливы, все мы заняты полный рабочий день где-то еще. Если ваше сообщение не заметили сразу, мы возможно попросим вас отправить PR (сообщение о проблеме) через man:send-pr[1]. При вводе PR, включайте ту же информацию, что запрошена выше. Это поможет нам отследить проблему и решить ее. Не отправляйте PR без предварительной отправки письма в {freebsd-acpi}, поскольку мы используем PR в качестве напоминаний о существующих проблемах, а не как механизм сообщений об ошибках. Вероятно, о вашей проблеме кто-то уже сообщал ранее.
+
+[[ACPI-background]]
+=== Общие сведения
+
+ACPI представлен во всех современных компьютерах, соответствующих архитектурам ia32 (x86), ia64 (Itanium) и amd64 (AMD). Полный стандарт включает множество возможностей, в том числе управление производительностью CPU, уровнем питания, температурой, различными системами аккумуляторов, встроенными контроллерами и опросом шины. В большинстве систем стандарт реализован не полностью. Например, настольные системы обычно реализуют только опрос шины, а портативные компьютеры кроме того могут поддерживать управление охлаждением и энергопотреблением. Они также поддерживают приостановку и последующий запуск системы различного уровня сложности.
+
+ACPI-совместимые системы состоят из различных компонентов. Производители BIOS и чипсетов предоставляют различные жестко заданные таблицы, (например, FADT), которые определяют функции вроде карты APIC (используется для SMP), регистры настройки и простые значения параметров. Кроме того, предоставляется таблица байткода (_Differentiated System Description Table_, DSDT), определяющая древоподобное пространство имен устройств и методов.
+
+Драйвер ACPI должен прочесть заданные таблицы, реализовать интерпретатор для байткода, модифицировать драйвера устройств и ядро для приема информации от подсистемы ACPI. Для FreeBSD Intel(R) предоставила интерпретатор (ACPI-CA), тот же что для Linux и NetBSD. Исходный код ACPI-CA находится в каталоге [.filename]#src/sys/contrib/dev/acpica#. Код для приспособления ACPI-CA к работе в FreeBSD, находится в [.filename]#src/sys/dev/acpica/Osd#. Наконец, драйвера, реализующие различные ACPI устройства, находятся в [.filename]#src/sys/dev/acpica#.
+
+[[ACPI-comprob]]
+=== Часто встречающиеся проблемы
+
+Для правильной работы ACPI все ее части должны работать правильно. Вот некоторые часто встречающиеся проблемы, в порядке частоты появления, и некоторые обходные пути или исправления.
+
+==== Проблемы с мышью
+
+В некоторых случаях при возобновлении работы после приостановки перестает работать мышь. Известным решением проблемы является добавление строки `hint.psm.0.flags="0x3000"` в файл [.filename]#/boot/loader.conf#. Если это не помогло, стоит сообщить о проблеме, как описано выше.
+
+==== Приостановка/возобновление работы
+
+ACPI поддерживает три состояния приостановки в RAM (STR), `S1`-`S3`, и одно состояние приостановки на диск (`STD`), называемое `S4`. `S5` это "мягкое выключение" и это нормальное состояние системы, когда она подключена к сети, но не включена. `S4` может быть реализован двумя различными путями. ``S4``BIOS это BIOS-поддерживаемая приостановка на диск. ``S4``OS реализуется полностью операционной системой.
+
+Начните с проверки переменных `sysctl hw.acpi`, относящихся к приостановке (suspend). Вот результат для Thinkpad:
+
+[source,bash]
+....
+hw.acpi.supported_sleep_state: S3 S4 S5
+hw.acpi.s4bios: 0
+....
+
+Это означает, что мы можем использовать `acpiconf -s` для тестирования `S3`, ``S4``OS, и `S5`. Если `s4bios` был единицей (`1`), это означает поддержку ``S4``BIOS вместо ``S4``OS.
+
+При тестировании приостановки/возобновления работы, начните с `S1`, если этот режим поддерживается. Это состояние скорее всего поддерживается, поскольку не требует слишком серьезной поддержки со стороны драйвера. Никто не реализовал `S2`, который похож на `S1`. Следующий режим для тестирования это `S3`. Это наиболее глубокое STR состояние, оно требует существенной поддержки со стороны драйвера, чтобы правильно реинициализировать оборудование. Если у вас возникли проблемы при выходе из этого состояния, отправьте письмо в рассылку {freebsd-acpi}, но не ждите, что проблема будет обязательно решена, поскольку существует множество драйверов/оборудования, нуждающихся в дальнейшем тестировании и разработке.
+
+Для изоляции проблемы удалите из ядра столько драйверов, сколько возможно. Если это работает, вы можете выяснить, какой драйвер вызывает проблему путем загрузки драйверов до тех пор, пока опять не произойдет сбой. Обычно бинарные драйвера, такие как [.filename]#nvidia.ko#, драйвера дисплея X11 и USB вызывают большинство проблем, а драйвера Ethernet интерфейсов как правило работают отлично. Если вы можете нормально загрузить/выгрузить драйвера, автоматизируйте этот процесс, поместив соответствующие команды в [.filename]#/etc/rc.suspend# и [.filename]#/etc/rc.resume#. Это закомментированные примеры выгрузки и загрузки драйверов. Попробуйте установить параметр `hw.acpi.reset_video` в нуль (`0`), если ваш дисплей не включается после возобновления работы. Попробуйте установить большие или меньшие значения для `hw.acpi.sleep_delay`, чтобы проверить, поможет ли это.
+
+Другой способ, который можно попробовать, это запуск последнего дистрибутива Linux с поддержкой ACPI и тестирование поддержки остановки/возобновления работы на том же оборудовании. Если она работает на Linux, проблема скорее всего в драйверах FreeBSD и поиск драйвера, вызывающего проблему, поможет разрешить ситуацию. Имейте ввиду, что разработчики ACPI обычно не поддерживают другие драйверы (звук, ATA, и т.п.), так что все результаты работы по поиску проблемы возможно необходимо отправить в список рассылки {freebsd-current} и человеку, поддерживающему драйвер. Если вы решитесь заняться отладкой, поместите соответствующий код (man:printf[3]) в вызывающий проблему драйвер для обнаружения места, где прерывается функция восстановления.
+
+Наконец, попробуйте отключить ACPI и включить APM. Если приостановка/возобновление работает с APM, вам возможно лучше подойдет APM, особенно на старом оборудовании (до 2000). Включение корректной поддержки ACPI поставщиками оборудования требует времени и вероятно в старом оборудовании поддержка ACPI в BIOS была некорректна.
+
+==== Система останавливается (временно или постоянно)
+
+Большинство систем останавливаются в результате потери прерываний или "шторма" прерываний. В чипсетах существует много проблем, связанных с тем, как BIOS настраивает прерывания перед загрузкой, правильностью таблицы APIC (MADT), и маршрутизации _System Control Interrupt_ (SCI).
+
+"Шторм" прерываний может быть обнаружен по потерянным прерываниям путем проверки вывода строки с `acpi0` команды `vmstat -i`. Если счетчик увеличивается более, чем несколько раз в секунду, это "шторм" прерываний. Если система останавливается, попробуйте войти в DDB (kbd:[CTRL+ALT+ESC] на консоли) и ввести `show interrupts`.
+
+Наиболее надежный способ избавиться от проблемы с прерываниями, это отключение поддержки APIC с помощью параметра [.filename]#loader.conf#`hint.apic.0.disabled="1"`.
+
+==== Паника
+
+Паника, связанная с ACPI, случается довольно редко и имеет наибольший приоритет исправления. Первый шаг это изоляция действий, приводящих к панике (если это возможно) и получение отладки. Следуйте инструкции по включению `options DDB` и настройке последовательной консоли (смотрите crossref:serialcomms[serialconsole-ddb,Вход в отладчик DDB с последовательной линии]) или настройке раздела man:dump[8]. Вы можете получить отладочную информацию DDB с помощью `tr`. Если вы записываете отладку вручную, убедитесь, что переписали как минимум пять (5) строк снизу и пять (5) строк сверху.
+
+Затем попробуйте изолировать проблему, загрузившись с выключенным ACPI. Если это работает, вы можете изолировать подсистему ACPI, используя различные параметры `debug.acpi.disable`. Обратитесь к странице справочника man:acpi[4] за примерами.
+
+==== Система включается после приостановки или завершения работы
+
+Во-первых, попробуйте установить в man:loader.conf[5] параметр `hw.acpi.disable_on_poweroff="0"`. Это предотвращает отключение различных событий в ACPI во время завершения работы. В некоторых системах этот параметр необходимо установить в `1` (по умолчанию) по тем же причинам. Обычно это решает проблему, если система неожиданно включается после приостановки или отключения питания.
+
+==== Другие проблемы
+
+Если вы наблюдаете другие проблемы с ACPI (работа с внешним оборудованием, проблемы с обнаружением устройств, и т.д.), отправьте описание проблемы в список рассылки; однако, некоторые из этих проблем могут относиться к незавершенным частям подсистемы ACPI, поэтому может потребоваться время на их реализацию. Будьте терпеливы, и подготовьтесь к тестированию исправлений, которые мы можем вам выслать.
+
+[[ACPI-aslanddump]]
+=== ASL, `acpidump`, и IASL
+
+Наиболее часто встречается проблема, связанная с предоставлением поставщиками BIOS некорректного (или полностью ошибочного!) байткода. Это обычно проявляется появлением консольных сообщений ядра, подобных этому:
+
+[source,bash]
+....
+ACPI-1287: *** Error: Method execution failed [\\_SB_.PCI0.LPC0.FIGD._STA] \\
+ (Node 0xc3f6d160), AE_NOT_FOUND
+....
+
+Зачастую вы можете разрешить эти проблемы путем обновления BIOS до последней ревизии. Большинство консольных сообщений безвредны, но если существуют другие проблемы, такие как не работающий статус батареи, возможно существуют проблемы в AML. Байткод, известный как AML, компилируется из исходного текста на языке ASL. AML находится в таблице, известной как DSDT. Для получения копии ASL, используйте man:acpidump[8]. Вы можете использовать оба параметра `-t` (показывать содержимое постоянных таблиц) и `-d` (дизассемблировать AML в ASL). Обратитесь к разделу <<ACPI-submitdebug,Отправка отладочной информации>> за примером синтаксиса.
+
+Простейшая первая проверка, которую вы можете провести, это перекомпиляция ASL для поиска ошибок. Предупреждения обычно могут быть проигнорированы, но ошибки обычно не позволяют ACPI работать правильно. Для перекомпиляции ASL, выполните следующую команду:
+
+[source,bash]
+....
+# iasl your.asl
+....
+
+[[ACPI-fixasl]]
+=== Исправление ASL
+
+В дальней перспективе, наша задача состоит в том, чтобы обеспечить поддержку ACPI практически для каждой системы без вмешательства пользователя. Однако, на данный момент мы все еще разрабатываем обходные пути для ошибок, которые часто делают поставщики BIOS. Интерпретатор Microsoft(R) ([.filename]#acpi.sys# и [.filename]#acpiec.sys#) не занимается проверкой четкости соблюдения стандартов, поэтому многие поставщики BIOS, проверяющие ACPI только под Windows(R), никогда не исправляют ASL. Мы надеемся продолжать обнаружение и документацию нестандартных поведений, позволяемых интерпретатором Microsoft(R), и воспроизводить их, чтобы FreeBSD могла работать без необходимости исправления ASL пользователями. В качестве обходного пути для обнаружения неправильного поведения, вы можете исправить ASL вручную. Если исправления будут работать, пожалуйста отправьте man:diff[1] между старым и новым ASL, чтобы мы могли реализовать обходной путь для неправильного поведения ACPI-CA, чтобы исправление вручную больше не требовалось.
+
+Вот список наиболее часто встречающихся проблем, их причин и способы исправления:
+
+==== OS зависимости
+
+Некоторые AML предполагают, что мир состоит из различных версий Windows(R). Вы можете настроить FreeBSD, чтобы она сообщала любое другое имя OS и посмотреть, исправит ли это имеющуюся проблему. Простой способ указания другого имени системы это установка переменной [.filename]#/boot/loader.conf#`hw.acpi.osname="Windows 2001"` или в другое подобное значение, имеющееся в ASL.
+
+==== Отсутствие возврата значения
+
+Некоторые методы не возвращают значение явно, как того требует стандарт. Хотя ACPI-CA не обрабатывает эту ситуацию, в FreeBSD существует обходной путь, позволяющей ей явно возвращать значение. Вы можете также добавить явные операторы Return (возврат) там, где требуется, если знаете, что значение должно быть возвращено. Для принудительного компилирования ASL командой `iasl`, используйте флаг `-f`.
+
+==== Перезапись AML по умолчанию
+
+После настройки [.filename]#your.asl# для компиляции запустите:
+
+[source,bash]
+....
+# iasl your.asl
+....
+
+Вы можете добавить флаг `-f` для создания AML даже при наличии ошибок компиляции. Помните, что некоторые ошибки (например, отсутствующие операторы Return), автоматически обходятся интерпретатором.
+
+Файл [.filename]#DSDT.aml# используется `iasl` по умолчанию. Вы можете загрузить его вместо ошибочной копии BIOS (которая остается в постоянной памяти) путем редактирования [.filename]#/boot/loader.conf#:
+
+[.programlisting]
+....
+acpi_dsdt_load="YES"
+acpi_dsdt_name="/boot/DSDT.aml"
+....
+
+Убедитесь, что скопировали [.filename]#DSDT.aml# в каталог [.filename]#/boot#.
+
+[[ACPI-debugoutput]]
+=== Получение отладочной информации ACPI
+
+Возможности отладки драйвера ACPI очень гибкие. Они позволяют вам указывать набор подсистем, а также уровень отладки. Подсистемы, которые вы хотите отлаживать, указываются как "слои", и подразделяются на компоненты ACPI-CA (ACPI_ALL_COMPONENTS) и поддержку оборудования ACPI (ACPI_ALL_DRIVERS). Уровень отладки варьируется от ACPI_LV_ERROR (только сообщать об ошибках) до ACPI_LV_VERBOSE (все сообщения). Уровень отладки представляет собой битовую маску, поэтому возможна одновременная установка нескольких параметров, разделенных пробелами. На практике, при использовании для получения отладочной информации последовательной консоли, слишком большое количество информации может переполнить буфер консоли. Полный список отдельных слоев и уровней можно найти на странице справочника man:acpi[4].
+
+Вывод отладочной информации по умолчанию не включен. Для его включения добавьте параметр `options ACPI_DEBUG` к файлу настройки ядра, если ACPI встроен в ядро. Вы можете добавить параметр `ACPI_DEBUG=1` в файл [.filename]#/etc/make.conf# для глобального включения этого параметра. Если вы используете модуль [.filename]#acpi.ko# , его можно пересобрать индивидуально:
+
+[source,bash]
+....
+# cd /sys/modules/acpi/acpi
+ make clean make
+ACPI_DEBUG=1
+....
+
+Установите [.filename]#acpi.ko# в [.filename]#/boot/kernel# и добавьте предпочитаемый уровень и слой к [.filename]#loader.conf#. Этот пример включает отладочные сообщения для всех компонентов ACPI-CA и всех драйверов оборудования ACPI (CPU, LID и т.д.). Будут выводиться только сообщения об ошибках, наименьший уровень отладки.
+
+[.programlisting]
+....
+debug.acpi.layer="ACPI_ALL_COMPONENTS ACPI_ALL_DRIVERS"
+debug.acpi.level="ACPI_LV_ERROR"
+....
+
+Если требуемая информация получается в результате определенного события (скажем, приостановка и восстановление), вы можете не изменять [.filename]#loader.conf# и использовать для указания слоя и уровня `sysctl` после загрузки и подготовки системы к определенному событию. Имена переменных `sysctl` те же, что и имена параметров настройки в [.filename]#loader.conf#.
+
+[[ACPI-References]]
+=== Ссылки
+
+Дальнейшую информацию о ACPI можно найти по следующим ссылкам:
+
+* {freebsd-acpi}
+* Архивы списка рассылки ACPI http://lists.freebsd.org/pipermail/freebsd-acpi/[http://lists.freebsd.org/pipermail/freebsd-acpi/]
+* Старые архивы списка рассылки ACPI http://home.jp.FreeBSD.org/mail-list/acpi-jp/[http://home.jp.FreeBSD.org/mail-list/acpi-jp/]
+* Спецификация ACPI 2.0 http://acpi.info/spec.htm[http://acpi.info/spec.htm]
+* Страницы справочника FreeBSD: man:acpi[4], man:acpi_thermal[4], man:acpidump[8], man:iasl[8], man:acpidb[8]
+* http://www.cpqlinux.com/acpi-howto.html#fix_broken_dsdt[ Ресурс по отладке DSDT]. (Использует в качестве примера Compaq, но обычно полезен.)
diff --git a/documentation/content/ru/books/handbook/cutting-edge/_index.adoc b/documentation/content/ru/books/handbook/cutting-edge/_index.adoc
new file mode 100644
index 0000000000..8df1a18272
--- /dev/null
+++ b/documentation/content/ru/books/handbook/cutting-edge/_index.adoc
@@ -0,0 +1,1056 @@
+---
+title: Глава 21. Обновление системы и смена версии FreeBSD
+part: Часть III. Системное администрирование
+prev: books/handbook/l10n
+next: books/handbook/partiv
+---
+
+[[updating-upgrading]]
+= Обновление системы и смена версии FreeBSD
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 21
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/cutting-edge/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/cutting-edge/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/cutting-edge/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[updating-upgrading-synopsis]]
+== Краткий обзор
+
+Между релизами над FreeBSD ведется постоянная работа. Некоторые отдают предпочтение официально выпущенным версиям, в то время как остальные предпочитают использовать последние разработки. Тем не менее, даже для официальных версий часто выходят обновления, связанные с безопасностью и другими критическими исправлениями. Независимо от используемой версии FreeBSD предоставляет все необходимые инструменты для поддержания системы в актуальном состоянии, а также позволяет легко перейти на другую версию. Эта глава описывает, как отслеживать систему в процессе её разработки, а также основные инструменты для поддержания системы FreeBSD в актуальном состоянии.
+
+После чтения этой главы вы будете знать:
+
+* Как поддерживать систему FreeBSD в актуальном состоянии при помощи freebsd-update, Subversion или CTM.
+* Как узнать состояние установленной системы по отношению к известной нетронутой копии.
+* Как поддерживать установленную документацию в актуальном состоянии при помощи Subversion или портов документации.
+* Разницу между двумя ветвями разработки: FreeBSD-STABLE и FreeBSD-CURRENT.
+* Как перестраивать и переустанавливать всю базовую систему.
+
+Перед чтением этой главы вы должны:
+
+* Правильно настроить сетевое подключение (crossref:advanced-networking[advanced-networking, Сложные вопросы работы в сети]).
+* Знать, как устанавливать дополнительное стороннее программное обеспечение (crossref:ports[ports, Установка приложений. порты и пакеты]).
+
+[NOTE]
+====
+В этой главе для получения и обновления исходных текстов FreeBSD используется команда `svn`. Для этого нужно сперва установить порт или пакет package:devel/subversion[].
+====
+
+[[updating-upgrading-freebsdupdate]]
+== Обновление FreeBSD
+
+Своевременное применение обновлений безопасности и переход на более новую версию операционной системы - важные аспекты системного администрирования. FreeBSD включает в себя программу `freebsd-update`, которую можно использовать для решения обеих задач.
+
+Эта программа используется для установки распространяемых в двоичном виде обновлений безопасности и исправлений для FreeBSD без необходимости ручной компиляции и установки патчей или нового ядра. Двоичные обновления доступны для всех архитектур и версий, поддерживаемых группой безопасности. Перечень поддерживаемых версий и их ожидаемые даты окончания поддержки указаны на странице http://www.FreeBSD.org/security/[http://www.FreeBSD.org/security/].
+
+Эта программа также используется для незначительных обновлений версии операционной системы, а также для перехода на другую ветвь выпуска релизов. Перед обновлением следует ознакомиться с объявлением о выпуске новой версии, так как там может содержаться важная информация, применимая к версии, на которую намечен переход. С соответствующими объявлениями можно ознакомиться по ссылке http://www.FreeBSD.org/releases/[http://www.FreeBSD.org/releases/].
+
+[NOTE]
+====
+Если имеется задание `crontab`, запускающее man:freebsd-update[8], то перед сменой версии операционной системы его обязательно нужно выключить.
+====
+
+В этом разделе описывается конфигурационный файл `freebsd-update`, демонстрируется применение исправлений безопасности и обновление операционной системы со сменой младшей или старшей версии, а также обсуждаются некоторые соображения касаемо смены версии операционной системы.
+
+[[freebsdupdate-config-file]]
+=== Конфигурационный файл
+
+Конфигурационный файл `freebsd-update` самодостаточен и работает по умолчанию. Некоторые пользователи могут пожелать отредактировать конфигурационный файл [.filename]#/etc/freebsd-update.conf# для лучшего контроля над процессом обновления. В комментариях описываются доступные в этом файле параметры, но для следующих из них может потребоваться дополнительное разъяснение:
+
+[.programlisting]
+....
+# Components of the base system which should be kept updated.
+Components world kernel
+....
+
+Данный параметр определяет, какие части FreeBSD будут обновлены. По умолчанию обновляется вся базовая система (world) и ядро (kernel). Вместо этого можно указать отдельные компоненты, такие как `src/base` или `src/sys`. Тем не менее, лучшим вариантом будет оставить всё как есть, поскольку изменение этого перечня с целью добавления особых пунктов потребует от пользователя указания подряд всех пунктов. Со временем это может привести к негативным последствиям из-за возможной рассинхронизации между исходными текстами и двоичными файлами.
+
+[.programlisting]
+....
+# Paths which start with anything matching an entry in an IgnorePaths
+# statement will be ignored.
+IgnorePaths /boot/kernel/linker.hints
+....
+
+Добавьте сюда пути к каталогам (например, [.filename]#/bin# или [.filename]#/sbin#), которые вы бы хотели оставить нетронутыми в процессе обновления. Этот параметр можно использовать для предотвращения перезаписывания локальных изменений программой `freebsd-update`.
+
+[.programlisting]
+....
+# Paths which start with anything matching an entry in an UpdateIfUnmodified
+# statement will only be updated if the contents of the file have not been
+# modified by the user (unless changes are merged; see below).
+UpdateIfUnmodified /etc/ /var/ /root/ /.cshrc /.profile
+....
+
+Этот параметр позволяет обновлять конфигурационные файлы в указанных каталогах, только если они не содержат изменений. При наличии каких-либо изменений со стороны пользователя автоматическое обновление таких файлов отменяется. Есть другой параметр `KeepModifiedMetadata`, который предписывает команде `freebsd-update` сохранять изменения в процессе слияния.
+
+[.programlisting]
+....
+# When upgrading to a new FreeBSD release, files which match MergeChanges
+# will have any local changes merged into the version from the new release.
+MergeChanges /etc/ /var/named/etc/ /boot/device.hints
+....
+
+Список каталогов с конфигурационными файлами, для которых `freebsd-update` попытается выполнить слияние. Процесс слияния файла представляет собой последовательность изменений в формате man:diff[1], похожую на man:mergemaster[8], но с меньшим количеством параметров. Результат слияния принимается, открывается редактор или `freebsd-update` прекращает работу. В случае сомнений сделайте резервную копию [.filename]#/etc# и просто согласитесь со всеми изменениями. Для получения подробной информации по команде `mergemaster` смотрите <<mergemaster>>.
+
+[.programlisting]
+....
+# Directory in which to store downloaded updates and temporary
+# files used by FreeBSD Update.
+# WorkDir /var/db/freebsd-update
+....
+
+Этот каталог предназначен для размещения патчей и временных файлов. В случае, когда пользователь выполняет обновление со сменой версии, в этом месте нужно иметь по крайней мере гигабайт свободного дискового пространства.
+
+[.programlisting]
+....
+# When upgrading between releases, should the list of Components be
+# read strictly (StrictComponents yes) or merely as a list of components
+# which *might* be installed of which FreeBSD Update should figure out
+# which actually are installed and upgrade those (StrictComponents no)?
+# StrictComponents no
+....
+
+Если выставлено значение `yes`, то `freebsd-update` будет исходить из того, что список `Components` является полным, и не будет пытаться выполнить изменения за пределами этого списка. В действительности `freebsd-update` попытается обновить все файлы, которые принадлежат списку `Components`.
+
+[[freebsdupdate-security-patches]]
+=== Обновления безопасности
+
+Процесс применения обновлений безопасности FreeBSD был упрощён, что позволяет поддерживать систему в актуальном состоянии, используя `freebsd-update`. Для получения дополнительной информации по бюллетеням безопасности FreeBSD смотрите crossref:security[security-advisories,Сообщения безопасности FreeBSD].
+
+Обновления безопасности можно загрузить и установить с использованием следующих команд. Первая команда определяет наличие незагруженных обновлений и показывает файлы, которые будут изменены в процессе обновления. Вторая команда выполняет обновление.
+
+[source,bash]
+....
+# freebsd-update fetch
+# freebsd-update install
+....
+
+Если были установлены обновления ядра, то после этого нужно перезагрузить систему. Если обновление установилось для какого-либо работающего в системе двоичного файла, то следует перезапустить затронутые приложения, чтобы использовалась исправленная версия двоичного файла.
+
+Можно настроить ежедневную автоматическую проверку наличия обновлений, добавив следующую запись в [.filename]#/etc/crontab#:
+
+[.programlisting]
+....
+@daily root freebsd-update cron
+....
+
+При наличии обновлений они будут автоматически загружены. Пользователю `root` будет отправлено письмо, так что эти обновления можно будет просмотреть и установить самостоятельно командой `freebsd-update install`.
+
+На случай, если что-то пошло не так, в `freebsd-update` предусмотрен механизм возврата последнего набора изменений с использованием следующей команды:
+
+[source,bash]
+....
+# freebsd-update rollback
+Uninstalling updates... done.
+....
+
+Если после завершения всех действий было изменено ядро или какой-либо из его модулей, система должна быть перезагружена, а все затронутые исполняемые файлы нужно перезапустить.
+
+Команда `freebsd-update` позволяет автоматически обновлять только ядро [.filename]#GENERIC#. Если используется ядро с собственной конфигурацией, его понадобится пересобрать и переустановить после того, как `freebsd-update` завершит установку обновлений. Тем не менее, `freebsd-update` обнаружит и обновит ядро [.filename]#GENERIC# при наличии [.filename]#/boot/GENERIC#, даже если оно не является текущим используемым ядром в системе.
+
+[NOTE]
+====
+Всегда храните копию ядра [.filename]#GENERIC# в [.filename]#/boot/GENERIC#. Оно пригодится при решении различных проблем, а также при выполнении обновления со сменой версии. Смотрите <<freebsd-update-custom-kernel-9x>> для описания получения копии ядра [.filename]#GENERIC#.
+====
+
+Если конфигурация в [.filename]#/etc/freebsd-update.conf# не изменялась, `freebsd-update` вместе с остальными обновлениями установит обновлённые исходные тексты ядра. После этого можно обычным способом выполнить перестроение и переустановку нового ядра с собственной конфигурацией.
+
+Обновления, получаемые с помощью `freebsd-update`, не всегда затрагивают ядро. Перестроение собственного ядра не является обязательным, если исходные тексты ядра не были изменены при выполнении `freebsd-update install`. Тем не менее, `freebsd-update` всегда обновляет [.filename]#/usr/src/sys/conf/newvers.sh#. Текущий набор изменений, как указано в номере `-p` в выводе `uname -r`, получается из этого файла. Перестроение собственного ядра, даже если ничего больше не менялось, позволяет `uname` правильно сообщать текущий набор изменений в системе. Это в частности может помочь при сопровождении множества систем, поскольку позволяет быстро оценить наличие установленных обновлений в каждой из них.
+
+[[freebsdupdate-upgrade]]
+=== Обновления со сменой старшей и младшей версий
+
+Обновление с FreeBSD 9.0 на FreeBSD 9.1, называется обновлением со сменой младшего номера версии. Смена старшего номера версии происходит, когда FreeBSD переходит с одной значительной версии на другую, как, например, при обновлении с FreeBSD 9.X на FreeBSD 10.X. Оба типа обновлений можно произвести, указав `freebsd-update` версию, на которую нужно перейти.
+
+[NOTE]
+====
+Если в системе используется ядро с собственной конфигурацией, убедитесь перед началом обновления в наличии копии ядра [.filename]#GENERIC# в [.filename]#/boot/GENERIC#. Смотрите <<freebsd-update-custom-kernel-9x>> для описания получения копии ядра [.filename]#GENERIC#.
+====
+
+Следующая команда, будучи запущенной на FreeBSD 9.0, выполнит обновление до версии FreeBSD 9.1:
+
+[source,bash]
+....
+# freebsd-update -r 9.1-RELEASE upgrade
+....
+
+После своего запуска `freebsd-update` анализирует содержимое конфигурационного файла и собирает необходимую для проведения обновления информацию о текущей установленной системе. На экран будет выдан перечень компонентов, которые удалось и не удалось обнаружить установленными. Например:
+
+[source,bash]
+....
+Looking up update.FreeBSD.org mirrors... 1 mirrors found.
+Fetching metadata signature for 9.0-RELEASE from update1.FreeBSD.org... done.
+Fetching metadata index... done.
+Inspecting system... done.
+
+The following components of FreeBSD seem to be installed:
+kernel/smp src/base src/bin src/contrib src/crypto src/etc src/games
+src/gnu src/include src/krb5 src/lib src/libexec src/release src/rescue
+src/sbin src/secure src/share src/sys src/tools src/ubin src/usbin
+world/base world/info world/lib32 world/manpages
+
+The following components of FreeBSD do not seem to be installed:
+kernel/generic world/catpages world/dict world/doc world/games
+world/proflibs
+
+Does this look reasonable (y/n)? y
+....
+
+Следующим шагом `freebsd-update` попытается загрузить по сети файлы, необходимые для выполнения обновления. В некоторых случаях может потребоваться ответить на вопросы относительно того, что и как устанавливать.
+
+Если используется ядро с собственной конфигурацией, то в этом случае появится предупреждение следующего вида:
+
+[source,bash]
+....
+WARNING: This system is running a "MYKERNEL" kernel, which is not a
+kernel configuration distributed as part of FreeBSD 9.0-RELEASE.
+This kernel will not be updated: you MUST update the kernel manually
+before running "/usr/sbin/freebsd-update install"
+....
+
+На этом этапе предупреждение можно проигнорировать. На промежуточном этапе процесса обновления будет использовано обновлённое ядро [.filename]#GENERIC#.
+
+После того, как все изменения были загружены, они будут применены. Этот процесс может занять определённое время, в зависимости от производительности и текущей загруженности компьютера. Затем будет выполнено слияние конфигурационных файлов. Процесс слияния требует от пользователя определённого вмешательства, так как для файла можно выполнить слияние автоматически, а можно открыть текстовый редактор для слияния вручную. Результат успешного слияния будет показан на экране. Неудачное или пропущенное слияние вызовет преждевременное завершение программы. Можно подготовить резервную копию каталога [.filename]#/etc# для таких важных файлов как [.filename]#master.passwd# и [.filename]#group# и выполнить их слияние вручную позднее.
+
+[NOTE]
+====
+На данном этапе система еще не модифицирована, и все изменения и слияния происходят в отдельном каталоге. Теперь, когда все изменения успешно применены, все конфигурационные файлы объединены и кажется, что процесс должен пройти плавно, изменения могут быть установлены на диск с помощью следующей команды:
+
+[source,bash]
+....
+# freebsd-update install
+....
+
+====
+
+В первую очередь изменения будут применены к ядру и его модулям. При использовании ядра с собственной конфигурацией укажите для следующей загрузки обновлённое ядро [.filename]#/boot/GENERIC# с помощью man:nextboot[8]:
+
+[source,bash]
+....
+# nextboot -k GENERIC
+....
+
+[WARNING]
+====
+
+Перед перезагрузкой с ядром [.filename]#GENERIC# убедитесь, что оно содержит все необходимые драйвера для системы для корректной загрузки и подключения к сети, если машина обновляется удалённо. В частности, если в ядре содержится встроенная функциональность, которая обычно обеспечивается модулями ядра, загрузите эти драйвера с ядром [.filename]#GENERIC#, временно указав их как модули в [.filename]#/boot/loader.conf#. Рекомендуется отключить несущественные службы, а также любые локальные и сетевые диски до завершения процесса обновления.
+====
+
+Теперь компьютер должен быть перезагружен с новым ядром:
+
+[source,bash]
+....
+# shutdown -r now
+....
+
+После перезагрузки нужно повторно запустить команду `freebsd-update`. Команда прочитает, на каком этапе она находится, и перейдёт к удалению старых объектных файлов и совместно используемых библиотек.
+
+[source,bash]
+....
+# freebsd-update install
+....
+
+[NOTE]
+====
+Количество этапов установки обновлений может быть два вместо трёх и зависит от того, были ли изменены номера версий каких-либо совместно используемых библиотек.
+====
+
+На этом процесс завершён. Если было выполнено обновление со сменой старшего номера версии, переустановите все порты и пакеты в соответствии с описанием, которое предоставляет <<freebsdupdate-portsrebuild>>.
+
+[[freebsd-update-custom-kernel-9x]]
+==== Собственная конфигурация ядра в FreeBSD 9.X и более поздних версиях
+
+Перед использованием `freebsd-update` убедитесь в наличии копии ядра [.filename]#GENERIC# в [.filename]#/boot/GENERIC#. Если ядро с собственной конфигурацией было собрано единожды, то в [.filename]#/boot/kernel.old# будет находиться ядро `GENERIC`. Просто переименуйте этот каталог в [.filename]#/boot/kernel#.
+
+Если ядро с собственной конфигурацией было собрано более одного раза, получите копию ядра `GENERIC`, соответствующую текущей версии операционной системы. При наличии физического доступа копию ядра `GENERIC` можно установить с установочного носителя:
+
+[source,bash]
+....
+# mount /cdrom
+# cd /cdrom/usr/freebsd-dist
+# tar -C/ -xvf kernel.txz boot/kernel/kernel
+....
+
+Иначе, ядро `GENERIC` можно собрать и установить из исходных текстов:
+
+[source,bash]
+....
+# cd /usr/src
+# make kernel __MAKE_CONF=/dev/null SRCCONF=/dev/null
+....
+
+Чтобы такое ядро было определено как ядро `GENERIC` программой `freebsd-update`, в файле конфигурации [.filename]#GENERIC# должны отсутствовать изменения. Также предлагается, что ядро было собрано без использования каких-либо специальных параметров.
+
+Загрузка с [.filename]#GENERIC# не требуется, поскольку для `freebsd-update` достаточно существования [.filename]#/boot/GENERIC#.
+
+[[freebsdupdate-portsrebuild]]
+==== Обновление пакетов после смены старшей версии системы
+
+После обновления системы со сменой младшей версии установленные приложения, в целом, продолжают работать без каких-либо проблем. Различные старшие версии используют различающиеся двоичные интерфейсы приложений (Application Binary Interface, ABI), из-за чего перестаёт работать большинство сторонних приложений. После обновления системы со сменой старшей версии все установленные пакеты и порты также нуждаются в обновлении. Пакеты можно обновить с использованием `pkg upgrade`. Для обновления установленных портов используется package:ports-mgmt/portmaster[].
+
+Принудительное обновление все установленных пакетов приведёт к их замене на последние версии из репозитория, даже если номер версии при этом не увеличивался. Это требуется из-за смены версии ABI при обновлении на другую старшую версию FreeBSD. Принудительное обновление можно выполнить так:
+
+[source,bash]
+....
+# pkg-static upgrade -f
+....
+
+Перестроение всех установленных приложений можно выполнить этой командой:
+
+[source,bash]
+....
+# portmaster -af
+....
+
+Эта команда будет отображать экран выбора конфигурации для каждого приложения, в котором доступны параметры конфигурации, с ожиданием пользовательского ввода. Чтобы не использовать такое поведение и всегда выбирать параметры по умолчанию, добавьте ключ `-G` в вышеприведённую команду.
+
+После завершения процесса обновления программного обеспечения закончите процесс обновления последним запуском `freebsd-update`, для того чтобы убедиться, что ничто не было пропущено в процессе обновления:
+
+[source,bash]
+....
+# freebsd-update install
+....
+
+Если в качестве временной меры использовалось ядро [.filename]#GENERIC#, то это подходящее время для построения и установки нового ядра с собственной конфигурацией в соответствии с инструкциями в crossref:kernelconfig[kernelconfig, Настройка ядра FreeBSD].
+
+Перезагрузите машину с новой версией FreeBSD. На этом процесс обновления завершён.
+
+[[freebsdupdate-system-comparison]]
+=== Сравнение состояния системы
+
+С помощью команды `freebsd-update IDS` можно получить состояние установленной версии FreeBSD относительно известной доверенной копии. Эта команда проверяет текущую версию системных утилит, библиотек и конфигурационных файлов, и её можно использовать в качестве встроенной системы обнаружения вторжений (Intrusion Detection System, IDS).
+
+[WARNING]
+====
+
+Эта команда не является заменой IDS, такой как package:security/snort[]. Поскольку `freebsd-update` сохраняет свои данные на диске, возможность подмены становится очевидной. И хотя эта возможность может быть уменьшена при использовании настройки `kern.securelevel`, а также используя для записи данных `freebsd-update` файловую систему, которая в остальное время смонтирована только на чтение, лучшим решением будет сравнить систему относительно эталона на физически защищенном носителе, таком как DVD или внешний USB диск с включённой защитой от записи.
+====
+
+Для того, чтобы начать сравнение, укажите файл для сохранения результатов:
+
+[source,bash]
+....
+# freebsd-update IDS >> outfile.ids
+....
+
+Запустится проверка системы, результат которой будет записан в указанный файл в виде списка файлов вместе с их контрольными суммами в формате SHA256 - для известных файлов из релиза и текущих в системе.
+
+Строки в списке чрезмерно длинные, но зато такой формат вывода удобен для разбора. Так, для получения списка всех отличающихся от релиза файлов достаточно выполнить такую команду:
+
+[source,bash]
+....
+# cat outfile.ids | awk '{ print $1 }' | more
+/etc/master.passwd
+/etc/motd
+/etc/passwd
+/etc/pf.conf
+....
+
+Вывод специально обрезан, на самом деле файлов намного больше. Некоторые из них изменены в ходе нормальной работы: так, файл [.filename]#/etc/passwd# был изменён после заведения пользователей в системе. Модули ядра могли измениться вследствие обновления через `freebsd-update`. Для исключения из проверки конкретных файлов и каталогов укажите их в качестве значения параметра `IDSIgnorePaths` в [.filename]#/etc/freebsd-update.conf#.
+
+[[updating-upgrading-documentation]]
+== Обновление документации
+
+Документация является неотъемлемой частью операционной системы FreeBSD. И хотя актуальная версия документации FreeBSD всегда доступна на сайте FreeBSD (link:https://www.FreeBSD.org/doc/[http://www.freebsd.org/doc/]), может быть удобно иметь под рукой актуальную локальную копию сайта FreeBSD, руководств, FAQ и статей.
+
+В этом разделе описывается, как использовать исходный текст или Коллекцию Портов FreeBSD для организации актуальной локальной копии документации FreeBSD.
+
+За информацией о редактировании и отправке изменений для документации обращайтесь к FreeBSD Documentation Project Primer for New Contributors (link:{fdp-primer}[FreeBSD Documentation Project Primer]).
+
+[[updating-installed-documentation]]
+=== Обновление документации из исходного кода
+
+Для перестроения документации FreeBSD из исходного текста требуется набор инструментов, который не является частью основной системы FreeBSD. Требуемые инструменты, включая svn, можно установить из пакета или порта package:textproc/docproj[], разработанного в рамках проекта документации FreeBSD.
+
+После установки используйте svn для получения копии исходных текстов документации:
+
+[source,bash]
+....
+# svn checkout https://svn.FreeBSD.org/doc/head /usr/doc
+....
+
+Первоначальная загрузка исходных текстов документации может занять некоторое время. Дайте ей завершиться.
+
+Последующие обновления можно получить, выполнив:
+
+[source,bash]
+....
+# svn update /usr/doc
+....
+
+После того как в [.filename]#/usr/doc# была загружена актуальная копия исходных текстов, всё готово для обновления установленной документации.
+
+Полное обновление всех доступных языковых версий можно выполнить, набрав команду:
+
+[source,bash]
+....
+# cd /usr/doc
+# make install clean
+....
+
+Для обновления только указанной языковой версии команду `make` можно запустить в соответствующем подкаталоге [.filename]#/usr/doc#:
+
+[source,bash]
+....
+# cd /usr/doc/en_US.ISO8859-1
+# make install clean
+....
+
+Альтернативный способ обновления документации заключается в запуске следующей команды из из [.filename]#/usr/doc# или подкаталога с желаемой языковой версией:
+
+[source,bash]
+....
+# make update
+....
+
+Используемый при установке формат можно указать через `FORMATS`:
+
+[source,bash]
+....
+# cd /usr/doc
+# make FORMATS='html html-split' install clean
+....
+
+Для упрощения процесса частичного обновления документации и построения только нужных переводов имеется несколько параметров. Их можно задать как на общесистемном уровне, указав в [.filename]#/etc/make.conf#, так и непосредственно в команде `make`.
+
+Данные параметры включают:
+
+`DOC_LANG`::
+Перечень языков и кодировок для построения и установки, например, `en_US.ISO8859-1` для англоязычной документации.
+
+`FORMATS`::
+Единый формат или набор форматов для построения. На данный момент поддерживаются `html`, `html-split`, `txt`, `ps` и `pdf`.
+
+`DOCDIR`::
+Путь для установки документации. По умолчанию [.filename]#/usr/shared/doc#.
+
+Для получения других переменных `make`, также работающих во FreeBSD в качестве общесистемных, обратитесь к man:make.conf[5].
+
+[[doc-ports-install-package]]
+=== Обновление документации из портов
+
+В предыдущем разделе был представлен метод обновления документации FreeBSD из исходных текстов. В этом разделе описывается альтернативный метод с использованием Коллекции Портов, который позволяет:
+
+* Установить предварительно собранный пакет документации без необходимости локального построения чего-либо или установки инструментария документации.
+* Выполнить построение исходных текстов документации через инфраструктуру портов, что несколько упрощает этапы загрузки и построения.
+
+Данный метод обновления документации FreeBSD предоставляется портами и пакетами документации, которые ежемесячно обновляет {doceng}. Они перечислены в Коллекции Портов FreeBSD в категории docs (http://www.freshports.org/docs/[http://www.freshports.org/docs/]).
+
+Порты документации организованы следующим образом:
+
+* Пакет или порт package:misc/freebsd-doc-en[] устанавливает всю англоязычную документацию.
+* Метапакет или порт package:misc/freebsd-doc-all[] устанавливает всю документацию на всех доступных языках.
+* Имеются пакеты и порты для каждого перевода, например, package:misc/freebsd-doc-hu[] для венгерской документации.
+
+При использовании двоичных пакетов документация FreeBSD будет установлена во всех доступных форматах для данного языка. Например, следующая команда установит последнюю версию пакета венгерской документации:
+
+[source,bash]
+....
+# pkg install hu-freebsd-doc
+....
+
+[NOTE]
+====
+Для пакетов используется другая схема наименования, которая отличается от названия соответствующего порта: `_lang_-freebsd-doc`, где _lang_ соответствует сокращённому языковому коду, такому как `hu` для венгерского или `zh_cn` для упрощённого китайского.
+====
+
+Чтобы указать используемый формат документации, для этого вместо установки готового пакета нужно собрать порт самостоятельно. Ниже приводится пример построения и установки английской документации:
+
+[source,bash]
+....
+# cd /usr/ports/misc/freebsd-doc-en
+# make install clean
+....
+
+В порте имеется меню конфигурации, в котором можно указать нужный формат. По умолчанию выбирается HTML с разделителями, такой как на http://www.FreeBSD.org[http://www.FreeBSD.org], а также PDF.
+
+Иначе, при построении порта документации можно указать параметры `make`, которые включают в себя:
+
+`WITH_HTML`::
+Документ в формате HTML на одной странице. Сформированная документация сохраняется в файле [.filename]#article.html# или [.filename]#book.html#.
+
+`WITH_PDF`::
+Сформированная документация сохраняется в файле [.filename]#article.pdf# или [.filename]#book.pdf#.
+
+`DOCBASE`::
+Указывает место размещения документации. По умолчанию [.filename]#/usr/local/shared/doc/freebsd#.
+
+В примере ниже демонстрируется использование переменных для установки венгерской документации в PDF в указанный каталог:
+
+[source,bash]
+....
+# cd /usr/ports/misc/freebsd-doc-hu
+# make -DWITH_PDF DOCBASE=share/doc/freebsd/hu install clean
+....
+
+Пакеты или порты документации обновляются согласно инструкциям в crossref:ports[ports, Установка приложений. порты и пакеты]. Например, следующая команда выполняет обновление установленной документации на венгерском языке с помощью package:ports-mgmt/portmaster[] в режиме использования только готовых пакетов:
+
+[source,bash]
+....
+# portmaster -PP hu-freebsd-doc
+....
+
+[[current-stable]]
+== Использование ветви разработки
+
+Во FreeBSD имеется две ветки разработки: FreeBSD-CURRENT и FreeBSD-STABLE.
+
+В этом разделе даётся объяснение для каждой из них и их предназначение, а также рассказывается, как синхронизировать систему с любой из этих веток.
+
+[[current]]
+=== Использование FreeBSD-CURRENT
+
+FreeBSD-CURRENT является "передним краем" разработки FreeBSD и предназначена для пользователей с высокой технической грамотностью. Менее продвинутым пользователям, также желающим отслеживать ветку разработки, следует использовать FreeBSD-STABLE.
+
+FreeBSD-CURRENT обозначает последнюю версию исходных текстов FreeBSD и включает в себя незавершённые работы, экспериментальные изменения и переходные механизмы, которые могут отсутствовать в следующем официальном релизе. Хотя многие разработчики FreeBSD выполняют компиляцию исходных текстов FreeBSD-CURRENT ежедневно, бывают периоды, когда исходные тексты могут не компилироваться. Обычно такие проблемы решаются сразу по мере возможности, но всё же выбор точки синхронизации исходных текстов является определяющим фактором, содержит ли FreeBSD-CURRENT новую функциональность или же мину замедленного действия.
+
+FreeBSD-CURRENT предназначена для трёх основных групп:
+
+. Члены сообщества FreeBSD, активно работающие над некоторой частью дерева исходных текстов.
+. Члены сообщества FreeBSD, которые являются активными тестерами. Они тратят свое время на исправление проблем, вносят важные предложения по изменениям и общему развитию FreeBSD, присылают патчи.
+. Пользователи, которые хотят быть в курсе изменений, используют текущие исходные тексты для ознакомительных целей либо же иногда высказывают замечания или предоставляют собственный код.
+
+FreeBSD-CURRENT _не_ должна использоваться в качестве быстрого способа получить новые возможности, не дожидаясь выпуска следующей версии, поскольку предварительная версия не является полностью проверенной и скорее всего содержит ошибки. FreeBSD-CURRENT не является быстрым способом получения исправлений, поскольку любое изменение является в равной мере источником исправления существующих ошибок и появления новых. FreeBSD-CURRENT не является "официально поддерживаемой" каким бы то ни было способом.
+
+Чтобы отслеживать изменения во FreeBSD-CURRENT:
+
+. Подпишитесь на списки рассылки {freebsd-current} и {svn-src-head}. Это _необходимо_ для того, чтобы получать сообщения и важные бюллетени относительно текущего состояния FreeBSD-CURRENT.
++
+Список рассылки {svn-src-head} содержит записи из журнала коммитов по каждому изменению, а также сопутствующую информацию о возможных побочных эффектах.
++
+Чтобы подписаться на эти списки рассылки, перейдите по ссылке {mailman-lists-url}, щёлкните на нужном списке и следуйте дальнейшим инструкциям. Для того чтобы отслеживать изменения всего дерева исходных текстов, а не только FreeBSD-CURRENT, подпишитесь на {svn-src-all}.
+. Загрузите исходные тексты FreeBSD-CURRENT. Обычно для этого используется crossref:mirrors[svn,svn], с помощью которого можно загрузить исходные тексты -CURRENT из ветки `head` с одного из зеркал Subversion, перечисленных в crossref:mirrors[svn-mirrors,Сайты зеркала Subversion].
++
+Пользователи с очень медленным или ограниченным подключением могут рассматривать использование CTM, который описывается в crossref:mirrors[ctm,Использование CTM], однако этот способ является менее надёжным по сравнению с рекомендуемым способом синхронизации исходных текстов посредством svn.
+. Вследствие больших размеров репозитория некоторые пользователи для ознакомления или изготовления патчей выбирают частичную загрузку. Тем не менее, для компиляции операционной системы из исходных текстов требуется загрузить FreeBSD-CURRENT _полностью_, а не только лишь выбранные части.
++
+Перед началом компиляции FreeBSD-CURRENT внимательно прочтите файл [.filename]#/usr/src/Makefile# и следуйте инструкциям в <<makeworld>>. {freebsd-current} и [.filename]#/usr/src/UPDATING# позволят быть в курсе прочих процедур, которые иногда бывают необходимы в процессе перехода к следующему релизу.
+. Будьте активным участником! Пользователям FreeBSD-CURRENT предлагается высказывать свои соображения по улучшению или исправлению ошибок. Предложения, к которым прилагается код, всегда приветствуются!
+
+[[stable]]
+=== Использование FreeBSD-STABLE
+
+FreeBSD-STABLE является веткой разработки, из которой выпускаются основные релизы. Изменения в этой ветке происходят с меньшей скоростью и в предположении, что они сперва были проверены во FreeBSD-CURRENT. При этом она _остаётся_ веткой разработки, и в любой момент времени исходные тексты FreeBSD-STABLE могут оказаться не готовы для обычного использования. Это просто другая ветка разработки, не предназначенная для конечных пользователей. Пользователям, у которых нет возможности заниматься тестированием, следует использовать самый последний выпуск FreeBSD.
+
+Тем, кто заинтересован процессом разработки FreeBSD или желает поучаствовать, особенно поскольку от этого зависит следующий релиз FreeBSD, стоит отслеживать FreeBSD-STABLE.
+
+Хотя ветка FreeBSD-STABLE должна всегда компилироваться и работать, это невозможно гарантировать. Поскольку гораздо больше людей работает с FreeBSD-STABLE, неудивительно, что в FreeBSD-STABLE иногда обнаруживаются ошибки и всплывают непредвиденные ситуации, которые не проявляли себя в FreeBSD-CURRENT. По этим причинам не рекомендуется слепо использовать FreeBSD-STABLE. Особенно важно _не_ обновлять какие-либо сервера, находящиеся в эксплуатации, до FreeBSD-STABLE без тщательного тестирования кода в среде разработки.
+
+Чтобы отслеживать изменения во FreeBSD-STABLE:
+
+. Подпишитесь на список рассылки {freebsd-stable}, чтобы быть в курсе о зависимостях процесса компиляции, которые могут появиться во FreeBSD-STABLE или любых других проблемах, требующих особого внимания. Также в этом списке рассылки разработчики делают объявления о спорных исправлениях или добавлениях, давая пользователям возможность высказать свое мнение о возможных тонких моментах.
++
+Подпишитесь на список рассылки svn, соответствующий используемой ветви. Например, при использовании 9-STABLE следует подписаться на {svn-src-stable-9}. Этот список рассылки содержит записи из журнала коммитов по каждому изменению, а также сопутствующую информацию о возможных побочных эффектах.
++
+Чтобы подписаться на эти списки рассылки, перейдите по ссылке {mailman-lists-url}, щёлкните на нужном списке, и следуйте дальнейшим инструкциям. Для того чтобы отслеживать изменения всего дерева исходных текстов, подпишитесь на {svn-src-all}.
+. Чтобы установить новую систему FreeBSD-STABLE, установите самый последний релиз FreeBSD-STABLE, загрузив его с crossref:mirrors[mirrors,зеркалирующих сайтов FreeBSD] или используйте ежемесячную стандартную сборку FreeBSD-STABLE. Обратитесь к link:https://www.FreeBSD.org/snapshots/[www.freebsd.org/snapshots] для получения дополнительной информации о снэпшотах.
++
+Чтобы скомпилировать новую или обновить существующую систему FreeBSD до FreeBSD-STABLE, используйте crossref:mirrors[svn,svn] для загрузки исходных текстов нужной ветки. Имена веток вида `stable/9` перечислены на странице link:https://www.FreeBSD.org/releng/[www.freebsd.org/releng]. При отсутствии надёжного Интернет-соединения можно воспользоваться CTM (crossref:mirrors[ctm,Использование CTM]).
+. Перед началом компиляции или обновления до FreeBSD-STABLE внимательно прочтите файл [.filename]#/usr/src/Makefile# и следуйте инструкциям в <<makeworld>>. {freebsd-stable} и [.filename]#/usr/src/UPDATING# позволят быть в курсе прочих процедур, которые иногда бывают необходимы в процессе перехода к следующему релизу.
+
+[[synching]]
+== Синхронизация исходных текстов
+
+Имеются различные способы синхронизации с исходными текстами FreeBSD. В этом разделе сравниваются основные из них, Subversion и CTM.
+
+[WARNING]
+====
+
+Хотя возможно частичное обновление дерева исходных текстов, единственной поддерживаемой процедурой обновления является обновление всего дерева и перекомпиляция всех программ, работающих в контексте пользователя, например тех, что находятся в каталогах [.filename]#/bin# и [.filename]#/sbin#, а также исходных текстов ядра. Обновление только части дерева исходных текстов, только ядра или только программ часто приводит к возникновению проблем от ошибок компиляции до аварийных остановов системы или потери данных.
+====
+
+Subversion для обновления исходных текстов использует модель _pull_. Пользователь или сценарий `cron` запускают программу `svn`, которая обновляет локальную версию исходных текстов. Subversion является предпочтительным способом обновления локального дерева исходных текстов, поскольку обновления являются актуальными с точностью до минуты и пользователь управляет временем их загрузки. Загрузку определённых файлов и каталогов легко ограничить, а запрашиваемые обновления формируются на лету на стороне сервера. О том, как актуализировать исходные тексты с использованием Subversion, описано в crossref:mirrors[svn,svn].
+
+CTM не выполняет интерактивное сравнение имеющихся исходных текстов с находящимися в главном архиве, и не выполняет их загрузку. Вместо этого несколько раз в день на главной машине CTM запускается скрипт, находящий изменения в файлах с момента своего предыдущего запуска. Все обнаруженные изменения сжимаются, помечаются последовательным номером и кодируются для передачи по электронной почте в печатном формате ASCII. После получения эти "дельта-файлы CTM" могут быть переданы утилите `ctm.rmail`, которая осуществляет автоматическое декодирование, проверку и применение изменений к пользовательской копии исходных текстов. Этот процесс более эффективен по сравнению с используемым в Subversion и требует меньше ресурсов сервера, так как он выполнен по модели _push_, а не _pull_. Инструкции по использованию CTM для синхронизации исходных текстов даны в crossref:mirrors[ctm,Использование CTM].
+
+Если пользователь случайно уничтожил часть своего архива, Subversion обнаружит и перестроит повреждённую часть. CTM этого не делает, поэтому если пользователь удалил часть дерева исходных текстов и не имеет архивной копии, то нужно будет начать с самого начала (с последнего "базового дельта-файла"), перестроив всё с помощью CTM.
+
+[[makeworld]]
+== Пересборка мира
+
+После того, как локальное дерево исходных текстов было синхронизировано с некоторой версией FreeBSD (FreeBSD-STABLE или FreeBSD-CURRENT), его можно использовать для перестроения системы. Этот процесс известен как перестроение мира.
+
+_Перед_ перестроением мира убедитесь в выполнении следующих действий:
+
+[.procedure]
+====
+*Procedure: _Перед_ тем как приступать к построению мира*
+
+. Сохраните резервную копию всех важных данных на другую систему или съёмный носитель, проверьте её целостность и держите под рукой загрузочный носитель. Невозможно переоценить важность создания резервной копии системы _до_ начала перестроения системы. Хотя перестроение системы является простой задачей, неизбежно возникают ситуации, при которых ошибки в исходных текстах приводят к тому, что система перестаёт загружаться. Возможно, вам никогда не придётся этим воспользоваться, но, постучав по дереву, всегда лучше подстраховаться.
+. Проверьте последние сообщения в списке рассылки {freebsd-stable} или {freebsd-current} (в зависимости от отслеживаемой ветки). Будьте в курсе любых известных проблем, и тех систем, которые они затрагивают. В случае возникновения подобной проблемы, дождитесь сообщения о том, что эта проблема решена. После этого повторите синхронизацию исходных текстов для получения необходимого исправления.
+. Прочтите [.filename]#/usr/src/UPDATING# для получения информации о дополнительных шагах, необходимых для данной версии исходных текстов. В этом файле содержится важная информация о возможных проблемах и может быть указан порядок выполнения соответствующих команд. При большинстве обновлений требуются дополнительные шаги, например, переименование или удаление определённых файлов перед установкой нового мира. Эти шаги будут перечислены в конце файла, где в явном виде описывается текущая рекомендуемая последовательность действий при обновлении. Если содержимое [.filename]#UPDATING# противоречит каким-либо шагам в этой главе, руководствуйтесь инструкциями в файле [.filename]#UPDATING#, которые имеют больший приоритет.
+====
+
+[WARNING]
+.Не используйте `make world`
+====
+В некоторой устаревшей документации рекомендуется использование `make world`. Эта команда пропускает некоторые важные шаги, поэтому использовать её следует лишь в том случае, если вы точно знаете, что делаете. Почти во всех случаях `make world` - это неправильный способ, вместо этого следует использовать описанную здесь процедуру.
+====
+
+[[canonical-build]]
+=== Обзор процесса
+
+Процесс построения мира подразумевает переход с более старой версии FreeBSD с использованием исходных текстов более новой версии, которые были получены согласно инструкциям в <<synching>>.
+
+Во FreeBSD термин "world" обозначает ядро, исполняемые файлы основой системы, библиотеки, файлы для программирования и встроенный компилятор. Имеет значение порядок, при котором эти компоненты собираются и устанавливаются.
+
+Например, из-за ошибки в старом компиляторе невозможно было бы скомпилировать новое ядре. Поскольку новое ядро должно быть собрано новым компилятором, для этого в свою очередь необходимо собрать новый компилятор, но устанавливать его перед сборкой ядра необязательно.
+
+Новый мир может зависеть от особенностей нового ядра, поэтому новое ядро должно быть установлено до установки нового мира. Старый мир может работать неправильно на новом ядре, поэтому новый мир должен быть установлен сразу после установки нового ядра.
+
+Перед установкой нового мира могут потребоваться изменения в конфигурации, но некоторые из изменений могут не работать со старым миром. Следовательно, используются два разных этапа обновления конфигурации. В основной части процесса обновления выполняется только замена или добавление файлов. Существующие файлы при этом не удаляются. Поскольку это может повлечь проблемы, в [.filename]#/usr/src/UPDATING# содержится информация о том, какие из файлов и на каком шаге нужно удалить вручную.
+
+Исходя из этих соображений в следующей процедуре описана рекомендуемая последовательность обновления.
+
+[NOTE]
+====
+Хорошей практикой является запись в файл вывода команды `make`. Если что-то пошло не так, копию сообщения об ошибке можно отправить в один из списков рассылки FreeBSD.
+
+Проще всего использовать для этого `script` с параметром, задающим имя файла для сохранения всего вывода. Не сохраняйте вывод в [.filename]#/tmp#, так как этот каталог может быть очищен при следующей перезагрузке. Более подходящим местом является [.filename]#/var/tmp#. Запустите команду непосредственно перед перестроением мира, а после завершения процесса наберите `exit`:
+
+[source,bash]
+....
+# script /var/tmp/mw.out
+Script started, output file is /var/tmp/mw.out
+....
+
+====
+
+[.procedure]
+====
+*Procedure: Обзор процесса построения мира*
+
+Команды для построения мира должны запускаться в указанном здесь порядке. В этом разделе даётся краткое описание назначения каждой из команд.
+
+. Если процесс построения мира уже запускался ранее на этой системе, то в [.filename]#/usr/obj# могла остаться копия предыдущей сборки. Удалите этот каталог для ускорения процесса построения нового мира и возможного сокращений работы по разрешению зависимостей.
++
+[source,bash]
+....
+# chflags -R noschg /usr/obj/*
+# rm -rf /usr/obj
+....
++
+. Скомпилируйте новый компилятор и несколько сопутствующих инструментов и используйте их для компиляции остальной части мира. Результаты сохраняются в [.filename]#/usr/obj#.
++
+[source,bash]
+....
+# cd /usr/src
+# make buildworld
+....
++
+. Для построения нового ядра используйте компилятор, расположенный в [.filename]#/usr/obj#, чтобы защититься от ошибок несоответствия между компилятором и ядром. Это необходимо, так как определённые структуры данных могут поменяться, и при использовании различных версий ядра и исходных текстов перестанут работать `ps` и `top`.
++
+[source,bash]
+....
+# make buildkernel
+....
++
+. Установите новое ядро и модули, чтобы их можно было использовать для загрузки. Если используется `kern.securelevel` со значением выше `1` _и_ на файле ядра установлен `noschg` или подобный флаг, то для этого сперва придётся дополнительно перейти в однопользовательский режим. В противном случае эту команду можно без проблем запустить в многопользовательском режиме. Смотрите страницу Справочника man:init[8] для получения информации о `kern.securelevel`, а также man:chflags[1] для информации об использовании различных файловых флагов.
++
+[source,bash]
+....
+# make installkernel
+....
++
+. Переведите систему в однопользовательский режим для минимизации проблем при обновлении уже работающих исполняемых файлов. Это также уменьшит вероятность возникновения проблем при работе старого мира на новом ядре.
++
+[source,bash]
+....
+# shutdown now
+....
++
+После перехода в однопользовательский режим, запустите эти команды, если в системе используется UFS:
++
+[source,bash]
+....
+# mount -u /
+# mount -a -t ufs
+# swapon -a
+....
++
+Если используется ZFS, запустите другие две команды. В данном примере zpool называется `zroot`:
++
+[source,bash]
+....
+# zfs set readonly=off zroot
+# zfs mount -a
+....
++
+. Дополнительно: Если желаемая картография клавиатуры отличается от используемой по умолчанию US English, её можно изменить с помощью man:kbdmap[1]:
++
+[source,bash]
+....
+# kbdmap
+....
++
+. Затем, если часы CMOS установлены на местное время (это так, если вывод man:date[1] не содержит правильное время и часовой пояс), выполните:
++
+[source,bash]
+....
+# adjkerntz -i
+....
++
+. Пересборка мира не включает в себя добавление или обновление конфигурационных файлов в [.filename]#/etc#, [.filename]#/var#, [.filename]#/usr# и некоторых других каталогах. Следующим шагом является выполнение первоначального обновления файлов конфигурации в [.filename]#/etc# для подготовки к новому миру. Следующая команда ограничивается сравнением файлов, необходимых для успешного выполнения цели `installworld`. В частности, на этом шаге могут быть добавлены новые пользовательские группы, служебные учётные записи и сценарии автозапуска, которые были добавлены во FreeBSD со времени последнего обновления. Это необходимо для их использования при выполнении шага `installworld`. Смотрите <<mergemaster>> для получения более подробных инструкций по этой команде:
++
+[source,bash]
+....
+# mergemaster -p
+....
++
+. Установите новый мир и служебные исполняемые файлы, находящиеся в [.filename]#/usr/obj#.
++
+[source,bash]
+....
+# cd /usr/src
+# make installworld
+....
++
+. Обновите остальные файлы конфигурации.
++
+[source,bash]
+....
+# mergemaster -iF
+....
++
+. Удалите устаревшие файлы. Это важно, так как в противном случае они могут вызвать проблемы.
++
+[source,bash]
+....
+# make delete-old
+....
++
+. Теперь нужна полная перезагрузка системы для того, чтобы загрузить новое ядро и мир с использованием новых конфигурационных файлов.
++
+[source,bash]
+....
+# reboot
+....
++
+. Убедитесь, что перед удалением старых версий библиотек все установленные порты были пересобраны согласно инструкциям в crossref:ports[ports-upgrading,Обновление портов]. По завершению удалите все старые библиотеки во избежание конфликтов с их новыми версиями. За подробным описанием этого шага обратитесь к <<make-delete-old>>.
++
+[source,bash]
+....
+# make delete-old-libs
+....
+====
+
+Если для системы доступно окно обслуживания, обдумайте возможность компиляции системы в однопользовательском режиме вместо использования для этого многопользовательского режима с переводом в однопользовательский режим для установки. Переустановка системы затрагивает множество важных системных файлов, все стандартные системные исполняемые файлы, библиотеки и заголовочные файлы. Замена этих файлов на работающей системе (в частности, используемых в данный момент пользователями) может привести к неприятностям.
+
+[[src-updating]]
+=== Файлы конфигурации
+
+В процессе построения мира используется несколько файлов конфигурации.
+
+[.filename]#Makefile#, расположенный в [.filename]#/usr/src#, описывает правила и порядок построения программ, составляющих FreeBSD.
+
+В man:make.conf[5] описаны параметры, доступные для `make`, а также несколько общих примеров имеется в [.filename]#/usr/shared/examples/etc/make.conf#. Добавляемые в [.filename]#/etc/make.conf# параметры определяют поведение `make` при построении программ. Эти параметры действуют при каждом использовании `make`, включая компиляцию приложений из Коллекции Портов, компиляцию собственных программ на Си и построение операционной системы FreeBSD. Изменение некоторых настроек может иметь далекоидущие и порой неожиданные последствия. Прочтите комментарии в обоих местах и примите к сведению, что значения по умолчанию были выбраны как компромисс между производительностью и надёжностью.
+
+Поведение при сборке операционной системы из исходных текстов задаётся в [.filename]#/etc/src.conf#. В отличие от [.filename]#/etc/make.conf#, содержимое [.filename]#/etc/src.conf# влияет только на сборку самой операционной системы FreeBSD. Описание многих параметров, доступных в этом файле, имеется в man:src.conf[5]. Будьте осторожны при выключении на первый взгляд ненужных модулей ядра или параметров сборки. Иногда между ними имеются неожиданные или неочевидные взаимозависимости.
+
+[[make-buildworld]]
+=== Переменные и цели выполнения
+
+Общий формат использования `make`:
+
+[source,bash]
+....
+# make -x -DVARIABLE target
+....
+
+В этом примере параметр `-_x_` передаётся `make`. Обратитесь к странице Справочника man:make[1] для получения примеров использования имеющихся параметров.
+
+Чтобы передать переменную, укажите её имя с использованием `-D_VARIABLE_`. Поведение [.filename]#Makefile# зависит от переменных. Они могут быть заданы в [.filename]#/etc/make.conf# или указаны при использовании `make`. Например, эта переменная указывает, что библиотеки для профилирования собирать не нужно:
+
+[source,bash]
+....
+# make -DNO_PROFILE target
+....
+
+Это соответствует настройке в [.filename]#/etc/make.conf#:
+
+[.programlisting]
+....
+NO_PROFILE= true # Обход построения библиотек для профилирования
+....
+
+_target_ указывает программе `make` на то, что нужно сделать, а [.filename]#Makefile# определяет доступные цели. Некоторые цели используются в процессе построения для разбиения его на этапы.
+
+Разделение опций удобно по двум причинам. Во-первых, это позволяет выполнять сборку, не затрагивая компоненты рабочей системы. По этой причине можно спокойно запустить `buildworld` на машине, работающей в многопользовательском режиме. Но цель `installworld` всё же рекомендуется запускать в однопользовательском режиме.
+
+Во-вторых, это позволяет использовать монтирование по NFS для обновления многих машин по сети согласно описанию в <<small-lan>>.
+
+Параметр `-j` приводит к запуску нескольких одновременно работающих процессов `make`. Поскольку процесс компиляции больше всего требователен к подсистеме ввода/вывода, а не к производительности процессора, это можно использовать и на машинах с одним процессором.
+
+Используйте следующую команду на машине с одним CPU, чтобы иметь до 4 одновременно работающих процессов. Опубликованные в списке рассылки практические замеры показывают, что в среднем это даёт наибольший выигрыш в производительности.
+
+[source,bash]
+....
+# make -j4 buildworld
+....
+
+На многопроцессорной машине попробуйте подобрать значение между `6` и `10`, и посмотрите, как это отразится на скорости работы.
+
+[NOTE]
+====
+Если при выполнении команды `make buildworld` были заданы значения каких-либо переменных, то при выполнении `make installworld` нужно задать те же самые переменные. При этом `-j` _нельзя_ использовать совместно с `installworld`.
+
+Например, если выполнялась эта команда:
+
+[source,bash]
+....
+# make -DNO_PROFILE buildworld
+....
+
+то результат её выполнения должен устанавливаться командой:
+
+[source,bash]
+....
+# make -DNO_PROFILE installworld
+....
+
+В противном случае вторая команда попытается установить библиотеки для профилирования, которые не компилировались на этапе выполнения команды `make buildworld`.
+====
+
+[[mergemaster]]
+=== Объединение файлов конфигурации
+
+FreeBSD предоставляет утилиту man:mergemaster[8], которая является скриптом для оболочки Боурна и предназначена для определения разницы между конфигурационными файлами в каталоге [.filename]#/etc# и конфигурационными файлами из дерева исходных текстов [.filename]#/usr/src/etc#. Это является рекомендуемым способом синхронизации системных конфигурационных файлов с теми, что размещены в дереве исходных текстов.
+
+Перед использованием `mergemaster` рекомендуется скопировать имеющийся каталог [.filename]#/etc# в какое-нибудь безопасное место. `-R` задает выполнение рекурсивного копирования, а `-p` сохраняет даты и владельца файлов:
+
+[source,bash]
+....
+# cp -Rp /etc /etc.old
+....
+
+При запуске `mergemaster` строит временное корневое окружение, начиная с [.filename]#/#, и заполняет его различными системными конфигурационными файлами. Затем эти файлы сравниваются с текущими установленными в системе. Файлы, которые имеют отличия, будут выданы в формате man:diff[1], где знак `+` означает добавленные или изменённые строки, а знак `-` означает строки, которые будут либо полностью удалены, либо заменены на новый файл. Обратитесь к страницам справочной системы по команде man:diff[1] для получения более полной информации о формате выдачи отличий в файлах.
+
+Затем `mergemaster` выдаст каждый файл, в котором есть изменения, с вариантами действий: удалить новый файл, упоминаемый здесь как временный, установить временный файл в его неизменённом виде, объединить временный файл с установленным на данный момент, либо просмотреть результат ещё раз.
+
+Выбор удаления временного файла укажет `mergemaster` оставить текущий файл без изменений и удалить его новую версию. Делать это не рекомендуется. Чтобы получить помощь в любое время, наберите kbd:[?] в приглашении `mergemaster`. Если пользователь выбирает пропуск файла, запрос появится снова, после того как будут обработаны все остальные файлы.
+
+Выбор установки немодифицированного временного файла приведёт к замене текущего файла новым. Для большинства немодифицированных файлов это является подходящим вариантом.
+
+Выбор варианта с объединением файла приведёт к вызову текстового редактора, содержащего текст обоих файлов. Файлы можно объединить, просматривая оба файла на экране и выбирая те части из обоих, которые подходят для окончательного варианта. При сравнении файлов нажатие kbd:[l] выбирает содержимое слева, нажатие kbd:[r] выбирает содержимое справа. В окончательном варианте будет файл, состоящий из обеих частей, который и будет установлен. Этот вариант обычно используется для файлов, настройки в которых изменялись пользователем.
+
+Выбор повторного просмотра результатов выдаст разницу между файлами.
+
+После того как утилита `mergemaster` закончит работу с системными файлами, она выдаст запрос относительно других параметров. Она может запросить перестроение файла паролей и завершится запросом на удаление оставшихся временных файлов.
+
+[[make-delete-old]]
+=== Удаление устаревших файлов и библиотек
+
+В ходе жизненного цикла разработки FreeBSD файлы с их содержимым иногда становятся устаревшими. Это может быть вызвано тем, что функциональность реализуется в другом месте, сменился номер версии библиотеки или файл был целиком удалён из системы. Такие устаревшие файлы, библиотеки и каталоги следует удалять вместе с обновлением системы. Это не даст захламить систему старыми файлами, которые занимают место на диске и на архивных носителях. Кроме того, если в старой библиотеке имеется проблема безопасности или стабильности, такую систему следует обновить до более новой библиотеки, чтобы предотвратить крахи, вызванные работой старой версии. Файлы, каталоги и библиотеки, которые признаны устаревшими, перечислены в [.filename]#/usr/src/ObsoleteFiles.inc#. Для удаления устаревших файлов в процессе обновления системы следует пользоваться следующими инструкциями.
+
+После выполнения `make installworld` и последующего `mergemaster` проверьте наличие устаревших файлов и библиотек:
+
+[source,bash]
+....
+# cd /usr/src
+# make check-old
+....
+
+Если были найдены какие-либо устаревшие файлы, их можно удалить с помощью следующей команды:
+
+[source,bash]
+....
+# make delete-old
+....
+
+Перед удалением каждого устаревшего файла запрашивается подтверждение. Используйте `BATCH_DELETE_OLD_FILES`, чтобы сократить этот процесс и позволить системе удалить эти файлы автоматически:
+
+[source,bash]
+....
+# make -DBATCH_DELETE_OLD_FILES delete-old
+....
+
+Аналогичного эффекта можно достичь, пропустив эти команды через `yes`:
+
+[source,bash]
+....
+# yes|make delete-old
+....
+
+.Предупреждение
+[WARNING]
+====
+
+Удаление устаревших файлов приведёт к нарушению работы программ, которые всё ещё зависят от этих устаревших файлов. Это особенно верно для старых библиотек. В большинстве случаев программы, порты или библиотеки, использующие такую старую библиотеку, нужно перекомпилировать перед выполнением `make delete-old-libs`.
+====
+
+Программы для проверки наличия зависимостей от совместно используемых библиотек включают в себя package:sysutils/libchk[] и package:sysutils/bsdadminscripts[].
+
+Устаревшие совместно используемые библиотеки могут конфликтовать с более новыми библиотеками, что приводит к сообщениям следующего вида:
+
+[source,bash]
+....
+/usr/bin/ld: warning: libz.so.4, needed by /usr/local/lib/libtiff.so, may conflict with libz.so.5
+/usr/bin/ld: warning: librpcsvc.so.4, needed by /usr/local/lib/libXext.so, may conflict with librpcsvc.so.5
+....
+
+Для решения этих проблем выясните, какой именно порт установил данную библиотеку:
+
+[source,bash]
+....
+# pkg which /usr/local/lib/libtiff.so
+ /usr/local/lib/libtiff.so was installed by package tiff-3.9.4
+# pkg which /usr/local/lib/libXext.so
+ /usr/local/lib/libXext.so was installed by package libXext-1.1.1,1
+....
+
+Затем данный порт нужно удалить, пересобрать и переустановить. Для автоматизации этого процесса можно использовать package:ports-mgmt/portmaster[]. После того как все порты пересобраны и более не используют старые библиотеки, удалите эти старые библиотеки с помощью следующей команды:
+
+[source,bash]
+....
+# make delete-old-libs
+....
+
+Если что-то работает неправильно, можно с лёгкостью перестроить конкретную часть системы. Например, если файл [.filename]#/etc/magic# был случайно удалён в процессе обновления или переноса [.filename]#/etc#, то команда `file` перестанет работать. В таком случае это можно исправить вот так:
+
+[source,bash]
+....
+# cd /usr/src/usr.bin/file
+# make all install
+....
+
+[[updating-questions]]
+=== Вопросы общего характера
+
+Нужно ли полностью перестраивать систему при каждом изменении?::
+Это зависит от характера изменения. Например, если svn показывает, что с момента последнего запуска были изменены только следующие файлы:
++
+[source,bash]
+....
+src/games/cribbage/instr.c
+src/games/sail/pl_main.c
+src/release/sysinstall/config.c
+src/release/sysinstall/media.c
+src/shared/mk/bsd.port.mk
+....
++
+то перестраивать всю систему возможно незачем. Вместо этого можно перейти в соответствующие подкаталоги и выдать команду `make all install`. Однако если меняется что-то важное, например, [.filename]#src/lib/libc/stdlib#, то вы должны перестроить всю систему.
++
+Некоторые пользователи перестраивают систему каждые две недели, позволяя изменениям накопиться за это время. Другие перестраивают только те вещи, которые менялись, и внимательно отслеживают все зависимости. Всё это зависит от того, как часто пользователь хочет делать обновление и отслеживает ли он FreeBSD-STABLE или FreeBSD-CURRENT.
+
+Почему прерывается компиляция с большим количеством ошибок по сигналу 11 (или с другим номером сигнала)?::
+Как правило, это говорит о проблемах с оборудованием. Построение системы является эффективным стресс-тестом для оборудования, в особенности памяти. Явным указателем на это является то, что при перезапуске make процедура построения прекращается в различные моменты времени.
++
+Для исправления этой ошибки попробуйте заменить комплектующие машины, начиная с оперативной памяти, для определения сбоящей компоненты.
+
+Можно ли удалить [.filename]#/usr/obj# после окончания?::
+В этом каталоге содержатся все объектные файлы, которые создаются во время фазы компиляции. Обычно одним из первых шагов в процессе `make buildworld` является удаление этого каталога, чтобы начать заново. Сохранение [.filename]#/usr/obj# после окончания имеет мало смысла, а его удаление освободит приблизительно 2 ГБ дискового пространства.
+
+Могут ли быть продолжены прерванные процессы построения?::
+Это зависит от того, насколько далеко зашел процесс построения перед тем, как была обнаружена проблема. В общем случае процесс `make buildworld` строит новые копии необходимых инструментальных средств и системные библиотеки. Затем эти средства и библиотеки устанавливаются. Новые инструментальные средства и библиотеки затем используются для перестроения самих себя и повторно устанавливаются. Система в целом теперь перестраивается с новыми системными файлами.
++
+На последней стадии выполнение этих команд является достаточно безопасным, поскольку они не отменяют работу предыдущего `make buildworld`:
++
+[source,bash]
+....
+# cd /usr/src
+# make -DNO_CLEAN all
+....
++
+Если в выводе `make buildworld` появляется такое сообщение:
++
+[source,bash]
+....
+--------------------------------------------------------------
+Building everything..
+--------------------------------------------------------------
+....
++
+то делать так вероятно достаточно безопасно.
++
+Если такое сообщение не выводится, всегда лучше подстраховаться и запустить сборку с самого начала.
+
+Можно ли ускорить сборку мира?::
+Ускорить процесс сборки мира может несколько действий. Например, весь процесс можно выполнять в однопользовательском режиме. Однако, это не позволит пользователям иметь доступ к системе, пока этот процесс не завершится.
++
+Тщательный подход к проектированию файловой системы или использование датасетов ZFS позволит почувствовать разницу. Задумайтесь о размещении [.filename]#/usr/src# и [.filename]#/usr/obj# на различных файловых системах. По возможности размещайте файловые системы на различных дисках и дисковых контроллерах. При монтировании [.filename]#/usr/src# используйте параметр `noatime`, который отключает запись информации о времени доступа к файлу. Если [.filename]#/usr/src# не расположен на собственной файловой системе, подумайте о перемонтировании [.filename]#/usr# с `noatime`.
++
+Файловая система, на которой располагается [.filename]#/usr/obj#, может быть смонтирована (или перемонтирована) с параметром `async`. Это приведёт к тому, что операции записи на диск будут выполняться асинхронно. Другими словами, запись будет завершаться немедленно, но данные записываться на диск несколькими секундами позже. Это позволит объединять операции записи и приведёт к значительному приросту производительности.
++
+Файловую систему с [.filename]#/usr/obj# можно смонтировать с `async` для записи на диск в асинхронном режиме. В этом случае операции записи завершаются мгновенно, а сами данные записываются на диск через несколько секунд. Это позволяет писать кластеризованно, что может дать значительный прирост производительности.
++
+[WARNING]
+====
+
+Имейте в виду, что эта опция делает вашу файловую систему менее устойчивой. С этой опцией имеется больше шансов, что при перезагрузке машины после неожиданного сбоя при пропадании напряжения файловая система окажется в невосстановимом состоянии.
+
+Если каталог [.filename]#/usr/obj# - это всё, что есть на этой файловой системе, то это не проблема. Если на той же самой файловой системе имеются какие-то важные данные, то проверьте давность ваших резервных копий перед включением этой опции.
+====
++
+Выключите генерацию профилирующего кода, установив "NO_PROFILE=true" в файле [.filename]#/etc/make.conf#.
++
+Передайте утилите man:make[1] параметр `-j__n__` для запуска параллельно нескольких процессов. Обычно это помогает вне зависимости от того, сколько процессоров установлено в машине.
+
+Что делать, если что-то пошло не так?::
+Скрупулезно проверьте, чтобы в вашем окружении не было мешающих остатков от предыдущих построений:
++
+[source,bash]
+....
+# chflags -R noschg /usr/obj/usr
+# rm -rf /usr/obj/usr
+# cd /usr/src
+# make cleandir
+# make cleandir
+....
++
+Да, команду `make cleandir` действительно нужно выполнять дважды.
++
+После этого повторите весь процесс снова, начиная с `make buildworld`.
++
+Если у вас всё ещё есть проблемы, пришлите текст ошибки и вывод команды `uname -a` в {freebsd-questions}. Будьте готовы ответить на другие вопросы о конфигурации вашей системы!
+
+[[small-lan]]
+== Отслеживание исходных текстов для нескольких машин
+
+Если нужно отслеживать одно и то же дерево исходных текстов на множестве машин, то загрузка кода и полное перестроение системы на каждой из них выглядит как ненужная трата ресурсов: дискового пространства, пропускной способности сети и процессорного времени. Решением является выделение одной машины, которая выполняет основной объём работы, в то время как остальные используют результаты работы посредством NFS. В этом разделе описывается именно этот метод. Для получения информации об использовании NFS обращайтесь в crossref:network-servers[network-nfs,Network File System (NFS)].
+
+Первым делом определите набор машин, на которых будет выполняться единый набор программ, который мы будем называть _набором для построения_. Каждая машина может иметь собственное уникальное ядро, но они будут работать с одними и теми же программами пользователя. Из этого набора выберите машину, которая будет являться _машиной построения_, на которой будут строиться ядро и всё окружение. В идеальном случае это быстрая машина с достаточно незагруженным CPU для выполнения команд `make buildworld` и `make buildkernel`.
+
+Выберите _тестовую машину_, которая будет выполнять проверку обновлений программного обеспечения, прежде чем они пойдут в работу. Это _должна_ быть машина, которая может находиться в нерабочем состоянии достаточно долго. Это также может быть машина построения, но не обязательно.
+
+Всем машинам в этом наборе для построения нужно смонтировать [.filename]#/usr/obj# и [.filename]#/usr/src# по NFS с машины построения. В случае нескольких наборов для построения каталог [.filename]#/usr/src# должен находиться на одной машине построения и монтироваться на остальных по NFS.
+
+Удостоверьтесь, что [.filename]#/etc/make.conf# и [.filename]#/etc/src.conf# на всех машинах в заданном наборе для построения согласуются с машиной построения. Это означает, что машина построения должна строить все те части базовой системы, которые будут устанавливаться на каждой машине из набора для построения. Кроме того, у каждой машины построения должно быть задано имя ядра в переменной `KERNCONF` в [.filename]#/etc/make.conf#, и машина построения должна перечислить их все в переменной `KERNCONF`, причём первым должно идти имя её собственного ядра. Машина построения должна хранить конфигурационные файлы ядра каждой машины в каталоге [.filename]#/usr/src/sys/arch/conf#.
+
+Постройте ядро и всё окружение на машине построения так, как это описано в <<make-buildworld>>, но ничего не устанавливайте на самой машине. Вместо этого, установите собранное ядро на тестовой машине. Для этого смонтируйте [.filename]#/usr/src# и [.filename]#/usr/obj# по NFS. Затем выполните команду `shutdown now` для перехода в однопользовательский режим, для того чтобы установить новое ядро и всё окружение, после чего выполните команду `mergemaster` обычным образом. После этих действий перезагрузитесь для возврата к обычному режиму работы в многопользовательском режиме.
+
+После того, как вы убедитесь в нормальной работе всего на тестовой машине, проведите эту процедуру для установки нового программного обеспечения на каждой из оставшихся машин в наборе для построения.
+
+Такой же подход можно использовать и для дерева портов. Сперва нужно смонтировать [.filename]#/usr/ports# по NFS на всех машинах в наборе для построения. Чтобы настроить [.filename]#/etc/make.conf# для использования общего каталога с дистрибутивными файлами, задайте переменную `DISTDIR` так, чтобы она указывала на общедоступный каталог, доступный для записи тому пользователю, который отображается в пользователя `root` для точек монтирования NFS. Каждая машина должна задавать `WRKDIRPREFIX` так, чтобы она указывала на локальный каталог, если порты будут собираться локально. Если же пакеты будут распространяться, задайте на машине построения переменную `PACKAGES`, чтобы она указывала на каталог, соответствующий `DISTDIR`.
diff --git a/documentation/content/ru/books/handbook/desktop/_index.adoc b/documentation/content/ru/books/handbook/desktop/_index.adoc
new file mode 100644
index 0000000000..e7a9f27c41
--- /dev/null
+++ b/documentation/content/ru/books/handbook/desktop/_index.adoc
@@ -0,0 +1,659 @@
+---
+title: Глава 7. Приложения для настольного компьютера
+part: Часть II. Общие задачи
+prev: books/handbook/partii
+next: books/handbook/multimedia
+---
+
+[[desktop]]
+= Приложения для настольного компьютера
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 7
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/desktop/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/desktop/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/desktop/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[desktop-synopsis]]
+== Краткий обзор
+
+FreeBSD может работать с широким кругом приложений для настольного компьютера (десктопа), таких как браузеры и текстовые процессоры. Большинство из них доступны в качестве пакетов или могут быть автоматически собраны из коллекции портов. Многим новым пользователям хотелось бы видеть эти приложения на своем компьютере. В этой главе показано как без усилий установить некоторые популярные приложения для настольного компьютера из пакетов или из коллекции портов.
+
+Обратите внимание, что при установке программ из портов они компилируются из исходных текстов. Это может занять очень много времени, в зависимости от того, что вы собираете, и от скорости процессора вашего компьютера (компьютеров). Большинство программ, имеющихся в коллекции портов, могут быть установлены из прекомпилированных пакетов, если сборка из исходных текстов занимает недопустимо много времени.
+
+Поскольку FreeBSD обеспечивает двоичную совместимость с Linux, многие приложения, первоначально разработанные для Linux, доступны и на вашем компьютере. Настоятельно рекомендуется прочитать crossref:linuxemu[linuxemu, Двоичная совместимость с Linux] перед установкой любого из приложений Linux. Названия многих портов, использующих двоичную совместимость с Linux, начинаются с "linux-". Помните это при поиске отдельного порта, например с помощью man:whereis[1]. Далее в статье подразумевается, что вы включили бинарную совместимость с Linux перед установкой какого-либо приложения Linux.
+
+Вот несколько категорий, о которых пойдет речь в этой главе:
+
+* Браузеры (такие как Mozilla, Opera, Firefox, Konqueror)
+* Бизнес приложения (такие как KOffice, AbiWord, GIMP, OpenOffice.org)
+* Программы просмотра документов (такие как Acrobat Reader(R), gv, Xpdf, GQview)
+* Финансовые программы (такие как GnuCash, Gnumeric, Abacus)
+
+Перед прочтением этой главы вам потребуется:
+
+* Узнать, как устанавливать дополнительные программы сторонних производителей (crossref:ports[ports, Установка приложений. порты и пакеты]).
+* Узнать, как устанавливать программы Linux (crossref:linuxemu[linuxemu, Двоичная совместимость с Linux]).
+
+Чтобы получить дополнительную информацию о настройке мультимедиа среды, прочтите crossref:multimedia[multimedia, Мультимедиа]. Если вам нужна электронная почта, обратитесь к crossref:mail[mail, Электронная почта].
+
+[[desktop-browsers]]
+== Браузеры
+
+FreeBSD поставляется без предустановленного браузера. Вместо этого, в категории http://www.FreeBSD.org/ru/ports/[www] коллекции портов содержится множество готовых к установке браузеров. Если у вас нет времени компилировать все (в некоторых случаях это может занять очень много времени), многие из них доступны в виде пакетов.
+
+В KDE и GNOME уже есть HTML браузеры. Обратитесь к crossref:x11[x11-wm,Графические оболочки] за подробной информацией об установке этих полноценных десктопов.
+
+Если вы ищете облегченный браузер, попробуйте package:www/dillo[], package:www/links[], или package:www/w3m[] из коллекции портов.
+
+Этот раздел рассказывает о следующих приложениях:
+
+[.informaltable]
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Название приложения
+| Потребность в ресурсах
+| Установка из портов
+| Основные зависимости
+
+|Mozilla
+|большая
+|тяжелая
+|Gtk+
+
+|Opera
+|малая
+|легкая
+|Доступны версии для FreeBSD и Linux. Для Linux версии необходимо наличие Linux Binary Compatibility и linux-openmotif
+
+|Firefox
+|средняя
+|тяжелая
+|Gtk+
+
+|Konqueror
+|средняя
+|тяжелая
+|Библиотеки KDE
+|===
+
+=== Mozilla
+
+Mozilla это наиболее современный и стабильный браузер; он полностью портирован на FreeBSD. Его достоинство в высокой совместимости со стандартами HTML. В нем есть почтовая и новостная программы. В нем даже найдется редактор HTML, если вам потребуется самостоятельно написать несколько веб-страничек. Пользователи man:getenv[3] найдут общие черты с Communicator, поскольку оба браузера имеют одну основу.
+
+На медленных компьютерах с частотой CPU меньше 233MHz или с памятью меньше 64MB, Mozilla требует слишком много ресурсов, чтобы быть удобной в использовании. Вместо нее вы можете обратить внимание на браузер Opera, описанный ниже в этой главе.
+
+Если вы не можете или не хотите компилировать Mozilla по какой-то причине, команда FreeBSD GNOME уже сделала это для вас. Просто установите пакет из сети с помощью:
+
+[source,bash]
+....
+# pkg_add -r mozilla
+....
+
+Если пакет недоступен, но у вас достаточно времени и места на диске, вы можете скачать исходные тексты для Mozilla, скомпилировать их и установить в вашу систему. Это делается так:
+
+[source,bash]
+....
+# cd /usr/ports/www/mozilla
+# make install clean
+....
+
+Порт Mozilla проверяет правильность установки путем запуска регистрации chrome с привилегиями пользователя `root`. Если вы хотите загрузить некоторые дополнения, например курсоры мыши, потребуется запустить Mozilla под `root` для их правильной установки.
+
+После завершения установки Mozilla, больше не требуется работать под `root`. Вы можете запустить Mozilla в качестве браузера, набрав:
+
+[source,bash]
+....
+% mozilla
+....
+
+Вы можете также запустить непосредственно программу чтения почты и новостей, как показано ниже:
+
+[source,bash]
+....
+% mozilla -mail
+....
+
+[[moz-java-plugin]]
+=== Mozilla и Java(TM)
+
+Установка Mozilla проста, но к сожалению, установка Mozilla с поддержкой дополнений, таких как Java(TM) и Macromedia(R) Flash(TM) отнимает и время и место на диске.
+
+Первое, что нужно сделать - загрузить файлы, которые будут использоваться с Mozilla. Зайдите с помощью имеющегося веб браузера на http://www.sun.com/software/java2/download.html[http://www.sun.com/software/java2/download.html] и создайте учетную запись на этом веб-сайте. Сохраните имя пользователя и пароль, они могут понадобиться в будущем. Загрузите копию файлов [.filename]#jdk-1_5_0-bin-scsl.zip# (JDK 5.0 SCSL Binaries) и [.filename]#jdk-1_5_0-src-scsl.zip# (JDK 5.0 SCSL Source) и поместите их в каталог [.filename]#/usr/ports/distfiles#, поскольку порт не может загрузить их автоматически в связи с лицензионными ограничениями. Загрузите с этого же сайта "java environment", http://javashoplm.sun.com/ECom/docs/Welcome.jsp?StoreId=22&PartDetailId=j2sdk-1.4.2_08-oth-JPR&SiteId=JSC&TransactionId=noreg[http://javashoplm.sun.com/ECom/docs/Welcome.jsp?StoreId=22&PartDetailId=j2sdk-1.4.2_08-oth-JPR&SiteId=JSC&TransactionId=noreg], файл [.filename]#j2sdk-1_4_2_08-linux-i586.bin#. Как и предыдущий, этот файл должен находиться в каталоге [.filename]#/usr/ports/distfiles/#. Загрузите копию "java patchkit" с http://www.eyesbeyond.com/freebsddom/java/jdk15.html[http://www.eyesbeyond.com/freebsddom/java/jdk15.html] и поместите ее в [.filename]#/usr/ports/distfiles/#. Наконец, установите порт package:java/jdk15[] при помощи стандартной команды `make install clean`.
+
+Запустите Mozilla и выберите пункт [.guimenuitem]#About Plug-ins# в меню menu:Help[]. В списке установленных плагинов должен присутствовать плагин Java(TM).
+
+[[moz-flash-plugin]]
+=== Mozilla и Macromedia(R) Flash(TM) plugin
+
+Плагина Macromedia(R) Flash(TM) для FreeBSD не существует. Тем не менее, есть решение (обертка, wrapper) для запуска плагина для Linux. Это решение также поддерживает плагины для Adobe(R) Acrobat(R), RealPlayer и других.
+
+Установите порт package:www/linuxpluginwrapper[]. Он требует для работы достаточно большого порта package:emulators/linux_base[]. Следуя инструкциям, исправьте файл [.filename]#/etc/libmap.conf#! Примеры конфигураций вы можете найти в каталоге [.filename]#/usr/local/shared/examples/linuxpluginwrapper/#.
+
+Установите порт package:www/mozilla[], если Mozilla еще не установлена.
+
+Теперь просто запустите Mozilla:
+
+[source,bash]
+....
+% mozilla &
+....
+
+И войдите в пункт [.guimenuitem]#About Plug-ins# меню menu:Help[]. Должен появиться список со всеми доступными плагинами.
+
+[NOTE]
+====
+Плагин linuxpluginwrapper работает только на архитектуре i386(TM).
+====
+
+=== Opera
+
+Opera это очень быстрый, полноценный и совместимый со стандартами браузер. Он также идет в комплекте с почтовой и новостной программами, клиентом IRC, модулем чтения RSS/Atom и другими. Несмотря на все это, браузер Opera относительно легок и быстр. Он поставляется в двух вариантах: "родная" для FreeBSD версия и версия, запускаемая в режиме эмуляции Linux.
+
+Для работы в сети с помощью FreeBSD версии Opera установите пакет:
+
+[source,bash]
+....
+# pkg_add -r opera
+....
+
+На некоторых серверах FTP нет всех пакетов, но те же результаты можно получить с помощью коллекции портов, набрав:
+
+[source,bash]
+....
+# cd /usr/ports/www/opera
+# make install clean
+....
+
+Для установки Linux версии Opera, замените `opera` на `linux-opera` в примере выше. Версия для Linux полезна в ситуации, когда требуются плагины, доступные только для Linux, такие как Adobe Acrobat Reader(R). Во всех других отношениях версии для FreeBSD и Linux являются функционально идентичными.
+
+=== Firefox
+
+Firefox это браузер следующего поколения, основанный на коде Mozilla. Mozilla это полный набор приложений, таких как браузер, почтовый клиент, чат клиент и многое другое. Firefox это всего лишь браузер, что делает его меньше и быстрее.
+
+Установите пакет, выполнив:
+
+[source,bash]
+....
+# pkg_add -r firefox
+....
+
+Вы можете также использовать коллекцию портов, если предпочитаете сборку из исходных текстов:
+
+[source,bash]
+....
+# cd /usr/ports/www/firefox
+# make install clean
+....
+
+=== Konqueror
+
+Konqueror это часть KDE, но может быть использован и отдельно от KDE, путем установки package:x11/kdebase3[]. Konqueror это гораздо больше чем просто браузер, это также менеджер файлов и программа просмотра мультимедиа.
+
+Konqueror поставляется с набором плагинов, доступных из package:misc/konq-plugins[].
+
+Konqueror поддерживает также Flash(TM), документация How To для него доступна по адресу http://freebsd.kde.org/howto.php[http://freebsd.kde.org/howto.php].
+
+[[desktop-productivity]]
+== Бизнес приложения
+
+В начале работы новые пользователи зачастую стремятся найти хороший офисный пакет или удобный текстовый процессор. Хотя некоторые crossref:x11[x11-wm,десктопы], такие как KDE, поставляются с готовым офисным пакетом, приложения по умолчанию не существует. В FreeBSD есть все необходимое, кроме графической среды.
+
+Этот раздел описывает следующие приложения:
+
+[.informaltable]
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Название приложения
+| Потребность в ресурсах
+| Установка из портов
+| Основные зависимости
+
+|KOffice
+|малая
+|тяжелая
+|KDE
+
+|AbiWord
+|малая
+|легкая
+|Gtk+ или GNOME
+
+|The Gimp
+|малая
+|тяжелая
+|Gtk+
+
+|OpenOffice.org
+|большая
+|очень тяжелая
+|JDK(TM) 1.4, Mozilla
+|===
+
+=== KOffice
+
+Сообщество KDE предоставляет графическую среду с офисным пакетом, который может быть использован вне KDE. Он включает четыре стандартных компонента, встречающиеся и в других офисных пакетах. Текстовый процессор KWord, программа электронных таблиц KSpread, KPresenter для создания презентаций и программа векторной графики Kontour.
+
+Перед установкой последней версии KOffice, убедитесь в наличии свежей версии KDE.
+
+Для установки KOffice из пакета, выполните следующую команду:
+
+[source,bash]
+....
+# pkg_add -r koffice
+....
+
+Если пакет недоступен, используйте коллекцию портов. Например, для установки KOffice для KDE3, выполните:
+
+[source,bash]
+....
+# cd /usr/ports/editors/koffice-kde3
+# make install clean
+....
+
+=== AbiWord
+
+AbiWord это свободно распространяемый текстовый процессор, по внешнему виду и поведению очень похожий на Microsoft(R) Word. Он подходит для набора документов, писем, отчетов, напоминаний и так далее. Он очень быстр, содержит много новшеств и очень удобен в использовании.
+
+AbiWord может импортировать и экспортировать множество файловых форматов, включая патентованный Microsoft [.filename]#.doc#.
+
+AbiWord доступен в виде пакета. Вы можете установить его так:
+
+[source,bash]
+....
+# pkg_add -r abiword
+....
+
+Если пакет недоступен, он может быть собран из коллекции портов, которая должна быть свежей. Это можно сделать командой:
+
+[source,bash]
+....
+# cd /usr/ports/editors/abiword
+# make install clean
+....
+
+=== GIMP
+
+Для создания и редактирования изображений есть продвинутая программа GIMP. Она может быть использована как простая программа рисования и как программа обработки фотографий. Поддерживается большое количество плагинов и предоставлен интерфейс для скриптов. GIMP может читать и записывать файлы многих форматов. Есть интерфейс со сканерами и планшетами.
+
+Вы можете установить пакет, выполнив эту команду:
+
+[source,bash]
+....
+# pkg_add -r gimp
+....
+
+Если на вашем сервере FTP нет этого пакета, вы можете использовать коллекцию портов. Категория http://www.FreeBSD.org/ru/ports/[graphics] коллекции портов содержит также раздел Руководство Gimp. Здесь показано, как его установить:
+
+[source,bash]
+....
+# cd /usr/ports/graphics/gimp
+# make install clean
+# cd /usr/ports/graphics/gimp-manual-pdf
+# make install clean
+....
+
+[NOTE]
+====
+Категория http://www.FreeBSD.org/ru/ports/[graphics] коллекции портов содержит версию GIMP для разработчиков в package:graphics/gimp-devel[]. HTML версия Руководства Gimp находятся в package:graphics/gimp-manual-html[].
+====
+
+=== OpenOffice.org
+
+OpenOffice.org включает все обязательные компоненты полноценного офисного пакета: текстовый процессор, программу электронных таблиц, программу управления презентациями и программу векторной графики. Интерфейс пользователя очень похож на другие офисные пакеты, возможен импорт и экспорт различных популярных файловых форматов. Приложение доступно в вариантах для множества разных языков, включая интерфейсы, проверку орфографии и словари.
+
+Текстовый процессор OpenOffice.org использует чистый XML формат файлов для увеличения переносимости и гибкости. Программа для работы с текстовыми таблицами предоставляет макроязык и может работать с внешними базами данных. OpenOffice.org уже стабильна и существует в версиях для Windows(R), Solaris(TM), Linux, FreeBSD, и Mac OS(R) X. Дополнительную информацию об OpenOffice.org можно найти на http://www.openoffice.org/[веб сайте OpenOffice.org]. Получить специфичную для FreeBSD информацию и загрузить пакеты можно с веб сайта команды портирования OpenOffice на FreeBSD (http://porting.openoffice.org/freebsd/[FreeBSD OpenOffice.org Porting Team]).
+
+Для установки OpenOffice.org, выполните:
+
+[source,bash]
+....
+# pkg_add -r openoffice
+....
+
+[NOTE]
+====
+Эта операция должна работать для любого релиза (-RELEASE) FreeBSD. Если вы используете иные версии (-STABLE, -CURRENT), нужный пакет может быть загружен с сайта группы поддержки OpenOffice.org и затем установлен при помощи man:pkg_add[1]. На сайте вы найдете как последний стабильный релиз, так и текущую версию, находящуюся в разработке.
+====
+
+После установки пакета просто наберите следующую команду для запуска OpenOffice.org:
+
+[source,bash]
+....
+% openoffice.org
+....
+
+[NOTE]
+====
+Во время первого запуска, вам будут заданы несколько вопросов и в вашей домашней директории будет создан каталог [.filename]#.openoffice.org2#.
+====
+
+Если пакеты OpenOffice.org недоступны, можно выбрать компиляцию порта. Однако, вы должны помнить, что это потребует много места на диске и компиляция будет довольно долгой.
+
+[source,bash]
+....
+# cd /usr/ports/editors/openoffice.org-2.0
+# make install clean
+....
+
+[NOTE]
+====
+Если вы хотите собрать локализованную версию, то вместо предыдущей командной строки используйте следующее:
+
+[source,bash]
+....
+# make LOCALIZED_LANG=your_language install clean
+....
+
+Вам следует изменить _your_language_ на корректный ISO код языка. Список поддерживаемых языковых кодов доступен в файле [.filename]#files/Makefile.localized#, расположенный в директории порта.
+====
+
+После того, как это было сделано OpenOffice.org может быть запущен командой:
+
+[source,bash]
+....
+% openoffice.org
+....
+
+[[desktop-viewers]]
+== Программы просмотра документов
+
+Некоторые новые форматы документов приобрели большую популярность. Стандартные программы для их просмотра могут отсутствовать в базовой системе. В этом разделе мы увидим, как их установить.
+
+В разделе говорится о следующих приложениях:
+
+[.informaltable]
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Название приложения
+| Потребность в ресурсах
+| Установка из портов
+| Основные зависимости
+
+|Acrobat Reader(R)
+|малая
+|легкая
+|Linux Binary Compatibility
+
+|gv
+|малая
+|легкая
+|Xaw3d
+
+|Xpdf
+|малая
+|легкая
+|FreeType
+
+|GQview
+|малая
+|легкая
+|Gtk+ или GNOME
+|===
+
+=== Acrobat Reader(R)
+
+Сейчас многие документы распространяются в формате PDF, аббревиатура для "Portable Document Format". Одна из рекомендованных программ для просмотра этого типа документов, это Acrobat Reader(R), выпущенный Adobe для Linux. Поскольку FreeBSD может запускать исполняемые файлы Linux, он доступен также и для FreeBSD.
+
+Для установки Acrobat Reader(R) 7 из Коллекции портов выполните:
+
+[source,bash]
+....
+# cd /usr/ports/print/acroread7
+# make install clean
+....
+
+Пакет acroread7 недоступен из-за лицензионных ограничений.
+
+=== gv
+
+gv это программа просмотра PostScript(R) и PDF. Она разработана на основе ghostview, но выглядит лучше благодаря библиотеке Xaw3d. Она быстра, а ее интерфейс несложен. У gv есть множество функций, таких как выбор ориентации, размера бумаги, масштаба и сглаживание. Почти любая операция может быть выполнена как с клавиатуры, так и мышью.
+
+Для установки gv из пакета, выполните:
+
+[source,bash]
+....
+# pkg_add -r gv
+....
+
+Если вы не можете получить пакет, используйте коллекцию портов:
+
+[source,bash]
+....
+# cd /usr/ports/print/gv
+# make install clean
+....
+
+=== Xpdf
+
+Если вам нужна небольшая программа просмотра PDF под FreeBSD, Xpdf это легкая и эффективная программа. Она требует очень небольшого количества ресурсов и очень стабильна. Используются стандартные шрифты X, Motif(R) или другие пакеты для X не нужны.
+
+Для установки пакета Xpdf, выполните эту команду:
+
+[source,bash]
+....
+# pkg_add -r xpdf
+....
+
+Если пакет недоступен, или вы предпочитаете коллекцию портов, выполните:
+
+[source,bash]
+....
+# cd /usr/ports/graphics/xpdf
+# make install clean
+....
+
+После завершения установки вы можете запустить Xpdf и использовать правую кнопку мыши для активации меню.
+
+=== GQview
+
+GQview это программа для работы с изображениями. Вы можете просмотреть файл одним кликом, запустить внешний редактор, получить миниатюры и многое другое. Еще в нем есть слайд-шоу и несколько основных файловых операций. Вы можете управлять коллекциями изображений и легко находить дубликаты. В GQview изображения можно просматривать во весь экран, его можно адаптировать к разным языкам.
+
+Если вы хотите установить пакет GQview, выполните:
+
+[source,bash]
+....
+# pkg_add -r gqview
+....
+
+Если пакет недоступен, или вы предпочитаете использовать коллекцию портов, выполните:
+
+[source,bash]
+....
+# cd /usr/ports/graphics/gqview
+# make install clean
+....
+
+[[desktop-finance]]
+== Финансовые программы
+
+Если по каким-то причинам вам нужно управлять своими финансами на десктопе FreeBSD, есть несколько мощных и простых в использовании приложений. Некоторые из них совместимы с широко распространенными форматами файлов, такими как документы Quicken или Excel.
+
+В этом разделе говорится о следующих приложениях:
+
+[.informaltable]
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Название приложения
+| Потребность в ресурсах
+| Установка из портов
+| Основные зависимости
+
+|GnuCash
+|малая
+|тяжелая
+|GNOME
+
+|Gnumeric
+|малая
+|тяжелая
+|GNOME
+
+|Abacus
+|малая
+|легкая
+|Tcl/Tk
+|===
+
+=== GnuCash
+
+GnuCash это часть проекта GNOME, который стремится предоставить дружественные к пользователю приложения с широким набором функций. С GnuCash вы можете отслеживать доходы и расходы, банковские счета или акции. Интуитивный интерфейс программы не мешает ей оставаться очень профессиональной.
+
+GnuCash предоставляет интеллектуальный журнал записей, иерархическую систему учетных записей, множество клавиатурных сокращений и метод автозавершения. Он может разбивать одну транзакцию на несколько частей, детализируя ее. GnuCash может импортировать и присоединять файлы Quicken QIF. Он также работает с основными международными форматами дат и валютами.
+
+Для установки GnuCash в вашу систему, выполните:
+
+[source,bash]
+....
+# pkg_add -r gnucash
+....
+
+Если пакет недоступен, вы можете использовать коллекцию портов:
+
+[source,bash]
+....
+# cd /usr/ports/finance/gnucash
+# make install clean
+....
+
+=== Gnumeric
+
+Gnumeric это электронная таблица, часть графической среды GNOME. Она использует удобное автоматическое "угадывание" ввода пользователя в зависимости от формата ячейки и систему автозаполнения для множества последовательностей. Она может импортировать файлы нескольких популярных форматов, таких как Excel, Lotus 1-2-3, или Quattro Pro. Gnumeric работает с диаграммами через package:math/guppi[]. В ней множество встроенных функций, можно использовать обычные форматы ячеек: число, валюта, дата, время и многие другие.
+
+Для установки Gnumeric из пакета, введите:
+
+[source,bash]
+....
+# pkg_add -r gnumeric
+....
+
+Если пакет недоступен, вы можете использовать коллекцию портов:
+
+[source,bash]
+....
+# cd /usr/ports/math/gnumeric
+# make install clean
+....
+
+=== Abacus
+
+Abacus это небольшая и простая в использовании программа электронных таблиц. В ней много встроенных функций из нескольких областей, таких как статистика, финансы и математика. Она может импортировать и экспортировать файлы Excel. Abacus также может печатать PostScript(R).
+
+Для установки Abacus из пакета, выполните:
+
+[source,bash]
+....
+# pkg_add -r abacus
+....
+
+Если пакет недоступен, вы можете использовать коллекцию портов, выполнив:
+
+[source,bash]
+....
+# cd /usr/ports/deskutils/abacus
+# make install clean
+....
+
+[[desktop-summary]]
+== Итоги
+
+Хотя FreeBSD популярна в основном среди провайдеров из-за стабильности и высокой производительности, на сегодняшний день она вполне готова к использованию в качестве десктопа. С несколькими тысячами приложений, доступных в виде http://www.FreeBSD.org/ru/where/[пакетов] или http://www.FreeBSD.org/ru/ports/[портов], вы можете создать прекрасный десктоп, отвечающий всем вашим потребностям.
+
+После первой установки десктопа, вы можете попробовать сделать шаг вперед с package:misc/instant-workstation[]. Этот "мета-порт" позволяет вам собрать типичный набор портов для рабочей станции. Вы можете настроить его, редактируя [.filename]#/usr/ports/misc/instant-workstation/Makefile#. Следуйте синтаксису существующего файла при добавлении и удалении портов, соберите порт как обычно. В конечном итоге, вы можете создать большой пакет, соответствующий вашему собственному десктопу, и установить его на другие рабочие станции!
+
+Вот небольшой обзор всех графических приложений, о которых говорилось в этой главе:
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Имя приложения
+| Имя пакета
+| Имя порта
+
+|Mozilla
+|`mozilla`
+|package:www/mozilla[]
+
+|Opera
+|`linux-opera`
+|package:www/linux-opera[]
+
+|Firefox
+|`firefox`
+|package:www/firefox[]
+
+|KOffice
+|`koffice-kde3`
+|package:editors/koffice-kde3[]
+
+|AbiWord
+|`abiword`
+|package:editors/abiword[]
+
+|The GIMP
+|`gimp`
+|package:graphics/gimp1[]
+
+|OpenOffice.org
+|`openoffice`
+|package:editors/openoffice[]
+
+|Acrobat Reader(R)
+|`acroread`
+|package:print/acroread7[]
+
+|gv
+|`gv`
+|package:print/gv[]
+
+|Xpdf
+|`xpdf`
+|package:graphics/xpdf[]
+
+|GQview
+|`gqview`
+|package:graphics/gqview[]
+
+|GnuCash
+|`gnucash`
+|package:finance/gnucash[]
+
+|Gnumeric
+|`gnumeric`
+|package:math/gnumeric[]
+
+|Abacus
+|`abacus`
+|package:deskutils/abacus[]
+|===
diff --git a/documentation/content/ru/books/handbook/disks/_index.adoc b/documentation/content/ru/books/handbook/disks/_index.adoc
new file mode 100644
index 0000000000..59b799a894
--- /dev/null
+++ b/documentation/content/ru/books/handbook/disks/_index.adoc
@@ -0,0 +1,2369 @@
+---
+title: Глава 17. Устройства хранения
+part: Часть III. Системное администрирование
+prev: books/handbook/audit
+next: books/handbook/geom
+---
+
+[[disks]]
+= Устройства хранения
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 17
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/disks/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/disks/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/disks/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[disks-synopsis]]
+== Краткий обзор
+
+В этой главе описывается использование дисков во FreeBSD. К ним относятся диски в памяти, диски, подключенные по сети, обычные устройства хранения SCSI/IDE и устройства, использующие интерфейс USB.
+
+После чтения этой главы вы будете знать:
+
+* Терминологию, используемую во FreeBSD для описания организации данных на физическом диске (разделы и слайсы).
+* Как добавить дополнительные винчестеры к вашей системе.
+* Как настроить FreeBSD для использования дисковых устройств USB.
+* Как настроить виртуальные файловые системы, такие, как диски в оперативной памяти.
+* Как использовать квоты для ограничения использования дискового пространства.
+* Как зашифровать диски, чтобы защитить их от взлома.
+* Как создавать и записывать CD и DVD во FreeBSD.
+* Различные варианты использования устройств хранения для резервных копий.
+* Как использовать программы резервного копирования, имеющиеся для FreeBSD.
+* Как выполнять резервное копирование на дискеты.
+* Что такое мгновенные копии файловых систем и как их эффективно использовать
+
+Перед прочтением этой главы вам потребуется:
+
+* Узнать как настраивать и устанавливать новое ядро FreeBSD (crossref:kernelconfig[kernelconfig, Настройка ядра FreeBSD]).
+
+[[disks-naming]]
+== Имена устройств
+
+Далее приводится список физических устройств хранения информации, которые поддерживаются во FreeBSD, и имена устройств, которые им соответствуют.
+
+[[disk-naming-physical-table]]
+.Соглашения по именованию физических дисков
+[cols="1,1", frame="none", options="header"]
+|===
+| Тип диска
+| Имя дискового устройства
+
+|Винчестеры IDE
+|`ad`
+
+|Приводы IDE CDROM
+|`acd`
+
+|Винчестеры SCSI и дисковые устройства USB
+|`da`
+
+|Приводы SCSI CDROM
+|`cd`
+
+|Различные нестандартные приводы CDROM
+|`mcd` для Mitsumi CD-ROM, `scd` для Sony CD-ROM
+
+|Дискеты
+|`fd`
+
+|Ленточные приводы SCSI
+|`sa`
+
+|Ленточные приводы IDE
+|`ast`
+
+|Флэш-диски
+|`fla` для флэш-устройств DiskOnChip(R)
+
+|Диски RAID
+|`aacd` для Adaptec(R) AdvancedRAID, `mlxd` и `mlyd` для Mylex(R), `amrd` для AMI MegaRAID(R), `idad` для Compaq Smart RAID, `twed` для 3ware(R) RAID.
+|===
+
+[[disks-adding]]
+== Добавление дисков
+
+В этом разделе будет описан процесс добавления нового SCSI диска на машину, имеющую в данный момент только один диск. Сначала выключим компьютер и установим диск в компьютер согласно инструкциям к компьютеру, контроллеру и от производителя диска. Из-за большого разнообразия этих процедур их рассмотрение выходит за рамки этого документа..
+
+Войдите в систему как пользователь `root`. После того, как вы установили диск, просмотрите файл [.filename]#/var/run/dmesg.boot#, чтобы убедиться, что новый диск был найден. Продолжая наш пример, только что добавленный диск будет называться [.filename]#da1# и мы хотим смонтировать его в каталог [.filename]#/1# (если вы добавляете диск IDE, то устройство будет называться [.filename]#ad1#).
+
+FreeBSD работает на IBM-PC совместимых компьютерах, поэтому она должна уметь работать с разделами PC BIOS. Однако они отличаются от традиционных разделов BSD. Диск ПК может иметь до четырёх записей разделов BIOS. Если диск на самом деле будет использоваться исключительно под FreeBSD, вы можете использовать режим _dedicated_. В противном случае FreeBSD будет располагаться в одном из разделов PC BIOS. Во FreeBSD разделы PC BIOS называются _слайсами_, чтобы не путать их с традиционными разделами BSD. Вы также можете использовать слайсы и с диском, предназначенным исключительно для FreeBSD, однако используемым в компьютере, на котором имеется дополнительная операционная система. Это является хорошим способом избежать путаницы в утилите `fdisk` других операционных систем, не связанных с FreeBSD.
+
+В случае слайсов диск будет добавлен как [.filename]#/dev/da1s1e#. Это интерпретируется следующим образом: диск SCSI, устройство номер 1 (второй диск SCSI), слайс 1 (раздел PC BIOS 1), и раздел BSD [.filename]#e#. В случае использования в выделенном режиме диск будет добавлен просто как [.filename]#/dev/da1e#.
+
+Вследствие использования 32-разрядных целых чисел для адресации секторов, man:bsdlabel[8] ограничен 2^32-1 секторами на диск, или 2TB в большинстве случаев. Формат man:fdisk[8] позволяет наличие первого сектора со смещением не более 2^32-1 и длину не более 2^32-1, что ограничивает размер раздела до 2TB, а размер диска до 4TB в большинстве случаев. Формат man:sunlabel[8] ограничен 2^32-1 секторами на раздел и 8 разделами, что составляет 16TB. Для дисков большего раздела могут быть использованы разделы man:gpt[8].
+
+=== Использование утилиты man:sysinstall[8]
+
+[.procedure]
+====
+. Использование Sysinstall
++
+Вы можете использовать простые меню утилиты `sysinstall` для разбиения на разделы и разметки нового диска. Войдите как пользователь `root` или воспользуйтесь командой `su`. Запустите команду `sysinstall` и войдите в меню `Configure`. Внутри `FreeBSD Configuration Menu`, пролистайте и выберите пункт `Fdisk`.
+. Редактор разделов fdisk
++
+При работе с утилитой fdisk нажатие kbd:[A] используется для выделения под FreeBSD полностью всего диска. Когда будет задан вопрос о том, хотите ли вы "сохранить совместимость с другими возможными операционными системами в будущем", ответьте `YES`. Запишите изменения на диск при помощи команды kbd:[W]. А теперь выйдите из редактора FDISK, нажав kbd:[Q]. В этот момент вам будет задан вопрос о "Master Boot Record" (главной загрузочной записи). Так как вы добавляете диск к уже работающей системе, выберите `None`.
+. Редактор метки диска
++
+Теперь вам нужно выйти из sysinstall и запустить эту утилиту снова. Следуйте указаниям выше, но на этот раз выберите пункт `Label`. Вы перейдёте к меню `Disk Label Editor`. Здесь вы создадите традиционные разделы BSD. На диске может быть до восьми разделов, имеющих метки `a-h`. Некоторые из меток разделов имеют особый смысл. Раздел `a` используется для размещения корневого раздела ([.filename]#/#). По этой причине только ваш системный диск (например, тот, с которого происходит загрузка), должен иметь раздел `a`. Раздел `b` используется под раздел подкачки, и вы можете иметь много дисков с разделами подкачки. Раздел `c` используется для доступа ко всему диску в режиме эксклюзивного использования или ко всему слайсу FreeBSD при работе в режиме с использованием слайсов. Остальные разделы имеют обычное предназначение.
++
+Редактор метки диска программы sysinstall использует раздел `e` для некорневого раздела и не для раздела подкачки. Внутри редактора метки диска создайте отдельную файловую систему, нажав kbd:[C]. Когда будет задан вопрос о том, будет ли это раздел с файловой системой (FS) или это будет раздел подкачки, выберите `FS` и наберите точку монтирования (например, [.filename]#/mnt#). При добавлении диска после установки системы, программа sysinstall не будет автоматически создавать записи в файле [.filename]#/etc/fstab#, поэтому точка монтирования не так уж и важна.
++
+Теперь вы готовы записать новую метку на диск и создать на нем файловую систему. Сделайте это, нажав kbd:[W]. Проигнорируйте сообщения об ошибках от sysinstall о невозможности смонтировать новый раздел. Полностью выйдите из редактора метки диска и из программы sysinstall.
+. Завершение
++
+Последний шаг заключается в редактировании файла [.filename]#/etc/fstab# и добавлении записи для вашего нового диска.
+====
+
+=== Использовании утилит командной строки
+
+==== Работа со слайсами
+
+Следующая настройка позволит вашему диску корректно работать с другими операционными системами, которые могут быть установлены на вашем компьютере, и не вызовет конфликта с утилитами `fdisk` других операционных систем. Этот способ рекомендуется использовать для установок новых дисков. Используйте `эксклюзивный` режим, только если у вас есть реальные причины делать это!
+
+[source,bash]
+....
+# dd if=/dev/zero of=/dev/da1 bs=1k count=1
+# fdisk -BI da1 # Инициализируем новый диск.
+# bsdlabel -B -w da1s1 auto # Размечаем его.
+# bsdlabel -e da1s1 # Редактируем только что созданную метку диска и добавляем разделы.
+# mkdir -p /1
+# newfs /dev/da1s1e # Повторяем этот шаг для всех созданных разделов.
+# mount /dev/da1s1e /1 # Монтируем раздел(ы)
+# vi /etc/fstab # Добавляем соответствующую запись/записи в файл /etc/fstab.
+....
+
+Если у вас установлен диск IDE, подставьте [.filename]#ad# вместо [.filename]#da#.
+
+==== Эксклюзивный режим
+
+Если вы не будете использовать новый диск совместно с другой операционной системой, то вы можете использовать режим `эксклюзивного` использования. Отметьте, что этот режим может ввести в заблуждение операционные системы от Microsoft; однако информацию они не разрушат. А вот OS/2(R) компании IBM будет "забирать себе" любой раздел, который она найдет и не сможет распознать.
+
+[source,bash]
+....
+# dd if=/dev/zero of=/dev/da1 bs=1k count=1
+# bsdlabel -Bw da1 auto
+# bsdlabel -e da1 # create the `e' partition
+# newfs /dev/da1e
+# mkdir -p /1
+# vi /etc/fstab # add an entry for /dev/da1e
+# mount /1
+....
+
+Альтернативный метод заключается в следующем:
+
+[source,bash]
+....
+# dd if=/dev/zero of=/dev/da1 count=2
+# bsdlabel /dev/da1 | bsdlabel -BR da1 /dev/stdin
+# newfs /dev/da1e
+# mkdir -p /1
+# vi /etc/fstab # add an entry for /dev/da1e
+# mount /1
+....
+
+[[raid]]
+== RAID
+
+[[raid-soft]]
+=== Программный RAID
+
+[[ccd]]
+==== Конфигурация драйвера объединённого диска (CCD)
+
+При выборе решения для организации хранилища самыми важными характеристиками являются скорость, надежность и стоимость. Редко все эти характеристики наличествуют одновременно; обычно быстрое и надёжное устройство хранения стоит дорого, а при уменьшении стоимости в жертву приносятся скорость работы или надёжность.
+
+При проектировании описываемой далее системы в качестве самого важного фактора была выбрана её стоимость, затем быстродействие и надёжность. Скорость передачи данных для этой системы ограничивалась только пропускной способностью сети. И, хотя надёжность очень важна, CCD-диск, описываемый ниже, обслуживал работу с данными, полные копии которых уже хранились на дисках CD-R, так они могли быть с лёгкостью обновлены.
+
+При выборе решения для массового хранения данных первым шагом является определение ваших требований к нему. Если в ваших требованиях главными являются скорость или надёжность, а не стоимость, то ваш выбор будет отличаться от описываемой в этом разделе системы.
+
+[[ccd-installhw]]
+===== Установка оборудования
+
+Кроме системного IDE-диска, основу описываемого далее CCD-диска общим объёмом примерно в 90 Гбайт составили три IDE-диска Western Digital 30GB, 5400 RPM. В идеальном случае каждый диск IDE имеет собственный контроллер и кабель, но для минимизации стоимости дополнительные контроллеры IDE не использовались. Вместо этого диски были настроены при помощи переключателей так, что на каждом IDE-контроллере находилось по одному ведущему и одному ведомому диску.
+
+До перезагрузки BIOS системы была настроена на автоматическое распознавание подключенных дисков. Более важно то, что при перезагрузке их распознала FreeBSD:
+
+[.programlisting]
+....
+ad0: 19574MB <WDC WD205BA> [39770/16/63] at ata0-master UDMA33
+ad1: 29333MB <WDC WD307AA> [59598/16/63] at ata0-slave UDMA33
+ad2: 29333MB <WDC WD307AA> [59598/16/63] at ata1-master UDMA33
+ad3: 29333MB <WDC WD307AA> [59598/16/63] at ata1-slave UDMA33
+....
+
+[NOTE]
+====
+Если FreeBSD не распознала все диски, проверьте корректность положения переключателей на них. На большинстве IDE-дисков имеется также переключатель "Cable Select". Он _не имеет_ отношения к выбору ведущего и ведомого устройств. Для получения помощи по правильному положению переключателей обратитесь к документации по устройствам.
+====
+
+[[ccd-setup]]
+===== Настройка CCD
+
+Драйвер man:ccd[4] позволяет вам взять несколько идентичных дисков и объединить их в одну логическую файловую систему. Для использования man:ccd[4] нужно ядро со встроенной поддержкой man:ccd[4]. Добавьте такую строку в файл конфигурации ядра, перестройте и установите новое ядро:
+
+[.programlisting]
+....
+device ccd
+....
+
+Поддержка man:ccd[4] также может быть обеспечена загрузкой подгружаемого модуля ядра.
+
+Для настройки man:ccd[4] сначала вам нужно воспользоваться утилитой man:bsdlabel[8] для разметки дисков:
+
+[.programlisting]
+....
+bsdlabel -w ad1 auto
+bsdlabel -w ad2 auto
+bsdlabel -w ad3 auto
+....
+
+При этом создаются метки для [.filename]#ad1c#, [.filename]#ad2c# и [.filename]#ad3c#, которые занимают диск полностью.
+
+Следующим шагом является изменение типа метки диска. Для редактирования дисков можно использовать утилиту man:bsdlabel[8]:
+
+[.programlisting]
+....
+bsdlabel -e ad1
+bsdlabel -e ad2
+bsdlabel -e ad3
+....
+
+При этом в редакторе, задаваемом переменной окружения `EDITOR` (обычно это man:vi[1]), открывается текущая метка каждого диска.
+
+Не модифицированная метка диска будет выглядеть примерно следующим образом:
+
+[.programlisting]
+....
+8 partitions:
+# size offset fstype [fsize bsize bps/cpg]
+ c: 60074784 0 unused 0 0 0 # (Cyl. 0 - 59597)
+....
+
+Добавьте новый раздел `e` для использования драйвером man:ccd[4]. Как правило, он может быть скопирован с раздела `c`, но поле `fstype` _должно_ иметь значение `4.2BSD`. Теперь метка диска должна выглядеть примерно так:
+
+[.programlisting]
+....
+8 partitions:
+# size offset fstype [fsize bsize bps/cpg]
+ c: 60074784 0 unused 0 0 0 # (Cyl. 0 - 59597)
+ e: 60074784 0 4.2BSD 0 0 0 # (Cyl. 0 - 59597)
+....
+
+[[ccd-buildingfs]]
+===== Построение файловой системы
+
+Теперь, когда все диски размечены, вы должны построить man:ccd[4]. Для этого используйте утилиту man:ccdconfig[8] с параметрами, подобными следующим:
+
+[.programlisting]
+....
+ccdconfig ccd0 32 0 /dev/ad1e /dev/ad2e /dev/ad3e
+....
+
+Использование и значение каждого параметра описывается ниже:
+* Первым аргументом является конфигурируемое устройство, в нашем случае [.filename]#/dev/ccd0c#. Часть [.filename]#/dev/# является необязательной.
+* Чередование для файловой системы. Оно определяет размер единицы блока данных в количестве дисковых блоков, каждый из которых обычно имеет объём в 512 байт. Таким образом, при чередовании в 32 это будет составлять 16384 байт.
+* Опции для man:ccdconfig[8]. Если вы хотите включить зеркалирование диска, то можете задать это здесь. В нашей конфигурации зеркалирование для man:ccd[4] не предусмотрено, поэтому здесь задан 0 (ноль).
+* Последним параметром для man:ccdconfig[8] является список устройств для объединения в массив. Для каждого устройства нужно задавать полное имя.
+
+После запуска man:ccdconfig[8] устройство man:ccd[4] будет отконфигурировано. Может будет построить файловую систему. Обратитесь к справке по команде man:newfs[8] для выяснения требуемых параметров, или просто запустите:
+
+[.programlisting]
+....
+newfs /dev/ccd0c
+....
+
+[[ccd-auto]]
+===== Автоматическое выполнение
+
+Вообще говоря, вам потребуется монтировать man:ccd[4] при каждой перезагрузке. Для этого сначала вы должны отконфигурировать это устройство. Запишите вашу текущую конфигурацию в файл [.filename]#/etc/ccd.conf# при помощи такой команды:
+
+[.programlisting]
+....
+ccdconfig -g > /etc/ccd.conf
+....
+
+При перезагрузке скрипт `/etc/rc` запускает команду `ccdconfig -C`, если существует файл [.filename]#/etc/ccd.conf#. При этом man:ccd[4] автоматически конфигурируется так, чтобы он мог быть смонтирован.
+
+[NOTE]
+====
+Если при загрузке вы входите в однопользовательский режим, то перед тем, как выполнять монтирование man:ccd[4] по команде man:mount[8], вам нужно для конфигурации массива запустить следующую команду:
+
+[.programlisting]
+....
+ccdconfig -C
+....
+
+====
+
+Для автоматического монтирования man:ccd[4] поместите запись о man:ccd[4] в файл [.filename]#/etc/fstab#, чтобы он мог быть смонтирован во время загрузки системы:
+
+[.programlisting]
+....
+/dev/ccd0c /media ufs rw 2 2
+....
+
+[[raid-hard]]
+=== Аппаратный RAID
+
+FreeBSD поддерживает также целый ряд аппаратных контроллеров RAID. Эти устройства самостоятельно управляют RAID-подсистемой, без необходимости иметь специфичное для FreeBSD программное обеспечения управления массивом.
+
+При помощи встроенной в адаптер BIOS, он сам управляет большинством дисковых операций. Далее следует краткое описание установки при помощи контроллера Promise IDERAID. После установки адаптера и запуска системы, выдаётся запрос на ввод. Следуйте указаниям для входа в настройку адаптера. Отсюда вы можете объединить все подключенные диски. После этого во FreeBSD диск(и) будут выглядеть как один диск. Аналогично могут быть настроены и другие уровни RAID.
+
+=== Перестроение массивов ATA RAID1
+
+FreeBSD позволяет вам выполнять горячую замену вышедшего из строя диска. При этом требуется, чтобы вы заметили это до перезагрузки.
+
+Вероятно, в файле [.filename]#/var/log/messages# или в выдаче команды man:dmesg[8] вы увидите примерно следующее:
+
+[.programlisting]
+....
+ad6 on monster1 suffered a hard error.
+ad6: READ command timeout tag=0 serv=0 - resetting
+ad6: trying fallback to PIO mode
+ata3: resetting devices .. done
+ad6: hard error reading fsbn 1116119 of 0-7 (ad6 bn 1116119; cn 1107 tn 4 sn 11)\\
+status=59 error=40
+ar0: WARNING - mirror lost
+....
+
+При помощи man:atacontrol[8] получите дополнительную информацию:
+
+[source,bash]
+....
+# atacontrol list
+ATA channel 0:
+ Master: no device present
+ Slave: acd0 <HL-DT-ST CD-ROM GCR-8520B/1.00> ATA/ATAPI rev 0
+
+ATA channel 1:
+ Master: no device present
+ Slave: no device present
+
+ATA channel 2:
+ Master: ad4 <MAXTOR 6L080J4/A93.0500> ATA/ATAPI rev 5
+ Slave: no device present
+
+ATA channel 3:
+ Master: ad6 <MAXTOR 6L080J4/A93.0500> ATA/ATAPI rev 5
+ Slave: no device present
+
+# atacontrol status ar0
+ar0: ATA RAID1 subdisks: ad4 ad6 status: DEGRADED
+....
+
+[.procedure]
+====
+
+. Сначала вам нужно отключить канал контроллера ATA, содержащий отказавший диск, чтобы его можно было без последствий извлечь:
++
+[source,bash]
+....
+# atacontrol detach ata3
+....
++
+. Замените диск.
+. Повторно подключите канал дискового контроллера:
++
+[source,bash]
+....
+# atacontrol attach ata3
+Master: ad6 <MAXTOR 6L080J4/A93.0500> ATA/ATAPI rev 5
+Slave: no device present
+....
++
+. Добавьте новый диск к массиву в качестве резервного:
++
+[source,bash]
+....
+# atacontrol addspare ar0 ad6
+....
++
+. Перестройте массив:
++
+[source,bash]
+....
+# atacontrol rebuild ar0
+....
++
+. Проверить состояние дел можно при помощи следующей команды:
++
+[source,bash]
+....
+# dmesg | tail -10
+[выдача удалена]
+ad6: removed from configuration
+ad6: deleted from ar0 disk1
+ad6: inserted into ar0 disk1 as spare
+
+# atacontrol status ar0
+ar0: ATA RAID1 subdisks: ad4 ad6 status: REBUILDING 0% completed
+....
++
+. Дождитесь завершения этой операции.
+====
+
+[[usb-disks]]
+== USB устройства хранения
+
+Множество современных устройств хранения используют Universal Serial Bus (USB): жесткие диски, брелоки USB, CD-R приводы, и т.д. FreeBSD предоставляет поддержку этих устройств.
+
+=== Настройка
+
+Драйвер man:umass[4] предоставляет поддержку устройств хранения USB. Если вы используете [.filename]#GENERIC# ядро, изменять что-либо в настройках не потребуется. Если вы используете настроенное ядро, убедитесь, что в файле настройки присутствуют следующие строки:
+
+[.programlisting]
+....
+device scbus
+device da
+device pass
+device uhci
+device ohci
+device ehci
+device usb
+device umass
+....
+
+Для доступа к устройствам хранения USB драйвер man:umass[4] использует подсистему SCSI, ваши устройства USB будут видны системе как SCSI устройства. В зависимости от чипсета USB на материнской плате, для включения поддержки USB 1.X вам потребуется только один из параметров `device uhci` или `device ohci`. Однако, наличие обоих этих параметров не помешает. Поддержка контроллеров USB 2.0 предоставляется драйвером man:ehci[4] (строка `device ehci`). Не забудьте скомпилировать и установить новое ядро после добавления каких-либо строк.
+
+[NOTE]
+====
+Если ваше USB устройство это пишущий привод CD-R или DVD, необходимо добавить в ядро SCSI CD-ROM драйвер, man:cd[4], следующей строкой:
+
+[.programlisting]
+....
+device cd
+....
+
+Поскольку устройство записи видно как SCSI диск, драйвер man:atapicam[4] не должен использоваться в файле настройки.
+====
+
+=== Тестирование конфигурации
+
+Конфигурация готова к тестированию, подключите устройство USB, и в буфере системных сообщений (man:dmesg[8]), диск должен отобразиться примерно так:
+
+[source,bash]
+....
+umass0: USB Solid state disk, rev 1.10/1.00, addr 2
+GEOM: create disk da0 dp=0xc2d74850
+da0 at umass-sim0 bus 0 target 0 lun 0
+da0: <Generic Traveling Disk 1.11> Removable Direct Access SCSI-2 device
+da0: 1.000MB/s transfers
+da0: 126MB (258048 512 byte sectors: 64H 32S/T 126C)
+....
+
+Конечно, производитель, имя устройства ([.filename]#da0#) и другие детали могут отличаться в зависимости от конфигурации.
+
+Поскольку устройство USB видится как SCSI, команда `camcontrol` может быть использована для вывода списка устройств хранения USB, подключенных к системе:
+
+[source,bash]
+....
+# camcontrol devlist
+<Generic Traveling Disk 1.11> at scbus0 target 0 lun 0 (da0,pass0)
+....
+
+Если на диске есть файловая система, у вас должна быть возможность смонтировать ее. <<disks-adding>> поможет вам создать и отформатировать разделы на диске USB если потребуется.
+
+[WARNING]
+====
+
+Ниже описанный механизм (`vfs.usermount`), допускающий монтирование случайных носителей пользователями, не являющимися доверенными, считается небезопасным. Большинство файловых систем во FreeBSD никак не ограждено от возможности _несанкционированного_ монтирования устройств.
+====
+
+Чтобы это устройство мог смонтировать обычный пользователь, необходимо выполнить определенные действия. Для начала, необходимо дать обычным пользователям доступ к устройствам, создаваемым при подключении USB устройства. Решение состоит во включении всех пользователей данных устройств в группу `operator`. Это делается утилитой man:pw[8]. Затем, когда устройства созданы, у группы `operator` должен быть доступ на чтение и запись для этих устройств. Это выполняется путем добавления следующих строк в [.filename]#/etc/devfs.rules#:
+
+[.programlisting]
+....
+[localrules=5]
+add path 'da*' mode 0660 group operator
+....
+
+[NOTE]
+====
+Если к системе подключены SCSI диски, это должно быть сделано немного иначе. Так, если в системе уже есть диски с [.filename]#da0# по [.filename]#da2#, вторая строка должна выглядеть так:
+
+[.programlisting]
+....
+add path 'da[3-9]*' mode 0660 group operator
+....
+
+Это исключит уже существующие диски из группы `operator`.
+====
+
+Вам также потребуется включить набор правил man:devfs.rules[5] в файл [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+devfs_system_ruleset="localrules"
+....
+
+Затем, ядро необходимо настроить так, чтобы оно позволяло обычным пользователям монтировать файловые системы. Простейший способ сделать это - добавить в файл [.filename]#/etc/sysctl.conf# следующую строку:
+
+[.programlisting]
+....
+vfs.usermount=1
+....
+
+Этот параметр установится только после последующей перезагрузки. Для установки этой переменной можно также использовать man:sysctl[8].
+
+Последний шаг - создание каталога, куда будет монтироваться файловая система. Каталог должен принадлежать пользователю, монтирующему файловую систему. Один из способов сделать это под пользователем `root` - создать каталог [.filename]#/mnt/username# (замените _username_ именем пользователя, а _usergroup_ - именем главной группы пользователя):
+
+[source,bash]
+....
+# mkdir /mnt/username
+# chown username:usergroup /mnt/username
+....
+
+Предположим, что USB брелок подключен, и появилось устройство [.filename]#/dev/da0s1#. Поскольку эти устройства обычно поставляются форматированными с файловой системой FAT, их можно смонтировать так:
+
+[source,bash]
+....
+% mount -t msdosfs -o -m=644,-M=755 /dev/da0s1 /mnt/username
+....
+
+Если вы отключите устройство (диск должен быть сначала размонтирован), вы должны увидеть в буфере системных сообщений что-то подобное:
+
+[source,bash]
+....
+umass0: at uhub0 port 1 (addr 2) disconnected
+(da0:umass-sim0:0:0:0): lost device
+(da0:umass-sim0:0:0:0): removing device entry
+GEOM: destroy disk da0 dp=0xc2d74850
+umass0: detached
+....
+
+=== Дополнительная информация
+
+Помимо разделов <<disks-adding,Добавление дисков>> и crossref:basics[mount-unmount,Монтирование и размонтирование файловых систем], также может быть полезно чтение различных страниц справочника: man:umass[4], man:camcontrol[8], и man:usbconfig[8] для FreeBSD 8.X или man:usbdevs[8] для более ранних версий FreeBSD.
+
+[[creating-cds]]
+== Запись и использование оптических носителей (CD)
+
+=== Введение
+
+Компакт-диски (CD) имеют несколько особенностей, отличающих их от обычных дисков. Во-первых, на них невозможно производить запись. Они спроектированы с расчетом на то, что их можно читать последовательно без задержек на перемещение головки между дорожками. К тому же их гораздо проще переносить от системы к системе, чем носители близкого объема.
+
+У CD имеются дорожки, но они представляют собой последовательность данных, читаемую последовательно, и не являются физической характеристикой диска. Для записи CD во FreeBSD вы готовите файлы данных, которые будут формировать дорожки на компакт-диске, а затем записываете дорожки на CD.
+
+Файловая система ISO 9660 была разработана с учетом этих отличий, К сожалению, она унаследовала ограничения файловых систем, которые были тогда. К счастью, она дает механизм расширений, которые позволяют правильно записанным дискам обходить эти ограничения и при этом продолжать работать с системами, которые не поддерживают эти расширения.
+
+Для создания файла данных, содержащего файловую систему ISO 9660, используется программа man:mkisofs[8], которая включена в порт package:sysutils/cdrtools[]. Она имеет опции, поддерживающие различные расширения, и описана ниже.
+
+Какой инструмент использовать для записи CD, зависит от того, является ли ваше устройство для записи CD устройством ATAPI или каким-либо другим. С устройствами для записи стандарта ATAPI используется программа `burncd`, которая является частью комплекта поставки системы. С устройствами SCSI и USB нужно использовать `cdrecord` из порта package:sysutils/cdrtools[]. Утилиту `cdrecord` и другие инструменты для SCSI-приводов также можно использовать при работе с ATAPI-оборудованием через <<atapicam,модуль ATAPI/CAM>>.
+
+Если для записи CD вам нужна программа с графическим интерфейсом пользователя, взгляните на X-CD-Roast или K3b. Они доступны в виде пакетов или из портов package:sysutils/xcdroast[] и package:sysutils/k3b[]. Программам X-CD-Roast и K3b для работы с оборудованием ATAPI требуется <<atapicam,модуль ATAPI/CAM>>.
+
+[[mkisofs]]
+=== mkisofs
+
+Программа man:mkisofs[8], поставляемая с портом package:sysutils/cdrtools[] создаёт файловую систему ISO 9660, которая является образом дерева каталогов в пространстве имён файловой системы UNIX(R). В самом простом случае она используется так:
+
+[source,bash]
+....
+# mkisofs -o imagefile.iso /path/to/tree
+....
+
+Эта команда создаст файл _imagefile.iso_, содержащий файловую систему ISO 9660, которая является копией дерева каталогов _/path/to/tree_. Во время работы она будет преобразовывать имена файлов в имена, которые удовлетворяют ограничениям файловой системы ISO 9660, и исключит файлы, которые носят имена, неподходящие для файловой системы ISO.
+
+Для того, чтобы обойти эти ограничения, имеется несколько опций. В частности, `-R` включает использование расширений Rock Ridge, распространенных в UNIX(R)-системах, с `-J` будут применены расширения Joliet, используемые в системах от Microsoft, а `-hfs` может использоваться для создания файловых систем HFS, используемых в Mac OS(R).
+
+Для CD, которые будут использоваться только с системами FreeBSD, может использоваться опция `-U`, отменяющая все ограничения на имена файлов. При использовании с опцией `-R` генерируется образ файловой системы, идентичный начальному дереву FreeBSD, хотя при этом стандарт ISO 9660 может нарушаться в нескольких местах.
+
+Последней часто используемой опцией является `-b`. Она используется для указания загрузочного образа для использования при создании загрузочного CD в стандарте "El Torito". Этой опции указывается аргумент, который является маршрутом к загрузочному образу из корня дерева, записываемого на CD. По умолчанию, man:mkisofs[8] создает образ ISO в так называемом режиме "эмуляции флоппи-диска", и потому ожидает загрузочный образ размера строго 1200, 1440 или 2880 KB. Некоторые загрузчики, в том числе и тот, что используется на дистрибутивных дисках FreeBSD, не используют режим эмуляции; в этом случае должна использоваться опция `-no-emul-boot`. Так что, если [.filename]#/tmp/myboot# содержит загрузочную систему FreeBSD с загрузочным образом в [.filename]#/tmp/myboot/boot/cdboot#, вы можете создать образ файловой системы ISO 9660 в [.filename]#/tmp/bootable.iso# следующим образом:
+
+[source,bash]
+....
+# mkisofs -R -no-emul-boot -b boot/cdboot -o /tmp/bootable.iso /tmp/myboot
+....
+
+Сделав это, и имея в ядре отконфигурированное устройство [.filename]#md#, вы можете смонтировать файловую систему, выполнив:
+
+[source,bash]
+....
+# mdconfig -a -t vnode -f /tmp/bootable.iso -u 0
+# mount -t cd9660 /dev/md0 /mnt
+....
+
+В этот момент вы можете проверить, что [.filename]#/mnt# и [.filename]#/tmp/myboot# идентичны.
+
+Имеется много других опций, которые можно использовать с программой man:mkisofs[8] для тонкой настройки её поведения. В частности: модификации в размещении ISO 9660 и создание дисков в форматах Joliet и HFS. Обратитесь к справочным страницам по man:mkisofs[8] для получения более подробной информации.
+
+[[burncd]]
+=== burncd
+
+Если ваше устройство для записи CD соответствует стандарту ATAPI, то для записи ISO-образа на компакт-диск вы можете воспользоваться командой `burncd`. `burncd` входит в базовый комплект операционной системы и установлена как [.filename]#/usr/sbin/burncd#. Использовать её очень просто, так как параметров у ней немного:
+
+[source,bash]
+....
+# burncd -f cddevice data imagefile.iso fixate
+....
+
+По этой команде файл _imagefile.iso_ будет скопирован на _cddevice_. По умолчанию используется устройство [.filename]#/dev/acd0#. Для получения информации о параметрах, задающих скорость записи, выброс диска после записи и запись звуковых данных, обратитесь к man:burncd[8].
+
+[[cdrecord]]
+=== cdrecord
+
+Если ваше устройство для записи CD не соответствует стандарту ATAPI, то для записи компакт-дисков вам нужно пользоваться программой `cdrecord`. `cdrecord` не входит в комплект поставки системы; вы должны установить её из порта package:sysutils/cdrtools[] или из соответствующего пакета. Изменения в системе могут приводить к тому, что откомпилированные версии этой программы работать не будут, или приводить к порче дисков. Поэтому вы должны при обновлении системы либо обновить порт, либо, если вы crossref:cutting-edge[stable,следуете -STABLE], обновить порт при появлении его новой версии.
+
+Хотя `cdrecord` имеет много опций, в основном использовать её ещё проще, чем `burncd`. Запись образа ISO 9660 делается такой командой:
+
+[source,bash]
+....
+# cdrecord dev=device imagefile.iso
+....
+
+Тонким моментом при использовании `cdrecord` является определение правильного устройства `dev`. Чтобы задать параметр правильно, воспользуйтесь флагом `-scanbus` команды `cdrecord`, в результате чего может получиться примерно такой результат:
+
+[source,bash]
+....
+# cdrecord -scanbus
+Cdrecord-Clone 2.01 (i386-unknown-freebsd7.0) Copyright (C) 1995-2004 J"org Schilling
+Using libscg version 'schily-0.1'
+scsibus0:
+ 0,0,0 0) 'SEAGATE ' 'ST39236LW ' '0004' Disk
+ 0,1,0 1) 'SEAGATE ' 'ST39173W ' '5958' Disk
+ 0,2,0 2) *
+ 0,3,0 3) 'iomega ' 'jaz 1GB ' 'J.86' Removable Disk
+ 0,4,0 4) 'NEC ' 'CD-ROM DRIVE:466' '1.26' Removable CD-ROM
+ 0,5,0 5) *
+ 0,6,0 6) *
+ 0,7,0 7) *
+scsibus1:
+ 1,0,0 100) *
+ 1,1,0 101) *
+ 1,2,0 102) *
+ 1,3,0 103) *
+ 1,4,0 104) *
+ 1,5,0 105) 'YAMAHA ' 'CRW4260 ' '1.0q' Removable CD-ROM
+ 1,6,0 106) 'ARTEC ' 'AM12S ' '1.06' Scanner
+ 1,7,0 107) *
+....
+
+Здесь приведены соответствующие значения параметров `dev` для имеющихся устройств. Найдите здесь ваше устройство для записи CD, а в качестве параметров для `dev` задавайте три числа через запятые. В нашем случае CRW-устройству соответствуют числа 1,5,0, так что правильным параметром будет `dev=1,5,0`. Имеется более простой способ задать эти значения; обратитесь к справочной информации о man:cdrecord[1] для выяснения подробностей. Там же находится информация о записи звуковых дорожек, управлении скоростью и другим вещам.
+
+[[duplicating-audiocds]]
+=== Копирование аудио CD
+
+Вы можете копировать музыкальные CD, извлекая данные аудио с CD в набор файлов, а затем записывая эти файлы на чистый CD. Процесс несколько различен в случаях использования устройств ATAPI и SCSI.
+
+[.procedure]
+====
+*Procedure: Устройства SCSI*
+
+. Используйте `cdda2wav` для извлечения данных аудио.
++
+[source,bash]
+....
+% cdda2wav -vall -D2,0 -B -Owav
+....
++
+. Воспользуйтесь `cdrecord` для записи файлов [.filename]#.wav#.
++
+[source,bash]
+....
+% cdrecord -v dev=2,0 -dao -useinfo *.wav
+....
++
+Значение, соответствующее _2,0_, должно быть установлено правильно, как это описано в <<cdrecord>>.
+====
+
+[.procedure]
+====
+*Procedure: Устройства ATAPI*
+
+[NOTE]
+======
+На приводах ATAPI также можно использовать утилиту `cdda2wav`. Для её функционирования потребуется <<atapicam,драйвер ATAPI/CAM>>. Следует отметить, что данная утилита предназначена для корректного извлечения и обработки аудио данных, в отличие от утилиты, приведенной в нижеследующем примере.
+======
+
+. Драйвер устройств ATAPI CD делает каждую дорожку доступной как [.filename]#/dev/acddtnn#, где _d_ является номером привода, а _nn_ соответствует номеру дорожки, который записывается двумя десятичными цифрами с нулём в начале, если это нужно. Таким образом, первая дорожка на первом диске будет носить имя [.filename]#/dev/acd0t01#, вторая будет именоваться [.filename]#/dev/acd0t02#, третья будет носить имя [.filename]#/dev/acd0t03# и так далее.
++
+Удостоверьтесь, что соответствующий файл имеется в каталоге [.filename]#/dev#. При его отсутствии следует принудительно перечитать оглавление диска:
++
+[source,bash]
+....
+# dd if=/dev/acd0 of=/dev/null count=1
+....
++
+. Извлеките каждую дорожку при помощи команды man:dd[1]. При извлечении файлов вы должны также использовать специфическое значение для размера блока.
++
+[source,bash]
+....
+# dd if=/dev/acd0t01 of=track1.cdr bs=2352
+# dd if=/dev/acd0t02 of=track2.cdr bs=2352
+...
+....
++
+. Запишите извлечённые файлы на диск при помощи утилиты `burncd`. Вы должны указать, что это файлы с аудио, и что `burncd` должна зафиксировать диск по окончании работы.
++
+[source,bash]
+....
+# burncd -f /dev/acd0 audio track1.cdr track2.cdr ... fixate
+....
+====
+
+[[imaging-cd]]
+=== Копирование компакт-дисков с данными
+
+Вы можете скопировать CD с данными в файл образа, который функционально эквивалентен файлу образа, созданному командой man:mkisofs[8], и вы можете использовать его для копирования любого CD с данными. В приводимом здесь примере предполагается, что ваш привод CDROM называется [.filename]#acd0#. Подставьте название вашего привода CDROM.
+
+[source,bash]
+....
+# dd if=/dev/acd0 of=file.iso bs=2048
+....
+
+Теперь, когда вы имеете образ, вы можете записать его на CD так, как это описано выше.
+
+[[mounting-cd]]
+=== Использование компакт-диски с данными
+
+Теперь, после того, как вы создали стандартный CDROM с данными, вы, наверное, захотите смонтировать его и считать с него данные. По умолчанию man:mount[8] предполагает, что файловая система имеет тип `ufs`. Если вы попытаетесь выполнить что-то вроде:
+
+[source,bash]
+....
+# mount /dev/cd0 /mnt
+....
+
+вы получите сообщение `Incorrect super block`, и диск не смонтируется. CDROM не является файловой системой `UFS`, поэтому попытки смонтировать его таким образом будут терпеть неудачу. Вам просто нужно указать команде man:mount[8], что файловая система имеет тип `ISO9660`, и всё должно заработать. Сделайте это, задав параметр `-t cd9660` при вызове man:mount[8]. К примеру, если вы хотите смонтировать устройство CDROM, [.filename]#/dev/cd0#, в каталог [.filename]#/mnt#, вы должны выполнить:
+
+[source,bash]
+....
+# mount -t cd9660 /dev/cd0 /mnt
+....
+
+Заметьте, что имя вашего устройства ([.filename]#/dev/cd0# в этом примере) может быть другим, в зависимости от интерфейса, используемого в CDROM. Кроме того, параметр `-t cd9660` всего лишь задаёт выполнение утилиты man:mount_cd9660[8]. Пример выше может быть упрощён до:
+
+[source,bash]
+....
+# mount_cd9660 /dev/cd0c /mnt
+....
+
+Таким способом, вообще говоря, вы можете использовать компакт-диски любого производителя. Диски с некоторыми расширениями ISO 9660 могут, однако, работать со странностями. К примеру диски Joliet хранят все имена файлов в виде последовательностей двухбайтовых символов Unicode. Ядро FreeBSD не может работать с Unicode, но CD9660 драйвер способен преобразовывать Unicode символы на лету. Если некоторые символы не английского алфавита выглядят, как знаки вопроса, то вам нужно указать используемую вами кодировку с помощью опции `-C`. За дополнительной информацией, обращайтесь к странице справочника man:mount_cd9660[8].
+
+[NOTE]
+====
+Чтобы смочь произвести преобразование символов посредством опции `-C`, ядру понадобится загрузить модуль [.filename]#cd9660_iconv.ko#. Это может быть сделано либо добавлением ниже представленной строчки в [.filename]#loader.conf#:
+
+[.programlisting]
+....
+cd9660_iconv_load="YES"
+....
+
+с последующей перезагрузкой машины, либо загрузкой модуля вручную с помощью man:kldload[8].
+====
+
+Время от времени вы можете получать сообщения `Device not configured` при попытке смонтировать CDROM. Это обычно означает, что привод CDROM полагает, что в нём нет диска, или что привод не виден на шине. Приводу CDROM может понадобиться несколько секунд, чтобы понять, что он был закрыт, так что будьте терпеливы.
+
+Иногда SCSI CDROM может потеряться из-за того, что у него не было достаточно времени, чтобы ответить на сброс шины. Если у вас имеется SCSI CDROM, то, пожалуйста, добавьте следующий параметр в конфигурацию вашего ядра и crossref:kernelconfig[kernelconfig-building,перестройте его].
+
+[.programlisting]
+....
+options SCSI_DELAY=15000
+....
+
+Это укажет вашей шине SCSI выдерживать 15-секундную паузу во время загрузки, чтобы дать вашему приводу CDROM шанс ответить на сброс шины.
+
+[[rawdata-cd]]
+=== Запись необработанных данных на компакт-диски
+
+Вы можете предпочесть запись файла непосредственно на CD без создания файловой системы ISO 9660. Некоторые поступают так при создании резервных копий. Это выполняется гораздо быстрее. чем запись стандартного компакт-диска:
+
+[source,bash]
+....
+# burncd -f /dev/acd1 -s 12 data archive.tar.gz fixate
+....
+
+Для извлечения данных, записанных так на компакт-диск, вы должны считывать данные из файла непосредственного доступа к устройству:
+
+[source,bash]
+....
+# tar xzvf /dev/acd1
+....
+
+Вы не можете монтировать этот диск как обычный CDROM. Такой компакт-диск не может быть прочитан ни в какой другой операционной системе, кроме FreeBSD. Если вы хотите монтировать CD или обменяться данными с другой операционной системой, то вы должны использовать man:mkisofs[8] так, как это было описано выше.
+
+[[atapicam]]
+=== Использование драйвера ATAPI/CAM
+
+Этот драйвер позволяет работать с ATAPI-устройствами (приводы CD-ROM, CD-RW, DVD и так далее) через подсистему SCSI, таким образом расширяя использование таких приложений, как package:sysutils/cdrdao[] или man:cdrecord[1].
+
+Для использования этого драйвера вам необходимо добавить в файл [.filename]#/boot/loader.conf# следующую строку:
+
+[.programlisting]
+....
+atapicam_load="YES"
+....
+
+с последующей перезагрузкой машины.
+
+[NOTE]
+====
+Если для вас предпочтительнее статически скомпилировать поддержку man:atapicam[4] в ядро, то добавьте эту строчку в файл конфигурации ядра:
+
+[.programlisting]
+....
+device atapicam
+....
+
+Кроме того, в файле конфигурации ядра должны быть следующие строки:
+
+[.programlisting]
+....
+device ata
+device scbus
+device cd
+device pass
+....
+
+которые уже должны там присутствовать. Затем пересоберите, установите новое ядро и перезагрузите компьютер.
+====
+
+В процессе загрузки ваш пишущий привод должен появиться примерно следующим образом:
+
+[source,bash]
+....
+acd0: CD-RW <MATSHITA CD-RW/DVD-ROM UJDA740> at ata1-master PIO4
+cd0 at ata1 bus 0 target 0 lun 0
+cd0: <MATSHITA CDRW/DVD UJDA740 1.00> Removable CD-ROM SCSI-0 device
+cd0: 16.000MB/s transfers
+cd0: Attempt to query device size failed: NOT READY, Medium not present - tray closed
+....
+
+Теперь с ним можно работать через устройство [.filename]#/dev/cd0#, например, чтобы смонтировать CD-ROM в каталог [.filename]#/mnt#, просто наберите следующую команду:
+
+[source,bash]
+....
+# mount -t cd9660 /dev/cd0 /mnt
+....
+
+Для получения SCSI-адреса пишущего привода, вы можете, работая как пользователь `root`, запустить такую команду:
+
+[source,bash]
+....
+# camcontrol devlist
+<MATSHITA CDRW/DVD UJDA740 1.00> at scbus1 target 0 lun 0 (pass0,cd0)
+....
+
+Таким образом, `1,0,0` будет SCSI-адресом для использования с man:cdrecord[1] и другими приложениями для работы со SCSI.
+
+Для получения дополнительной информации об ATAPI/CAM и системе SCSI, обратитесь к страницам справочной системы по man:atapicam[4] и man:cam[4].
+
+[[creating-dvds]]
+== Создание и использование оптических носителей (DVD)
+
+=== Введение
+
+DVD это следующее после CD поколение оптических носителей. DVD может вмещать больше данных чем любой CD и является современным стандартом распространения видео.
+
+Для записываемых DVD существует пять физических форматов записи:
+
+* DVD-R: Был первым форматом записываемых DVD. Стандарт DVD-R был создан http://www.dvdforum.com/forum.shtml[DVD Forum]. Это формат для однократной записи.
+* DVD-RW: Это перезаписываемая версия стандарта DVD-R. Носители DVD-RW могут быть перезаписаны около 1000 раз.
+* DVD-RAM: Это также перезаписываемый формат, поддерживаемый DVD Forum. DVD-RAM может быть виден как съемный жесткий диск. Однако, этот носитель не совместим с большинством приводов DVD-ROM и проигрывателями DVD-Video; лишь некоторые пишущие DVD поддерживают формат DVD-RAM. Более подробно о работе с DVD-RAM можно прочитать в разделе <<creating-dvd-ram>>.
+* DVD+RW: Это перезаписываемый формат, созданный http://www.dvdrw.com/[DVD+RW Alliance]. Носитель DVD+RW может быть перезаписан около 1000 раз.
+* DVD+R: Этот формат - однократно записываемая версия формата DVD+RW.
+
+Однослойный записываемый DVD может хранить до 4,700,000,000 байт, что равно 4.38 Гбайт, или 4485 Мбайт (1 килобайт это 1024 байт).
+
+[NOTE]
+====
+Необходимо различать физический носитель и приложение. Например, DVD-Video это определенная файловая раскладка, которая может быть помещена на записываемый DVD любого физического формата: DVD-R, DVD+R, DVD-RW и т.д. Перед выбором типа носителя вы должны убедиться, что и устройство записи и DVD-Video проигрыватель (отдельный или DVD-ROM привод компьютера) совместимы с данным носителем.
+====
+
+=== Настройка
+
+Для записи DVD будет использоваться программа man:growisofs[1]. Эта команда входит в набор утилит dvd+rw-tools (package:sysutils/dvd+rw-tools[]), который поддерживает все типы носителей DVD.
+
+Эти утилиты используют подсистему SCSI для доступа к устройствам, следовательно необходимо добавить в ядро <<atapicam,поддержку ATAPI/CAM>>. Если пишущий привод использует USB интерфейс, это добавление бесполезно и необходимо прочесть более подробную информацию по настройке устройств USB в <<usb-disks>>
+
+Вам также потребуется включить DMA доступ для устройств ATAPI, это можно сделать добавив в [.filename]#/boot/loader.conf# следующую строку:
+
+[.programlisting]
+....
+hw.ata.atapi_dma="1"
+....
+
+Перед использованием dvd+rw-tools вы должны свериться со http://fy.chalmers.se/~appro/linux/DVD+RW/hcn.html[списком совместимого оборудования dvd+rw-tools] с информацией по устройствам для записи DVD.
+
+[NOTE]
+====
+Если вам нужен графический интерфейс пользователя, взгляните на K3b (package:sysutils/k3b[]), который предоставляет дружественный пользователю интерфейс к man:growisofs[1] и многим другим программам записи.
+====
+
+=== Запись DVD с данными
+
+Команда man:growisofs[1] является оболочкой для <<mkisofs,mkisofs>>, она вызовет man:mkisofs[8] для создания файловой системы и запишет DVD. Это означает, что вам не потребуется создавать образ с данными перед началом процесса записи.
+
+Для записи данных из каталога [.filename]#/path/to/data# на DVD+R или DVD-R, используйте следующую команду:
+
+[source,bash]
+....
+# growisofs -dvd-compat -Z /dev/cd0 -J -R /path/to/data
+....
+
+Параметры `-J -R` передаются man:mkisofs[8] для создания файловой системы (в данном случае: файловая система ISO 9660 с расширениями Joliet и Rock Ridge), обратитесь к странице справочника man:mkisofs[8] за более подробной информацией.
+
+Параметр `-Z` используется для первой сессии записи в любом случае: для одной или нескольких сессий. Устройство DVD, _/dev/cd0_, должно быть изменено в соответствии с имеющимися настройками. Параметр `-dvd-compat` закроет диск и дозапись станет невозможна. Это должно улучшить совместимость с приводами DVD-ROM.
+
+Возможна также запись предварительного (pre-mastered) образа, например, для записи _imagefile.iso_ запустим:
+
+[source,bash]
+....
+# growisofs -dvd-compat -Z /dev/cd0=imagefile.iso
+....
+
+Скорость записи должна быть определена и автоматически установлена в соответствии с носителем и приводом. Если вы хотите явно указать скорость записи, используйте параметр `-speed=`. За дальнейшей информацией обратитесь к странице справочника man:growisofs[1].
+
+[NOTE]
+====
+Если размер файлов внутри набора превышает 4.38Гб, то необходимо будет создать гибридную файловую систему UDF/ISO-9660, для чего потребуется передать параметры `-udf -iso-level 3` в man:mkisofs[8] и в остальные соответствующие программы (например, man:growisofs[1]). Указание параметров обязательно лишь во время создания файла образа или во время непосредственной записи на диск. Созданный таким способом диск должен монтироваться утилитой man:mount_udf[8]. Диск будет доступен лишь тем операционным системам, которые поддерживают UDF; в противном случае носитель будет отображаться как поврежденный.
+
+Для того, чтобы создать такой образ, выполните:
+
+[source,bash]
+....
+% mkisofs -R -J -udf -iso-level 3 -o imagefile.iso /path/to/data
+....
+
+Для того, чтобы записать файлы прямо на диск, наберите:
+
+[source,bash]
+....
+# growisofs -dvd-compat -udf -iso-level 3 -Z /dev/cd0 -J -R /path/to/data
+....
+
+Если у вас в распоряжении уже имеется образ, содержащий в себе файлы большого размера, то для записи образа на диск никаких дополнительных опций для man:growisofs[1] не потребуется.
+
+Также удостоверьтесь, что у вас установлена последняя версия package:sysutils/cdrtools[] (man:mkisofs[8] принадлежит к этому порту), поскольку предыдущие версии утилит не поддерживают работу с большими файлами. Если с этим портом возникают проблемы, то установите package:sysutils/cdrtools-devel[] и прочитайте страницу справочника man:mkisofs[8].
+====
+
+=== Запись DVD-Video
+
+DVD-Video это особая файловая система, базирующаяся на ISO 9660 и спецификациях micro-UDF (M-UDF). DVD-Video также представляет определенную иерархию структуры данных, поэтому для создания DVD потребуется особая программа, такая как package:multimedia/dvdauthor[].
+
+Если у вас уже есть образ файловой системы DVD-Video, просто запишите его как любой другой образ, примеры находятся в предыдущем разделе. Если вы создали DVD и результат находится в каталоге [.filename]#/path/to/video#, для записи DVD-Video должна быть использована следующая команда:
+
+[source,bash]
+....
+# growisofs -Z /dev/cd0 -dvd-video /path/to/video
+....
+
+Параметр `-dvd-video` будет передан man:mkisofs[8] и укажет создать файловую систему DVD-Video. Помимо этого, параметр `-dvd-video` подразумевает параметр man:growisofs[1] `-dvd-compat`.
+
+=== Использование DVD+RW
+
+В отличие от CD-RW, новый DVD+RW необходимо отформатировать перед первым использованием. Программа man:growisofs[1] позаботится об этом сама при необходимости, и это _рекомендованный_ способ. Тем не менее, для форматирования DVD+RW вы можете использовать команду `dvd+rw-format`:
+
+[source,bash]
+....
+# dvd+rw-format /dev/cd0
+....
+
+Эту операцию необходимо выполнить лишь однажды, помните, что только новые носители DVD+RW необходимо форматировать. Затем запишите DVD+RW тем способом, который описан в предыдущем разделе.
+
+Если вы хотите записать новые данные (полностью новую файловую систему, а не дописать данные) на DVD+RW, его не нужно очищать, просто запишите поверх предыдущей записи (создав новую начальную сессию) примерно так :
+
+[source,bash]
+....
+# growisofs -Z /dev/cd0 -J -R /path/to/newdata
+....
+
+Формат DVD+RW делает возможным легко дописать данные к предыдущей записи. Операция состоит в присоединении предыдущей сессии к существующей, это не мультисессионная запись, man:growisofs[1] _расширит_ (grow) файловую систему ISO 9660, существующую на носителе.
+
+Например, для дозаписи данных к предыдущей сессии на DVD+RW, используется следующая команда:
+
+[source,bash]
+....
+# growisofs -M /dev/cd0 -J -R /path/to/nextdata
+....
+
+При последующих записях man:mkisofs[8] необходимо передавать те же параметры, что и при первой записи.
+
+[NOTE]
+====
+Вы можете использовать параметр `-dvd-compat` для улучшения совместимости с приводами DVD-ROM. В случае DVD+RW это не помешает добавлению данных.
+====
+
+Если по какой-либо причине вам потребуется очистить носитель, используйте следующую команду:
+
+[source,bash]
+....
+# growisofs -Z /dev/cd0=/dev/zero
+....
+
+=== Использование DVD-RW
+
+Существует два формата дисков DVD-RW: последовательно дополняемый и с ограниченной перезаписью. По умолчанию формат дисков DVD-RW последовательный.
+
+Новый DVD-RW может быть записан непосредственно без необходимости форматирования, однако DVD-RW с данными в последовательном формате необходимо очистить перед созданием новой начальной сессии.
+
+Для очистки DVD-RW в последовательном формате, запустите:
+
+[source,bash]
+....
+# dvd+rw-format -blank=full /dev/cd0
+....
+
+[NOTE]
+====
+Полная очистка (`-blank=full`) займет около одного часа на скорости 1x. Быструю очистку можно выполнить с параметром `-blank`, если DVD-RW будет записан в режиме Disk-At-Once (DAO). Для записи DVD-RW в режиме DAO, используйте команду:
+
+[source,bash]
+....
+# growisofs -use-the-force-luke=dao -Z /dev/cd0=imagefile.iso
+....
+
+Параметр `-use-the-force-luke=dao` не должен потребоваться, поскольку man:growisofs[1] попытается определить был ли носитель быстро очищен и включить DAO запись.
+
+Фактически, лучше использовать режим с ограниченной перезаписью с любым DVD-RW, этот формат более гибкий, чем формат по умолчанию с последовательной записью.
+====
+
+Для записи данных на последовательный DVD-RW, используйте ту же команду, что и для других форматов DVD:
+
+[source,bash]
+....
+# growisofs -Z /dev/cd0 -J -R /path/to/data
+....
+
+Если вы хотите добавить данные к предыдущей записи, используйте параметр man:growisofs[1] `-M`. Однако при добавлении данных на DVD-RW в последовательном режиме, на диске будет создана новая сессия и в результате получится мультисессионный диск.
+
+В формате DVD-RW с ограниченной перезаписью не требуется очищать носитель перед созданием новой начальной сессии, вам всего лишь нужно переписать диск с параметром `-Z`, подобно DVD+RW. Возможно также увеличение существующей файловой системы ISO 9660, записанной на диск тем же способом, как для DVD+RW с параметром `-M`. В результате получится односессионный DVD.
+
+Для перевода DVD-RW в формат с ограниченной перезаписью, необходимо использовать следующую команду:
+
+[source,bash]
+....
+# dvd+rw-format /dev/cd0
+....
+
+Для перевода обратно в последовательный формат, выполните:
+
+[source,bash]
+....
+# dvd+rw-format -blank=full /dev/cd0
+....
+
+=== Мультисессия
+
+Лишь несколько DVD-ROM и проигрывателей поддерживают мультисессионные DVD, в основном они в лучшем случае прочтут только первую сессию. DVD+R, DVD-R и DVD-RW в последовательном формате могут работать с несколькими сессиями, и это не относится к форматам DVD+RW и DVD-RW в формате ограниченной перезаписи.
+
+Использование следующей команды после первой (не закрытой) сессии для DVD+R, DVD-R, или DVD-RW в последовательном формате, добавит на диск новую сессию:
+
+[source,bash]
+....
+# growisofs -M /dev/cd0 -J -R /path/to/nextdata
+....
+
+Использование этой командной строки с DVD+RW или DVD-RW в режиме ограниченной перезаписи добавит данные, объединив новую сессию с предыдущей. В результате получится односессионный диск. Такой способ используется для добавления данных после первой записи на эти носители.
+
+[NOTE]
+====
+Некоторый объем носителя используется между сессиями для завершения и начала сессии. Следовательно, для оптимизации объема хранения сессии должны быть большими. Количество сессий ограничено 154 для DVD+R, около 2000 для DVD-R и 127 для DVD+R Double Layer.
+====
+
+=== Дополнительная информация
+
+Для получения дополнительной информации о DVD, можно запустить команду `dvd+rw-mediainfo _/dev/cd0_`, диск должен находиться в приводе.
+
+Дополнительная информация о dvd+rw-tools может быть найдена на странице справочника man:growisofs[1], на http://fy.chalmers.se/~appro/linux/DVD+RW/[Web-сайте dvd+rw-tools] и в архивах http://lists.debian.org/cdwrite/[списка рассылки cdwrite].
+
+[NOTE]
+====
+Вывод `dvd+rw-mediainfo` при записи или проблемный носитель необходимы для любого сообщения о проблеме. Без этого вывода будет совершенно невозможно помочь вам.
+====
+
+[[creating-dvd-ram]]
+=== Использование DVD-RAM
+
+==== Конфигурация
+
+Записывающие устройства DVD-RAM поставляются с интерфейсами SCSI и ATAPI. В последнем случае вы должны убедиться, что для них включен режим DMA, добавив в файл [.filename]#/boot/loader.conf# строку
+
+[.programlisting]
+....
+hw.ata.atapi_dma="1"
+....
+
+==== Подготовка носителя
+
+Как указывалось ранее, DVD-RAM представляется съемным жестким диском. Как и другие дисковые устройства, DVD-RAM должен быть "подготовлен" к первому использованию. В нашем примере мы займём все пространство диска одной файловой системой UFS2:
+
+[source,bash]
+....
+# dd if=/dev/zero of=/dev/acd0 bs=2k count=1
+# bsdlabel -Bw acd0
+# newfs /dev/acd0
+....
+
+Имя устройства DVD device, [.filename]#acd0#, должно соответствовать вашей конфигурации.
+
+==== Использование носителя
+
+После выполнения указанных выше команд, DVD-RAM может быть смонтирован как обычный жесткий диск:
+
+[source,bash]
+....
+# mount /dev/acd0 /mnt
+....
+
+После этого вы можете читать и писать на DVD-RAM.
+
+[[floppies]]
+== Дискеты
+
+Хранение данных на дискетах иногда бывает полезным, например, когда нет других съёмных носителей или когда необходимо перенести небольшой объём данных на другой компьютер.
+
+В этом разделе будет описано, как использовать дискеты во FreeBSD. В основном речь пойдёт о форматировании и использовании дискет DOS размером 3.5 дюйма, однако общие принципы применимы и для других форматов гибких дисков.
+
+=== Форматирование дискет
+
+==== Устройство
+
+Доступ к гибким дискам, как, впрочем, и к остальным устройствам, осуществляется через соответствующие файлы в каталога [.filename]#/dev#. Чтобы обратиться к дискете, просто используйте [.filename]#/dev/fdN#.
+
+==== Форматирование
+
+Перед тем, как дискетой можно будет воспользоваться, её необходимо отформатировать на низком уровне. Обычно это выполняется производителем, однако форматирование является хорошим способом проверить целостность носителя. Большинство гибких дисков предназначены для использования с размером 1440kB, однако возможно задать меньший или больший размер.
+
+Для низкоуровневого форматирования дискет вам нужно использовать man:fdformat[1]. В качестве параметра этой утилите передаётся имя устройства.
+
+Обратите внимание на появление сообщений об ошибках, так как они могут помочь определить, хорошая это дискета или плохая.
+
+===== Форматирование гибких дисков
+
+Для форматирования гибких дисков используйте устройства [.filename]#/dev/fdN#. Вставьте новую 3.5-дюймовую дискету в дисковод и введите команду:
+
+[source,bash]
+....
+# /usr/sbin/fdformat -f 1440 /dev/fd0
+....
+
+=== Метка диска
+
+После низкоуровневого форматирования диска вам нужно поместить на него метку диска. Эта метка будет потом разрушена, но она будет нужна системе для определения размера диска и его характеристик.
+
+Новая метка диска будет касаться диска в целом, и будет содержать полную информацию о параметрах дискеты. Значения геометрии для метки диска перечислены в файле [.filename]#/etc/disktab#.
+
+Теперь вы можете запустить man:bsdlabel[8] примерно так:
+
+[source,bash]
+....
+# /sbin/bsdlabel -B -w /dev/fd0 fd1440
+....
+
+=== Файловая система
+
+Теперь ваша дискета готова к высокоуровневому форматированию. При этом на неё будет помещаться новая файловая система, которая позволит FreeBSD читать и записывать информацию на диск. После создания новой файловой системы метка диска уничтожается, так что если вы захотите переформатировать диск, вам придётся создавать метку диска повторно.
+
+Файловой системой для дискеты может служить UFS или FAT. Вообще говоря, FAT для дискет походит лучше.
+
+Для размещения на дискете новой файловой системы, выполните:
+
+[source,bash]
+....
+# /sbin/newfs_msdos /dev/fd0
+....
+
+Теперь диск готов к работе.
+
+=== Использование дискет
+
+Для работы с гибким диском смонтируйте его при помощи утилит man:mount_msdosfs[8]. Можно также использовать пакет package:emulators/mtools[] из коллекции портов.
+
+[[backups-tapebackups]]
+== Создание и использование архивных копий на магнитной ленте
+
+К наиболее часто используемым носителям на магнитной ленте следует отнести ленты шириной 4мм и 8мм, а также типа QIC, мини-картриджи и DLT.
+
+[[backups-tapebackups-4mm]]
+=== 4мм (DDS: Digital Data Storage)
+
+Ленты шириной 4мм заменяют QIC в качестве наиболее предпочтительного носителя для создания резервных копий. Эта тенденция значительно усилилась после покупки компанией Conner фирмы Archive, ведущего производителя накопителей QIC и последующего прекращения их выпуска. Накопители 4мм малы по размеру и мало шумят, но у них нет репутации носителя, обладающего надежностью приводов 8мм. Картриджи более дешевы и меньше по размеру (3 x 2 x 0.5 дюймов; 76 x 51 x 12 мм), чем 8мм-картриджи. Накопители для лент шириной 4мм, как и 8мм, имеют сравнительно малый срок службы головок, по причине использования в обоих случаях технологии спирального сканирования (helical scan).
+
+Пропускная способность у таких накопителей начинается с цифры ~150 kB/s, пиковая достигает ~500 kB/s. Ёмкость накопителей начинается с 1.3 GB и может достигать 2.0 GB. Аппаратное сжатие, имеющееся на большинстве таких накопителей, даёт увеличение ёмкости примерно вдвое. Блоки многоприводных ленточных библиотек могут иметь до 6 накопителей в одном модуле с автоматической сменой ленты. Ёмкость библиотек может достигать 240 Гбайт.
+
+Стандарт DDS-3 в настоящее время поддерживает ёмкости лент вплоть до 12 Гбайт (или 24 Гбайт сжатой информации).
+
+В накопителях 4мм, как и в приводах 8мм, используется технология спирального сканирования. Все плюсы и минусы этой технологии относятся как к 4мм, так и 8мм приводам.
+
+Не следует использовать ленты после того, как они были подвергнуты 2000 проходов, или были использованы для создания 100 полных копий.
+
+[[backups-tapebackups-8mm]]
+=== 8мм (Exabyte)
+
+Ленты шириной 8мм являются самым распространённым типом для ленточных SCSI-накопителей; они же являются наиболее удачным выбором при выборе типа носителей для обмена лентами. Наверное, каждый сервер имеет привод Exabyte шириной 8мм и объёмом 2 Гбайт. Эти приводы удобны, они работают надёжно и тихо. Картриджи дешевы и малы по размеру (4.8 x 3.3 x 0.6 дюймов; 122 x 84 x 15 мм). Одним минусом лент шириной 8мм является сравнительно малое время службы головок и лент из-за высокой скорости движения ленты вдоль головок.
+
+Скорость передачи данных варьируется от ~250 kB/s до ~500 kB/s. Объём хранимых данных начинается с 300 Мбайт и может достигать 7 Гбайт. Аппаратное сжатие, имеющееся практически на всех таких приводах, увеличивает емкость примерно вдвое. Эти приводы существуют как в виде отдельных модулей, так и в виде многоприводных ленточных библиотек с 6 приводами и 120 лентами в одном отсеке. Ленты сменяются автоматически модулем. Емкости библиотек достигают величин, превышающих 840 Гбайт.
+
+Модель Exabyte "Mammoth" поддерживает ёмкость ленты в 12 Гбайт (24 Гбайт со сжатием) и стоит примерно вдвое больше, чем обычный ленточный накопитель.
+
+Данные на ленту записываются по технологии спирального сканирования, головки позиционируются под углом к носителю (примерно в 6 градусов). Лента оборачивается на 270 градусов вокруг шпульки, которая держит головки. Во время скольжения ленты вокруг шпульки последняя вращается. В результате достигается высокая плотность записи данных с очень близко лежащими дорожками, расположенными под наклоном по всей ленте.
+
+[[backups-tapebackups-qic]]
+=== QIC
+
+Ленты и накопители формата QIC-150, наверное, являются наиболее распространенным типом носителей. Приводы лент формата QIC являются самыми дешёвыми "серьёзными" накопителями для резервного копирования. Минусом является стоимость носителей. Ленты формата QIC по сравнению с лентами шириной 8мм или 4мм являются дорогими, превосходя их по стоимости хранения одного гигабайта в пять раз. Однако если вам будут достаточно половины ленты, QIC может оказаться правильным выбором. QIC является _самым_ распространенным типом привода. Каждый сайт имеет привод QIC какой-либо емкости. QIC имеет большое количество плотностей на физически похожих (иногда даже идентичных) лентах. Приводы QIC работают вовсе не тихо. Эти накопители громко осуществляют поиск перед тем, как начать запись данных и достаточно шумны в процессе чтения, записи или поиска. Ленты QIC имеют размеры (6 x 4 x 0.7 дюймов; 152 x 102 x 17 мм).
+
+Скорость обмена данными лежит в границах от ~150 kB/s до ~500 kB/s. Ёмкость накопителей варьируется от 40 Мбайт до 15 Гбайт. Аппаратное сжатие присутствует во многих современных накопителях QIC. Приводы QIC устанавливаются менее часто; они вытесняются накопителями DAT.
+
+На ленту данные записываются в виде дорожек. Дорожки располагаются в длину вдоль всей ленты. Количество дорожек, и, в свою очередь, их ширина, меняется вместе с емкостью ленты. Большинство, если не все современные накопители обеспечивают обратную совместимость по крайней мере для чтения (однако зачастую и для режима записи). Формат QIC имеет хорошую репутацию в области надежности хранения данных (механика устроена проще и более надежна, чем в случае накопителей, построенных по технологии спирального сканирования).
+
+Ленты не следует больше использовать после создания 5,000 резервных копий.
+
+[[backups-tapebackups-dlt]]
+=== DLT
+
+Формат DLT обладает самой высокой скоростью передачи данных среди всех перечисленных здесь накопителей. Лента шириной 1/2" (12.5мм) помещена в один картридж с катушкой (4 x 4 x 1 дюймов; 100 x 100 x 25 мм). Вдоль одной из сторон картриджа расположена сдвигающаяся крышечка. Механизм накопителя открывает эту крышку, чтобы вытащить конец ленты. На этом конце имеется овальное отверстие, которое используется для "захвата" ленты. Принимающая катушка размещена внутри накопителя. Все другие типы картриджей, перечисленные здесь (за исключением 9-дорожечных лент), имеют как подающий, так и принимающий барабаны внутри самого картриджа.
+
+Скорость передачи данных равна примерно 1.5 MB/s, что в три раза больше скорости передачи данных для накопителей 4мм, 8мм или QIC. Ёмкость картриджей варьируется от 10 Гбайт до 20 Гбайт для одного накопителя. Приводы могут компоноваться как многоленточные роботизированные, так и многоленточные, многоприводные библиотеки лент, вмещающие от 5 до 900 лент и от 1 до 20 приводов, что даёт ёмкость хранилища от 50 Гбайт до 9 Тбайт.
+
+Формат DLT Type IV поддерживает емкость до 70 Гбайт со сжатием.
+
+Данные на ленту записываются в виде дорожек, параллельных направлению движения (точно также, как и для лент QIC). Одновременно записываются две дорожки. Срок жизни головок чтения/записи сравнительно велик; как только лента перестает двигаться, одновременно прекращается трение между головками и лентой.
+
+=== AIT
+
+AIT - это новый формат фирмы Sony, который позволяет хранить до 50 Гбайт (со сжатием) информации на одной ленте. Ленты содержат микросхемы памяти, на которых размещается каталог содержимого ленты. Этот каталог может быть быстро считан накопителем для определения расположения файлов на ленте, вместо того, чтобы тратить несколько минут на поиск, как это происходит с другими форматами. Такое программное обеспечение, как SAMS:Alexandria, может управлять сорока или большим количеством ленточных библиотек AIT, связываясь непосредственно с памятью лент для вывода их содержимого, определения того, какие файлы были скопированы на какую ленту, выбора нужной ленты, её загрузки и восстановления данных с ленты.
+
+Библиотеки с такими функциями стоят в районе $20,000, выводя их из ниши любительского рынка.
+
+=== Использование новой ленты первый раз
+
+Если вы попытаетесь прочитать или записать новую, абсолютно чистую ленту, в первый раз, то вам это не удастся. Выводимые на консоль сообщения будут выглядеть примерно так:
+
+[source,bash]
+....
+sa0(ncr1:4:0): NOT READY asc:4,1
+sa0(ncr1:4:0): Logical unit is in process of becoming ready
+....
+
+На ленте отсутствует идентификационный блок (блок номер 0). Со времен принятия стандарта QIC-525 все накопители формата QIC записывают на ленту идентификационный блок (Identifier Block). Здесь имеется два решения:
+
+* По команде `mt fsf 1` ленточный накопитель записывает идентификационный блок на ленту.
+* Воспользуйтесь кнопкой на передней панели для выброса ленты.
++
+Вставьте ленту повторно и по команде `dump` сбросьте данные на ленту.
++
+Программа `dump` выдаст `DUMP: End of tape detected`, а на консоли будет выведено: `HARDWARE FAILURE info:280 asc:80,96`.
++
+перемотайте ленту такой командой: `mt rewind`.
++
+Последующие операции с лентой будут успешными.
+
+[[backups-floppybackups]]
+== Создание резервных копий на дискетах
+
+[[floppies-using]]
+=== Можно ли использовать дискеты для создания резервных копий моих данных?
+
+На самом деле дискеты не подходят для создания резервных копий, потому что:
+
+* Носитель ненадёжен, особенно если речь идет о больших сроках хранения.
+* Создание резервных копий и восстановление данных происходит очень медленно.
+* Дискеты имеют весьма ограниченную емкость (дни, когда весь винчестер копировался на десяток или около того дискет, давно прошли).
+
+Несмотря на все это, если у вас нет другого способа сделать резервную копию ваших данных, то дискеты все же лучше, чем ничего.
+
+Если вы используете дискеты, то проверьте, что они должны быть хорошего качества. Дискеты, которые валялись по всему офису в течении нескольких лет, не подойдут. Идеально использовать новые от известного производителя.
+
+[[floppies-creating]]
+=== Итак, как же сделать резервную копию данных на дискетах?
+
+Самым лучшим методом создания резервной копии на дискете является использование утилиты man:tar[1] с опцией `-M` (многотомные архивы), которая позволяет размещать архивы на нескольких дискетах.
+
+Для копирования всех файлов в текущем каталоге и подкаталогах выполните следующее (работая как пользователь `root`):
+
+[source,bash]
+....
+# tar Mcvf /dev/fd0 *
+....
+
+Когда первая дискета окажется полностью заполненной, программа man:tar[1] выдаст запрос на следующий том (так как работа утилиты man:tar[1] не зависит от носителя, она имеет дело с томами; здесь это означает дискету).
+
+[source,bash]
+....
+Prepare volume 2 for /dev/fd0 and hit return:
+....
+
+Это сообщение будет повторяться (со все увеличивающимся номером тома) до тех пор, пока все указанные файлы не будут заархивированы.
+
+[[floppies-compress]]
+=== Можно ли резервные копии подвергнуть компрессии?
+
+К сожалению, man:tar[1] при создании многотомных архивов не позволяет использовать опцию `-z`. Вы конечно же, можете скомпрессировать все файлы утилитой man:gzip[1], программой man:gzip[1] скопировать их на дискеты, а затем распаковать файлы снова утилитой man:gunzip[1]!
+
+[[floppies-restoring]]
+=== Как восстановить данные из моих резервных копий?
+
+Для полного восстановления архива воспользуйтесь такой командой:
+
+[source,bash]
+....
+# tar Mxvf /dev/fd0
+....
+
+Есть два подхода к восстановлению только нужных вам файлов. В первом вы можете начать с первой дискеты и выдать такую команду:
+
+[source,bash]
+....
+# tar Mxvf /dev/fd0 filename
+....
+
+Программа man:tar[1] будет выдавать запрос на подачу последующих дискет до тех пор, пока не найдет требуемый файл.
+
+Как альтернатива, если вы знаете, на какой дискете расположен файл, то вы можете просто подать ее и дать ту же самую команду, что и выше. Заметьте, что если первый файл на дискете является продолжением предыдущего, то man:tar[1] выдаст предупреждение о том, что не может его восстановить, хотя вы этого и не просили делать!
+
+[[backup-strategies]]
+== Стратегии резервного копирования
+
+При разработке плана резервного копирования первым делом надо продумать методы защиты от следующих проблем:
+
+* Отказ жесткого диска
+* Случайное удаление файлов
+* Повреждение содержимого файлов
+* Полное уничтожение компьютера (например, при пожаре), при котором погибнут также резервные копии, физически находящиеся рядом.
+
+Вполне возможно, что для ваших нужд нет единой стратегии, наилучшим образом покрывающей все описанные проблемы; более того, скорее всего, ее и не может быть (разве что для персональных систем, где ценность данных очень низка).
+
+Вот несколько наиболее распространенных технологий, применяемых для резервного копирования:
+
+* Архивация системы целиком с копированием на какой-либо надежный внешний носитель и размещение его вдалеке от основной системы. При этом вы защищены от всех перечисленных проблемы, однако этот метод требует много времени и неудобен в процессе восстановления. Вы можете хранить резервные копии рядом или даже смонтированными, однако все равно столкнетесь с неудобствами при восстановлении, в особенности для непривилегированных пользователей.
+* Снэпшоты файловых систем. Помогают только от случайного удаления файлов, но как раз в этом случае _очень_ полезны и эффективны.
+* Полные копии файловых систем или дисков (например, периодический запуск программы man:rsync[1] для машины целиком). Для защиты от отказа жестких дисков этот способ обычно несколько уступает RAID; для восстановления случайно удаленных файлов может быть сравним по удобству со снэпшотами UFS, в зависимости от вашей ситуации.
+* RAID. Минимизирует или исключает вовсе простои при отказе жестких дисков. При этом средняя частота таких отказов увеличивается (поскольку количество дисков больше), но разбираться с ними становится много спокойнее.
+* Проверка отпечатков файлов (fingerprints). Для этого весьма полезна утилита man:mtree[8]. Не являясь собственно технологией резервного копирования, этот метод помогает выяснять, когда вам пока обращаться к резервным копиям. В особенности это важно для "оффлайновых" резервных копий.
+
+Довольно легко придумать и другие стратегии резервного копирования; многие из них будут композициями уже упомянутых. Наличие специальных требований, как правило, приводит к специализированным же технологиям (например, резервное копирование базы данных, как правило, требует использования методов, специфичных для соответствующей СУБД). Главным остается знание опасностей потери данных, от которых вы хотите себя оградить, и методов защиты от них.
+
+[[backup-basics]]
+== Основы технологии резервного копирования
+
+Тремя основными программами резервного копирования являются man:dump[8], man:tar[1] и man:cpio[1].
+
+=== Dump и Restore
+
+Для UNIX(R) традиционными программами резервного копирования являются `dump` и `restore`. Они работают с приводом как с набором дисковых блоков, которые расположены ниже понятий файлов, связей и каталогов, создаваемых файловыми системами. В отличие от других программ для резервного копирования, программа `dump` выполняет резервное копирование всей файловой системы, располагающейся на устройстве. Невозможно выполнить резервное копирование части файловой системы или дерева каталогов, которые располагаются более чем в одной файловой системе. Утилита `dump` не записывает на ленту файлы и каталоги, она записывает блоки данных, из которых строятся файлы и каталоги. Утилита `restore` по умолчанию настроена так, что в процессе своей работы она сохраняет временные файлы в каталог [.filename]#/tmp/#. В некоторых ситуациях доступного в [.filename]#/tmp/# места бывает недостаточно: например, если вы работаете с диска восстановления (recovery disk). В таких случаях для успешной работы утилиты необходимо указать в переменной окружения `TMPDIR` путь к каталогу на менее заполненной файловой системе.
+
+[NOTE]
+====
+Если вы используете программу `dump` для работы с корневым каталогом, при этом не будет выполняться резервное копирование [.filename]#/home#, [.filename]#/usr# и многих других каталогов, так как они обычно являются точками монтирования других файловых систем или символическими ссылками на эти файловые системы.
+====
+
+В программе `dump` имеются некоторые неудобства, оставшиеся от её ранних дней в составе Version 6 операционной системы AT&T UNIX (примерно 1975). Параметры, используемые по умолчанию, подходят для 9-дорожечных лент (6250 bpi), но не для современных носителей с высокой плотностью записи информации (до 62,182 ftpi). Для использования ёмкостей нынешних накопителей на магнитной ленте эти параметры могут быть заданы в командной строке.
+
+При помощи `rdump` и `rrestore` возможно резервное копирование данных по сети на накопитель, подключенный к другому компьютеру. Обе программы используют в работе man:rcmd[3] и man:ruserok[3] для доступа к накопителю на магнитной ленте на удалённом компьютере. Поэтому пользователь, выполняющий резервное копирование, должен быть указан в файле [.filename]#.rhosts# на удалённом компьютере. Аргументы для `rdump` и `rrestore` должны подходить для использования на другом компьютере. При выполнении копирования по команде `rdump` на компьютере с FreeBSD на накопитель Exabyte, подключенный к машине Sun по имени `komodo`, используйте такую команду:
+
+[source,bash]
+....
+# /sbin/rdump 0dsbfu 54000 13000 126 komodo:/dev/nsa8 /dev/da0a 2>&1
+....
+
+Будьте осторожны: есть проблемы с обеспечением безопасности при аутентификации посредством [.filename]#.rhosts#. Внимательно рассмотрите вашу ситуацию.
+
+Программы `dump` и `restore` можно использовать в более защищённом режиме посредством `ssh`.
+
+.Использование `dump` через ssh
+[example]
+====
+
+[source,bash]
+....
+# /sbin/dump -0uan -f - /usr | gzip -2 | ssh -c blowfish \
+targetuser@targetmachine.example.com dd of=/mybigfiles/dump-usr-l0.gz
+....
+
+====
+
+Либо воспользуйтесь встроенной в `dump` возможностью, задав переменную окружения `RSH`:
+
+.Использование `dump` при работе через ssh с заданием `RSH`
+[example]
+====
+
+[source,bash]
+....
+# RSH=/usr/bin/ssh /sbin/dump -0uan -f targetuser@targetmachine.example.com:/dev/sa0 /usr
+....
+
+====
+
+=== `tar`
+
+Утилита man:tar[1] также восходит корнями к Version 6 системы AT&T UNIX (около 1975). `tar` работает с файловой системой, записывая на ленту файлы и каталоги. Эта утилита поддерживает не полный набор опций, имеющихся в man:cpio[1], однако не требует необычного перенаправления в командной строке, которое используется в утилите `cpio`.
+
+Чтобы скопировать данные на накопитель Exabyte, подключенный к машине Sun по имени `komodo`, используйте такую команду:
+
+[source,bash]
+....
+# tar cf - . | rsh komodo dd of=tape-device obs=20b
+....
+
+Если вы беспокоитесь о безопасности создания резервных копий по сети, то вместо `rsh` вам нужно использовать `ssh`.
+
+=== `cpio`
+
+man:cpio[1] является оригинальной программой UNIX(R) для обмена файлами на магнитных носителях. В утилите `cpio` имеются опции (кроме всего прочего), позволяющие выполнять изменение порядка следования байтов, поддерживающие различные форматы архивов и выполняющие перенаправление данных другим программам. Последняя возможность делает `cpio` прекрасным выбором для целей установки. `cpio` не знает о том, как работать с каталогами, список файлов должен даваться через [.filename]#stdin#.
+
+`cpio` не поддерживает создание резервных копий по сети. Вы можете воспользоваться перенаправлением вывода и программой `rsh` для посылки данных на удалённый накопитель.
+
+[source,bash]
+....
+# for f in directory_list; do
+find $f >> backup.list
+done
+# cpio -v -o --format=newc < backup.list | ssh user@host "cat > backup_device"
+....
+
+Где directory_list это список директорий, c которых Вы хотите создать резервные копии, _user_@_host_ это комбинация пользователь/хост которая описывает того кто занимается резервированием, и __backup_device__ это устройство куда копии должны быть записаны (например, [.filename]#/dev/nsa0#).
+
+=== `pax`
+
+man:pax[1] является ответом IEEE/POSIX(R) на утилиты `tar` и `cpio`. В течение многих лет различные версии программ `tar` и `cpio` получались не совсем совместимыми. Так что вместо того, чтобы попытаться полностью их стандартизировать, POSIX(R) создал новую утилиту для работы с архивами. `pax` пытается читать и писать различные форматы `cpio` и `tar`, и, кроме того, свои собственные новые форматы. Набор команд этой утилиты больше напоминает `cpio`, чем `tar`.
+
+[[backups-programs-amanda]]
+=== Amanda
+
+Amanda (Advanced Maryland Network Disk Archiver) является целой клиент/серверной системой резервного копирования, а не отдельной программой. Сервер Amanda сможет осуществлять резервное копирование на единственный накопитель любого количества компьютеров, на которых имеется клиент Amanda и которые могут связываться по сети с сервером Amanda. Общей проблемой систем с большим количеством больших дисков является то, что время, требуемое для непосредственной записи данных на ленту, превышает лимит времени, выделенный на эту задачу. Amanda решает эту проблему. Amanda может использовать "промежуточный диск" для резервного копирования нескольких файловых систем одновременно. Amanda создаёт "наборы архивов": группа лент, используемых в некоторый период времени для создания полных копий всех файловых систем, перечисленных в конфигурационном файле системы Amanda. "Архивный набор" содержит также создаваемый каждую ночь инкрементальные (или дифференциальные) резервные копии всех файловых систем. Восстановление повреждённой файловой системы требует наличия самой последней полной копии и инкрементальных резервных копий.
+
+Конфигурационный файл даёт прекрасный механизм для управления процессом резервного копирования и объёмом трафика, генерируемого системой Amanda. Amanda сможет использовать любую из перечисленных выше программ для записи данных на ленту. Amanda имеется в виде как порта, так и пакета, и по умолчанию она не установлена.
+
+=== Не делать ничего
+
+"Не делать ничего" - это не программа для компьютера, и в то же время это наиболее широко используемая стратегия резервного копирования. Здесь нет никаких первоначальных затрат. Здесь нет расписания, которому нужно следовать. Просто скажите нет. Если что-то случится с вашими данными, улыбнитесь и забудьте о них!
+
+Если ваше время и данные практически ничего не стоят, то "не делать ничего" является самой подходящей программой для вашего компьютера. Но будьте осторожны, POSIX(R) является весьма полезным инструментом, и через полгода вы можете обнаружить, что у вас есть набор файлов, представляющих для вас определенную ценность.
+
+"Ничего не делать" является правильным методом резервного копирования для [.filename]#/usr/obj# и других деревьев каталогов, которые могут быть в точности перегенерированы вашим компьютером. Примером являются файлы, представляющие страницы этого Руководства в форматах HTML или PostScript(R). Они генерируются из входных файлов в формате SGML. Создавать резервные копии файлов в форматах HTML и PostScript(R) не нужно. Исходные файлы в формате SGML копируются регулярно.
+
+=== Какая программа резервного копирования самая лучшая?
+
+man:dump[8] _Точка._ Elizabeth D. Zwicky протестировала все программы резервного копирования, обсуждаемые здесь. Беспроигрышным вариантом для сохранения всех ваших данных и особенностей файловых систем UNIX(R) является `dump`. Элизабет создала файловые системы, содержащие большое количество необычных элементов (и некоторых не так уж необычных) и тестировала каждую из программ, выполняя резервное копирование и последующее восстановление этих файловых систем. В число необычных элементов входили: файлы с дырами, файлы с дырами и блоком пустого места, файлы с необычными символами в их именах, нечитаемые и незаписываемые файлы, устройства, меняющие свой размер во время резервного копирования, файлы, создаваемые и удаляемые во время копирования и тому подобное. Она представила результаты на конференции LISA V в октябре 1991 года. Посмотрите ссылку на сайте http://www.coredumps.de/doc/dump/zwicky/testdump.doc.html[ torture-testing Backup and Archive Programs].
+
+=== Процедура восстановления при сбое
+
+==== До того, как случится катастрофа
+
+Вам нужно выполнить всего лишь четыре шага для того, чтобы быть готовым к любому сбою.
+
+Во-первых, распечатайте разметку диска для всех ваших дисков (к примеру, `bsdlabel da0 | lpr`), таблицу файловых систем ([.filename]#/etc/fstab#) и все сообщения, выводимые при загрузке, каждого по два экземпляра.
+
+Во-вторых, запишите CD диск с "livefs". Этот диск позволяет загружаться в режим аварийного восстановления FreeBSD, давая возможность пользователю выполнять ряд утилит, среди которых man:dump[8], man:restore[8], man:fdisk[8], man:bsdlabel[8], man:newfs[8], man:mount[8] и т.д. Образ CD с "livefs" для FreeBSD/i386 {rel120-current}-RELEASE находится по адресу link:ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/ISO-IMAGES/{rel120-current}/FreeBSD-{rel120-current}-RELEASE-i386-livefs.iso[ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/ISO-IMAGES/{rel120-current}/FreeBSD-{rel120-current}-RELEASE-i386-livefs.iso].
+
+В-третьих, регулярно создавайте резервные копии на ленте. Любые изменения, которые вы делали после последнего резервного копирования, могут быть безвозвратно потеряны. На лентах включайте защиту от записи.
+
+В-четвертых, проверяйте работу CD диска (который вы сделали при выполнении второго шага) и лент с резервными копиями. Ведите журнал выполняемых действий. Храните эти записи вместе с загрузочным CD диском, распечатками и лентами. Вы просто обезумеете при восстановлении данных, если окажется, что записи помогли бы избежать разрушения ваших резервных копий (Каким образом? Вместо команды `tar xvf /dev/sa0` вы могли случайно набрать `tar cvf /dev/sa0` и тем самым перезаписать вашу резервную копию).
+
+Для дополнительной страховки, каждый раз создавайте загрузочный CD диск с "livefs" и две резервные копии на ленте. Храните одну из копий в каком-то удаленном месте и НЕ в том же здании, где находится ваш офис. Достаточно большое количество компаний во Всемирном Торговом Центре изучило это на своей шкуре. Это удаленное хранилище должно быть физически отделено на большое расстояние от ваших компьютеров и дисковых устройств.
+
+==== После сбоя
+
+Главный вопрос: выжило ли ваше оборудование? Вы регулярно делали резервные копии, так что нет нужды беспокоиться о программном обеспечении.
+
+Если оборудование было повреждено, должны быть заменены неисправные компоненты.
+
+Если с оборудованием всё в порядке, вставьте CD диск с "livefs" в привод и загрузите компьютер. На экран будет выведено оригинальное меню установки. Выберите требуемую страну, потом - пункт меню [.guimenuitem]#Fixit -- Repair mode with CDROM/DVD/floppy or start a shell.#, а в нём выберите пункт [.guimenuitem]#CDROM/DVD -- Use the live filesystem CDROM/DVD#. Утилита `restore` и другие нужные вам программы находятся в каталоге [.filename]#/mnt2/rescue#.
+
+Восстановите по отдельности каждую файловую систему.
+
+Попробуйте выполнить команду `mount` (например, `mount /dev/da0a /mnt`) по отношению к корневому разделу вашего первого диска. Если метка диска была испорчена, то воспользуйтесь командой `bsdlabel` для переразбиения на разделы и разметки диска так, чтобы получившаяся метка совпала с той, которая вами была распечатана и сохранена. Для повторного создания файловых систем используйте утилиту `newfs`. Повторно смонтируйте корневой раздел диска в режиме чтения-записи (`mount -u -o rw /mnt`). Воспользуйтесь вашей программой резервного копирования и резервными копиями на лентах для восстановления данных для этой файловой системы (например. `restore vrf /dev/sa0`). Размонтируйте файловую систему (например, `umount /mnt`). Повторите эту процедуру для каждой файловой системы, которая была повреждена.
+
+Как только ваша система заработает, сделайте резервную копию на новые ленты. Что бы ни вызвало сбой или потерю данных, это может случиться снова. Ещё один час, потраченный в этот момент, может спасти вас от неприятностей в будущем.
+
+[[disks-virtual]]
+== Сетевые файловые системы, файловые системы в памяти и с отображением в файл
+
+Кроме дисков, которые вы физически устанавливаете в ваш компьютер; дискеты, компакт-диски, винчестеры и так далее, FreeBSD воспринимает и другие типы дисков - _виртуальные диски_.
+
+Сюда могут быть отнесены сетевые файловые системы, такие, как crossref:network-servers[network-nfs,Network File System] и Coda, а также файловые системы с организацией в памяти и создаваемые в файлах.
+
+В зависимости от версии FreeBSD, которую вы используете, для создания и работы с файловыми системами, отображаемыми в оперативную память или файлы, вам нужно будет пользоваться разными инструментами.
+
+[NOTE]
+====
+Пользователи FreeBSD 4.X для создания требуемых устройств должны использовать man:MAKEDEV[8]. Во FreeBSD 5.0 и более поздних версиях для создания файлов устройств используется man:devfs[5], которая выполняет это прозрачно для пользователей.
+====
+
+[[disks-vnconfig]]
+=== Файловая система в файле во FreeBSD 4.X
+
+Утилита man:vnconfig[8] конфигурирует и позволяет использовать дисковые устройства на основе псевдо-устройств vnode. _vnode_ представляет собой файл и отвечает за работу с файлом. Это означает, что man:vnconfig[8] использует файлы для создания и работы с файловой системой. Одним из возможных способов использования является монтирование образов дискет или образов компакт-дисков, сброшенных в файлы.
+
+Для использования man:vnconfig[8] в конфигурационном файле ядра вам нужно включить поддержку man:vn[4]:
+
+[.programlisting]
+....
+pseudo-device vn
+....
+
+Чтобы смонтировать имеющийся образ файловой системы:
+
+.Использование vnconfig для монтирования имеющегося образа файловой системы во FreeBSD 4.X
+[example]
+====
+
+[source,bash]
+....
+# vnconfig vn0 diskimage
+# mount /dev/vn0c /mnt
+....
+
+====
+
+Для создания нового образа файловой системы с помощью man:vnconfig[8]:
+
+.Создание нового диска в файле с помощью `vnconfig`
+[example]
+====
+
+[source,bash]
+....
+# dd if=/dev/zero of=newimage bs=1k count=5k
+5120+0 records in
+5120+0 records out
+# vnconfig -s labels -c vn0 newimage
+# bsdlabel -r -w vn0 auto
+# newfs vn0c
+Warning: 2048 sector(s) in last cylinder unallocated
+/dev/vn0c: 10240 sectors in 3 cylinders of 1 tracks, 4096 sectors
+ 5.0MB in 1 cyl groups (16 c/g, 32.00MB/g, 1280 i/g)
+super-block backups (for fsck -b #) at:
+ 32
+# mount /dev/vn0c /mnt
+# df /mnt
+Filesystem 1K-blocks Used Avail Capacity Mounted on
+/dev/vn0c 4927 1 4532 0% /mnt
+....
+
+====
+
+[[disks-mdconfig]]
+=== Файловые системы, отображаемые в файлы
+
+Во FreeBSD 5.X и более поздних для конфигурации и подключения дисков man:md[4], отображаемых в оперативную память, используется утилита man:mdconfig[8]. Для работы с man:mdconfig[8] вам нужно подгрузить модуль man:md[4] или добавить поддержку этих устройств в файл конфигурации ядра:
+
+[.programlisting]
+....
+device md
+....
+
+Утилита man:mdconfig[8] поддерживает три типа виртуальных дисков, отображаемых в память: диски в памяти, которая выделяется запросами man:malloc[9] и диски в памяти, использующие в качестве устройств хранения файлы или раздел подкачки. Одним из возможных использований таких дисков является монтирование файлов с образами дискет или CD.
+
+Для монтирования образа существующей файловой системы:
+
+.Использование `mdconfig` для монтирования файла с образом существующей файловой системы
+[example]
+====
+
+[source,bash]
+....
+# mdconfig -a -t vnode -f diskimage -u 0
+# mount /dev/md0 /mnt
+....
+
+====
+
+Для создания образа новой файловой системы при помощи man:mdconfig[8]:
+
+.Создание нового диска, отображаемого в файл, при помощи `mdconfig`
+[example]
+====
+
+[source,bash]
+....
+# dd if=/dev/zero of=newimage bs=1k count=5k
+5120+0 records in
+5120+0 records out
+# mdconfig -a -t vnode -f newimage -u 0
+# bsdlabel -w md0 auto
+# newfs md0a
+/dev/md0c: 5.0MB (10224 sectors) block size 16384, fragment size 2048
+ using 4 cylinder groups of 1.25MB, 80 blks, 192 inodes.
+super-block backups (for fsck -b #) at:
+ 160, 2720, 5280, 7840
+# mount /dev/md0a /mnt
+# df /mnt
+Filesystem 1K-blocks Used Avail Capacity Mounted on
+/dev/md0a 4710 4 4330 0% /mnt
+....
+
+====
+
+Если в параметре `-u` вы не задали номер устройства, то man:mdconfig[8] для выбора неиспользуемого устройства будет использовать функцию автоматическое выделения в man:md[4]. Имя выделенного устройства будет выдано на стандартное устройство выводы в виде, например, [.filename]#md4#. Для получения более полной информации о man:mdconfig[8], пожалуйста, обратитесь к соответствующей странице справочной системы.
+
+Утилита man:mdconfig[8] весьма полезна, однако для создания файла с файловой системой требуется произвести много действий. Вместе с FreeBSD 5.0 поставляется утилита под названием man:mdmfs[8], которая создаёт диск man:md[4] при помощи man:mdconfig[8], размещает на нём файловую систему UFS при помощи man:newfs[8] и монтирует её командой man:mount[8]. Например, если вы хотите создать и смонтировать такой же образ файловой системе, как выше, просто наберите такую команду:
+
+.Настройка и монтирование диска, отображаемого в файл, при помощи команды `mdmfs`
+[example]
+====
+
+[source,bash]
+....
+# dd if=/dev/zero of=newimage bs=1k count=5k
+5120+0 records in
+5120+0 records out
+# mdmfs -F newimage -s 5m md0 /mnt
+# df /mnt
+Filesystem 1K-blocks Used Avail Capacity Mounted on
+/dev/md0 4718 4 4338 0% /mnt
+....
+
+====
+
+Если вы используете параметр `md` без номера устройства, то man:mdmfs[8] будет использовать автоматическую нумерацию man:md[4] для автоматического выбора неиспользуемого устройства. Более полную информацию о man:mdmfs[8] можно найти на страницах справочной системы.
+
+[[disks-md-freebsd4]]
+=== Файловая система в памяти во FreeBSD 4.X
+
+Драйвер man:md[4] является простым и эффективным способом создания файловых систем в памяти во FreeBSD 4.X. Для выделения памяти используется man:malloc[9].
+
+Просто возьмите файловую систему, которую вы приготовили при помощи, скажем, man:vnconfig[8] и:
+
+.Диск md в памяти во FreeBSD 4.X
+[example]
+====
+
+[source,bash]
+....
+# dd if=newimage of=/dev/md0
+5120+0 records in
+5120+0 records out
+# mount /dev/md0c /mnt
+# df /mnt
+Filesystem 1K-blocks Used Avail Capacity Mounted on
+/dev/md0c 4927 1 4532 0% /mnt
+....
+
+====
+
+Для получения более полной информации, пожалуйста, обратитесь к страницам справочной системы по man:md[4].
+
+[[disks-md-freebsd5]]
+=== Файловые системы с отображением в память
+
+При работе с файловыми системами, отображаемыми в файл или память, используются одни и те же утилиты: man:mdconfig[8] или man:mdmfs[8]. Обычно для отображаемых в память файловых систем следует использовать опцию "хранение на области подкачки". Это не означает, что такая файловая система будет сразу сброшена на диск: место под нее будет выделено из общего пула памяти, и при необходимости может перемещаться в область подкачки. Также, возможно выделение места под файловую систему в основной памяти (через man:malloc[9]); однако, следует помнить, что использование таких файловых систем, в особенности большого размера, может привести к панике системы от исчерпания ядерной памяти.
+
+.Создание нового диска с отображением в память при помощи `mdconfig`
+[example]
+====
+
+[source,bash]
+....
+# mdconfig -a -t swap -s 5m -u 1
+# newfs -U md1
+/dev/md1: 5.0MB (10240 sectors) block size 16384, fragment size 2048
+ using 4 cylinder groups of 1.27MB, 81 blks, 192 inodes.
+ with soft updates
+super-block backups (for fsck -b #) at:
+ 160, 2752, 5344, 7936
+# mount /dev/md1 /mnt
+# df /mnt
+Filesystem 1K-blocks Used Avail Capacity Mounted on
+/dev/md1 4718 4 4338 0% /mnt
+....
+
+====
+
+.Создание нового диска с отображением в память при помощи `mdmfs`
+[example]
+====
+
+[source,bash]
+....
+# mdmfs -s 5m md2 /mnt
+# df /mnt
+Filesystem 1K-blocks Used Avail Capacity Mounted on
+/dev/md2 4846 2 4458 0% /mnt
+....
+
+====
+
+=== Отключение диска, отображаемого в память, от системы
+
+Если файловые системы, отображаемые в память или файл, больше не используются, вам нужно высвободить все ресурсы для системы. Первым делом нужно размонтировать файловую систему, затем воспользоваться man:mdconfig[8] для отключения диска от системы и освободить ресурсы.
+
+К примеру, чтобы отключить и освободить все ресурсы, используемые [.filename]#/dev/md4#:
+
+[source,bash]
+....
+# mdconfig -d -u 4
+....
+
+Для выдачи информации об отконфигурированных устройствах man:md[4] используется команда `mdconfig -l`.
+
+Во FreeBSD 4.X для отключения устройства используется команда man:vnconfig[8]. Например, для отключения и освобождения всех ресурсов, используемых [.filename]#/dev/vn4#:
+
+[source,bash]
+....
+# vnconfig -u vn4
+....
+
+[[snapshots]]
+== Мгновенные копии файловых систем
+
+Во FreeBSD 5.0 вместе с технологией crossref:cutting-edge[soft-updates, Отложенных обновлений] представлена новая возможность: генерация мгновенных копий файловых систем.
+
+Мгновенные копии позволяют пользователю создавать образы заданных файловых систем и работать с ними как с файлами. Файлы мгновенных копий должны создаваться в той файловой системе, над которой производится действие, и пользователь может создавать не более 20 мгновенных копий для каждой файловой системы. Активные копии записываются в суперблок, так что они остаются в силе между операциями монтирования и размонтирования в процессе системных перезагрузок. Если мгновенная копия больше не нужна, она может быть удалена стандартной командой man:rm[1]. Мгновенные копии могут удаляться в любом порядке, однако всё использованное пространство не может быть использовано, так как другая мгновенная копия может претендовать на некоторые блоки из освобождённых.
+
+Неизменяемый флаг `snapshot` устанавливается на файл при помощи man:mksnap_ffs[8] после первоначального создания файла мгновенной копии. Команда man:unlink[1] делает исключение для файлов мгновенных копий, позволяя их удалять.
+
+Мгновенные копии создаются при помощи утилиты man:mount[8]. Чтобы создать мгновенную копию [.filename]#/var# в файле [.filename]#/var/snapshot/snap#, воспользуйтесь такой командой:
+
+[source,bash]
+....
+# mount -u -o snapshot /var/snapshot/snap /var
+....
+
+В качестве альтернативного средства создания мгновенных копий вы можете использовать утилиту man:mksnap_ffs[8]:
+
+[source,bash]
+....
+# mksnap_ffs /var /var/snapshot/snap
+....
+
+Файлы мгновенных копий файловых систем (к примеру, [.filename]#/var#) можно найти при помощи команды man:find[1]:
+
+[source,bash]
+....
+# find /var -flags snapshot
+....
+
+После создания мгновенной копии есть несколько способов её использования:
+
+* Некоторые администраторы будут использовать файл мгновенной копии для целей создания резервной копии, так как мгновенная копия может быть перенесена на CD или магнитную ленту.
+* Утилита проверка целостности файловой системы, man:fsck[8], может быть запущена над мгновенной копией. Полагая, что файловая система была в порядке, когда она была смонтирована, вы всегда должны получать нормальный (и неизменный) результат. Это именно то, что выполняет фоновый процесс man:fsck[8].
+* Запустить утилиту man:dump[8] с мгновенной копией. Будет создаваться дамп, соответствующий файловой системе на момент создания мгновенной копии. Утилита man:dump[8] при использовании опции `-L` тоже может работать с мгновенными копиями, создавать их дампы, а затем удалять за один проход.
+* Смонтировать командой man:mount[8] мгновенную копию как замороженный образ файловой системы. Чтобы смонтировать командой man:mount[8] мгновенную копию [.filename]#/var/snapshot/snap#, запустите:
++
+
+[source,bash]
+....
+# mdconfig -a -t vnode -f /var/snapshot/snap -u 4
+# mount -r /dev/md4 /mnt
+....
+
+Теперь вы можете пройтись по иерархии вашей зафиксированной файловой системы [.filename]#/var#, смонтированной в каталог [.filename]#/mnt#. Первоначально всё будет в том же самом состоянии, в каком это было во время создания мгновенной копии. Единственным исключением будет то, что любые ранее сделанные мгновенные копии будут видны как файлы нулевой длины. Когда использование мгновенной копии закончено, она может быть удалена командой:
+
+[source,bash]
+....
+# umount /mnt
+# mdconfig -d -u 4
+....
+
+Для получения более полной информации о `softupdates` и мгновенных копиях файловых систем, включая технической описание, вы можете посетить сайт Маршалла Кёрка МакКузика (Marshall Kirk McKusick) по адресу http://www.mckusick.com/[http://www.mckusick.com/].
+
+[[quotas]]
+== Квотирование файловых систем
+
+Квоты - это опциональная возможность операционной системы, которая позволяет ограничивать объем дискового пространства и/или количество файлов для конкретного пользователя или членов определенной группы в рамках одной файловой системы. Чаще всего эта возможность используется в системах разделения времени, когда желательно ограничить количество ресурсов, которые может использовать один пользователь или группа пользователей. Это позволит не допустить ситуации, когда один пользователь или группа пользователей заполняют всё доступное дисковое пространство.
+
+=== Настройка вашей системы на использование дисковых квот
+
+Перед тем, как попытаться использовать дисковые квоты, необходимо убедиться, что квоты включены в вашем ядре. Это делается добавлением следующей строки в конфигурационный файл вашего ядра:
+
+[.programlisting]
+....
+options QUOTA
+....
+
+В стандартном ядре [.filename]#GENERIC# это по умолчанию не включено, так что для использования дисковых квот вам нужно будет настроить, откомпилировать и установить собственное ядро. Пожалуйста, обратитесь к crossref:kernelconfig[kernelconfig, Настройка ядра FreeBSD] за дополнительной информацией о настройке ядра.
+
+Затем вам потребуется включить квотирование дисков в файле [.filename]#/etc/rc.conf#. Это делается добавление такой строчки:
+
+[.programlisting]
+....
+enable_quotas="YES"
+....
+
+Для более полного контроля над запуском квотирования имеется дополнительная переменная для настройки. Как правило, при загрузке целостность квот каждой файловой системы проверяется программой man:quotacheck[8]. При работе программы man:quotacheck[8] проверяется точное соответствие данных в базе данных квот данным в файловой системе. Это весьма долгий процесс, что отражается на времени загрузки системы. Если вам захочется пропустить этот шаг, то для этого предназначена специальная переменная в файле [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+check_quotas="NO"
+....
+
+Наконец, вам потребуется отредактировать файл [.filename]#/etc/fstab# для включения дисковых квот на уровне файловых систем. Это то место, где вы можете включить квоты для пользователей, для групп или для обеих этих категорий для всех ваших файловых систем.
+
+Для включения пользовательских квот для файловой системы, добавьте параметр `userquota` в поле параметров файловой системы, на которой вы хотите включить квотирование, в файле [.filename]#/etc/fstab#. Например:
+
+[.programlisting]
+....
+/dev/da1s2g /home ufs rw,userquota 1 2
+....
+
+Подобным же образом для включения квотирования на уровне групп, воспользуйтесь параметром `groupquota` вместо `userquota`. Чтобы включить квотирование как для пользователей, так и для групп, измените строчку следующим образом:
+
+[.programlisting]
+....
+/dev/da1s2g /home ufs rw,userquota,groupquota 2 2
+....
+
+По умолчанию файлы квот хранятся в корневом каталоге файловой системы в файлах с именами [.filename]#quota.user# и [.filename]#quota.group# соответственно для пользовательских и групповых квот. Для получения подробной информации обратитесь к команде man:fstab[5]. Хотя справочная страница по man:fstab[5] утверждает, что вы можете указать другое местоположение файлов с квотами, этого делать не рекомендуется, потому что различные утилиты для работы с квотами не могут нормально работать в такой ситуации.
+
+На этом этапе вы должны перезагрузить вашу систему с новым ядром. Скрипт [.filename]#/etc/rc# автоматически запустит соответствующие команды для создания начальных файлов для всех квот, которые вы создали в файле [.filename]#/etc/fstab#, так что нет нужды вручную создавать никаких файлов квот нулевой длины.
+
+При нормальной работе вам не потребуется вручную запускать программы man:quotacheck[8], man:quotaon[8] или man:quotaoff[8]. Однако вам нужно хотя бы прочесть страницы справочника по этим командам, просто чтобы ознакомиться с их функциями.
+
+=== Установка квот
+
+Как только вы настроили вашу систему на использование квот, проверьте, что они действительно были задействованы. Простым способом сделать это является запуск такой команды:
+
+[source,bash]
+....
+# quota -v
+....
+
+Вы должны увидеть однострочную информацию, отражающую использование диска и текущие ограничения для каждой файловой системы, на которой включено квотирование.
+
+Теперь вы действительно готовы задавать ограничения при помощи команды man:edquota[8].
+
+У вас есть несколько вариантов того, как приводить в действие ограничения по объему дискового пространства, который могут занимать пользователь или группа, а также по количеству файлов, которые они могут создать. Вы можете ограничивать размещение ресурсов на основе объема дискового пространства (квотирование блоков), количества файлов (квотирование inode) или их комбинации. Каждое из этих ограничений, в свою очередь, делится на две категории: мягкие и жёсткие ограничения.
+
+Жёсткое ограничение не может быть превышено. Как только пользователь достиг своих ограничений, ресурсы соответствующей файловой системы ему больше выделяться не будут. Например, если пользователь имеет жесткое ограничение в 500 Кбайт на файловой системе и в текущий момент использует 490 Кбайт, то пользователь может получить дополнительно ещё 10 Кбайт. Попытка занять ещё 11 Кбайт окончится неудачно.
+
+С другой стороны, мягкие ограничения могут быть превышены в течении некоторого периода времени. Этот период времени также называют периодом отсрочки, который по умолчанию равен одной неделе. Если пользователь превышает своё мягкое ограничение в течение периода времени, превышающего отсрочку, то это мягкое ограничение становится жестким и последующее выделение ресурсов будет запрещено. Когда пользователь вернётся обратно к отметке, меньшей, чем мягкое ограничение, то период отсрочки будет сброшен.
+
+Далее приводится пример того, что вы можете наблюдать при запуске команды man:edquota[8]. Когда вызывается команда man:edquota[8], вы оказываетесь в редакторе, заданном переменной переменной окружения `EDITOR`, или в редакторе vi, если переменная `EDITOR` не задана, и можете редактировать квоты.
+
+[source,bash]
+....
+# edquota -u test
+....
+
+[.programlisting]
+....
+Quotas for user test:
+/usr: kbytes in use: 65, limits (soft = 50, hard = 75)
+ inodes in use: 7, limits (soft = 50, hard = 60)
+/usr/var: kbytes in use: 0, limits (soft = 50, hard = 75)
+ inodes in use: 0, limits (soft = 50, hard = 60)
+....
+
+Для каждой файловой системы, на которой включено квотирование, вы должны увидеть две строки. В одной строке приведены ограничения на блоки, а в другой на количество inode. Например, чтобы увеличить ограничения на количество блоков для пользователя с мягкого ограничения в 50 и жёсткого ограничения в 75, на мягкое ограничение в 500 и жёсткое ограничение в 600, измените:
+
+[.programlisting]
+....
+/usr: kbytes in use: 65, limits (soft = 50, hard = 75)
+....
+
+на:
+
+[.programlisting]
+....
+/usr: kbytes in use: 65, limits (soft = 500, hard = 600)
+....
+
+Новые ограничения вступят в силу после выхода из редактора.
+
+Иногда желательно установить ограничения квот на некоторый диапазон UID (идентификаторов пользователей). Это можно сделать при помощи параметра `-p` в команде man:edquota[8]. Во-первых, установите желаемое ограничение для пользователя, а затем запустите команду `edquota -p protouser startuid-enduid`. Например, если пользователь `test` имеет желаемые ограничения, то для дублирования этих ограничений на пользователей с UID от 10000 до 19999 может быть использована такая команда:
+
+[source,bash]
+....
+# edquota -p test 10000-19999
+....
+
+Дополнительную информацию можно получить из справочной страницы по команде man:edquota[8].
+
+=== Проверка ограничений и использования диска
+
+Для проверки квот и использования дисков вы можете использовать команды man:quota[1] или man:repquota[8]. Команда man:quota[1] может быть использована для проверки квот отдельных пользователей, групп, а также использования дисков. Пользователь может только проверить собственную квоту и квоту той группы, к которой он принадлежит. Только администратор системы может проверить квоты всех пользователей и групп. Команду man:repquota[8] можно использовать для получения суммарной статистики всех квот и использования дисков для файловых систем с включенными квотами.
+
+Далее приведен пример вывода команды `quota -v` для пользователя, который имеет ограничения на двух файловых системах.
+
+[.programlisting]
+....
+Disk quotas for user test (uid 1002):
+ Filesystem usage quota limit grace files quota limit grace
+ /usr 65* 50 75 5days 7 50 60
+ /usr/var 0 50 75 0 50 60
+....
+
+В этом примере для файловой системы [.filename]#/usr# пользователь превысил свое мягкое ограничение в 50 Кбайт на 15 Кбайт и имеет 5 дней до истечения отсрочки. Отметьте знак звездочки `*`, который указывает на превышение пользователем своего ограничения.
+
+Как правило, файловые системы, на которых пользователь не занимает дискового пространства, не показываются в выводе команды man:quota[1], даже если ему выделена квота на этой файловой системе. При использовании параметра `-v` эти файловые системы выводятся, как, например, файловая система [.filename]#/usr/var# в примере выше.
+
+=== Квоты в NFS
+
+Квоты определяются подсистемой квот на сервере NFS. Даемон man:rpc.rquotad[8] предоставляет информацию о квотах для программы man:quota[1] на клиентах NFS, позволяя пользователям на этих машинах смотреть свою статистику о квотах.
+
+Включите `rpc.rquotad` в файле [.filename]#/etc/inetd.conf# следующим образом:
+
+[.programlisting]
+....
+rquotad/1 dgram rpc/udp wait root /usr/libexec/rpc.rquotad rpc.rquotad
+....
+
+Теперь перезапустите `inetd`:
+
+[source,bash]
+....
+# /etc/rc.d/inetd restart
+....
+
+[[disks-encrypting]]
+== Шифрование дисковых разделов
+
+FreeBSD предоставляет прекрасную возможность по защите от несанкционированного доступа к данным. Права на доступ к файлам и технология принудительного контроля доступа MAC (Mandatory Access Control) (смотрите see crossref:mac[mac, Принудительный контроль доступа (MAC)]) помогают предотвратить несанкционированный доступ посторонних лиц к данным, при условии работы операционной системы и компьютера. Однако права доступа, контролируемые операционной системой, не имеют значения, если нападающий получает физический доступ к компьютеру и может просто перенести жёсткий диск на другую машину для копирования и дальнейшего анализа важных данных.
+
+Вне зависимости от того, как атакующий завладел жёстким диском или выключенным компьютером, технологии gbde (GEOM Based Disk Encryption - шифрование диска на уровне GEOM) и криптографическая подсистема `geli` FreeBSD могут защитить данные файловой системы компьютера даже против очень заинтересованной атакующей стороны с достаточными ресурсами. В отличие от громоздких систем шифрования, которые шифруют отдельные файлы, `gbde` и `geli` шифруют в прозрачном режиме файловую систему в целом, при этом данные в открытом виде на диск никогда не записываются.
+
+=== Шифрование диска при помощи gbde
+
+[.procedure]
+====
+
+. Получите права пользователя `root`
++
+Настройка gbde требует права доступа администратора системы.
++
+[source,bash]
+....
+% su -
+Password:
+....
++
+. Включите поддержку man:gbde[4] в конфигурационный файл ядра
++
+Добавьте следующую строку в файл конфигурации вашего ядра:
++
+`options GEOM_BDE`
++
+Перестройте ядро FreeBSD. Этот процесс описан в crossref:kernelconfig[kernelconfig, Настройка ядра FreeBSD].
++
+Перезагрузитесь, запустив новое ядро.
+. Альтернативой пересборке ядра является использование `kldload` для загрузки модуля man:gbde[4]:
++
+[source,bash]
+....
+# kldload geom_bde
+....
+====
+
+==== Подготовка зашифрованного жёсткого диска
+
+В следующем примере предполагается, что в вашу систему вы добавляете новый винчестер, на котором будет располагаться единственный раздел с зашифрованными данными. Этот раздел будет монтироваться в каталог [.filename]#/private#. gbde может также использоваться для шифрования [.filename]#/home# и [.filename]#/var/mail#, но это требует более сложной последовательности действий, что выходит за рамки этого вводного материала.
+
+[.procedure]
+====
+
+. Подключите новый жёсткий диск
++
+Установите новый диск в систему, как это описано в <<disks-adding>>. В рамках этого примера раздел, соответствующий новому жёсткому диску, будет называться [.filename]#/dev/ad4s1c#. Устройства [.filename]#/dev/ad0s1*# представляют существующие стандартные разделы FreeBSD нашей тестовой системы.
++
+[source,bash]
+....
+# ls /dev/ad*
+/dev/ad0 /dev/ad0s1b /dev/ad0s1e /dev/ad4s1
+/dev/ad0s1 /dev/ad0s1c /dev/ad0s1f /dev/ad4s1c
+/dev/ad0s1a /dev/ad0s1d /dev/ad4
+....
++
+. Создайте каталог для размещения файлов блокировок GBDE
++
+[source,bash]
+....
+# mkdir /etc/gbde
+....
++
+Файл блокировки gbde содержит информацию, которая нужна gbde для доступа к зашифрованному разделу. Не имея доступа к файлу блокировки, gbde не сможет расшифровать данные, хранимые в зашифрованном разделе, без значительного ручного вмешательства, что программно не поддерживается. Каждый зашифрованный раздел использует отдельный файл блокировки.
+. Инициализируйте раздел gbde
++
+Перед началом работы с разделом gbde его необходимо проинициализировать. Эта инициализация производится только один раз:
++
+[source,bash]
+....
+# gbde init /dev/ad4s1c -i -L /etc/gbde/ad4s1c.lock
+....
++
+man:gbde[8] запустит редактор, что позволит вам задать в шаблоне различные конфигурационные параметры. При работе с файловыми системами UFS1 и UFS2 задайте значение sector_size равным 2048:
++
+[.programlisting]
+....
+$FreeBSD: src/sbin/gbde/template.txt,v 1.1 2002/10/20 11:16:13 phk Exp $
+#
+# Sector size is the smallest unit of data which can be read or written.
+# Making it too small decreases performance and decreases available space.
+# Making it too large may prevent filesystems from working. 512 is the
+# minimum and always safe. For UFS, use the fragment size
+#
+sector_size = 2048
+[...]
+....
++
+man:gbde[8] дважды запросит ввод пароля, который будет использоваться для защиты данных. Пароль в обоих случаях должен вводиться одинаковый. Возможности gbde по защите ваших данных полностью зависят от качества выбранной вами ключевой фразы.
++
+По команде `gbde init` создаётся файл блокировок для вашего раздела gbde, который в нашем случае будет иметь имя [.filename]#/etc/gbde/ad4s1c.lock#. Для того, чтобы файлы блокировок корректно распознавались стартовым скриптом [.filename]#/etc/rc.d/gbde#, их имена должны заканчиваться на ".lock".
++
+[CAUTION]
+======
+
+Резервные копии файлов блокировок gbde _должны_ храниться вместе с содержимым шифруемых разделов. Хотя удаление только блокировочного файла не сможет противостоять дешифрации атакующим раздела gbde, без этого файла даже легитимный пользователь не сможет получить доступ к данным без определённых и значительных усилий, что не поддерживается man:gbde[8] и его разработчиком.
+======
++
+. Подключите зашифрованный раздел к системе
++
+[source,bash]
+....
+# gbde attach /dev/ad4s1c -l /etc/gbde/ad4s1c.lock
+....
++
+Будет выдан запрос на ввод ключевой фразы, которую вы выбирали во время инициализации зашифрованного раздела. Новое защищённое устройство будет видно в каталоге [.filename]#/dev# под названием [.filename]#/dev/device_name.bde#:
++
+[source,bash]
+....
+# ls /dev/ad*
+/dev/ad0 /dev/ad0s1b /dev/ad0s1e /dev/ad4s1
+/dev/ad0s1 /dev/ad0s1c /dev/ad0s1f /dev/ad4s1c
+/dev/ad0s1a /dev/ad0s1d /dev/ad4 /dev/ad4s1c.bde
+....
++
+. Создайте файловую систему на зашифрованном устройстве
++
+Как только защищённое устройство будет подключено к системе, вы сможете создать на нём файловую систему. Для этого используется утилита man:newfs[8]. Так как инициализация новой файловой системы UFS2 происходит быстрее, чем инициализация файловой системы старого формата UFS1, то рекомендуется использовать man:newfs[8] с параметром `-O2`.
++
+[source,bash]
+....
+# newfs -U -O2 /dev/ad4s1c.bde
+....
++
+[NOTE]
+======
+Запуск команды man:newfs[8] должен выполняться над подключенном разделе gbde, который идентифицируется по расширению [.filename]#*.bde# в имени устройства.
+======
++
+. Смонтируйте зашифрованный раздел
++
+Создайте точку монтирования для зашифрованной файловой системы.
++
+[source,bash]
+....
+# mkdir /private
+....
++
+Смонтируйте защищённую файловую систему.
++
+[source,bash]
+....
+# mount /dev/ad4s1c.bde /private
+....
++
+. Проверьте доступность зашифрованной файловой системы
++
+Защищённая файловая система теперь должна быть доступна утилите man:df[1] и доступной для использования.
++
+[source,bash]
+....
+% df -H
+Filesystem Size Used Avail Capacity Mounted on
+/dev/ad0s1a 1037M 72M 883M 8%
+/devfs 1.0K 1.0K 0B 100% /dev
+/dev/ad0s1f 8.1G 55K 7.5G 0% /home
+/dev/ad0s1e 1037M 1.1M 953M 0% /tmp
+/dev/ad0s1d 6.1G 1.9G 3.7G 35% /usr
+/dev/ad4s1c.bde 150G 4.1K 138G 0% /private
+....
+====
+
+==== Монтирование имеющихся зашифрованных файловых систем
+
+После каждой загрузки для каждой защищённой файловой системы перед их использованием должны выполняться повторное подключение к системе, проверка на наличие ошибок и монтирование. Требуемые для этого команды должны выполняться пользователем `root`.
+
+[.procedure]
+====
+
+. Подключение gbde-раздела к системе
++
+[source,bash]
+....
+# gbde attach /dev/ad4s1c -l /etc/gbde/ad4s1c.lock
+....
++
+Будет выдан запрос на ввод ключевой фразы, выбранной на этапе инициализации зашифрованного раздела gbde.
+. Проверка файловой системы на наличие ошибок
++
+Так как защищаемая файловая система не может пока быть указана в файле [.filename]#/etc/fstab# для автоматического монтирования, то она должны проверяться на наличие ошибок посредством ручного запуска man:fsck[8] до её монтирования.
++
+[source,bash]
+....
+# fsck -p -t ffs /dev/ad4s1c.bde
+....
++
+. Монтирование зашифрованной файловой системы
++
+[source,bash]
+....
+# mount /dev/ad4s1c.bde /private
+....
++
+Теперь защищённая файловая система доступна для работы.
+====
+
+===== Автоматическое монтирование зашифрованных разделов
+
+Для автоматического подключения, проверки и монтирования зашифрованного раздела можно создать скрипт, но по соображениям безопасности в этом скрипте пароля для man:gbde[8] быть не должно. Поэтому рекомендуется запускать такие скрипты вручную, а пароль задавать с консоли или сеанса man:ssh[1].
+
+Кроме того, базовая система содержит скрипт [.filename]#rc.d# для автоматического монтирования шифрованных разделов. Его аргументы могут быть указаны в файле man:rc.conf[5]:
+
+[.programlisting]
+....
+gbde_autoattach_all="YES"
+gbde_devices="ad4s1c"
+gbde_lockdir="/etc/gbde"
+....
+
+При этом ключевая фраза для gbde должна быть введена на этапе загрузки. После введения ключевой фразы зашифрованный раздел будет смонтирован автоматически. Такой подход может быть очень удобным для использования gbde на ноутбуках.
+
+==== Криптографическая защита, применяемая в gbde
+
+man:gbde[8] шифрует содержимое секторов при помощи 128-битного AES в режиме CBC. Каждый сектор диска шифруется различным ключом AES. Более полная информацию о системе шифрования gbde, включая алгоритм генерации ключей для секторов из ключевой фразы, вводимой пользователем, можно найти на страницах справочной системы о man:gbde[4].
+
+==== Вопросы совместимости
+
+man:sysinstall[8] несовместим с устройствами, зашифрованными gbde. Все устройства [.filename]#*.bde# перед запуском man:sysinstall[8] должны быть отключены от системы, или эта утилита аварийно завершит работу на этапе обнаружения устройств. Для отключения защищённого устройства, используемого в нашем примере, воспользуйтесь такой командой:
+
+[source,bash]
+....
+# gbde detach /dev/ad4s1c
+....
+
+=== Шифрование дисков при помощи `geli`
+
+Во FreeBSD имеется альтернативный криптографический класс GEOM - `geli`. В настоящий момент он поддерживается {pjd}. Утилита `geli` отличается от `gbde`; она предоставляет другой комплекс возможностей и использует иную схему криптования.
+
+Наиболее значимыми особенностями man:geli[8] являются:
+
+* Использование инфраструктуры man:crypto[9]: при наличии аппаратной криптографической поддержки, `geli` автоматически использует ее.
+* Поддержка разнообразных криптоалгоритмов (в настоящее время AES, Blowfish и 3DES).
+* Поддержка шифрованного корневого раздела. Для загрузки в такой ситуации потребуется ввести ключевую фразу.
+* Поддержка двух независимых ключей шифрования (например, "основного ключа" и "ключа компании").
+* Высокая скорость работы `geli` за счет простого криптования сектор-сектор.
+* Поддержка архивирования основных ключей. При необходимости текущие ключи могут быть уничтожены, а в дальнейшем доступ к данным восстановлен при помощи архивированных ключей.
+* Поддержка криптования файловых систем случайным одноразовым ключом - например, для разделов подкачки или временных файловых систем.
+
+Другие возможности класса `geli` описаны в его странице справочника: man:geli[8].
+
+Несколько следующих страниц будут посвящены описанию процесса конфигурации `geli` в ядре FreeBSD, а также объяснят, как создавать и использовать криптографический провайдер `geli`.
+
+Поскольку в процессе настройки возникнет необходимость внесения изменений в конфигурацию ядра, потребуются также привилегии суперпользователя.
+
+[.procedure]
+====
+
+. Добавление поддержки `geli` в ядро
++
+Добавьте в конфигурационный файл ядра следующие строки:
++
+[.programlisting]
+....
+options GEOM_ELI
+device crypto
+....
++
+Перестройте ядро, как описано в разделе crossref:kernelconfig[kernelconfig, Настройка ядра FreeBSD].
++
+Помимо этого, поддержка `geli` может быть активирована модулем ядра на этапе загрузки. Для этого добавьте в файл [.filename]#/boot/loader.conf# строку:
++
+[.programlisting]
+....
+geom_eli_load="YES"
+....
++
+Теперь ядро должно поддерживать man:geli[8].
+. Генерация главного ключа
++
+Предлагаемый пример описывает процесс генерации ключевого файла, который послужит частью главного ключа для шифрованного провайдера, монтируемого в каталог [.filename]#/private#. При помощи содержимого ключевого файла создается набор случайных данных, которым зашифровывается главный ключ. Кроме того, он будет защищен кодовой фразой. Размер сектора провайдера будет составлять 4kB. Наконец, мы обсудим, как присоединиться к провайдеру `geli`, создать на базе его файловую систему, как ее смонтировать и работать с ней, и, в заключение, как корректно завершить работу.
++
+Больший чем обычно размер сектора (как в нашем примере, 4 кБ) рекомендуется для увеличения производительности.
++
+Главный ключ будет защищен кодовой фразой; данные для ключевого файла берутся из [.filename]#/dev/random#. Размер сектора создаваемого нами шифрованного провайдера [.filename]#/dev/da2.eli# - 4кБ.
++
+[source,bash]
+....
+# dd if=/dev/random of=/root/da2.key bs=64 count=1
+# geli init -s 4096 -K /root/da2.key /dev/da2
+Enter new passphrase:
+Reenter new passphrase:
+....
++
+Использование одновременно кодовой фразы и ключевого файла не обязательно: любой из этих методов защиты главного ключа может применяться независимо.
++
+Если в качестве имени ключевого файла указан "-", используется стандартный ввод. Это позволяет использовать более одного ключевого файла:
++
+[source,bash]
+....
+# cat keyfile1 keyfile2 keyfile3 | geli init -K - /dev/da2
+....
++
+. Свяжите сгенерированный ключ с провайдером
++
+[source,bash]
+....
+# geli attach -k /root/da2.key /dev/da2
+Enter passphrase:
+....
++
+Созданный при этом файл дискового устройства будет называться [.filename]#/dev/da2.eli#.
++
+[source,bash]
+....
+# ls /dev/da2*
+/dev/da2 /dev/da2.eli
+....
++
+. Создайте новую файловую систему
++
+[source,bash]
+....
+# dd if=/dev/random of=/dev/da2.eli bs=1m
+# newfs /dev/da2.eli
+# mount /dev/da2.eli /private
+....
++
+Зашифрованная файловая система будет видна в выводе утилиты man:df[1] и готова к использованию:
++
+[source,bash]
+....
+# df -H
+Filesystem Size Used Avail Capacity Mounted on
+/dev/ad0s1a 248M 89M 139M 38% /
+/devfs 1.0K 1.0K 0B 100% /dev
+/dev/ad0s1f 7.7G 2.3G 4.9G 32% /usr
+/dev/ad0s1d 989M 1.5M 909M 0% /tmp
+/dev/ad0s1e 3.9G 1.3G 2.3G 35% /var
+/dev/da2.eli 150G 4.1K 138G 0% /private
+....
++
+. Размонтирование и деактивация провайдера
++
+После завершения работы с шифрованным разделом, когда содержимое каталога [.filename]#/private# больше не нужно, будет разумным отключить раздел от системы.
++
+[source,bash]
+....
+# umount /private
+# geli detach da2.eli
+....
+====
+
+Дополнительную информацию о man:geli[8] можно найти на соответствующей странице справочника.
+
+==== Использование стартового скрипта [.filename]#rc.d# [.filename]#geli#
+
+Для удобства использования подсистемы `geli` в комплект базовой системы FreeBSD входит стартовый скрипт, работой которого можно управлять из man:rc.conf[5]:
+
+[.programlisting]
+....
+geli_devices="da2"
+geli_da2_flags="-p -k /root/da2.key"
+....
+
+При этом дисковый раздел [.filename]#/dev/da2# будет сконфигурирован как провайдер `geli`, связан с ключевым файлом [.filename]#/root/da2.key#, а кодовая фраза не будет использоваться (отметим, что это возможно только в том случае, если при инициализации `geli init` был указан ключ `-P`). Шифрованный провайдер `geli` будет отсоединен перед выключением системы.
+
+Дополнительную информацию о конфигурации скриптов [.filename]#rc.d# можно найти в соответствующей crossref:config[configtuning-rcd,главе] Руководства.
+
+[[swap-encrypting]]
+== Шифрование области подкачки
+
+Шифрование области подкачки в FreeBSD достаточно легко конфигурируется. Варианты конфигурации слегка различаются в зависимости от версии системы. Для шифрования разделов подкачки можно использовать утилиты man:gbde[8] или man:geli[8];. В обоих случаях используется скрипт crossref:config[configtuning-rcd,rc.d] [.filename]#encswap#.
+
+Предыдущий раздел, <<disks-encrypting,Шифрование дисковых разделов>>, кратко описывает различные методы криптования.
+
+=== Зачем шифровать область подкачки?
+
+Как и в случае дисковых разделов, шифрование области подкачки применяется для защиты важной информации. Возьмем, к примеру, приложение, которому требуется работать с паролями. До тех пор, пока пароли хранятся в физической памяти, все в порядке. Если же операционная система начинает выгружать отдельные участки памяти в область подкачки, чтобы освободить память для других приложений, пароли могут быть записаны на диск в открытом виде и тем самым оказаться легко доступными злоумышленнику (имеющему физический доступ к диску - прим. пер.). В таких ситуациях решением может стать шифрование раздела подкачки.
+
+=== Подготовка
+
+[NOTE]
+====
+В данном разделе мы будем считать, что разделом подкачки является [.filename]#ad0s1b#.
+====
+
+До настоящего момента раздел подкачки не был зашифрован. Таким образом, на нем могут содержаться пароли или какая-либо иная важная информация в открытом виде. Чтобы избавиться от этого, заполним раздел подкачки случайными данными:
+
+[source,bash]
+....
+# dd if=/dev/random of=/dev/ad0s1b bs=1m
+....
+
+=== Шифрование раздела подкачки при помощи man:gbde[8]
+
+В строку файла [.filename]#/etc/fstab#, описывающую раздел подкачки, необходимо добавить суффикс `.bde`:
+
+[.programlisting]
+....
+# Device Mountpoint FStype Options Dump Pass#
+/dev/ad0s1b.bde none swap sw 0 0
+....
+
+=== Шифрование раздела подкачки при помощи man:geli[8]
+
+Процедура при использовании man:geli[8] для шифрования раздела подкачки сходна с использованием man:gbde[8]. В строку файла [.filename]#/etc/fstab#, описывающую раздел подкачки, нужно добавить суффикс `.eli`:
+
+[.programlisting]
+....
+# Device Mountpoint FStype Options Dump Pass#
+/dev/ad0s1b.eli none swap sw 0 0
+....
+
+По умолчанию, man:geli[8] использует алгоритм криптования AES с длиной ключа 256 бит.
+
+При необходимости эти параметры могут быть изменены в опции `geli_swap_flags` файла конфигурации [.filename]#/etc/rc.conf#. Приведенная ниже строка указывает, что скрипт rc.d [.filename]#encswap# должен использовать для криптования алгоритм Blowfish с ключом длиной 128 бит, размером сектора 4 килобайта и включенной опцией "отсоединиться при последнем закрытии":
+
+[.programlisting]
+....
+geli_swap_flags="-e blowfish -l 128 -s 4096 -d"
+....
+
+За списком возможных опций обращайтесь к описанию команды `onetime` в странице справочника man:geli[8].
+
+=== Окончательная проверка
+
+После перезагрузки системы правильность работы шифрованного раздела подкачки может быть проверена при помощи команды `swapinfo`.
+
+В случае использования man:gbde[8]:
+
+[source,bash]
+....
+% swapinfo
+Device 1K-blocks Used Avail Capacity
+/dev/ad0s1b.bde 542720 0 542720 0%
+....
+
+При использовании man:geli[8]:
+
+[source,bash]
+....
+% swapinfo
+Device 1K-blocks Used Avail Capacity
+/dev/ad0s1b.eli 542720 0 542720 0%
+....
diff --git a/documentation/content/ru/books/handbook/eresources/_index.adoc b/documentation/content/ru/books/handbook/eresources/_index.adoc
new file mode 100644
index 0000000000..ab38313b46
--- /dev/null
+++ b/documentation/content/ru/books/handbook/eresources/_index.adoc
@@ -0,0 +1,1047 @@
+---
+title: Приложение C. Ресурсы в интернет
+part: Часть V. Приложения
+prev: books/handbook/bibliography
+next: books/handbook/pgpkeys
+---
+
+[appendix]
+[[eresources]]
+= Ресурсы в интернет
+:doctype: book
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: C
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+Высокая скорость прогресса FreeBSD делает непрактичным использование печатных изданий для информирования о последних разработках. Электронные ресурсы это лучший, а зачастую и единственный способ информирования о новых возможностях. Поскольку FreeBSD основывается на усилиях добровольцев, сообщество пользователей само по себе зачастую выполняет роль "службы технической поддержки", а электронная почта, веб форумы и новости USENET это наиболее эффективный способ обращения к этому сообществу.
+
+Наиболее важная контактная информация сообщества пользователей FreeBSD показана ниже. Если вам известно о других ресурсах, не упомянутых здесь, пожалуйста отправьте информацию о них в {freebsd-doc}, чтобы мы могли включить в этот документ.
+
+[[eresources-mail]]
+== Списки рассылки
+
+Обращение в списки рассылки является наиболее простым способом задания вопросов или открытия технических дискуссий в сосредоточенной аудитории пользователей и разработчиков FreeBSD. Существует большое разнообразие списков по десяткам разных тем FreeBSD. Обращение в наиболее подходящий список рассылки обеспечит вас более быстрым и более точным ответом.
+
+[WARNING]
+====
+
+Все сообщения в приведенные ниже списки рассылки должны быть составлены _только на английском языке_.
+====
+
+Описание каждой рассылки дано в конце этого документа. _Пожалуйста, прочтите описание перед подпиской или отправкой почты в любой из списков_. Большинство наших подписчиков получают многие сотни относящихся к FreeBSD сообщений каждый день, и определяя правила использования рассылок мы стремимся удержать высокое соотношение "сигнал к шуму". При меньшем соотношении списки рассылки перестанут быть эффективной средой общения участников проекта.
+
+[NOTE]
+====
+_Если вы желаете проверить возможность отправки сообщений в списки рассылки FreeBSD, пошлите тестовое сообщение на {freebsd-test}._ Пожалуйста, не шлите тестовые сообщения в любой другой список рассылки.
+====
+
+Если вы сомневаетесь, в какой именно список рассылки нужно направить вопрос, то прочтите статью link:{freebsd-questions-article}[Как эффективно использовать список рассылки FreeBSD-questions].
+
+Перед тем, как направлять сообщение в любой список рассылки, пожалуйста, выясните, как лучше всего их использовать, например, как избежать частого повторения одних и тех же дискуссий, прочитав документ link:{mailing-list-faq}[Часто задаваемые вопросы о списках рассылки] (FAQ).
+
+Архивы поддерживаются для всех списков рассылки и поиск по ним организован на link:https://www.FreeBSD.org/ru/search/[WWW сервере FreeBSD]. Поиск в архиве по ключевым словам дает отличный способ получения ответов на часто задаваемые вопросы и должен быть выполнен перед отправкой вопроса. Следует также отметить то, что отправленные в списки рассылок сообщения сохраняются в архивах навсегда. Если есть необходимость сохранить приватность, то задействуйте любой доступный вам второстепенный адрес электронной почты, предоставляя в сообщении лишь публичную информацию.
+
+[[eresources-summary]]
+=== Списки рассылки
+
+_Общие списки:_ Ниже представлены общие списки рассылки, к которым каждый может (и приглашается) присоединиться:
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Список
+| Назначение
+
+|link:{freebsd-advocacy-url}[freebsd-advocacy]
+|В защиту FreeBSD
+
+|{freebsd-announce}
+|Важные события и вехи проекта
+
+|link:{freebsd-arch-url}[freebsd-arch]
+|Обсуждения архитектуры и дизайна системы
+
+|link:{freebsd-bugbusters-url}[freebsd-bugbusters]
+|Обсуждения, относящиеся к поддержке базы данных сообщений о проблемах FreeBSD и соответствующим инструментам
+
+|link:{freebsd-bugs-url}[freebsd-bugs]
+|Сообщения о проблемах
+
+|link:{freebsd-chat-url}[freebsd-chat]
+|Не-технические темы, относящиеся к сообществу FreeBSD
+
+|link:{freebsd-chromium-url}[freebsd-chromium]
+|Вопросы, относящиеся к Chromium во FreeBSD
+
+|{freebsd-current}
+|Обсуждения, относящиеся к использованию FreeBSD-CURRENT
+
+|link:{freebsd-isp-url}[freebsd-isp]
+|Вопросы использования FreeBSD провайдерами
+
+|link:{freebsd-jobs-url}[freebsd-jobs]
+|Вакансии и резюме, относящиеся к FreeBSD, с полной и частичной занятостью
+
+|link:{freebsd-policy-url}[freebsd-policy]
+|Публикация правил FreeBSD Core team. Только для чтения, малое количество сообщений
+
+|link:{freebsd-questions-url}[freebsd-questions]
+|Вопросы пользователей и техническая поддержка
+
+|{freebsd-security-notifications}
+|Уведомления безопасности
+
+|{freebsd-stable}
+|Обсуждения, относящиеся к использованию FreeBSD-STABLE
+
+|{freebsd-test}
+|Рассылка для отправки тестовых сообщений (вместо обычных списков рассылки
+|===
+
+_Технические списки:_ Следующие списки предназначены для технических обсуждений. Вам необходимо внимательно прочитать описание перед подпиской или отправкой почты в один из этих списков, поскольку они предназначены для использования внутри проекта.
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Список
+| Назначение
+
+|{freebsd-acpi}
+|Разработка ACPI и системы управления энергопотреблением
+
+|link:{freebsd-afs-url}[freebsd-afs]
+|Портирование AFS на FreeBSD
+
+|link:{freebsd-aic7xxx-url}[freebsd-aic7xxx]
+|Разработка драйверов для Adaptec(R) AIC 7xxx
+
+|link:{freebsd-amd64-url}[freebsd-amd64]
+|Портирование FreeBSD на системы AMD64
+
+|link:{freebsd-apache-url}[freebsd-apache]
+|Обсуждение портов, относящихся к Apache
+
+|link:{freebsd-arm-url}[freebsd-arm]
+|Портирование FreeBSD на процессоры ARM(R)
+
+|link:{freebsd-atm-url}[freebsd-atm]
+|Использование ATM сетей с FreeBSD
+
+|link:{freebsd-audit-url}[freebsd-audit]
+|Проект аудита исходных текстов
+
+|link:{freebsd-binup-url}[freebsd-binup]
+|Дизайн и разработка системы бинарных обновлений
+
+|link:{freebsd-bluetooth-url}[freebsd-bluetooth]
+|Использование технологии Bluetooth(R) во FreeBSD
+
+|link:{freebsd-cluster-url}[freebsd-cluster]
+|Использование FreeBSD в кластерах
+
+|link:{freebsd-cvsweb-url}[freebsd-cvsweb]
+|Поддержка CVSweb
+
+|link:{freebsd-database-url}[freebsd-database]
+|Обсуждение использования и разработки баз данных под FreeBSD
+
+|link:{freebsd-doc-url}[freebsd-doc]
+|Создание относящихся к FreeBSD документов
+
+|link:{freebsd-drivers-url}[freebsd-drivers]
+|Создание драйверов устройств для FreeBSD
+
+|link:{freebsd-eclipse-url}[freebsd-eclipse]
+|Использование в FreeBSD Eclipse IDE, а также приложений и портов для нее.
+
+|link:{freebsd-eol-url}[freebsd-eol]
+|Взаимная поддержка относящегося к FreeBSD программного обеспечения, более не поддерживаемого проектом FreeBSD.
+
+|link:{freebsd-embedded-url}[freebsd-embedded]
+|Использование FreeBSD во встроенных системах
+
+|link:{freebsd-emulation-url}[freebsd-emulation]
+|Эмуляция других систем, таких как Linux/MS-DOS(R)/Windows(R)
+
+|link:{freebsd-firewire-url}[freebsd-firewire]
+|Техническое обсуждение FreeBSD FireWire(R) (iLink, IEEE 1394)
+
+|link:{freebsd-fs-url}[freebsd-fs]
+|Файловые системы
+
+|link:{freebsd-gecko-url}[freebsd-gecko]
+|Проблемы со средствами визуализации Gecko
+
+|link:{freebsd-geom-url}[freebsd-geom]
+|Относящиеся к GEOM обсуждения и реализации
+
+|link:{freebsd-gnome-url}[freebsd-gnome]
+|Портирование GNOME и приложений GNOME
+
+|link:{freebsd-hackers-url}[freebsd-hackers]
+|Общее техническое обсуждение
+
+|link:{freebsd-hardware-url}[freebsd-hardware]
+|Общее обсуждение оборудования для FreeBSD
+
+|link:{freebsd-i18n-url}[freebsd-i18n]
+|Интернационализация FreeBSD
+
+|link:{freebsd-ia32-url}[freebsd-ia32]
+|FreeBSD на платформе IA-32 (Intel(R) x86)
+
+|link:{freebsd-ia64-url}[freebsd-ia64]
+|Портирование FreeBSD на будущие системы Intel(R) IA64
+
+|link:{freebsd-ipfw-url}[freebsd-ipfw]
+|Технические обсуждения, относящиеся к переработке кода IP брандмауэра
+
+|link:{freebsd-isdn-url}[freebsd-isdn]
+|Разработчики ISDN
+
+|link:{freebsd-jail-url}[freebsd-jail]
+|Обсуждение man:jail[8]
+
+|link:{freebsd-java-url}[freebsd-java]
+|Разработчики Java(TM) и те, кто занимается переносом JDK(TM) на FreeBSD
+
+|link:{freebsd-kde-url}[freebsd-kde]
+|Портирование KDE и приложений KDE
+
+|link:{freebsd-lfs-url}[freebsd-lfs]
+|Портирование LFS на FreeBSD
+
+|link:{freebsd-libh-url}[freebsd-libh]
+|Второе поколение программы установки системы и пакетов
+
+|link:{freebsd-mips-url}[freebsd-mips]
+|Портирование FreeBSD на MIPS(R)
+
+|link:{freebsd-mobile-url}[freebsd-mobile]
+|Обсуждение портативных компьютеров
+
+|link:{freebsd-mono-url}[freebsd-mono]
+|Mono и C# приложения на FreeBSD
+
+|link:{freebsd-mozilla-url}[freebsd-mozilla]
+|Портирование Mozilla на FreeBSD
+
+|{freebsd-multimedia}
+|Мультимедиа приложения
+
+|link:{freebsd-new-bus-url}[freebsd-new-bus]
+|Технические обсуждения архитектуры шины
+
+|link:{freebsd-net-url}[freebsd-net]
+|Обсуждения, относящиеся к сети и исходному тексту TCP/IP
+
+|link:{freebsd-office-url}[freebsd-office]
+|Офисные приложения во FreeBSD
+
+|link:{freebsd-performance-url}[freebsd-performance]
+|Вопросы оптимизации производительности для быстрых/работающих под большой нагрузкой серверов
+
+|link:{freebsd-perl-url}[freebsd-perl]
+|Поддержка различных портов, относящихся к Perl
+
+|link:{freebsd-pf-url}[freebsd-pf]
+|Обсуждение брандмауэра на базе packet filter
+
+|link:{freebsd-platforms-url}[freebsd-platforms]
+|Относится к портам для платформ не-Intel(R) архитектуры
+
+|link:{freebsd-ports-url}[freebsd-ports]
+|Обсуждения Коллекции Портов
+
+|link:{freebsd-ports-bugs-url}[freebsd-ports-bugs]
+|Обсуждения относящихся к портам ошибок/PR
+
+|link:{freebsd-ppc-url}[freebsd-ppc]
+|Портирование FreeBSD на PowerPC(R)
+
+|link:{freebsd-proliant-url}[freebsd-proliant]
+|Работа FreeBSD на серверной платформе HP ProLiant
+
+|link:{freebsd-python-url}[freebsd-python]
+|Вопросы, специфичные для использования Python во FreeBSD
+
+|link:{freebsd-rc-url}[freebsd-rc]
+|Обсуждения, касающиеся системы [.filename]#rc.d# и работы над ней
+
+|link:{freebsd-realtime-url}[freebsd-realtime]
+|Разработка расширений реального времени для FreeBSD
+
+|link:{freebsd-ruby-url}[freebsd-ruby]
+|Обсуждения, касающиеся специфики использования Ruby во FreeBSD
+
+|link:{freebsd-scsi-url}[freebsd-scsi]
+|Подсистема SCSI
+
+|{freebsd-security}
+|Сообщения безопасности, касающиеся FreeBSD
+
+|link:{freebsd-small-url}[freebsd-small]
+|Использование FreeBSD во встроенных приложениях (устарел; следует использовать link:{freebsd-embedded-url}[freebsd-embedded])
+
+|link:{freebsd-sparc64-url}[freebsd-sparc64]
+|Портирование FreeBSD на системы, основанные на SPARC(R)
+
+|link:{freebsd-standards-url}[freebsd-standards]
+|Соответствие FreeBSD стандартам C99 и POSIX(R)
+
+|link:{freebsd-sysinstall-url}[freebsd-sysinstall]
+|Разработка man:sysinstall[8]
+
+|link:{freebsd-threads-url}[freebsd-threads]
+|Потоки в FreeBSD
+
+|link:{freebsd-testing-url}[freebsd-testing]
+|Тестирование производительности и стабильности FreeBSD
+
+|link:{freebsd-tilera-url}[freebsd-tilera]
+|Портирование FreeBSD на процессоры Tilera
+
+|link:{freebsd-tokenring-url}[freebsd-tokenring]
+|Поддержка Token Ring в FreeBSD
+
+|link:{freebsd-toolchain-url}[freebsd-toolchain]
+|Поддержка встроенных инструментальных средств FreeBSD
+
+|link:{freebsd-usb-url}[freebsd-usb]
+|Обсуждение поддержки USB в FreeBSD
+
+|link:{freebsd-virtualization-url}[freebsd-virtualization]
+|Обсуждение различных техник виртуализации, поддерживаемых FreeBSD
+
+|link:{freebsd-vuxml-url}[freebsd-vuxml]
+|Обсуждение инфраструктуры VuXML
+
+|link:{freebsd-x11-url}[freebsd-x11]
+|Сопровождение и поддержка X11 в FreeBSD
+
+|link:{freebsd-xen-url}[freebsd-xen]
+|Обсуждение портирования FreeBSD на Xen(TM) - реализация и использование
+|===
+
+_Ограниченные списки:_ Следующие списки рассылки предназначены для более специализированной (и более официальной) аудитории и вероятно не могут заинтересовать широкую публику. Вероятно хорошей идеей будет сначала наладить общение в технических списках рассылки перед присоединением к ограниченным спискам, так вы сможете освоить этику общения.
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Список
+| Назначение
+
+|link:{freebsd-hubs-url}[freebsd-hubs]
+|Люди, поддерживающие зеркала (поддержка инфраструктуры)
+
+|link:{freebsd-user-groups-url}[freebsd-user-groups]
+|Координация групп пользователей
+
+|link:{freebsd-vendors-url}[freebsd-vendors]
+|Координация поставщиков перед релизом
+
+|link:{freebsd-wip-status-url}[freebsd-wip-status]
+|Статус начатых работ (Work-In-Progress) во FreeBSD
+
+|link:{freebsd-wireless-url}[freebsd-wireless]
+|Обсуждение разработки стека 802.11, утилит, драйверов устройств
+
+|link:{freebsd-www-url}[freebsd-www]
+|Ответственные за link:https://www.FreeBSD.org/[www.FreeBSD.org]
+|===
+
+_Дайджест рассылки:_ Все вышеприведенные списки доступны в формате дайджеста. После подписки на рассылку, вы можете изменить параметры дайджеста в разделе настроек учетной записи.
+
+_CVS и SVN рассылки:_ Следующие рассылки предназначены для людей, заинтересованных в просмотре сообщений об изменении в различных областях дерева исходных текстов. Это списки _только для чтения_ и вы не должны отправлять туда почту.
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Рассылка
+| Область исходного текста
+| Описание области исходного текста
+
+|link:{cvs-all-url}[cvs-all]
+|[.filename]#/usr/(CVSROOT\|doc\|ports)#
+|Все изменения в любой области дерева исходных текстов (надмножество других списков рассылки CVS)
+
+|link:{cvs-doc-url}[cvs-doc]
+|[.filename]#/usr/(doc\|www)#
+|Все изменения в дереве исходных текстов документации и Web-сервера
+
+|link:{cvs-ports-url}[cvs-ports]
+|[.filename]#/usr/ports#
+|Все изменения в дереве портов
+
+|link:{cvs-projects-url}[cvs-projects]
+|[.filename]#/usr/projects#
+|Все изменения в дереве проектов
+
+|link:{cvs-src-url}[cvs-src]
+|[.filename]#/usr/src#
+|Все изменения в дереве исходных текстов системы (создаваемых во время импорта из SVN в CVS)
+
+|{svn-src-all}
+|[.filename]#/usr/src#
+|Все изменения в репозитории Subversion (за исключением [.filename]#user# и [.filename]#projects#)
+
+|{svn-src-head}
+|[.filename]#/usr/src#
+|Все изменения в ветке "head" репозитория Subversion (ветка FreeBSD-CURRENT)
+
+|link:{svn-src-projects-url}[svn-src-projects]
+|[.filename]#/usr/projects#
+|Все изменения в части [.filename]#projects# дерева исходных текстов репозитория Subversion
+
+|link:{svn-src-release-url}[svn-src-release]
+|[.filename]#/usr/src#
+|Все изменения в части [.filename]#release# дерева исходных текстов репозитория Subversion
+
+|link:{svn-src-releng-url}[svn-src-releng]
+|[.filename]#/usr/src#
+|Все изменения в части [.filename]#releng# дерева исходных текстов репозитория Subversion
+
+|link:{svn-src-stable-url}[svn-src-stable]
+|[.filename]#/usr/src#
+|Все изменения во всех ветках stable дерева исходных текстов репозитория Subversion
+
+|link:{svn-src-stable-6-url}[svn-src-stable-6]
+|[.filename]#/usr/src#
+|Все изменения в ветке [.filename]#stable/6# дерева исходных текстов репозитория Subversion
+
+|link:{svn-src-stable-7-url}[svn-src-stable-7]
+|[.filename]#/usr/src#
+|Все изменения в ветке [.filename]#stable/7# дерева исходных текстов репозитория Subversion
+
+|link:{svn-src-stable-8-url}[svn-src-stable-8]
+|[.filename]#/usr/src#
+|Все изменения в ветке [.filename]#stable/8# дерева исходных текстов репозитория Subversion
+
+|link:{svn-src-stable-other-url}[svn-src-stable-other]
+|[.filename]#/usr/src#
+|Все изменения в предыдущих ветках [.filename]#stable# дерева исходных текстов репозитория Subversion
+
+|link:{svn-src-svnadmin-url}[svn-src-svnadmin]
+|[.filename]#/usr/src#
+|Все изменения в административных скриптах, хуках (hook) и других конфигурационных параметрах дерева исходных текстов репозитория Subversion
+
+|link:{svn-src-user-url}[svn-src-user]
+|[.filename]#/usr/src#
+|Все изменения в экспериментальной части [.filename]#user# дерева исходных текстов репозитория Subversion
+
+|link:{svn-src-vendor-url}[svn-src-vendor]
+|[.filename]#/usr/src#
+|Все изменения в части дерева исходных текстов репозитория Subversion, выделенной для работы поставщиков (vendor)
+|===
+
+[[eresources-subscribe]]
+=== Как подписаться
+
+Для подписки на рассылку, нажмите на название списка рассылки выше или воспользуйтесь ссылкой {mailman-lists-url} и нажмите на имя рассылки, которой вы заинтересовались. Страница списка рассылки содержит все необходимые инструкции по подписке.
+
+Для отправки сообщения в выбранный список рассылки, отправьте письмо в mailto:listname@FreeBSD.org[listname@FreeBSD.org]. Это письмо будет разослано участникам рассылки по всему миру.
+
+Для отписки от рассылки, нажмите на ссылку, находящуюся внизу каждого письма, отправляемого через список рассылки. Возможна также отписка путем отправки письма на mailto:listname-unsubscribe@FreeBSD.org[listname-unsubscribe@FreeBSD.org].
+
+Напоминаем, что обсуждение в технических списках рассылки должно оставаться в рамках технической темы. Если вас интересует только получение важных анонсов, мы предлагаем подписаться на рассылку с небольшим трафиком {freebsd-announce}.
+
+[[eresources-charters]]
+=== Описание рассылок
+
+_Все_ списки рассылки FreeBSD имеют определенные основные правила, которых должен придерживаться каждый использующий их. Несоблюдение этих правил приведет к отправлению двух (2) предупреждений от FreeBSD Postmaster mailto:postmaster@FreeBSD.org[postmaster@FreeBSD.org], после которых, после третьего нарушения, подписчик будет удален из всех списков рассылки FreeBSD и дальнейшие его сообщения будут отфильтровываться. Мы сожалеем, что эти правила и меры вообще необходимы, но современный интернет это довольно суровая среда и многие его механизмы довольно слабы.
+
+Основные правила:
+
+* Тема любого сообщения должна соответствовать назначению списка рассылки, в который это сообщение отправляется. Например, если список рассылки посвящен техническим вопросам, сообщение должно быть техническим. Продолжающееся обсуждение вне темы, или флейм только понижают ценность рассылки для всех ее участников и поэтому не разрешаются. Для обсуждений вне какой-либо определенной темы необходимо использовать {freebsd-chat}, специально для этого предназначенный.
+* Ни одно сообщение не должно отправляться более чем в 2 рассылки, отправка сообщения в 2 рассылки должна выполняться только при наличии простой и очевидной причины для дублирования сообщения. В большинстве рассылок подписчикам уже приходит много избыточного материала, и за исключением редких случаев (скажем, "-stable & -scsi"), на самом деле нет причины отправлять сообщение более чем в один список рассылки. Если сообщение отправлено вам так, что в поле `Cc` находятся несколько списков рассылки, необходимо урезать поле `Cc` перед отправкой ответа. _Именно вы отвечаете за собственные сообщения, независимо от того, кто был автором исходного письма._
+* Персональные нападки и профанация (в контексте аргументов) не разрешены, это относится и к пользователям, и к разработчикам. Грубые нарушения сетевой этики, такие как цитирование или пересылка личной переписки без специального на то разрешения, осуждаются но специальные меры в этом случае не принимаются. _Однако_, существует несколько специальных случаев, когда такие письма не отвечают назначению списка рассылки и, следовательно, могут повлечь отправку предупреждения (или исключение из списка рассылки).
+* Реклама не-FreeBSD продуктов или сервисов строго запрещена и исключение из списка рассылки последует незамедлительно, если станет очевидным, что это спам.
+
+_Описания рассылок:_
+
+{freebsd-acpi}::
+_Разработка ACPI и системы управления энергопотреблением_
+
+link:{freebsd-afs-url}[freebsd-afs]::
+_Andrew File System_
++
+Этот список предназначен для обсуждения портирования и использования AFS от CMU/Transarc
+
+{freebsd-announce}::
+_Важные события / вехи проекта_
++
+Этот список рассылки предназначен для тех, кто интересуется только периодическими анонсами значительных событий FreeBSD. Сюда включаются анонсы снэпшотов и других релизов, а также новых возможностей FreeBSD. Рассылка может содержать призыв к добровольцам и т.п. Это строго модерируемый список рассылки с малым объемом трафика.
+
+link:{freebsd-arch-url}[freebsd-arch]::
+_Обсуждение архитектуры и дизайна системы_
++
+Эта рассылка предназначена для обсуждения архитектуры FreeBSD. Сообщения в основном строго технические. Примеры подходящих тем:
+
+** Как изменить систему сборки для одновременной сборки нескольких по-разному настроенных систем.
+** Что необходимо исправить в VFS для включения слоев Heidemann.
+** Как необходимо изменить интерфейс драйверов устройств для использования одних и тех же драйверов на множестве шин и архитектур.
+** Как написать сетевой драйвер.
+
+link:{freebsd-audit-url}[freebsd-audit]::
+_Проект аудита исходных текстов_
++
+Это список рассылки для проекта аудита исходных текстов FreeBSD. Хотя первоначально он предназначался для изменений, связанных с безопасностью, его назначение было расширено для пересмотра всех изменений кода.
++
+В эту рассылку отправляется большой объем исправлений, и она вероятно не представляет интереса для обычного пользователя FreeBSD. Обсуждения безопасности, не относящиеся к определенному изменению в коде, ведутся в freebsd-security. Разработчикам предлагается отправлять изменения в этот список рассылки для просмотра, особенно если эти изменения затрагивают части кода, ошибки в которых могут повлечь нарушение целостности системы.
+
+link:{freebsd-binup-url}[freebsd-binup]::
+_Проект бинарного обновления FreeBSD_
++
+Этот список предназначен для обсуждений системы бинарного обновления системы, или binup. В этой рассылке обсуждаются вопросы дизайна, детали реализации, исправления, сообщения об ошибках, сообщения о статусе, запросы на расширение функциональности, протоколы коммитов, и все, что относится к binup.
+
+link:{freebsd-bluetooth-url}[freebsd-bluetooth]::
+_Bluetooth(R) во FreeBSD_
++
+Это форум, где собираются пользователи Bluetooth(R) во FreeBSD. Обсуждения касаются вопросов архитектуры, деталей реализации, патчей, сообщений об ошибках, состояния работы, запросов на добавление функций и всего, что относится к Bluetooth(R).
+
+link:{freebsd-bugbusters-url}[freebsd-bugbusters]::
+_Координация усилий по обработке сообщений о проблемах_
++
+Назначение этой рассылки в координации и предоставлении места для обсуждения для лиц, обслуживающих базу данных сообщений о проблемах (bugmeister, bugbusters) и для всех сторон, интересующихся базой данных PR. Эта рассылка не предназначена для обсуждения отдельных проблем, исправлений или PR.
+
+link:{freebsd-bugs-url}[freebsd-bugs]::
+_Сообщения об ошибках_
++
+Этот список рассылки предназначен для отправки сообщений об ошибках в FreeBSD. Когда это возможно, сообщения должны отправляться с использованием man:send-pr[1] или через link:https://www.FreeBSD.org/ru/send-pr/[WEB интерфейс] к `send-pr`.
+
+link:{freebsd-chat-url}[freebsd-chat]::
+_Не-технические темы, относящиеся к сообществу FreeBSD_
++
+В эту рассылку входят все темы, не подходящие для других рассылок, с не-технической, социальной информацией. Она включает обсуждения на темы: кто пьет слишком много кофе, где варят лучшее пиво, кто варит пиво в своем подвале, и так далее. Нерегулярные анонсы важных событий (такие как будущие встречи, свадьбы, дни рождения, новая работа и т.д.) могут быть опубликованы в технических рассылках, но ответы должны отправляться в -chat.
+
+link:{freebsd-chromium-url}[freebsd-chromium]::
+_Вопросы, относящиеся к Chromium во FreeBSD_
++
+Список рассылки, предназначенный для обсуждения поддержки Chromium во FreeBSD. Это технический список рассылки, в котором обговаривается разработка и установка Chromium.
+
+{core-name}::
+_Команда FreeBSD core_
++
+Это внутренний список рассылки, используемый членами core. Сообщения в эту рассылку могут быть отправлены по серьезной, имеющей отношение к FreeBSD причине, которая требует рассмотрения на самом высоком уровне.
+
+{freebsd-current}::
+_Обсуждения, касающиеся использования FreeBSD-CURRENT_
++
+Это список рассылки для пользователей FreeBSD-CURRENT. Он включает предупреждения о новых возможностях, вносимых в -CURRENT, влияющих на пользователей, и инструкции относительно действий, которые должны быть предприняты для поддержки -CURRENT. Всякий, работающий с "CURRENT", должен подписаться на эту рассылку. Это технический список рассылки, все сообщения должны быть строго техническими.
+
+link:{freebsd-cvsweb-url}[freebsd-cvsweb]::
+_FreeBSD CVSweb Project_
++
+Технические обсуждения использования, разработки и поддержки FreeBSD-CVSweb.
+
+link:{freebsd-doc-url}[freebsd-doc]::
+_Проект документирования_
++
+Этот список рассылки предназначен для обсуждения вопросов и проектов, относящихся к созданию документации для FreeBSD. Члены этой рассылки все вместе обозначаются как "The FreeBSD Documentation Project". Это открытая рассылка; присоединяйтесь и участвуйте!
+
+link:{freebsd-drivers-url}[freebsd-drivers]::
+_Создание драйверов устройств для FreeBSD_
++
+Этот список рассылки предназначен для технических дискуссий, относящихся к написанию драйверов устройств для FreeBSD. Это наилучшее место для того, чтобы задать вопросы по форматам и протоколам общенияi (API) драйверов устройств с ядром FreeBSD.
+
+link:{freebsd-eclipse-url}[freebsd-eclipse]::
+_Список рассылки для пользователей системы Eclipse IDE под FreeBSD, а также ее приложений и портов._
++
+Этот список рассылки призван оказать помощь тем, кто выбирает, устанавливает, использует, разрабатывает и поддерживает работу Eclipse IDE под FreeBSD, а также портирует их под FreeBSD.
++
+Кроме того, в данном списке для общего блага пересекаются и обмениваются информацией сообщества Eclipse и FreeBSD.
++
+Хотя данный список предназначен главным образом для тех, кто использует Eclipse, в нем также можно обсуждать средства разработки приложений для FreeBSD при помощи среды Eclipse.
+
+link:{freebsd-embedded-url}[freebsd-embedded]::
+_Использование FreeBSD во встроенных системах_
++
+Этот список рассылки, предназначенный для технических обсуждений, рассматривает работу FreeBSD в особо стесненных условиях, в частности, во встроенных (embedded) системах. В данном случае встроенными считаются вычислительные устройства, отличные от настольных компьютеров и выполняющие, как правило, специализированные задачи. Примером могут служить смартфоны, сетевые устройства, такие как маршрутизаторы, коммутаторы и офисные АТС, телеметрические системы, КПК, кассовые терминалы и т.п.
+
+link:{freebsd-emulation-url}[freebsd-emulation]::
+_Эмуляция других систем, таких как Linux/MS-DOS(R)/Windows(R) _
++
+Этот список рассылки предназначен для обсуждения вопросов запуска и эксплуатации под FreeBSD программ, предназначенных для работы под другими операционными системами.
+
+link:{freebsd-eol-url}[freebsd-eol]::
+_Взаимная поддержка относящегося к FreeBSD программного обеспечения, более не поддерживаемого проектом FreeBSD._
++
+Этот список рассылки предназначен для интересующихся предоставлением или использованием взаимной поддержки относящегося к FreeBSD программного обеспечения, для которого проект FreeBSD более не предоставляет официальной поддержки (например, в виде сообщений безопасности или патчей).
+
+link:{freebsd-firewire-url}[freebsd-firewire]::
+_FireWire(R) (iLink, IEEE 1394)_
++
+Это список рассылки, предназначенный для обсуждения дизайна и реализации подсистемы FireWire(R) (также известной как IEEE 1394 или iLink) в FreeBSD. Соответствующие темы относятся к стандартам, устройствам шины и их протоколам, наборам плат/карт/чипов адаптера, а также архитектуре и реализации кода для их правильной поддержки.
+
+link:{freebsd-fs-url}[freebsd-fs]::
+_Файловые системы_
++
+Обсуждения, относящиеся к файловым системам FreeBSD. Это технический список рассылки, предназначенный только для технических обсуждений.
+
+link:{freebsd-gecko-url}[freebsd-gecko]::
+_Средства визуализации Gecko_
++
+Дискуссия о приложениях Gecko, используемых на FreeBSD.
++
+Обсуждение сосредоточено вокруг портированных приложений Gecko, их установки, разработки и поддержки во FreeBSD.
+
+link:{freebsd-geom-url}[freebsd-geom]::
+_GEOM_
++
+Обсуждения, относящиеся к GEOM и связанным с GEOM реализациям. Это технический список рассылки, предназначенный только для технических обсуждений.
+
+link:{freebsd-gnome-url}[freebsd-gnome]::
+_GNOME_
++
+Обсуждения, относящиеся к графической среде GNOME для системы FreeBSD. Это технический список рассылки, предназначенный только для технических обсуждений.
+
+link:{freebsd-ipfw-url}[freebsd-ipfw]::
+_IP брандмауэр_
++
+Это форум для технических обсуждений, относящихся к перепроектированию кода межсетевого экрана IP во FreeBSD. Это технический список рассылки, предназначенный только для технических обсуждений.
+
+link:{freebsd-ia64-url}[freebsd-ia64]::
+_Портирование FreeBSD на IA64_
++
+Это технический список рассылки для тех, кто активно работает над портированием FreeBSD на платформу IA-64 от Intel(R), предназначенный для поднятия вопросов или обсуждения альтернативных решений. Те, кто интересуется обсуждаемыми проблемами, также приглашаются к участию в рассылке.
+
+link:{freebsd-isdn-url}[freebsd-isdn]::
+_ISDN соединения_
++
+Это список рассылки для обсуждения разработки поддержки ISDN для FreeBSD.
+
+link:{freebsd-java-url}[freebsd-java]::
+_Разработка Java(TM)_
++
+Этот список рассылки предназначен для обсуждения ключевых приложений Java(TM) для FreeBSD, а также портирования и поддержки JDK(TM).
+
+[[eresources-charters-jobs]]
+link:{freebsd-jobs-url}[freebsd-jobs]::
+_Предложение и поиск работы_
++
+Это форум для публикации вакансий и резюме, относящихся к FreeBSD. Например, если вы ищете работу, относящеюся к FreeBSD, или у вас есть работа, связанная с FreeBSD, вы можете разместить соответствующую информацию именно здесь. Эта рассылка _не_ предназначена для обсуждения общих вопросов о приеме на работу, поскольку форумы на соответствующие темы уже существуют на других сайтах.
++
+Имейте ввиду, что эта рассылка, как и другие рассылки `FreeBSD.org`, распространяется по всему миру. Поэтому вам необходимо чётко указать свое местоположение и область, с которой возможны телекоммуникации или помощь в перемещении.
++
+Письма должны быть составлены только в открытых форматах - предпочтителен чистый текст, но Portable Document Format (PDF), HTML, и некоторые другие форматы могут быть прочитаны многими. Закрытые форматы, такие как Microsoft(R) Word ([.filename]#.doc#) будут отброшены сервером почтовой рассылки.
+
+link:{freebsd-kde-url}[freebsd-kde]::
+_KDE_
++
+Обсуждения, относящиеся к KDE в системах FreeBSD. Это технический список рассылки, предназначенный только для технических обсуждений.
+
+link:{freebsd-hackers-url}[freebsd-hackers]::
+_Технические обсуждения_
++
+Это форум для технических обсуждений, относящихся к FreeBSD. Это в основном технический список рассылки. Он предназначен для тех, кто активно работает над FreeBSD, и служит для поднятия вопросов или обсуждения альтернативных решений. Те, кто интересуется обсуждаемыми вопросами, также приглашаются к участию в обсуждении. Это технический список рассылки, предназначенный только для технических обсуждений.
+
+link:{freebsd-hardware-url}[freebsd-hardware]::
+_Общее обсуждение оборудования FreeBSD_
++
+Общее обсуждение типов оборудования, на котором работает FreeBSD, различных проблем и предложений относительно того, какое оборудование можно покупать а какое нет.
+
+link:{freebsd-hubs-url}[freebsd-hubs]::
+_Сайты зеркал_
++
+Анонсы и обсуждения для поддерживающих зеркала FreeBSD.
+
+link:{freebsd-isp-url}[freebsd-isp]::
+_Вопросы использования FreeBSD провайдерами_
++
+Этот список рассылки предназначен для обсуждения тем, имеющих значение для провайдеров, использующих FreeBSD. Это технический список рассылки, предназначенный только для технических обсуждений.
+
+link:{freebsd-mono-url}[freebsd-mono]::
+_Mono и C# приложения на FreeBSD_
++
+Этот список рассылки посвящен обсуждениям разработки инфраструктуры Mono на FreeBSD. Это технический список рассылки, который предназначен для людей, активно работающих над портированием Mono или C# приложений на FreeBSD, для освещения проблем или обсуждения альтернативных решений. Также к дискуссии приглашаются все заинтересованные данной темой.
+
+link:{freebsd-office-url}[freebsd-office]::
+_Офисные приложения во FreeBSD_
++
+Тема этого списка рассылки - офисные приложения, установка офисных приложений, их разработка и поддержка во FreeBSD.
+
+link:{freebsd-performance-url}[freebsd-performance]::
+_Обсуждения оптимизации или повышения скорости FreeBSD_
++
+Этот список рассылки существует как место для обсуждения тем, имеющих отношение к производительности FreeBSD, хакерами, администраторами, и/или заинтересованными сторонами. Приемлемые темы включают обсуждения установок FreeBSD, которые находятся под высокой нагрузкой и сталкиваются с проблемами производительности, или преодоление ограничений FreeBSD. Заинтересованным сторонам, собирающимся работать над улучшением производительности FreeBSD, настоятельно рекомендуется подписаться на эту рассылку. Это техническая рассылка, идеально подходящая для пользователей, хакеров или администраторов, заинтересованных в скорости, стабильности и расширяемости FreeBSD. Это не рассылка вопросов-и-ответов, заменяющая чтение документации, а место, где можно внести свой вклад или получить информацию по еще незатронутой теме, связанной с производительностью.
+
+link:{freebsd-pf-url}[freebsd-pf]::
+_Обсуждение брандмауэра на базе packet filter_
++
+Обсуждения, касающиеся работы пакетного фильтра pf под FreeBSD. Допускаются как вопросы пользователей, так и технические дискуссии. Помимо этого, в данном списке уместно обсуждать инфраструктуру ALTQ QoS.
+
+link:{freebsd-platforms-url}[freebsd-platforms]::
+_Портирование на не-Intel(R) платформы_
++
+Кросс-платформенные вопросы FreeBSD, общее обсуждение и предложения для не-Intel(R) портов FreeBSD. Это технический список рассылки, предназначенный только для технических обсуждений.
+
+link:{freebsd-policy-url}[freebsd-policy]::
+_Правила core team_
++
+Это рассылка с малым количеством сообщений, только для чтения, предназначенная для публикации решений FreeBSD Core Team.
+
+link:{freebsd-ports-url}[freebsd-ports]::
+_Обсуждения "ports"_
++
+Обсуждения, относящиеся к "коллекции портов" FreeBSD, ([.filename]#/usr/ports#), инфраструктуры портов и общих усилий по координации портов. Это технический список рассылки, предназначенный только для технических обсуждений.
+
+link:{freebsd-ports-bugs-url}[freebsd-ports-bugs]::
+_Обсуждение проблем в "ports"_
++
+Обсуждения, относящиеся к сообщениям о проблемах для "коллекции портов" FreeBSD ([.filename]#/usr/ports#), предлагаемых портов, или изменений к портам. Это технический список рассылки, предназначенный только для технических обсуждений.
+
+link:{freebsd-proliant-url}[freebsd-proliant]::
+_Работа FreeBSD на серверной платформе HP ProLiant_
++
+Этот список используется для обсуждения технических аспектов использования FreeBSD на серверах HP ProLiant, в том числе для обсуждения специфичных для ProLiant драйверов, управляющего ПО, систем конфигурации и обновлений BIOS. В частности, это основное место для обсуждения модулей hpasmd, hpasmcli и hpacucli.
+
+link:{freebsd-python-url}[freebsd-python]::
+_Python во FreeBSD_
++
+Этот список рассылки посвящён обсуждениям, связанным с улучшением поддержки Python во FreeBSD. Это технический список рассылки. Он предназначен тем, кто работает над портированием во FreeBSD языка Python, модулей сторонних разработчиков для него и Zope. К участию приглашаются также все, кому интересны технические вопросы.
+
+link:{freebsd-questions-url}[freebsd-questions]::
+_Вопросы пользователей_
++
+Это список рассылки по вопросам о FreeBSD. Вы не должны отправлять вопросы "как сделать" в технические рассылки, если только не уверены, что ваш вопрос чисто технический.
+
+link:{freebsd-ruby-url}[freebsd-ruby]::
+_Обсуждения, касающиеся специфики использования Ruby во FreeBSD_
++
+Список рассылки по вопросам поддержки Ruby на FreeBSD. Это технический список рассылки, который предназначен для людей, работающих над портами Ruby, над инфраструктурой и библиотеками от третьих сторон.
++
+Также к обсуждению приглашаются все, кто заинтересован этой технической дискуссией.
+
+link:{freebsd-scsi-url}[freebsd-scsi]::
+_Подсистема SCSI_
++
+Это список рассылки для тех, кто работает над подсистемой SCSI для FreeBSD. Это технический список рассылки, предназначенный только для технических обсуждений.
+
+{freebsd-security}::
+_Вопросы безопасности_
++
+Вопросы безопасности FreeBSD (DES, Kerberos, известные проблемы безопасности и исправления, и т.п.). Это технический список рассылки, предназначенный только для технических обсуждений. Обратите внимание, что это не рассылка вопросов-и-ответов, но дополнения в FAQ (И вопрос И ответ) приветствуются.
+
+{freebsd-security-notifications}::
+_Уведомления безопасности_
++
+Уведомления о проблемах безопасности FreeBSD и исправления. Эта рассылка не предназначена для обсуждений. Для обсуждения предназначена рассылка FreeBSD-security.
+
+link:{freebsd-small-url}[freebsd-small]::
+_Использование FreeBSD во встроенных приложениях_
++
+В этой рассылке обсуждаются темы, связанные с необычно малыми и встроенными установками FreeBSD. Это технический список рассылки, предназначенный только для технических обсуждений.
++
+
+[NOTE]
+====
+Этот список рассылки устарел; следует использовать link:{freebsd-embedded-url}[freebsd-embedded].
+====
+
+{freebsd-stable}::
+_Обсуждения, касающиеся использования FreeBSD-STABLE_
++
+Этот список рассылки предназначен для пользователей FreeBSD-STABLE. Он включает предупреждения о новых возможностях, добавляемых в -STABLE, и влияющих на пользователей, и инструкции по действиям, которые необходимы для поддержки системы в состоянии -STABLE. Всякий, использующий "STABLE", должен подписаться на эту рассылку. Это технический список рассылки, предназначенный только для технических обсуждений.
+
+link:{freebsd-standards-url}[freebsd-standards]::
+_Соответствие C99 и POSIX_
++
+Это форум для технических обсуждений, относящихся к соответствию FreeBSD стандартам C99 и POSIX.
+
+link:{freebsd-toolchain-url}[freebsd-toolchain]::
+_Поддержка встроенных инструментальных средств FreeBSD_
++
+Список рассылки для технических дискуссий, относящихся к поддержке инструментальных средств, поставляемых с FreeBSD. Сюда включено состояние Clang и GCC, а также части программного обеспечения, такого как ассемблеры, компоновщики и отладчики.
+
+link:{freebsd-usb-url}[freebsd-usb]::
+_Обсуждение поддержки USB в FreeBSD_
++
+Это форум для технических обсуждений, относящихся к поддержке в FreeBSD устройств с интерфейсом USB.
+
+link:{freebsd-user-groups-url}[freebsd-user-groups]::
+_Список координации групп пользователей_
++
+Этот список рассылки предназначен для обсуждения вопросов координаторами каждой группы пользователей и назначенным членом Core Team. Обсуждения в этой рассылке ограничены темой встреч и координацией проектов, относящихся к группам пользователей.
+
+link:{freebsd-vendors-url}[freebsd-vendors]::
+_Поставщики_
++
+Обсуждения, относящиеся к координации между FreeBSD Project и поставщиками программного и аппаратного обеспечения для FreeBSD.
+
+link:{freebsd-virtualization-url}[freebsd-virtualization]::
+_Обсуждение различных техник виртуализации, поддерживаемых FreeBSD_
++
+Список рассылки, который предназначен для обсуждений различных техник виртуализации, поддерживаемых FreeBSD. С одной стороны фокус сосредоточен на реализации базовой функциональности, также, как и на добавлении новых возможностей. С другой стороны, пользователи получают возможность обратиться за помощью в случае возникновения проблем или обсудить их конкретные варианты использования.
+
+link:{freebsd-wip-status-url}[freebsd-wip-status]::
+_Статус начатых работ (Work-In-Progress) во FreeBSD_
++
+Этот список рассылки может быть использован для анонсов начала и прогресса вашей работы над FreeBSD. Сообщения модерируются. Предполагается, что сообщение посылается ("To:") в тематический список рассылки FreeBSD, а в этот список отправляется копия ("BCC:"). Таким образом ваша работа может обсуждаться в тематическом списке рассылки, так как в этом списке дискуссии не разрешены.
++
+Выборочный обзор сообщений из этого списка рассылки может публиковаться на сайте FreeBSD как часть Status Reports .
++
+Если вам нужны подходящие примеры сообщений, загляните в архивы рассылки или на страницу Status Reports.
+
+link:{freebsd-wireless-url}[freebsd-wireless]::
+_Обсуждение разработки стека 802.11, утилит, драйверов устройств_
++
+Список рассылки FreeBSD-wireless предназначен для обсуждения разработки стека 802.11 (sys/net80211), утилит и драйверов устройств. Сообщения о проблемах и новых функциональных возможностях также направляются в эту рассылку.
+
+link:{freebsd-xen-url}[freebsd-xen]::
+_Обсуждение портирования FreeBSD на Xen(TM) - реализация и использование_
++
+Список рассылки, предназначенный для дискуссий на тему портирования FreeBSD на Xen(TM). Ожидаемый объем сообщений довольно невелик, поэтому эта рассылка объединяет как технические обсуждения реализации и деталей дизайна, так и административные вопросы развертывания.
+
+[[eresources-mailfiltering]]
+=== Фильтрация списков рассылки
+
+Списки рассылки FreeBSD фильтруются различными способами для предотвращения распространения спама, вирусов, и другой нежелательной почты. Действия по фильтрации, описанные в этом разделе, не включают всех используемых для фильтрации списков рассылки проекта действий.
+
+Только определенные типы вложений разрешены в списках рассылки. Все вложения с типами MIME содержимого, не входящие в список ниже, будут вырезаться перед тем, как письмо будет отправлено в список рассылки.
+
+* application/octet-stream
+* application/pdf
+* application/pgp-signature
+* application/x-pkcs7-signature
+* message/rfc822
+* multipart/alternative
+* multipart/related
+* multipart/signed
+* text/html
+* text/plain
+* text/x-diff
+* text/x-patch
+
+[NOTE]
+====
+Некоторые из списков рассылки могут пропускать вложения других типов MIME, но список выше применим к большинству рассылок.
+====
+
+Если письмо содержит как HTML, так и только текстовую версию, версия HTML будет удалена. Если письмо содержит только HTML версию, она будет конвертирована в простой текст.
+
+[[eresources-news]]
+== Новостные группы Usenet
+
+В дополнение к двум относящимся к FreeBSD группам новостей, существуют множество других, где обсуждается FreeBSD или куда помещается другая информация, относящаяся к пользователям FreeBSD. http://minnie.tuhs.org/BSD-info/bsdnews_search.html[Архивы с поиском по ключевому слову] доступны для некоторых из этих новостных групп благодаря Warren Toomey mailto:wkt@cs.adfa.edu.au[wkt@cs.adfa.edu.au].
+
+=== Относящиеся к BSD новостные группы
+
+* link:news:comp.unix.bsd.freebsd.announce[comp.unix.bsd.freebsd.announce]
+* link:news:comp.unix.bsd.freebsd.misc[comp.unix.bsd.freebsd.misc]
+* link:news:de.comp.os.unix.bsd[de.comp.os.unix.bsd] (German)
+* link:news:fr.comp.os.bsd[fr.comp.os.bsd] (French)
+* link:news:it.comp.os.freebsd[it.comp.os.freebsd] (Italian)
+* link:news:tw.bbs.comp.386bsd[tw.bbs.comp.386bsd] (Traditional Chinese)
+
+=== Другие интересные UNIX(R) новостные группы
+
+* link:news:comp.unix[comp.unix]
+* link:news:comp.unix.questions[comp.unix.questions]
+* link:news:comp.unix.admin[comp.unix.admin]
+* link:news:comp.unix.programmer[comp.unix.programmer]
+* link:news:comp.unix.shell[comp.unix.shell]
+* link:news:comp.unix.user-friendly[comp.unix.user-friendly]
+* link:news:comp.security.unix[comp.security.unix]
+* link:news:comp.sources.unix[comp.sources.unix]
+* link:news:comp.unix.advocacy[comp.unix.advocacy]
+* link:news:comp.unix.misc[comp.unix.misc]
+* link:news:comp.bugs.4bsd[comp.bugs.4bsd]
+* link:news:comp.bugs.4bsd.ucb-fixes[comp.bugs.4bsd.ucb-fixes]
+* link:news:comp.unix.bsd[comp.unix.bsd]
+
+=== X Window System
+
+* link:news:comp.windows.x.i386unix[comp.windows.x.i386unix]
+* link:news:comp.windows.x[comp.windows.x]
+* link:news:comp.windows.x.apps[comp.windows.x.apps]
+* link:news:comp.windows.x.announce[comp.windows.x.announce]
+* link:news:comp.windows.x.intrinsics[comp.windows.x.intrinsics]
+* link:news:comp.windows.x.motif[comp.windows.x.motif]
+* link:news:comp.windows.x.pex[comp.windows.x.pex]
+* link:news:comp.emulators.ms-windows.wine[comp.emulators.ms-windows.wine]
+
+[[eresources-web]]
+== Серверы World Wide Web
+
+<<central-mirrors, {central}>>, <<armenia-mirrors, {mirrors-armenia}>>, <<australia-mirrors, {mirrors-australia}>>, <<austria-mirrors, {mirrors-austria}>>, <<czech-republic-mirrors, {mirrors-czech}>>, <<denmark-mirrors, {mirrors-denmark}>>, <<finland-mirrors, {mirrors-finland}>>, <<france-mirrors, {mirrors-france}>>, <<germany-mirrors, {mirrors-germany}>>, <<hong-kong-mirrors, {mirrors-hongkong}>>, <<ireland-mirrors, {mirrors-ireland}>>, <<japan-mirrors, {mirrors-japan}>>, <<latvia-mirrors, {mirrors-latvia}>>, <<lithuania-mirrors, {mirrors-lithuania}>>, <<netherlands-mirrors, {mirrors-netherlands}>>, <<norway-mirrors, {mirrors-norway}>>, <<russia-mirrors, {mirrors-russia}>>, <<slovenia-mirrors, {mirrors-slovenia}>>, <<south-africa-mirrors, {mirrors-south-africa}>>, <<spain-mirrors, {mirrors-spain}>>, <<sweden-mirrors, {mirrors-sweden}>>, <<switzerland-mirrors, {mirrors-switzerland}>>, <<taiwan-mirrors, {mirrors-taiwan}>>, <<uk-mirrors, {mirrors-uk}>>, <<usa-mirrors, {mirrors-us}>>.
+
+(as of UTC)
+
+[[central-mirrors]]
+*{central}*
+
+* {central-www}
+
+[[armenia-mirrors]]
+*{mirrors-armenia}*
+
+* {mirrors-armenia-www-httpv6} (IPv6)
+
+[[australia-mirrors]]
+*{mirrors-australia}*
+
+* {mirrors-australia-www-http}
+* {mirrors-australia-www2-http}
+
+[[austria-mirrors]]
+*{mirrors-austria}*
+
+* {mirrors-armenia-www-httpv6} (IPv6)
+
+[[czech-republic-mirrors]]
+*{mirrors-czech}*
+
+* {mirrors-czech-www-httpv6} (IPv6)
+
+[[denmark-mirrors]]
+*{mirrors-denmark}*
+
+* {mirrors-denmark-www-httpv6} (IPv6)
+
+[[finland-mirrors]]
+*{mirrors-finland}*
+
+* {mirrors-finland-www-http}
+
+[[france-mirrors]]
+*{mirrors-france}*
+
+* {mirrors-france-www-http}
+
+[[germany-mirrors]]
+*{mirrors-germany}*
+
+* {mirrors-germany-www-http}
+
+[[hong-kong-mirrors]]
+*{mirrors-hongkong}*
+
+* {mirrors-hongkong-www}
+
+[[ireland-mirrors]]
+*{mirrors-ireland}*
+
+* {mirrors-ireland-www}
+
+[[japan-mirrors]]
+*{mirrors-japan}*
+
+* {mirrors-japan-www-httpv6} (IPv6)
+
+[[latvia-mirrors]]
+*{mirrors-latvia}*
+
+* {mirrors-latvia-www}
+
+[[lithuania-mirrors]]
+*{mirrors-lithuania}*
+
+* {mirrors-lithuania-www}
+
+[[netherlands-mirrors]]
+*{mirrors-netherlands}*
+
+* {mirrors-netherlands-www}
+
+[[norway-mirrors]]
+*{mirrors-norway}*
+
+* {mirrors-norway-www}
+
+[[russia-mirrors]]
+*{mirrors-russia}*
+
+* {mirrors-russia-www-httpv6} (IPv6)
+
+[[slovenia-mirrors]]
+*{mirrors-slovenia}*
+
+* {mirrors-slovenia-www}
+
+[[south-africa-mirrors]]
+*{mirrors-south-africa}*
+
+* {mirrors-south-africa-www}
+
+[[spain-mirrors]]
+*{mirrors-spain}*
+
+* {mirrors-spain-www}
+* {mirrors-spain-www2}
+
+[[sweden-mirrors]]
+*{mirrors-sweden}*
+
+* {mirrors-sweden-www}
+
+[[switzerland-mirrors]]
+*{mirrors-switzerland}*
+
+* {mirrors-switzerland-www-httpv6} (IPv6)
+* {mirrors-switzerland-www2-httpv6} (IPv6)
+
+[[taiwan-mirrors]]
+*{mirrors-taiwan}*
+
+* {mirrors-taiwan-www}
+* {mirrors-taiwan-www2}
+* {mirrors-taiwan-www4}
+* {mirrors-taiwan-www5-httpv6} (IPv6)
+
+[[uk-mirrors]]
+*{mirrors-uk}*
+
+* {mirrors-uk-www}
+* {mirrors-uk-www3}
+
+[[usa-mirrors]]
+*{mirrors-us}*
+
+* {mirrors-us-www5-httpv6} (IPv6)
+
+[[eresources-web-social]]
+=== Форумы, блоги и социальные сети
+
+* Страница http://forums.freebsd.org/[форумов FreeBSD] предоставляет веб форум для технических дискуссий и вопросов о FreeBSD.
+* Страница http://planet.freebsdish.org/[Planet FreeBSD] содержит коллекцию ссылок на десятки блогов, ведомых разработчиками FreeBSD. Многие разработчики используют свои блоги для размещения коротких сообщений о своих текущих занятостях, о новых патчах и о прогрессе в своих работах.
+* Страница http://www.youtube.com/bsdconferences[Конференций BSD на YouTube] предоставляет коллекцию видеозаписей с Конференций BSD со всего мира. Это прекрасная возможность ознакомиться с презентациями от ключевых разработчиков, освещающих новые работы во FreeBSD.
+
+[[eresources-web-mirrors]]
+=== Официальные зеркала
+
+[[eresources-email]]
+== Адреса Email
+
+Следующие группы пользователей предоставляют для своих участников почтовые адреса. Приведенные в списке администраторы оставляют за собой право удалить адреса при любом злоупотреблении.
+
+[.informaltable]
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Домен
+| Возможности
+| Группа пользователей
+| Администратор
+
+|ukug.uk.FreeBSD.org
+|Только пересылка
+|mailto:ukfreebsd@uk.FreeBSD.org[ukfreebsd@uk.FreeBSD.org]
+|Lee Johnston mailto:lee@uk.FreeBSD.org[lee@uk.FreeBSD.org]
+|===
diff --git a/documentation/content/ru/books/handbook/filesystems/_index.adoc b/documentation/content/ru/books/handbook/filesystems/_index.adoc
new file mode 100644
index 0000000000..4df8107be9
--- /dev/null
+++ b/documentation/content/ru/books/handbook/filesystems/_index.adoc
@@ -0,0 +1,465 @@
+---
+title: Глава 19. Поддержка файловых систем
+part: Часть III. Системное администрирование
+prev: books/handbook/geom
+next: books/handbook/l10n
+---
+
+[[filesystems]]
+= Поддержка файловых систем
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 19
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/filesystems/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/filesystems/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/filesystems/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[filesystems-synopsis]]
+== Краткий обзор
+
+Файловые системы - неотъемлемая часть любой операционной системы. Они позволяют пользователям записывать и хранить файлы, получать доступ к данным, и, конечно-же, пользоваться жесткими дисками. У разных операционных систем есть одна общая черта - их основная файловая система (native filesystem). Для FreeBSD это Fast File System (или FFS), которая произошла от Unix(TM) File System (сокращенно UFS).
+
+FreeBSD также поддерживает ряд других файловых систем, тем самым предоставляя возможность получать доступ к данным от других операционных систем локально, например: к данным, находящимся на подключенных USB устройствах хранения, флэш-накопителях и жестких дисках. В списке поддерживаемых есть файловые системы, разработанные для других операционных систем, например Linux(R) Extended File System (EXT) и Sun(TM) Z File System (ZFS).
+
+FreeBSD имеет разные уровни поддержки для разных файловых систем. Для некоторых будет достаточно загрузки модуля ядра, другим может потребоваться установка набора утилит (toolset). Цель этого раздела - дать представления пользователям FreeBSD о возможностях использования других файловых систем на их операционных системах. Начнем с Sun(TM) Z file system.
+
+После прочтения этого раздела вы будете знать:
+
+* Разницу между основной и поддерживаемой файловой системой.
+* Какие файловые системы поддерживаются FreeBSD.
+* Как подключить, сконфигурировать, получить доступ и использовать поддерживаемые файловые системы.
+
+Перед прочтением этого раздела вам необходимо:
+
+* Понимать основы UNIX(R) и FreeBSD (crossref:basics[basics, Основы UNIX]).
+* Знать азы конфигурирования и компиляции ядра (crossref:kernelconfig[kernelconfig, Настройка ядра FreeBSD]).
+* Уметь устанавливать приложения сторонних разработчиков в FreeBSD (crossref:ports[ports, Установка приложений. порты и пакеты]).
+* Быть знакомым с именованием дисков и устройств хранения в FreeBSD (crossref:disks[disks, Устройства хранения]).
+
+[[filesystems-zfs]]
+== Файловая система ZFS
+
+Файловая система ZFS, разработанная компанией Sun(TM), основана на использовании метода пулов устройств хранения данных. Это значит, что емкость носителя занимается только тогда, когда она становится необходимой для сохранения данных. ZFS также была разработана с упором на максимальную целостность данных, поддерживая снимки (snapshot), множество копий и контрольные суммы данных. Новая модель репликации данных, известная как RAID-Z, подобна RAID-5, но специально разработана для предотвращения повреждений данных при записи.
+
+=== Настройка ZFS
+
+Подсистема ZFS занимает значительную часть ресурсов системы. Чтобы получить от нее максимум эффективности в повседневном использовании, потребуется выполнить некоторые настройки. ZFS является экспериментальной функциональной возможностью в FreeBSD, но ситуация может измениться в ближайшем будущем; однако на данный момент рекомендуется выполнить следующие шаги.
+
+==== Память
+
+Общий размер ОЗУ должен быть как минимум равен одному гигабайту, хотя рекомендуется два гигабайта или более. Во всех нижеследующих примерах используется система с 1ГБ памяти совместно с другими специальными настройками.
+
+Известно, что некоторые пользователи преуспели в использовании ZFS на системах, имеющих менее одного гигабайта памяти, но с таким ограниченным объемом ОЗУ и при серьезной загрузке машины очень вероятны паники FreeBSD из-за нехватки памяти.
+
+==== Настройка ядра
+
+Рекомендуется исключить из файла конфигурации ядра неиспользуемые драйвера и опции. Так как большинство драйверов устройств доступно в виде модулей, то они просто могут быть загружены с помощью соответствующих записей в файле [.filename]#/boot/loader.conf#.
+
+Пользователям архитектуры i386(TM) необходимо добавить следующую опцию в их файл конфигурации ядра, перестроить ядро и перезагрузиться:
+
+[.programlisting]
+....
+options KVA_PAGES=512
+....
+
+Эта опция расширит адресное пространство ядра, тем самым позволяя переменной `vm.kvm_size` быть установленной за текущий предел в 1 ГБ (2 ГБ для PAE). Чтобы найти наиболее подходящее значение для этой опции, разделите имеющийся объем ОЗУ, выраженный в мегабайтах, на 4. Приведенное выше значение `512` рекомендуется для систем с 2 ГБ оперативной памяти.
+
+==== Параметры loader.conf
+
+Адресное пространство [.filename]#kmem# должно быть увеличено на всех FreeBSD архитектурах. На тестовой системе с одним гигабайтом физической памяти стабильная работа была получена со следующими параметрами, которые необходимо внести в файл [.filename]#/boot/loader.conf# и перезагрузить систему.
+
+[.programlisting]
+....
+vm.kmem_size="330M"
+vm.kmem_size_max="330M"
+vfs.zfs.arc_max="40M"
+vfs.zfs.vdev.cache.size="5M"
+....
+
+За более детальными рекомендациями по тонкой настройке системы под ZFS, обратитесь к странице: http://wiki.freebsd.org/ZFSTuningGuide[http://wiki.freebsd.org/ZFSTuningGuide].
+
+=== Использование ZFS
+
+Существует стартовый механизм, позволяющий монтировать ZFS пулы во время инициализации системы. Чтобы его задействовать, выполните следующие команды:
+
+[source,bash]
+....
+# echo 'zfs_enable="YES"' >> /etc/rc.conf
+# /etc/rc.d/zfs start
+....
+
+Здесь и далее в статье подразумевается, что в системе установлено три SCSI диска с именами устройств [.filename]#da0#, [.filename]#da1# и [.filename]#da2#. Использующим IDE диски необходимо подставить имена устройств [.filename]#ad# вместо имен устройств SCSI.
+
+==== Простой дисковый пул
+
+Для создания простого пула ZFS без избыточности, задействовав при этом один жесткий диск, воспользуйтесь командой `zpool`:
+
+[source,bash]
+....
+# zpool create example /dev/da0
+....
+
+Чтобы увидеть новый пул, просмотрите вывод команды `df`:
+
+[source,bash]
+....
+# df
+Filesystem 1K-blocks Used Avail Capacity Mounted on
+/dev/ad0s1a 2026030 235230 1628718 13% /
+devfs 1 1 0 100% /dev
+/dev/ad0s1d 54098308 1032846 48737598 2% /usr
+example 17547136 0 17547136 0% /example
+....
+
+Этот вывод четко показывает, что пул `example` был не только создан, но также и _примонтирован_. Он также доступен, как и обычная файловая система, в нем можно создавать файлы, а пользователи могут просматривать его содержимое, например:
+
+[source,bash]
+....
+# cd /example
+# ls
+# touch testfile
+# ls -al
+total 4
+drwxr-xr-x 2 root wheel 3 Aug 29 23:15 .
+drwxr-xr-x 21 root wheel 512 Aug 29 23:12 ..
+-rw-r--r-- 1 root wheel 0 Aug 29 23:15 testfile
+....
+
+Однако в этом примере простого пула не задействованы никакие функциональные возможности ZFS. Создайте файловую систему в этом пуле и активируйте сжатие данных на ней:
+
+[source,bash]
+....
+# zfs create example/compressed
+# zfs set compression=gzip example/compressed
+....
+
+С этого момента для файловой системы ZFS `example/compressed` активировано сжатие данных. Попробуйте поместить на нее несколько больших файлов копируя их в [.filename]#/example/compressed#.
+
+А вот как можно отключить сжатие данных:
+
+[source,bash]
+....
+# zfs set compression=off example/compressed
+....
+
+Для того чтобы размонтировать файловую систему, выполните следующую команду и проверьте результат утилитой `df`:
+
+[source,bash]
+....
+# zfs umount example/compressed
+# df
+Filesystem 1K-blocks Used Avail Capacity Mounted on
+/dev/ad0s1a 2026030 235232 1628716 13% /
+devfs 1 1 0 100% /dev
+/dev/ad0s1d 54098308 1032864 48737580 2% /usr
+example 17547008 0 17547008 0% /example
+....
+
+Снова смонтируйте файловую систему и проверьте результат при помощи `df`:
+
+[source,bash]
+....
+# zfs mount example/compressed
+# df
+Filesystem 1K-blocks Used Avail Capacity Mounted on
+/dev/ad0s1a 2026030 235234 1628714 13% /
+devfs 1 1 0 100% /dev
+/dev/ad0s1d 54098308 1032864 48737580 2% /usr
+example 17547008 0 17547008 0% /example
+example/compressed 17547008 0 17547008 0% /example/compressed
+....
+
+Пул и файловая система также отображается в выводе команды `mount`:
+
+[source,bash]
+....
+# mount
+/dev/ad0s1a on / (ufs, local)
+devfs on /dev (devfs, local)
+/dev/ad0s1d on /usr (ufs, local, soft-updates)
+example on /example (zfs, local)
+example/data on /example/data (zfs, local)
+example/compressed on /example/compressed (zfs, local)
+....
+
+Как вы уже убедились, файловые системы ZFS после создания могут использоваться как и обычные файловые системы; однако доступно множество других возможностей. В следующем примере мы создадим новую файловую систему `data`. На ней мы будем содержать важные данные, поэтому файловая система сконфигурирована хранить две копии каждого блока:
+
+[source,bash]
+....
+# zfs create example/data
+# zfs set copies=2 example/data
+....
+
+Снова проверьте свободное и использованное место выполнив команду `df`:
+
+[source,bash]
+....
+# df
+Filesystem 1K-blocks Used Avail Capacity Mounted on
+/dev/ad0s1a 2026030 235234 1628714 13% /
+devfs 1 1 0 100% /dev
+/dev/ad0s1d 54098308 1032864 48737580 2% /usr
+example 17547008 0 17547008 0% /example
+example/compressed 17547008 0 17547008 0% /example/compressed
+example/data 17547008 0 17547008 0% /example/data
+....
+
+Заметьте, что каждая файловая система в пуле имеет тот же объем свободного места. Мы использовали команду `df` на протяжении этих примеров, чтобы показать, что файловые системы занимают только необходимое им пространство, используя ресурс одного и того же пула. ZFS уходит от привычных понятий "том (volume)" и "раздел (partition)", позволяя файловым системам занимать один и тот же пул. Уничтожьте файловые системы, потом уничтожьте пул, так как в них уже нет нужды:
+
+[source,bash]
+....
+# zfs destroy example/compressed
+# zfs destroy example/data
+# zpool destroy example
+....
+
+Жесткие диски со временем выходят из строя, это неизбежно. Когда этот диск выйдет из строя, данные будут утеряны. Одним из способов избежать потери данных из-за вышедшего из строя жесткого диска является построение RAID массивов. ZFS поддерживает эту функциональную возможность в своем дизайне, и это описано в следующем разделе.
+
+==== ZFS RAID-Z
+
+Как уже было сказано выше, в этой статье подразумевается, что в нашей системе в распоряжении есть три SCSI диска: [.filename]#da0#, [.filename]#da1# и [.filename]#da2# (или [.filename]#ad0# и далее в случае IDE дисков). Для того, чтобы создать RAID-Z пул, выполните следующую команду:
+
+[source,bash]
+....
+# zpool create storage raidz da0 da1 da2
+....
+
+[NOTE]
+====
+Sun(TM) рекомендует использовать от трех до девяти жестких дисков в конфигурации RAID-Z. Если есть необходимость в использовании 10 или более дисков, подумайте над тем, чтобы разбить их на меньшие группы RAID-Z. Если у вас есть только два диска и вам всё-таки требуется избыточность, возможно лучшим вариантом будет создание ZFS зеркала. Смотрите страницу справочника man:zpool[8] для получения более подробных сведений.
+====
+
+По завершении команды должен создаться пул `storage`. Как и прежде, это может быть проверено при помощи команд man:mount[8] и man:df[1]. Больше дисковых устройств может быть задействовано путем добавления их в конец списка параметров команды, приведенной выше. Создайте в пуле новую файловую систему, называемую `home`, в которой будут размещаться пользовательские файлы:
+
+[source,bash]
+....
+# zfs create storage/home
+....
+
+На данном этапе возможно активировать сжатие данных и организовать автоматическое создание копий пользовательских домашних каталогов и файлов. Это может быть достигнуто так же, как и ранее, при помощи следующих команд:
+
+[source,bash]
+....
+# zfs set copies=2 storage/home
+# zfs set compression=gzip storage/home
+....
+
+Чтобы организовать в этой файловой системе хранение домашних каталогов пользователей, скопируйте сюда их содержимое и создайте соответствующие символические ссылки:
+
+[source,bash]
+....
+# cp -rp /home/* /storage/home
+# rm -rf /home /usr/home
+# ln -s /storage/home /home
+# ln -s /storage/home /usr/home
+....
+
+С этого момента пользовательские данные сохраняются на новой файловой системе [.filename]#/storage/home#. Для проверки создайте учетную запись нового пользователя и войдите ею в систему.
+
+Попробуйте создать снимок (snapshot), к которому можно будет откатиться при необходимости:
+
+[source,bash]
+....
+# zfs snapshot storage/home@08-30-08
+....
+
+Заметьте, что снимок (snapshot) захватит реальную файловую систему, а не домашний каталог или файл. Символ `@` отделяет имя файловой системы или имя тома от имени снимка. Когда возникнет необходимость восстановить пользовательские домашние каталоги, выполните следующую команду:
+
+[source,bash]
+....
+# zfs rollback storage/home@08-30-08
+....
+
+Чтобы получить список имеющихся в наличии снимков, выполните команду `ls` в каталоге [.filename]#.zfs/snapshot#. Например, чтобы увидеть сделанный ранее снимок, выполните следующую команду:
+
+[source,bash]
+....
+# ls /storage/home/.zfs/snapshot
+....
+
+Можно написать скрипт, выполняющий снимки пользовательских данных ежемесячно; однако, со временем, они могут занять значительную часть дискового пространства. Предыдущий снимок может быть удален используя следующую команду:
+
+[source,bash]
+....
+# zfs destroy storage/home@08-30-08
+....
+
+Нет причины после наших экспериментов далее держать в текущем состоянии [.filename]#/storage/home#. Сделаем ее реальной файловой системой [.filename]#/home#:
+
+[source,bash]
+....
+# zfs set mountpoint=/home storage/home
+....
+
+Выполнение команд `df` и `mount` покажет, что с этого момента операционная система воспринимает нашу файловую систему как обычную [.filename]#/home#:
+
+[source,bash]
+....
+# mount
+/dev/ad0s1a on / (ufs, local)
+devfs on /dev (devfs, local)
+/dev/ad0s1d on /usr (ufs, local, soft-updates)
+storage on /storage (zfs, local)
+storage/home on /home (zfs, local)
+# df
+Filesystem 1K-blocks Used Avail Capacity Mounted on
+/dev/ad0s1a 2026030 235240 1628708 13% /
+devfs 1 1 0 100% /dev
+/dev/ad0s1d 54098308 1032826 48737618 2% /usr
+storage 26320512 0 26320512 0% /storage
+storage/home 26320512 0 26320512 0% /home
+....
+
+На этом завершим конфигурацию RAID-Z. Чтобы во время ночных запусков man:periodic[8] получать информацию о статусе созданных файловых систем, выполните следующую команду:
+
+[source,bash]
+....
+# echo 'daily_status_zfs_enable="YES"' >> /etc/periodic.conf
+....
+
+==== Восстановление RAID-Z
+
+Каждая система программных RAID массивов предоставляет возможность отображать информацию о своем `состоянии`. ZFS - не исключение. Статус устройств RAID-Z может быть просмотрен при помощи следующей команды:
+
+[source,bash]
+....
+# zpool status -x
+....
+
+Если пулы исправны и всё нормально, возвратится следующее сообщение:
+
+[source,bash]
+....
+all pools are healthy
+....
+
+А если есть какие-то неполадки, например диск выведен из массива, возвращенное состояние пула будет подобным следующему:
+
+[source,bash]
+....
+ pool: storage
+ state: DEGRADED
+status: One or more devices has been taken offline by the administrator.
+ Sufficient replicas exist for the pool to continue functioning in a
+ degraded state.
+action: Online the device using 'zpool online' or replace the device with
+ 'zpool replace'.
+ scrub: none requested
+config:
+
+ NAME STATE READ WRITE CKSUM
+ storage DEGRADED 0 0 0
+ raidz1 DEGRADED 0 0 0
+ da0 ONLINE 0 0 0
+ da1 OFFLINE 0 0 0
+ da2 ONLINE 0 0 0
+
+errors: No known data errors
+....
+
+Вывод показывает, что устройство было переведено в автономный режим администратором. Это верно для данного отдельного примера. Чтобы перевести диск в автономный режим, была выполнена команда:
+
+[source,bash]
+....
+# zpool offline storage da1
+....
+
+Теперь после останова системы возможно заменить [.filename]#da1#. Когда система загрузится снова, выполните следующую команду чтобы заменить диск в массиве:
+
+[source,bash]
+....
+# zpool replace storage da1
+....
+
+С этого момента статус может быть проверен опять и на этот раз без флага `-x`:
+
+[source,bash]
+....
+# zpool status storage
+ pool: storage
+ state: ONLINE
+ scrub: resilver completed with 0 errors on Sat Aug 30 19:44:11 2008
+config:
+
+ NAME STATE READ WRITE CKSUM
+ storage ONLINE 0 0 0
+ raidz1 ONLINE 0 0 0
+ da0 ONLINE 0 0 0
+ da1 ONLINE 0 0 0
+ da2 ONLINE 0 0 0
+
+errors: No known data errors
+....
+
+В выводе сообщается, что при перестроении массива ошибок обнаружено не было.
+
+==== Проверка данных
+
+Как уже было сказано ранее, ZFS использует `контрольные суммы` для проверки целостности сохраненных данных. Подсчет и сохранение контрольных сумм включается автоматически во время создания файловых систем и может быть отключен при помощи команды:
+
+[source,bash]
+....
+# zfs set checksum=off storage/home
+....
+
+Отключение подсчета контрольных сумм - не очень хорошая идея; особенно ввиду того, что они занимают мало места, а также при их использовании нет существенных расходов ресурсов системы. Пока подсчет включен, возможно выполнять проверки целостности данных ZFS, используя контрольные суммы. Этот процесс известен как "очистка (scrubbing)". Чтобы проверить целостность данных пула `storage`, выполните следующую команду:
+
+[source,bash]
+....
+# zpool scrub storage
+....
+
+Этот процесс может занять значительное время в зависимости от количества сохранённых данных. Очистка (scrubbing) порождает интенсивный ввод/вывод, поэтому только один экземпляр этой операции может выполняться в один момент времени. После завершения очистки (scrubbing) статус обновится, его можно просмотреть выполнив следующий запрос:
+
+[source,bash]
+....
+# zpool status storage
+ pool: storage
+ state: ONLINE
+ scrub: scrub completed with 0 errors on Sat Aug 30 19:57:37 2008
+config:
+
+ NAME STATE READ WRITE CKSUM
+ storage ONLINE 0 0 0
+ raidz1 ONLINE 0 0 0
+ da0 ONLINE 0 0 0
+ da1 ONLINE 0 0 0
+ da2 ONLINE 0 0 0
+
+errors: No known data errors
+....
+
+Время завершения отображается в простом виде в этом примере. Очистка помогает удостовериться в целостности данных на протяжении длительного времени.
+
+В этом разделе была освещена лишь малая часть возможностей ZFS. За более подробной информацией обратитесь к страницам справочника man:zfs[8] и man:zpool[8].
diff --git a/documentation/content/ru/books/handbook/firewalls/_index.adoc b/documentation/content/ru/books/handbook/firewalls/_index.adoc
new file mode 100644
index 0000000000..cd3ac7bfae
--- /dev/null
+++ b/documentation/content/ru/books/handbook/firewalls/_index.adoc
@@ -0,0 +1,1385 @@
+---
+title: Глава 26. Межсетевые экраны
+part: Часть IV. Сетевые коммуникации
+prev: books/handbook/network-servers
+next: books/handbook/advanced-networking
+---
+
+[[firewalls]]
+= Межсетевые экраны
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 26
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/firewalls/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/firewalls/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/firewalls/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[firewalls-intro]]
+== Введение
+
+Межсетевые экраны (firewall, брандмауэр) делают возможной фильтрацию входящего и исходящего трафика, идущего через вашу систему. Межсетевой экран использует один или более наборов "правил" для проверки сетевых пакетов при их входе или выходе через сетевое соединение, он или позволяет прохождение трафика или блокирует его. Правила межсетевого экрана могут проверять одну или более характеристик пакетов, включая но не ограничиваясь типом протокола, адресом хоста источника или назначения и портом источника или назначения.
+
+Межсетевые экраны могут серьезно повысить уровень безопасности хоста или сети. Они могут быть использованы для выполнения одной или более нижеперечисленных задач:
+
+* Для защиты и изоляции приложений, сервисов и машин во внутренней сети от нежелательного трафика, приходящего из внешней сети интернет.
+* Для ограничения или запрещения доступа хостов внутренней сети к сервисам внешней сети интернет.
+* Для поддержки преобразования сетевых адресов (network address translation, NAT), что дает возможность задействовать во внутренней сети приватные IP адреса и совместно использовать одно подключение к сети Интернет (либо через один выделенный IP адрес, либо через адрес из пула автоматически присваиваемых публичных адресов).
+
+После прочтения этой главы вы узнаете:
+
+* Как правильно задать правила фильтрации пакетов.
+* Разницу между межсетевыми экранами, встроенными в FreeBSD
+* Как использовать и настраивать межсетевой экран OpenBSD PF.
+* Как использовать и настраивать IPFILTER.
+* Как использовать и настраивать IPFW.
+
+Перед прочтением этой главы вам потребуется:
+
+* Ознакомиться с основами FreeBSD и интернет.
+
+[[firewalls-concepts]]
+== Принципы работы межсетевых экранов
+
+Существует два основных способа создания наборов правил межсетевого экрана: "включающий" и "исключающий". Исключающий межсетевой экран позволяет прохождение всего трафика, за исключением трафика, соответствующего набору правил. Включающий межсетевой экран действует прямо противоположным образом. Он пропускает только трафик, соответствующий правилам и блокирует все остальное.
+
+Включающий межсетевой экран обеспечивает гораздо большую степень контроля исходящего трафика. Поэтому включающий межсетевой экран является лучшим выбором для систем, предоставляющих сервисы в сети Интернет. Он также контролирует тип трафика, порождаемого вне и направляющегося в вашу приватную сеть. Трафик, не попавший в правила, блокируется, а в файл протокола вносятся соответствующие записи. Включающие межсетевые экраны обычно более безопасны, чем исключающие, поскольку они существенно уменьшают риск пропуска межсетевым экраном нежелательного трафика.
+
+[NOTE]
+====
+Если не указано иначе, то все приведенные в этом разделе примеры наборов правил и конфигураций относятся к типу включающего межсетевого экрана.
+====
+
+Безопасность может быть дополнительно повышена с использованием "межсетевого экрана с сохранением состояния". Такой межсетевой экран сохраняет информацию об открытых соединениях и разрешает только трафик через открытые соединения или открытие новых соединений. Недостаток межсетевого экрана с сохранением состояния в том, что он может быть уязвим для атак DoS (Denial of Service, отказ в обслуживании), если множество новых соединений открывается очень быстро. Большинство межсетевых экранов позволяют комбинировать поведение с сохранением состояния и без сохранения состояния, что позволяет создавать оптимальную конфигурацию для каждой конкретной системы.
+
+[[firewalls-apps]]
+== Пакеты межсетевых экранов
+
+В базовую систему FreeBSD встроено три программных межсетевых экрана. Это _IPFILTER_ (известный также как IPF), _IPFIREWALL_ (известный также как IPFW) и _OpenBSD PacketFilter_ (также известный как PF). Помимо этого, FreeBSD содержит два пакета ограничения трафика (по существу, предназначенных для контроля пропускной способности сетевого соединения): man:altq[4] и man:dummynet[4]. Dummynet традиционно сильно связан с IPFW, а ALTQ с PF. В настоящее время IPFILTER не поддерживает ограничение пропускной способности сетевого соединения. Для реализации этой функции предлагается использовать IPFILTER совместно с одним из двух существующих пакетов ограничения трафика. Конфигурация следующая: IPFILTER задействуется для фильтрации и трансляции трафика, а IPFW с man:dummynet[4] _или_PF с ALTQ - для контроля пропускной способности сетевого соединения. IPFW и PF для контроля исходящих и входящих пакетов используют наборы правил, хотя и разными способами с разным синтаксисом правил.
+
+Причина, по которой в FreeBSD включено более одного пакета межсетевых экранов, заключается в том, что разные пользователи выдвигают к ним различные требования и используют разные предпочтения. Нет одного пакета, который был бы очевидно лучше других.
+
+Автор предпочитает IPFILTER, поскольку его правила с сохранением состояния гораздо проще использовать совместно с NAT; кроме того, в него встроен ftp прокси, что упрощает правила для фильтрации исходящих FTP соединений.
+
+Поскольку все межсетевые экраны основаны на анализе значений выбранных полей заголовка пакета, для создания правил межсетевого экрана необходимо понимание принципов TCP/IP, того, что означают различные поля заголовка пакета, и как эти поля используются в обычной сессии. Хорошим примером является: http://www.ipprimer.com/overview.cfm[http://www.ipprimer.com/overview.cfm].
+
+[[firewalls-pf]]
+== Packet Filter (PF, межсетевой экран OpenBSD) и ALTQ
+
+В июле 2003 программный межсетевой экран OpenBSD, известный как PF, был портирован в FreeBSD и стал доступен из коллекции портов FreeBSD; первым релизом, где PF был интегрирован в основную систему, стала FreeBSD 5.3 в ноябре 2004. PF это полноценный межсетевой экран с широким набором возможностей, в котором есть опциональная поддержка ALTQ (Alternate Queuing). ALTQ предоставляет управление пропускной способностью Quality of Service (QoS).
+
+Проект OpenBSD осуществляет замечательную работу по поддержке http://www.openbsd.org/faq/pf/[PF FAQ]. Этот раздел руководства фокусируется на взаимосвязи PF и FreeBSD, предоставляя лишь общую информацию по его использованию. За более подробной информацией по использованию PF обратитесь к http://www.openbsd.org/faq/pf/[PF FAQ].
+
+Дополнительные сведения о PF для FreeBSD можно получить с веб сайта: http://pf4freebsd.love2party.net/[http://pf4freebsd.love2party.net/].
+
+=== Использование модуля ядра PF
+
+Чтобы загрузить PF как модуль ядра, добавьте следующую строку в [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+pf_enable="YES"
+....
+
+Далее, выполните стартовый скрипт:
+
+[source,bash]
+....
+# /etc/rc.d/pf start
+....
+
+Учтите, модуль PF не загрузится, если он не сможет найти конфигурационный файл с набором правил. По умолчанию размещение файла с правилами следующее: [.filename]#/etc/pf.conf#. Если путь к файлу отличается от вышеприведённого, то внесите в [.filename]#/etc/rc.conf# строку вида:
+
+[.programlisting]
+....
+pf_rules="/path/to/pf.conf"
+....
+
+Файл с примерами конфигураций [.filename]#pf.conf# находится в каталоге [.filename]#/usr/shared/examples/pf/#.
+
+Модуль PF можно также загрузить вручную:
+
+[source,bash]
+....
+# kldload pf.ko
+....
+
+Поддержка ведения логов для PF обеспечивается модулем `pflog.ko`, для загрузки которого добавьте следующую строку в [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+pflog_enable="YES"
+....
+
+и запустите на выполнение скрипт:
+
+[source,bash]
+....
+# /etc/rc.d/pflog start
+....
+
+Если вам необходимы другие функциональные возможности PF, то придется добавить поддержку PF в ядро.
+
+=== Параметры ядра
+
+Включение PF путем компиляции с ядром FreeBSD не является обязательным требованием, однако вам может понадобиться одна из функциональных возможностей, которая не включена в загружаемый модуль. Например, man:pfsync[4] являет собой псевдоустройство, которое вносит определенные изменения в таблицу состояний, используемую PF. В дальнейшем, это псевдоустройство может быть скомпоновано с man:carp[4] чтобы создать отказоустойчивую систему межсетевых экранов на основе PF.
+
+Пример параметров конфигурации ядра для включения PF находится в [.filename]#/usr/src/sys/conf/NOTES# и показан здесь:
+
+[.programlisting]
+....
+device pf
+device pflog
+device pfsync
+....
+
+`device pf` включает поддержку межсетевого экрана "Packet Filter" (man:pf[4]).
+
+`device pflog` включает необязательное сетевое псевдоустройство man:pflog[4], которое может использоваться для протоколирования трафика через man:bpf[4]. Даемон man:pflogd[8] может использоваться для сохранения протоколируемой информации на диск.
+
+`device pfsync` включает необязательное сетевое псевдоустройство man:pfsync[4], используемое для отслеживания "изменений состояния".
+
+=== Доступные параметры rc.conf
+
+Для активации PF и man:pflog[4] во время загрузки в man:rc.conf[5] должны быть включены следующие переменные:
+
+[.programlisting]
+....
+pf_enable="YES" # Включить PF (загрузить модуль если необходимо)
+pf_rules="/etc/pf.conf" # определение правил для pf
+pf_flags="" # дополнительные флаги для запуска pfctl
+pflog_enable="YES" # запустить pflogd(8)
+pflog_logfile="/var/log/pflog" # где pflogd должен сохранять протокол
+pflog_flags="" # дополнительные флаги для запуска pflogd
+....
+
+Если за межсетевым экраном находится локальная сеть и необходимо передавать пакеты для компьютеров этой сети, или использовать NAT, включите также следующий параметр:
+
+[.programlisting]
+....
+gateway_enable="YES" # Включить сетевой шлюз
+....
+
+=== Создание правил фильтрации
+
+Пакет PF читает конфигурацию из файла man:pf.conf[5] (полный путь: [.filename]#/etc/pf.conf#); пакеты отвергаются, пропускаются или модифицируются в соответствии с правилами и определениями из этого файла. В стандартную поставку FreeBSD входят несколько файлов с примерами конфигураций, которые находятся в каталоге [.filename]#/usr/shared/examples/pf/#. За исчерпывающим описанием правил PF обратитесь к http://www.openbsd.org/faq/pf/[PF FAQ].
+
+[WARNING]
+====
+
+Изучая http://www.openbsd.org/faq/pf/[PF FAQ], имейте в виду, что различные версии FreeBSD могут содержать разные версии pf. В настоящий момент FreeBSD использует ту же версию PF, которая включена в OpenBSD 4.1.
+====
+
+{freebsd-pf} является хорошим местом, чтобы задавать вопросы по конфигурации и использованию пакета PF. Не забудьте проверить архивы списка рассылки перед тем, как задавать вопрос.
+
+=== Работа с PF
+
+Для управления PF используйте утилиту man:pfctl[8]. Ниже приведено несколько полезных команд (все возможные команды и опции приведены на странице справочника man:pfctl[8]):
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Команда
+| Действие
+
+|`pfctl -e`
+|Включить PF
+
+|`pfctl -d`
+|Выключить PF
+
+|`pfctl -F all -f /etc/pf.conf`
+|Сбросить все правила (NAT, правила фильтрации, состояния соединений, таблицы и т.д.) и загрузить новые с файла [.filename]#/etc/pf.conf#
+
+|`pfctl -s [ rules \| nat \| state ]`
+|Отобразить правила фильтрации, правила NAT или таблицу состояний соединений
+
+|`pfctl -vnf /etc/pf.conf`
+|Проверить [.filename]#/etc/pf.conf# на наличие ошибок, но сами наборы правил не загружать
+|===
+
+=== Включение ALTQ
+
+ALTQ может быть включен только путем компилирования ядра FreeBSD с соответствующими параметрами. ALTQ поддерживается не всеми существующими драйверами сетевых карт. Для просмотра списка поддерживаемых устройств в вашем релизе FreeBSD обратитесь к странице справочника man:altq[4].
+
+Следующие параметры включат ALTQ и добавят дополнительную функциональность.
+
+[.programlisting]
+....
+options ALTQ
+options ALTQ_CBQ # Class Bases Queuing (CBQ)
+options ALTQ_RED # Random Early Detection (RED)
+options ALTQ_RIO # RED In/Out
+options ALTQ_HFSC # Hierarchical Packet Scheduler (HFSC)
+options ALTQ_PRIQ # Priority Queuing (PRIQ)
+options ALTQ_NOPCC # Required for SMP build
+....
+
+`options ALTQ` включает подсистему ALTQ.
+
+`options ALTQ_CBQ` включает _Class Based Queuing_ (CBQ). CBQ позволяет распределять пропускную способность соединений по классам или очередям для выставления приоритетов трафика на основе правил фильтрации.
+
+`options ALTQ_RED` включает _Random Early Detection_ (RED). RED используется для предотвращения перегрузки сети. RED вычисляет длину очереди и сравнивает ее с минимальным и максимальным значением длины очереди. Если очередь превышает максимум, все новые пакеты будут отброшены. В соответствии со своим названием, RED отбрасывает пакеты из различных соединений в произвольном порядке.
+
+`options ALTQ_RIO` включает _Random Early Detection In and Out_.
+
+`options ALTQ_HFSC` включает _Hierarchical Fair Service Curve Packet Scheduler_. Дополнительная информация о HFSC находится по адресу: http://www-2.cs.cmu.edu/\~hzhang/HFSC/main.html[http://www-2.cs.cmu.edu/~hzhang/HFSC/main.html].
+
+`options ALTQ_PRIQ` включает _Priority Queuing_ (PRIQ). PRIQ всегда первым пропускает трафик из очереди c более высоким приоритетом.
+
+`options ALTQ_NOPCC` включает поддержку SMP для ALTQ. Эта опция необходима для SMP систем.
+
+[[firewalls-ipf]]
+== * IPFILTER (IPF)
+
+[WARNING]
+====
+
+Перевод раздела не завершен.
+====
+
+[NOTE]
+====
+Этот раздел находится в процессе написания; содержание может не вполне соответствовать действительности.
+====
+
+Автором IPFILTER является Darren Reed. IPFILTER не зависит от операционной системы: это приложение с открытыми исходными текстами, которое было портировано на операционные системы FreeBSD, NetBSD, OpenBSD, SunOS(TM), HP/UX, и Solaris(TM). IPFILTER активно разрабатывается и поддерживается, регулярно выпускаются обновленные версии.
+
+IPFILTER основан на межсетевом экране и механизме NAT уровня ядра, которые управляются и контролируются утилитами уровня пользовательских процессов. Правила межсетевого экрана могут устанавливаться или удаляться утилитой man:ipf[8]. Правила NAT могут устанавливаться или удаляться утилитой man:ipnat[1]. Утилита man:ipfstat[8] выводит статистику IPFILTER для ядра. Программа man:ipmon[8] может заносить действия IPFILTER в файлы системных протоколов.
+
+IPF был первоначально написан с использованием правила "последнее совпадение применяется" и только с правилами без сохранения состояния. Со временем IPF был расширен и включает параметры "quick" и "keep state" (сохранение состояния), которые кардинальным образом изменяют логику обработки пакетов. Официальная документация IPF включает традиционные параметры правил с традиционной последовательностью обработки пакетов. Измененные функции включены в виде дополнительных параметров, они необходимы для создания эффективного межсетевого экрана.
+
+Инструкции этого раздела подразумевают использование параметра "quick" и параметра сохранения состояния "keep state". Это основа для создания включающего межсетевого экрана.
+
+Детальное описание традиционных методов обработки правил: http://www.obfuscation.org/ipf/ipf-howto.html#TOC_1[http://www.obfuscation.org/ipf/ipf-howto.html#TOC_1] и http://coombs.anu.edu.au/\~avalon/ip-filter.html[http://coombs.anu.edu.au/~avalon/ip-filter.html].
+
+IPF FAQ находится по адресу http://www.phildev.net/ipf/index.html[http://www.phildev.net/ipf/index.html].
+
+Архив списка рассылки по IPFilter с возможностью поиска доступен по адресу http://marc.theaimsgroup.com/?l=ipfilter[http://marc.theaimsgroup.com/?l=ipfilter].
+
+=== Включение IPF
+
+IPF включен в базовую систему FreeBSD в качестве отдельного загружаемого модуля. Система динамически загрузит модуль IPF, если в [.filename]#rc.conf# указана переменная `ipfilter_enable="YES"`. Модуль создается с включенным протоколированием и правилом по умолчанию `pass all` (пропускать все). Для изменения правила по умолчанию не обязательно собирать ядро с новыми параметрами. Просто добавьте в конец набора правило, блокирующее все пакеты.
+
+=== Параметры ядра
+
+Включение IPF в ядро FreeBSD не является обязательным требованием. Эта процедура представлена здесь в качестве дополнительной информации. При включении IPF в ядро загружаемый модуль не используется.
+
+Пример параметров настройки ядра для IPF находится в [.filename]#/usr/src/sys/conf/NOTES# и воспроизведен здесь:
+
+[.programlisting]
+....
+options IPFILTER
+options IPFILTER_LOG
+options IPFILTER_DEFAULT_BLOCK
+....
+
+`options IPFILTER` включает поддержку межсетевого экрана "IPFILTER".
+
+`options IPFILTER_LOG` включает протоколирование трафика через IPF путем записи его в псевдо-устройство протоколирования пакетов [.filename]#ipl# для каждого правила, содержащего ключевое слово `log`.
+
+`options IPFILTER_DEFAULT_BLOCK` изменяет поведение по умолчанию так, что блокируется каждый пакет, не соответствующий правилу `pass`.
+
+Эти настройки будут работать только после сборки и установки нового ядра.
+
+=== Доступные параметры rc.conf
+
+Для активации IPF во время загрузки в [.filename]#/etc/rc.conf# потребуется добавить следующие переменные:
+
+[.programlisting]
+....
+ipfilter_enable="YES" # Запуск межсетевого экрана ipf
+ipfilter_rules="/etc/ipf.rules" # Загрузка файла с правилами
+ipmon_enable="YES" # Включение протоколирования IP monitor
+ipmon_flags="-Ds" # D = запуск в виде даемона
+ # s = протоколирование в syslog
+ # v = протоколирование tcp window, ack, seq
+ # n = отображение имен IP и портов
+....
+
+Если за межсетевым экраном находится локальная сеть, использующая приватные IP адреса, для включения NAT потребуется добавить следующие переменные:
+
+[.programlisting]
+....
+gateway_enable="YES" # Включение шлюза для локальной сети
+ipnat_enable="YES" # Запуск функции ipnat
+ipnat_rules="/etc/ipnat.rules" # Определение файла правил для ipnat
+....
+
+=== IPF
+
+Команда man:ipf[8] используется для загрузки файла с правилами. Обычно создается файл, содержащий подготовленный набор правил, который полностью замещает набор, используемый на данный момент:
+
+[source,bash]
+....
+# ipf -Fa -f /etc/ipf.rules
+....
+
+`-Fa` означает сброс всех внутренних таблиц правил.
+
+`-f` указывает файл с правилами, который необходимо загрузить.
+
+Это дает вам возможность отредактировать файл с правилами, запустить вышеприведенную команду IPF, тем самым обновить набор правил работающего межсетевого экрана без перезагрузки системы. Для обновления правил такой подход очень удобен, поскольку команду можно выполнять столько раз, сколько нужно.
+
+На странице справочной системы man:ipf[8] находится подробная информация по всем флагам этой команды.
+
+Набор правил для команды man:ipf[8] должен быть в виде стандартного текстового файла. Правила, написанные в виде скрипта с символами подстановки, не принимаются.
+
+Есть способ составления правил IPF, использующих символы подстановки. Обратитесь к <<firewalls-ipf-rules-script>>.
+
+=== IPFSTAT
+
+По умолчанию man:ipfstat[8] получает и отображает суммарную статистику, полученную в результате применения действующих правил к пакетам, проходящим через межсетевой экран с момента его последнего запуска, или с того момента, когда статистика была последний раз обнулена командой `ipf -Z`.
+
+Детальная информация приводится на странице справочника man:ipfstat[8].
+
+Вывод команды man:ipfstat[8] по умолчанию выглядит примерно так:
+
+[source,bash]
+....
+input packets: blocked 99286 passed 1255609 nomatch 14686 counted 0
+ output packets: blocked 4200 passed 1284345 nomatch 14687 counted 0
+ input packets logged: blocked 99286 passed 0
+ output packets logged: blocked 0 passed 0
+ packets logged: input 0 output 0
+ log failures: input 3898 output 0
+ fragment state(in): kept 0 lost 0
+ fragment state(out): kept 0 lost 0
+ packet state(in): kept 169364 lost 0
+ packet state(out): kept 431395 lost 0
+ ICMP replies: 0 TCP RSTs sent: 0
+ Result cache hits(in): 1215208 (out): 1098963
+ IN Pullups succeeded: 2 failed: 0
+ OUT Pullups succeeded: 0 failed: 0
+ Fastroute successes: 0 failures: 0
+ TCP cksum fails(in): 0 (out): 0
+ Packet log flags set: (0)
+....
+
+При задании флага `-i` или `-o` соответственно для входящих или исходящих пакетов, команда извлечет и отобразит соответствующий список правил, установленных и используемых на данный момент.
+
+`ipfstat -in` отображает правила, применяемые к входящим пакетам, вместе с номерами этих правил.
+
+`ipfstat -on` отображает правила, применяемые к исходящим пакетам, вместе с номерами этих правил.
+
+Вывод команды будет выглядеть примерно так:
+
+[source,bash]
+....
+@1 pass out on xl0 from any to any
+@2 block out on dc0 from any to any
+@3 pass out quick on dc0 proto tcp/udp from any to any keep state
+....
+
+`ipfstat -ih` отображает правила, применяемые к входящим пакетам, со счетчиком количества совпадений для каждого правила.
+
+`ipfstat -oh` отображает правила, применяемые к исходящим пакетам, со счетчиком количества совпадений для каждого правила.
+
+Вывод команды будет выглядеть примерно так:
+
+[source,bash]
+....
+2451423 pass out on xl0 from any to any
+354727 block out on dc0 from any to any
+430918 pass out quick on dc0 proto tcp/udp from any to any keep state
+....
+
+Одна из наиболее важных функций команды `ipfstat` активируется флагом `-t`, правила отображаются подобно тому, как man:top[1] показывает таблицу запущенных процессов FreeBSD. Когда межсетевой экран подвергается атаке, эта функция позволяет обнаружить соответствующие пакеты. Дополнительные флаги дают возможность выбирать IP адрес назначения или источника, порт или протокол, которые будут отслеживаться в реальном времени. Подробная информация приведена на странице man:ipfstat[8].
+
+=== IPMON
+
+Для того, чтобы стало возможно использование команды `ipmon`, необходимо включить параметр ядра `IPFILTER_LOG`. Эта команда может использоваться в двух различных режимах. В основном режиме, который используется по умолчанию, она используется без флага `-D`.
+
+В режиме даемона создается непрерывный протокол, и возможен просмотр предыдущих событий. В этом режиме IPFILTER работает в FreeBSD. Поскольку в FreeBSD встроена функция ротации файлов протокола, лучше использовать man:syslogd[8], чем используемый по умолчанию вывод в обычный файл. В [.filename]#rc.conf# по умолчанию `ipmon_flags` имеет значение `-Ds`:
+
+[.programlisting]
+....
+ipmon_flags="-Ds" # D = start as daemon
+ # s = log to syslog
+ # v = log tcp window, ack, seq
+ # n = map IP & port to names
+....
+
+Описывать преимущества протоколирования излишне. Например, оно дает возможность отложенного просмотра информации об отброшенных пакетах, откуда они пришли и куда направлялись. Эта информация существенно помогает при отслеживании атак.
+
+Даже с включенным протоколированием, IPF не ведет протокол для каждого правила. Администратор межсетевого экран должен решить, по каким правилам набора нужно вести протокол и добавить ключевое слово log к этим правилам. Обычно протоколируются только правила, отбрасывающие пакеты.
+
+Включение в набор последнего правила, запрещающего прохождение пакетов, в сочетании с ключевым словом `log` является довольно распространённой практикой. Так вы можете увидеть все пакеты, не попадающие ни под одно правило набора.
+
+=== Протоколирование IPMON
+
+Для разделения собираемых данных syslogd использует свой собственный специальный метод. Он использует группировку по категории ("facility") и уровню ("level"). IPMON в режиме `-Ds` использует `local0` в качестве имени "категории". Для дальнейшего разделения протоколируемых данных, если такое необходимо, могут быть использованы следующие уровни:
+
+[source,bash]
+....
+LOG_INFO - packets logged using the "log" keyword as the action rather than pass or block.
+LOG_NOTICE - packets logged which are also passed
+LOG_WARNING - packets logged which are also blocked
+LOG_ERR - packets which have been logged and which can be considered short
+....
+
+Для указания IPFILTER протоколировать все данные в [.filename]#/var/log/ipfilter.log#, создайте этот файл заранее, выполнив следующую команду:
+
+[source,bash]
+....
+# touch /var/log/ipfilter.log
+....
+
+Функционирование man:syslogd[8] управляется настройками в файле [.filename]#/etc/syslog.conf#. Файл [.filename]#syslog.conf# позволяет достаточно гибко настроить обработку системных сообщений, выдаваемых программами, такими как IPF.
+
+Добавьте в [.filename]#/etc/syslog.conf# следующую запись:
+
+[.programlisting]
+....
+local0.* /var/log/ipfilter.log
+....
+
+`local0.*` означает запись всех протоколируемых сообщений в указанный файл.
+
+Для применения внесенных в [.filename]#/etc/syslog.conf# изменений вы можете перезагрузиться или заставить man:syslogd[8] перечитать [.filename]#/etc/syslog.conf#, выполнив команду `/etc/rc.d/syslogd reload`.
+
+Не забудьте отредактировать [.filename]#/etc/newsyslog.conf# для ротации только что созданного лог файла.
+
+=== Формат протоколируемых сообщений
+
+Сообщения, генерируемые `ipmon`, состоят из полей данных, разделенных пробелами. Поля, общие для всех сообщений:
+
+. Дата получения пакета.
+. Время получения пакета. Формат времени HH:MM:SS.F для часов, минут, секунд и долей секунд (последнее поле может состоять из нескольких цифр).
+. Имя интерфейса, через который прошел пакет, например [.filename]#dc0#.
+. Группа и номер правила, например `@0:17`.
+
+Эти сообщения могут быть просмотрены командой `ipfstat -in`.
+
+. Действие: p для пропущенных, b для заблокированных, S для пакетов с неполным заголовком (short packet), n для пакетов, не соответствующих какому-либо правилу, L для соответствующих правилу протоколирования. Порядок следования по флагам: S, p, b, n, L. Знаки P или B в верхнем регистре означают, что пакет был протоколирован в соответствии с общими настройками, а не каким-то конкретным правилом.
+. Адреса. Всего три поля: адрес и порт источника (разделенные запятой), ->, адрес и порт назначения. 209.53.17.22,80 -> 198.73.220.17,1722.
+. `PR`, с последующим именем или номером протокола, например `PR tcp`.
+. `len`, с последующей длиной заголовка и общей длиной пакета, например `len 20 40`.
+
+Для TCP пакетов добавляется дополнительное поле, начинающееся с дефиса, за которым следуют буквы, соответствующие установленным флагам. На странице справочника man:ipf[5] находится список букв и флагов.
+
+Для пакетов ICMP, в конце находятся два поля, одно всегда "ICMP", а второе содержит тип и подтип ICMP сообщения (message и sub-message), разделенные символом косой черты, например ICMP 3/3 для сообщения "port unreachable".
+
+[[firewalls-ipf-rules-script]]
+=== Создание набора правил с использованием символьной подстановки
+
+Некоторые опытные пользователи IPF создают файл правил, поддерживающий использование символьной подстановки. Основное преимущество использования такого подхода заключается в возможности изменения значения, присваиваемого символьному имени, в результате чего во всех правилах, содержащих эту символьную подстановку, будет использоваться новое значение. В начале скрипта вы можете поместить часто используемые переменные, а затем использовать их сразу в нескольких правилах. Ниже дан пример такого использования.
+
+Синтаксис скрипта совместим с man:sh[1], man:csh[1], и man:tcsh[1].
+
+Символьная подстановка предваряется знаком доллара: `$`.
+
+Для присвоения значения символьным переменным знак $ не используется.
+
+Присваиваемое символической переменной значение должно быть заключено в двойные кавычки (`"`).
+
+Начните файл правил примерно так:
+
+[.programlisting]
+....
+############# Start of IPF rules script ########################
+
+oif="dc0" # name of the outbound interface
+odns="192.0.2.11" # ISP's DNS server IP address
+myip="192.0.2.7" # my static IP address from ISP
+ks="keep state"
+fks="flags S keep state"
+
+# You can choose between building /etc/ipf.rules file
+# from this script or running this script "as is".
+#
+# Uncomment only one line and comment out another.
+#
+# 1) This can be used for building /etc/ipf.rules:
+#cat > /etc/ipf.rules << EOF
+#
+# 2) This can be used to run script "as is":
+/sbin/ipf -Fa -f - << EOF
+
+# Allow out access to my ISP's Domain name server.
+pass out quick on $oif proto tcp from any to $odns port = 53 $fks
+pass out quick on $oif proto udp from any to $odns port = 53 $ks
+
+# Allow out non-secure standard www function
+pass out quick on $oif proto tcp from $myip to any port = 80 $fks
+
+# Allow out secure www function https over TLS SSL
+pass out quick on $oif proto tcp from $myip to any port = 443 $fks
+EOF
+################## End of IPF rules script ########################
+....
+
+Это все, что требовалось сделать. В данном примере сами правила не важны; важно то, как используется символьная подстановка. Если вышеприведенный пример помещен в файл [.filename]#/etc/ipf.rules.script#, то набор правил можно перезагрузить, введя следующую команду:
+
+[source,bash]
+....
+# sh /etc/ipf.rules.script
+....
+
+С использованием в правилах символьной подстановки связана одна проблема: IPF не понимает символьную подстановку и не может обработать такой скрипт непосредственно.
+
+Скрипт может использоваться одним из следующих двух способов:
+
+* Уберите комментарий перед строкой, начинающейся с `cat`, и закомментируйте строку, начинающуюся с `/sbin/ipf`. Поместите строку `ipfilter_enable="YES"` в файл [.filename]#/etc/rc.conf# как обычно, и запускайте скрипт после каждого его обновления для создания или обновления файла [.filename]#/etc/ipf.rules#.
+* Отключите IPFILTER в стартовых скриптах системы, поместив строку `ipfilter_enable="NO"` (это значение по умолчанию) в файл [.filename]#/etc/rc.conf#.
++
+Поместите скрипт, подобный нижеприведенному, в каталог [.filename]#/usr/local/etc/rc.d/#. У него должно быть однозначно говорящее о его назначении имя, например [.filename]#ipf.loadrules.sh#. Расширение [.filename]#.sh# обязательно.
++
+[.programlisting]
+....
+#!/bin/sh
+sh /etc/ipf.rules.script
+....
+
++
+Права, установленные на этот файл, должны разрешать чтение, запись и выполнение владельцу `root`.
++
+
+[source,bash]
+....
+# chmod 700 /usr/local/etc/rc.d/ipf.loadrules.sh
+....
+
+Теперь, правила IPF будут загружаться при загрузке системы.
+
+=== Наборы правил IPF
+
+Набор правил ipf это группа правил, составленных для пропускания или блокирования пакетов на основе их содержимого. Двусторонний обмен пакетами между хостами составляет сессию. Межсетевой экран обрабатывает как входящие из Интернет пакеты, так и исходящие пакеты, которые сгенерированы самой системой в ответ на входящий трафик. Для каждой службы TCP/IP (например, telnet, www, mail, и т.п.) назначен протокол и номер привилегированного (прослушиваемого) порта. Пакеты, предназначенные для определенного сервиса, порождаются с некоторым исходящим адресом и портом из непривилегированного диапазона и направляются на определенный адрес и определенный порт назначения. Все упомянутые параметры (номера портов и адреса) могут использоваться как критерии выбора в правилах, пропускающих или блокирующих доступ к службам TCP/IP.
+
+IPF был первоначально написан с использованием логики "последнее совпадающее правило побеждает" и только с правилами без сохранения состояния. Со временем в IPF был включен параметр "quick" и параметр сохранения состояния "keep state", что существенно улучшило логику обработки правил.
+
+Инструкции, помещенные в эту главу, созданы с использованием параметров "quick" и "keep state". Это основа для создания набора правил включающего межсетевого экрана.
+
+[WARNING]
+====
+
+При работе с правилами межсетевого экрана, будьте _очень осторожны_. Некоторые конфигурации _могут заблокировать вам доступ_ к серверу. В целях предосторожности, первоначальную настройку межсетевого экрана вы можете выполнить с локальной консоли, а не через удаленное подключение, такое как ssh.
+====
+
+[[firewalls-ipfw]]
+== IPFW
+
+IPFIREWALL (IPFW) - представляет собой межсетевой экран, написанный и поддерживаемый добровольными участниками проекта FreeBSD. Он использует stateless правила, т.е. правила без учета состояния, и наследование техники кодирования правил для получения того, что называется простой логикой с сохранением состояния (stateful).
+
+Пример простейшего набора правил IPFW (находится в [.filename]#/etc/rc.firewall# и [.filename]#/etc/rc.firewall6#) в стандартной установке FreeBSD достаточно прост и не рассчитан на непосредственное использование без изменений. В нём не используется фильтрация с сохранением состояния, которая даёт преимущества во многих конфигурациях, поэтому он не может быть взят за основу для этого раздела.
+
+Синтаксис правил IPFW без сохранения состояния обеспечивает расширенные возможности фильтрации, которые намного превосходят уровень знаний обычного пользователя межсетевого экрана. IPFW рассчитан на профессиональных пользователей или технически продвинутых любителей, которые предъявляют повышенные требования к фильтрации пакетов. Чтобы использовать возможности IPFW в полную силу, необходимы углубленные знания того, как в различных протоколах формируются и используются заголовки пакетов. Углубленное изучение работы протоколов выходит за рамки этого раздела Руководства.
+
+IPFW состоит из семи компонентов, главный из которых - процессор правил фильтрации уровня ядра и интегрированный в него механизм учета пакетов, а также средства протоколирования пакетов, правило `divert`, посредством которых вызывается функция NAT и другие возможности специального назначения, средства для ограничения скорости (шейпинга) трафика (dummynet), средства перенаправления `fwd`, средства организации сетевого моста bridge и механизм ipstealth. IPFW поддерживает протоколы IPv4 и IPv6.
+
+[[firewalls-ipfw-enable]]
+=== Включение IPFW
+
+IPFW включён в базовую установку FreeBSD в виде отдельного подгружаемого модуля. Система динамически загружает модуль ядра, когда в [.filename]#rc.conf# присутствует строка `firewall_enable="YES"`. Если использовать функциональность NAT не планируется, то в этом случае дополнительно компилировать IPFW в состав ядра FreeBSD не требуется.
+
+После перезагрузки системы с `firewall_enable="YES"` в [.filename]#rc.conf# на экране в процессе загрузки отобразится выделенное белым сообщение:
+
+[source,bash]
+....
+ipfw2 initialized, divert disabled, rule-based forwarding disabled, default to deny, logging disabled
+....
+
+Загружаемый модуль скомпилирован с возможностью протоколирования информации о трафике. Для включения протоколирования и установки уровня его детализации имеется переключатель, значение которого можно установить в конфигурационном файле [.filename]#/etc/sysctl.conf#. При добавлении следующих двух строк протоколирование будет включено при следующей загрузке системы:
+
+[.programlisting]
+....
+net.inet.ip.fw.verbose=1
+net.inet.ip.fw.verbose_limit=5
+....
+
+[[firewalls-ipfw-kernel]]
+=== Параметры ядра
+
+Включение следующих параметров в ядро FreeBSD не является обязательным, если дополнительно не требуется функциональность NAT. Эти параметры представлены здесь в качестве справочной информации для дальнейших примеров.
+
+[.programlisting]
+....
+options IPFIREWALL
+....
+
+Этот параметр включает IPFW в состав ядра.
+
+[.programlisting]
+....
+options IPFIREWALL_VERBOSE
+....
+
+Этот параметр включает протоколирование пакетов, которые проходят через IPFW по правилам с ключевым словом `log`.
+
+[.programlisting]
+....
+options IPFIREWALL_VERBOSE_LIMIT=5
+....
+
+Ограничение числа пакетов, прошедших через man:syslogd[8], отдельно для каждого правила. Этот параметр имеет смысл использовать в недружественной среде, когда необходимо отслеживать активность межсетевого экрана. Это закрывает возможность атак типа "отказ в обслуживании" через флуд сообщениями syslog.
+
+[.programlisting]
+....
+options IPFIREWALL_DEFAULT_TO_ACCEPT
+....
+
+Этот параметр включает для IPFW разрешающую политику по умолчанию. Это удобно на первых этапах настройки IPFW.
+
+[.programlisting]
+....
+options IPDIVERT
+....
+
+Включение функциональности NAT.
+
+[NOTE]
+====
+Межсетевой экран будет блокировать все входящие и исходящие пакеты, если отсутствует параметр ядра `IPFIREWALL_DEFAULT_TO_ACCEPT` или правило, явно разрешающее эти соединения.
+====
+
+[[firewalls-ipfw-rc]]
+=== Параметры [.filename]#/etc/rc.conf#
+
+Включение межсетевого экрана:
+
+[.programlisting]
+....
+firewall_enable="YES"
+....
+
+Для выбора одного из стандартных режимов работы межсетевого экрана, предоставляемых FreeBSD, выберите наиболее подходящий в файле [.filename]#/etc/rc.firewall# и разместите так, как указано ниже:
+
+[.programlisting]
+....
+firewall_type="open"
+....
+
+Возможны следующие значения для этого параметра:
+
+* `open` - пропускать весь трафик.
+* `client` - защищать только эту машину.
+* `simple` - защищать всю сеть.
+* `closed` - полностью запретить IP трафик, за исключением loopback интерфейса.
+* `UNKNOWN` - отключить загрузку правил межсетевого экрана.
+* [.filename]#filename# - абсолютный путь к файлу, содержащему правила межсетевого экрана.
+
+Есть два варианта загрузки собственных правил в межсетевой экран ipfw. Первый способ - задать переменную `firewall_type` в виде абсолютного пути файла, содержащего _правила межсетевого экрана_ без каких-либо параметров командной строки для самого man:ipfw[8]. Ниже приведён простой пример набора правил, который блокирует весь входящий и исходящий трафик:
+
+[.programlisting]
+....
+add deny in
+add deny out
+....
+
+Второй способ - установить значение переменной `firewall_script` в виде абсолютного пути исполняемого скрипта, содержащего команды `ipfw`, которые будут выполнены во время загрузки операционной системы. Правильный формат правил исполняемого скрипта должен соответствовать формату файла, приведённому ниже:
+
+[.programlisting]
+....
+#!/bin/sh
+
+ipfw -q flush
+
+ipfw add deny in
+ipfw add deny out
+....
+
+[NOTE]
+====
+Если переменной `firewall_type` присвоено значение `client` или `simple`, то правила, расположенные по умолчанию в [.filename]#/etc/rc.firewall#, должны быть приведены в соответствие с конфигурацией данной машины. Также заметим, что для используемых в этой главе примеров в качестве значения переменной `firewall_script` используется [.filename]#/etc/ipfw.rules#.
+====
+
+Включение протоколирования:
+
+[.programlisting]
+....
+firewall_logging="YES"
+....
+
+[WARNING]
+====
+
+Единственное, что делает параметр `firewall_logging`, - присвоение логической единицы (`1`) переменной sysctl `net.inet.ip.fw.verbose` (смотрите <<firewalls-ipfw-enable>>). В [.filename]#rc.conf# нет переменной для ограничения протоколирования, но это можно сделать через переменную sysctl вручную либо используя файл [.filename]#/etc/sysctl.conf#:
+
+[.programlisting]
+....
+net.inet.ip.fw.verbose_limit=5
+....
+
+====
+
+Если ваша машина выполняет роль шлюза, т.е. обеспечивает трансляцию сетевых адресов (NAT) с помощью man:natd[8], имеет смысл сразу перейти к чтению crossref:advanced-networking[network-natd,Даемон преобразования сетевых адресов (natd)] для уточнения информации относительно параметров [.filename]#/etc/rc.conf#.
+
+[[firewalls-ipfw-cmd]]
+=== Команда IPFW
+
+Команда `ipfw` - это стандартный механизм для ручного добавления/удаления отдельных правил в активной цепочке правил межсетевого экрана. Основная проблема при использовании этого метода состоит в том, что при перезагрузке операционной системы все изменения, сделанные с помощью данной команды, будут утеряны. Вместо этого рекомендуется записать все правила в файл, из которого они будут считываться во время загрузки операционной системы, а также для полной замены текущего набора правил на содержимое из файла.
+
+Тем не менее, команду `ipfw` удобно использовать для отображения текущей конфигурации правил на экране консоли. Учетный модуль IPFW динамически создаёт счётчики для каждого правила, которые подсчитывают количество пакетов, соответствующих условиям срабатывания правила. В процессе тестирования отображение правила со своим счётчиком является одним из способов проверки, срабатывает ли правило при прохождении через него пакета или нет.
+
+Вывод полного списка правил:
+
+[source,bash]
+....
+# ipfw list
+....
+
+Вывод полного списка правил с маркером времени последнего срабатывания правила:
+
+[source,bash]
+....
+# ipfw -t list
+....
+
+Следующий пример выводит учетную информацию, количество совпавших пакетов и сами правила. Первым столбцом идет номер правила, за ним следует число совпавших исходящих пакетов, третий столбец - число соответствующих входящих пакетов, и затем само правило.
+
+[source,bash]
+....
+# ipfw -a list
+....
+
+Вывод динамических правил вместе со статическими:
+
+[source,bash]
+....
+# ipfw -d list
+....
+
+Отобразить статические и динамические правила, в т.ч. с истекшим временем действия:
+
+[source,bash]
+....
+# ipfw -d -e list
+....
+
+Обнуление счетчиков:
+
+[source,bash]
+....
+# ipfw zero
+....
+
+Обнулить счетчики для правила под номером _NUM_:
+
+[source,bash]
+....
+# ipfw zero NUM
+....
+
+[[firewalls-ipfw-rules]]
+=== Набор правил IPFW
+
+Набор правил (ruleset) представляет собой группу правил IPFW, которые разрешают или запрещают прохождение пакета через межсетевой экран на основании значений, содержащихся в пакете. Двунаправленный обмен пакетов между машинами является сессией. Набор правил межсетевого экрана анализирует как пакеты, приходящие из глобальной сети, так и ответные пакеты, исходящие из системы. Каждый TCP/IP сервис (такой как telnet, www, mail, и т.д.) принадлежит определенному протоколу и привилегированному (прослушиваемому) порту. Пакеты, предназначенные для конкретного сервиса, передаются с непривилегированного (с высоким значением) порта по адресу назначения на указанный порт сервиса. Все эти параметры (т.е. порты и адреса) могут быть использованы в качестве критериев фильтрации при создании правил, которые пропускают или блокируют сервисы.
+
+Когда пакет попадает в межсетевой экран, он сравнивается с каждым правилом, начиная с первого, двигаясь по множеству правил верху вниз в порядке увеличения номера правил. Когда пакет совпадает с критерием выбора правила, выполняется действие, указанное в правиле, и на этом поиск правил прекращается. Такой метод поиска известен как "выигрыш первого совпадения", т.е. после срабатывания правила оставшиеся не просматриваются. Если содержимое пакета не соответствует ни одному из правил, он принудительно попадает на встроенное правило по умолчанию, заданное под номером 65535, которое запрещает и отбрасывает все пакеты без какого-либо отклика в сторону отправителя.
+
+[NOTE]
+====
+Поиск продолжается после правил `count`, `skipto` и `tee`.
+====
+
+Упомянутые здесь инструкции основаны на использовании правил, содержащих параметры с сохранением состояния `keep state`, `limit`, `in`, `out` и `via`. Это основной механизм для кодирования набора правил межсетевого экрана закрытого типа.
+
+[WARNING]
+====
+
+Будьте осторожны, когда работаете с правилами межсетевого экрана, так как вы можете легко заблокировать самого себя.
+====
+
+[[firewalls-ipfw-rules-syntax]]
+==== Синтаксис правил
+
+Представленный здесь синтаксис правил был упрощен для создания стандартного набора правил межсетевого экрана закрытого типа. Для полного описания синтаксиса правил смотрите страницу Справочника man:ipfw[8].
+
+Правила содержат ключевые слова: эти ключевые слова записываются в строке в определенном порядке слева направо. Ключевые слова выделены полужирным шрифтом. Некоторые ключевые слова имеют дополнительные параметры, которые могут являться ключевыми словами для них самих и также содержать вложенные дополнительные параметры.
+
+Символ `#` используется для обозначения начала комментария и может быть расположен в конце строки с правилом или в начале строки над правилом. Пустые строки игнорируются.
+
+_CMD RULE_NUMBER ACTION LOGGING SELECTION STATEFUL_
+
+===== CMD
+
+Каждое новое правило должно начинаться с префикса [parameter]#add# для добавления во внутреннюю таблицу.
+
+===== RULE_NUMBER
+
+Каждое правило обозначено номером в диапазоне 1..65535.
+
+===== ACTION
+
+При соответствии пакета описанным в правиле критериям фильтрации будет выполнено одно из следующих действий.
+
+[parameter]#allow | accept | pass | permit#
+
+Все эти действия означают одно и то же - пакеты, совпадающие с правилом, могут покинуть обработку правил межсетевого экрана. На этом поиск прекращается.
+
+[parameter]#check-state#
+
+Проверяет пакет на соответствие динамической таблице правил. Если совпадение найдено, выполняется действие, содержащееся в правиле, породившем данное динамическое правило, иначе выполняется переход к следующему правилу. Правило check-state не имеет критериев фильтрации. При отсутствии правила check-state в наборе правил проверка по динамической таблице происходит на первом правиле keep-state или limit.
+
+[parameter]#deny | drop#
+
+Оба слова означают отбрасывание пакетов, совпавших с правилом. Поиск прекращается.
+
+===== Протоколирование
+
+[parameter]#log# или [parameter]#logamount#
+
+Когда пакет совпадает с правилом, содержащим ключевое слово `log`, информация об этом событии записывается в man:syslogd[8] с пометкой SECURITY. Запись в журнал происходит только в том случае, если число срабатываний для данного правила не превышает значения параметра `logamount`. Если значение `logamount` не объявлено, то ограничение берется из значения переменной sysctl `net.inet.ip.fw.verbose_limit`. В обоих случаях обнуление значения отменяет ограничение. По достижению установленного лимита запись в журнал может быть повторно включена путем сброса счетчика срабатываний или счетчика пакетов для этого правила; смотрите описание команды `ipfw reset log`.
+
+[NOTE]
+====
+Протоколирование осуществляется после проверки на соответствие всем условиям в правиле и перед выполнением окончательного действия (accept, deny) над пакетом. Вы должны выбрать сами, какие действия правил вы хотите включить в журнал.
+====
+
+===== Условия отбора
+
+Ключевые слова, представленные в этом разделе, используются для описания атрибутов пакета, по которым проверяется условие срабатывания того или иного правила. Для совпадения используется следующая последовательность атрибутов общего назначения:
+
+[parameter]#udp | tcp | icmp#
+
+Также могут быть использованы имена протоколов, описанные в [.filename]#/etc/protocols#. Указанное значение обозначает протокол для совпадения. Это является обязательным требованием.
+
+[parameter]#from src to dst#
+
+Ключевые слова `from` и `to` служат для фильтрации по IP адресам. Обязательно должны быть указаны и источник, и получатель. `any` - это специальное ключевое слово, которое соответствует любому IP адресу. `me` - это специальное ключевое слово, которое соответствует любому из IP адресов, сконфигурированных на интерфейсе вашей системы FreeBSD, и служит для указания компьютера, на котором работает межсетевой экран (т.е. этот компьютер), как показано на примерах `from me to any`, `from any to me`, `from 0.0.0.0/0 to any`, `from any to 0.0.0.0/0`, `from 0.0.0.0 to any`, `from any to 0.0.0.0` и `from me to 0.0.0.0`. IP адрес указывается в виде четырёх чисел, разделённых точками, или дополнительно с префиксом сети (нотация CIDR). Это является обязательным требованием. Для упрощения вычислений, связанных с IP адресами, используйте порт package:net-mgmt/ipcalc[]. Более подробную информацию можно посмотреть на странице программы: http://jodies.de/ipcalc[http://jodies.de/ipcalc].
+
+[parameter]#port number#
+
+Для протоколов, работающих с портами (такие как TCP и UDP), обязательным требованием является указание номера порта соответствующего сервиса. Вместо номера порта можно использовать имя сервиса (из [.filename]#/etc/services#).
+
+[parameter]#in | out#
+
+Отбор соответственно по входящим и исходящим пакетам. Присутствие одного из этих ключевым слов в правиле обязательно для формирования критерия фильтрации.
+
+[parameter]#via IF#
+
+Совпадает с пакетами, проходящими через указанный интерфейс. Ключевое слово `via` включает обязательную проверку на указанном интерфейсе в общий процесс поиска совпадений.
+
+[parameter]#setup#
+
+Это обязательное ключевое слово определяет начало запроса сессии для TCP пакетов.
+
+[parameter]#keep-state#
+
+Это обязательное ключевое слово. При совпадении межсетевой экран создает динамическое правило, которое по умолчанию будет совпадать с двунаправленным трафиком между отправителем и получателем для данной пары IP/порт по указанному протоколу.
+
+[parameter]#limit {src-addr | src-port | dst-addr | dst-port}#
+
+Межсетевой экран разрешит только _N_ соединений с одинаковым набором параметров, указанных в правиле. Можно задавать один или несколько адресов и портов отправителя и получателя. В одном и том же правиле использование `limit` и `keep-state` не допускается. Параметр `limit` предоставляет такую же функцию с сохранением состояний, что и `keep-state`, плюс свои собственные.
+
+==== Параметры для правил с сохранением состояния
+
+С точки зрения фильтрации по правилам с сохранением состояния весь трафик выглядит как двусторонний обмен пакетами, включая данные о сессиях. При такой фильтрации у нас есть средства сопоставления и определения корректности процедуры двустороннего обмена пакетами между стороной, породившей пакет, и стороной-получателем. Любые пакеты, которые не подходят под шаблон сессии, автоматически отбрасываются как злонамеренные.
+
+Параметр `check-state` служит для указания места в наборе правил IPFW, в котором пакет будет передан на поиск соответствий динамическим правилам. В случае совпадения пакет пропускается, при этом создается новое динамическое правило для следующего пакета, принадлежащего данной двусторонней сессии. В противном случае пакет движется по обычным правилам, начиная со следующей позиции.
+
+Динамические правила уязвимы к атаке SYN-пакетами, которые могут породить гигантское количество динамических правил. Для предотвращения такого рода атак во FreeBSD предусмотрен еще один параметр - `limit`. Этот параметр служит для ограничения количества одновременно установленных сессий путём проверки полей отправителя и получателя, в зависимости от параметра `limit`, с использованием IP адреса пакета для поиска открытых динамических правил, которые представляют собой счетчик количества совпадений для данного IP адреса и этого правила. Если это количество превышает значение, указанное в параметре `limit`, то такой пакет отбрасывается.
+
+==== Протоколирование сообщений межсетевого экрана
+
+Преимущества протоколирования очевидны: это предоставляет возможность отслеживать постфактум, прохождение каких пакетов было отклонено, откуда эти пакеты пришли и куда они назначались для тех правил, в которых включена функция записи в журнал. Это замечательный инструмент для отслеживания атак на вашу систему.
+
+Даже при включенной функции ведения журнала само по себе оно производиться не будет. Администратор межсетевого экрана определяет, для каких правил будет включена функция ведения журнала, и добавляет к этим правилам `log`. Обычно в журнал пишутся только запрещающие правила, такие как правила deny для входящего ICMP ping. Довольно часто конец списка добавляют дублирующее правило вида "ipfw default deny everything" с приставкой `log`. Это позволяет отслеживать все пакеты, не совпадающие ни с одним из правил в вашем наборе.
+
+Будьте крайне осмотрительны при использовании функции ведения журнала, так как это чревато несоразмерным разрастанием файла журнала, вплоть до полного заполнения им места на жестком диске. DoS атаки, направленные на переполнение свободного пространства жесткого диска, являются одними из самых старейших. Помимо заполнения жесткого диска это неприятно еще и тем, что сообщения журнала пишутся не только в syslogd, но также отображаются на экране системной консоли, и это вскоре начинает сильно раздражать.
+
+Параметр ядра `IPFIREWALL_VERBOSE_LIMIT=5` ограничивает число идущих подряд сообщений в системный регистратор man:syslogd[8], касающихся пакетов, совпавших с правилом. Когда этот параметр включен в ядро, число последовательно идущих сообщений для определенного правила обрезается указанным числом. От записи 200 идентичных сообщений особого прока нет. В данном случае для сработавшего правила в журнале syslogd будут зафиксированы 5 сообщений подряд, остальные идентичные сообщения будут подсчитаны и отправлены в syslogd как одно сообщение такого вида:
+
+[.programlisting]
+....
+last message repeated 45 times
+....
+
+Путь к файлу, в который пишутся сообщения, задается в файле [.filename]#/etc/syslog.conf#. По умолчанию это файл [.filename]#/var/log/security#.
+
+[[firewalls-ipfw-rules-script]]
+==== Написание скрипта правил
+
+Наиболее опытные пользователи IPFW создают скрипт, содержащий в себе правила, оформленные таким образом, что они могут быть исполнены как обыкновенный sh-скрипт. Основное преимущество такого подхода в том, что правила можно полностью заменить на новые без необходимости в перезагрузке системы для их активации. Это крайне удобно на этапе разработки и тестирования набора правил, т.к. перезагружать весь список правил можно сколь угодно часто. Помимо того, поскольку это скрипт, то здесь можно объявить некие часто используемые значения в виде переменной, и использовать её во множестве правил, как показано в примере ниже.
+
+Синтаксис примера, приведенного ниже, совместим с тремя командными оболочками: man:sh[1], man:csh[1], man:tcsh[1]. Для использования значения ранее объявленной переменной имя переменной предваряется символом $. Во время присвоения имя переменной не имеет префикса $, присваиваемое значение должно быть заключено в "двойные кавычки".
+
+Так выглядит файл с правилами, с которого вы можете начать:
+
+[.programlisting]
+....
+############### начало примера скрипта с правилами ipfw #############
+#
+ipfw -q -f flush # Сброс всех правил.
+# Установки по умолчанию
+oif="tun0" # наш интерфейс
+odns="192.0.2.11" # IP DNS сервера провайдера
+cmd="ipfw -q add " # префикс для создания правил
+ks="keep-state" # просто лень вводить каждый раз
+$cmd 00500 check-state
+$cmd 00502 deny all from any to any frag
+$cmd 00501 deny tcp from any to any established
+$cmd 00600 allow tcp from any to any 80 out via $oif setup $ks
+$cmd 00610 allow tcp from any to $odns 53 out via $oif setup $ks
+$cmd 00611 allow udp from any to $odns 53 out via $oif $ks
+################### конец примера скрипта с правилами ipfw ############
+....
+
+Вот и все, что нужно сделать. Сами правила в этом примере не столь важны, они написаны ради того, чтобы продемонстрировать использование подстановки значения переменной по ее имени.
+
+Если бы этот скрипт находился в файле [.filename]#/etc/ipfw.rules#, то правила можно было бы перезагрузить следующей командой.
+
+[source,bash]
+....
+# sh /etc/ipfw.rules
+....
+
+Имя и расположение файла [.filename]#/etc/ipfw.rules# могут быть какими угодно.
+
+Такой же результат можно получить, выполнив вручную следующие команды:
+
+[source,bash]
+....
+# ipfw -q -f flush
+# ipfw -q add check-state
+# ipfw -q add deny all from any to any frag
+# ipfw -q add deny tcp from any to any established
+# ipfw -q add allow tcp from any to any 80 out via tun0 setup keep-state
+# ipfw -q add allow tcp from any to 192.0.2.11 53 out via tun0 setup keep-state
+# ipfw -q add 00611 allow udp from any to 192.0.2.11 53 out via tun0 keep-state
+....
+
+==== Набор правил с сохранением состояния
+
+Следующий набор правил, не включающий в себя правила трансляции адресов NAT, является примером того, как создавать правила для межсетевого экрана закрытого типа высокого уровня защиты. Закрытый межсетевой экран разрешает трафик, описанный в разрешающих правилах, и по умолчанию блокирует всё остальное. Межсетевой экран, предназначенный для защиты сегментов сети, имеет как минимум два интерфейса, для которых должны быть написаны правила для работы межсетевого экрана.
+
+Все разновидности операционных систем UNIX(R), включая FreeBSD, используют интерфейс [.filename]#lo0# и IP адрес `127.0.0.1` для передачи данных внутри операционной системы. Правила межсетевого экрана должны содержать в своем составе правила, разрешающие беспрепятственное прохождение трафика по этому интерфейсу.
+
+Интерфейс, подключенный к Интернет, является местом для размещения правил авторизации и контроля доступа исходящих и входящих соединений. Это может быть туннельный интерфейс PPP [.filename]#tun0# или сетевой адаптер, подключенный к DSL или кабельному модему.
+
+В случае, когда за межсетевым экраном один и более интерфейсов подсоединён к локальной сети, должны присутствовать правила для беспрепятственного прохождения исходящих пакетов с этих интерфейсов LAN.
+
+Правила изначально разделяются на три основных раздела: интерфейсы, не ограниченные правилами, правила для исходящего трафика на внешнем интерфейсе и правила для входящего трафика на внешнем интерфейсе.
+
+В каждом из разделов, относящихся к внешнему интерфейсу, правила должны быть упорядоченны по следующему принципу: наиболее используемые расположены в начале, наименее используемые - в конце. Последним должно идти правило блокирования и занесения в журнал информации о пакетах на этом интерфейсе, не попавших под предыдущие правила.
+
+Раздел, описывающий правила для исходящего трафика на внешнем интерфейсе, содержит только разрешающие правила `allow`, состоящие из значений фильтрации, которые однозначно определяют сервис, которому разрешен доступ в Интернет. Все правила включают в себя поля `proto`, `port`, `in/out`, `via` и `keep state`. Правила, содержащие `proto tcp`, имеют также параметр `setup`, который служит для определения начала сессии, которое в дальнейшем передается как условие срабатывания в динамическую таблицу.
+
+В разделе, описывающем правила для входящего трафика на внешнем интерфейсе, в самом начале должны стоять правила, блокирующие нежелательные пакеты. Так должно быть по двум причинам. Первая состоит в том, что пакеты, сформированные злоумышленником, могут частично или полностью соответствовать разрешающим правилам `allow`. Вторая причина состоит в том, что заведомо не интересующие нас пакеты могут быть просто отклонены, вместо того, чтобы быть перехваченными и записанными в файл журнала по последнему правилу. Последнее правило в каждом разделе блокирует и регистрирует в журнале все пакеты и может быть использовано для юридических обоснований в ходе разбирательств против злоумышленников, атаковавших вашу систему.
+
+Также следует убедиться в том, что ваш сервер не отвечает ни на какие другие формы непредусмотренного трафика. Некорректные пакеты должны быть просто отброшены. В результате атакующие не получат информацию о том, достиг ли его пакет вашего сервера. Чем меньше атакующие будут знать о вашей системе, тем более она защищена. Назначение нераспознанного номера порта можно посмотреть в файле [.filename]#/etc/services/# или по адресу http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers[http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers]. Рекомендуем ознакомиться с содержимым ссылки относительно номеров портов, используемых троянами: http://www.sans.org/security-resources/idfaq/oddports.php[http://www.sans.org/security-resources/idfaq/oddports.php].
+
+==== Пример правил для межсетевого экрана закрытого типа.
+
+Следующие правила, не включающие поддержку NAT, являются логически полным набором правил для межсетевого экрана закрытого типа. При использовании этого набора правил вы вполне можете быть уверены в безопасности вашей системы. Просто закомментируйте некоторые из правил `pass` для тех служб, которые вам не требуются. Чтобы избежать занесения в журнал нежелательных сообщений, добавьте правило `deny` в раздел, описывающий входящий трафик на интерфейсе. Замените название интерфейса [.filename]#dc0#, упоминающегося в правилах ниже, на название интерфейса (NIC), который соединяет вашу систему с глобальной сетью. Для PPP соединений это будет [.filename]#tun0#.
+
+Примечание по использованию этих правил.
+
+* Все запросы начала сессии с внешней сетью используют параметр `keep-state`.
+* Все разрешенные сервисы внешней сети имеют параметр `limit` для защиты от флуда.
+* Все правила используют параметры `in` или `out` для указания направления трафика.
+* Все правила используют параметр `via` _имя-интерфейса_ для уточнения интерфейса, через который проходит пакет.
+
+Следующие правила записываются в [.filename]#/etc/ipfw.rules#.
+
+[.programlisting]
+....
+################ Начало файла с правилами IPFW ###############################
+# Сброс всех правил перед началом работы скрипта.
+ipfw -q -f flush
+
+# Префикс для создания правил
+cmd="ipfw -q add"
+pif="dc0" # название внешнего интерфейса,
+ # принадлежащего глобальной сети
+
+#################################################################
+# Нет ограничений на внутреннем интерфейсе локальной сети
+# Нет необходимости в этом, если у вас нет локальной сети.
+# Замените xl0 на название интерфейса вашей локальной сети
+#################################################################
+#$cmd 00005 allow all from any to any via xl0
+
+#################################################################
+# Нет ограничений на интерфейсе Loopback
+#################################################################
+$cmd 00010 allow all from any to any via lo0
+
+#################################################################
+# Разрешить пакет, если он был ранее добавлен в "динамическую"
+# таблицу при помощи выражения allow keep-state
+#################################################################
+$cmd 00015 check-state
+
+#################################################################
+# Раздел правил для исходящего трафика на внешнем интерфейсе
+# Анализ запросов начала сессии, идущих из-за межсетевого экрана
+# в локальную сеть или от этого шлюза в интернет.
+#################################################################
+
+# Разрешить исходящий трафик к DNS серверу провайдера
+# x.x.x.x должен быть IP адресом DNS сервера вашего провайдера
+# Продублируйте эти строки, если у вас больше одного DNS сервера
+# Эти IP адреса можно взять из файла /etc/resolv.conf
+$cmd 00110 allow tcp from any to x.x.x.x 53 out via $pif setup keep-state
+$cmd 00111 allow udp from any to x.x.x.x 53 out via $pif keep-state
+
+# Разрешить исходящий трафик к DHCP серверу провайдера для cable/DSL конфигураций.
+# Это правило не нужно для .user ppp. соединений с глобальной сетью
+# в этом случае вы можете удалить эти правила.
+# Используйте это правило для записи необходимого нам IP адреса в лог-файл.
+# Затем укажите IP адрес в закомментированном правиле и удалите первое правило.
+$cmd 00120 allow log udp from any to any 67 out via $pif keep-state
+#$cmd 00120 allow udp from any to x.x.x.x 67 out via $pif keep-state
+
+# Разрешить исходящий трафик для незащищенного www соединения
+$cmd 00200 allow tcp from any to any 80 out via $pif setup keep-state
+
+# Разрешить исходящий трафик для защищенного www соединения
+# https с поддержкой TLS и SSL
+$cmd 00220 allow tcp from any to any 443 out via $pif setup keep-state
+
+# Разрешить исходящий POP/SMTP
+$cmd 00230 allow tcp from any to any 25 out via $pif setup keep-state
+$cmd 00231 allow tcp from any to any 110 out via $pif setup keep-state
+
+# Разрешить исходящий трафик для FreeBSD (make install & CVSUP)
+# По сути назначаем пользователю root полные привилегии.
+$cmd 00240 allow tcp from me to any out via $pif setup keep-state uid root
+
+# Разрешаем исходящий icmp ping
+$cmd 00250 allow icmp from any to any out via $pif keep-state
+
+# Разрешаем исходящий трафик Time
+$cmd 00260 allow tcp from any to any 37 out via $pif setup keep-state
+
+# Разрешаем исходящий трафик nntp news
+$cmd 00270 allow tcp from any to any 119 out via $pif setup keep-state
+
+# Разрешаем исходящий защищённый трафик FTP, Telnet и SCP
+# Эта функция использует SSH (secure shell)
+$cmd 00280 allow tcp from any to any 22 out via $pif setup keep-state
+
+# Разрешаем исходящий трафик whois
+$cmd 00290 allow tcp from any to any 43 out via $pif setup keep-state
+
+# Запрещаем и заносим в журнал остальной исходящий трафик.
+# Обеспечивает политику межсетевого экрана закрытого типа
+$cmd 00299 deny log all from any to any out via $pif
+
+#################################################################
+# Раздел правил для входящего трафика на внешнем интерфейсе
+# Анализ пакетов, приходящих из глобальной сети,
+# предназначенных для этого шлюза или локальной сети
+########################################################################
+
+# Запрещаем весь входящий трафик с немаршрутизируемых сетей
+$cmd 00300 deny all from 192.168.0.0/16 to any in via $pif #RFC 1918 private IP
+$cmd 00301 deny all from 172.16.0.0/12 to any in via $pif #RFC 1918 private IP
+$cmd 00302 deny all from 10.0.0.0/8 to any in via $pif #RFC 1918 private IP
+$cmd 00303 deny all from 127.0.0.0/8 to any in via $pif #loopback
+$cmd 00304 deny all from 0.0.0.0/8 to any in via $pif #loopback
+$cmd 00305 deny all from 169.254.0.0/16 to any in via $pif #DHCP auto-config
+$cmd 00306 deny all from 192.0.2.0/24 to any in via $pif #reserved for docs
+$cmd 00307 deny all from 204.152.64.0/23 to any in via $pif #Sun cluster interconnect
+$cmd 00308 deny all from 224.0.0.0/3 to any in via $pif #Class D & E multicast
+
+# Запрещаем пинг извне
+$cmd 00310 deny icmp from any to any in via $pif
+
+# Запрещаем ident
+$cmd 00315 deny tcp from any to any 113 in via $pif
+
+# Запрещаем все Netbios службы. 137=name, 138=datagram, 139=session
+# Netbios это MS/Windows сервис обмена.
+# Блокируем MS/Windows hosts2 запросы сервера имен на порту 81
+$cmd 00320 deny tcp from any to any 137 in via $pif
+$cmd 00321 deny tcp from any to any 138 in via $pif
+$cmd 00322 deny tcp from any to any 139 in via $pif
+$cmd 00323 deny tcp from any to any 81 in via $pif
+
+# Запрещаем любые опоздавшие пакеты
+$cmd 00330 deny all from any to any frag in via $pif
+
+# Запрещаем ACK пакеты, которые не соответствуют динамической таблице правил.
+$cmd 00332 deny tcp from any to any established in via $pif
+
+# Разрешаем входящий трафик с DHCP сервера провайдера. Это правило
+# должно содержать IP адрес DHCP сервера вашего провайдера, поскольку
+# только ему разрешено отправлять пакеты данного типа. Необходимо только
+# для проводных и DSL соединений. Для 'user ppp' соединений с глобальной
+# сетью использовать это правило нет необходимости. Это тот же IP адрес,
+# выбранный и используемый вами в разделе правил для исходящего трафика.
+#$cmd 00360 allow udp from any to x.x.x.x 67 in via $pif keep-state
+
+# Разрешить входящий трафик для www, так как я использую сервер apache
+$cmd 00400 allow tcp from any to me 80 in via $pif setup limit src-addr 2
+
+# Разрешить входящий трафик безопасных FTP, Telnet и SCP из глобальной сети
+$cmd 00410 allow tcp from any to me 22 in via $pif setup limit src-addr 2
+
+# Разрешить входящий нешифрованный трафик Telnet из глобальной сети
+# считается небезопасным, потому что ID и PW передаются через глобальную
+# сеть в открытом виде.
+# Удалите этот шаблон, если вы не используете telnet.
+$cmd 00420 allow tcp from any to me 23 in via $pif setup limit src-addr 2
+
+# Отбрасываем и заносим в журнал все входящие соединения снаружи
+$cmd 00499 deny log all from any to any in via $pif
+
+# Всё остальное запрещено по умолчанию
+# Запрещаем и заносим в журнал все пакеты для дальнейшего анализа
+$cmd 00999 deny log all from any to any
+################ Конец файла правил IPFW ###############################
+....
+
+==== Пример правил с сохранением состояний и поддержкой NAT
+
+Здесь перечислены некоторые дополнительные конфигурационные параметры, которые нужно включить, чтобы активировать функцию NAT в IPFW. В файл конфигурации ядра к остальным параметрам IPFIREWALL нужно добавить строку `option IPDIVERT`.
+
+В дополнение к обычным параметрам IPFW в [.filename]#/etc/rc.conf# добавим следующее:
+
+[.programlisting]
+....
+natd_enable="YES" # Включить функцию NATD
+natd_interface="rl0" # Название внешнего сетевого интерфейса
+natd_flags="-dynamic -m" # -m = по возможности сохранить номера портов
+....
+
+Использование динамических правил с правилом `divert natd` (Network Address Translation) значительно затрудняет логику составления правил. Расположение `check-state` и `divert natd` в таблице правил влияет на поведение межсетевого экрана. Это уже не просто последовательный логический поток. При применении вышеозначенных параметров становится доступным новый тип действия `skipto`. При использовании `skipto` нумерация правил становится обязательной. В качестве аргумента `skipto` используется номер правила, к которому нужно перейти.
+
+Ниже последует пример метода кодирования, не снабженный комментариями, приведенный здесь для внесения ясности относительно последовательности прохождения пакетов через набор правил.
+
+Обработка правил начинается с первого по счету и идет последовательно, по правилу за раз, до достижения конца файла, либо если проверяемый пакет соответствует критериям фильтрации; в последнем случае пакет покидает межсетевой экран. Для правил под номерами 100, 101, 450, 500 и 510 важен порядок их расположения. Эти правила управляют трансляцией исходящих и входящих пакетов, таким образом в таблицу keep-state заносятся только приватные IP адреса локальной сети. Обратите внимание, что все правила allow и deny указывают направление, по которому передается пакет (исходящее или входящее) и сетевой интерфейс. Также стоит отметить, что все запросы начала исходящей сессии передаются с использованием `skipto rule 500` для трансляции адресов.
+
+Предположим, что пользователь локальной сети запрашивает страницу через браузер. Веб-страницы передаются по порту 80. Пакет входит в межсетевой экран. Этот пакет не попадает под правило 100, потому что в критериях фильтрации этого правила указан параметр `in`. Этот пакет не попадает под правило 101, потому что это первый пакет сессии и он еще не был занесен в динамическую таблицу keep-state. Достигнув, наконец, правила 125, пакет удовлетворяет всем критериям фильтрации. Этот пакет является выходящим из интерфейса, взаимодействующим с глобальной сетью. На данном этапе у пакета в качестве исходящего адреса всё еще указан приватный IP адрес локальной сети. По условию этого правила к пакету применяются два действия. Параметр `keep-state` создаст новую запись в динамической таблице keep-state, и выполнится действие, указанное в правиле. Указанное действие является частью информации, заносимой в динамическую таблицу. В данном случае это `skipto rule 500`. Правило 500 транслирует (NAT) адреса пакета и отпускает его наружу. Данное замечание очень важно. Этот пакет идет к цели, где генерируется ответный пакет и отправляется обратно. Этот новый пакет входит в начало списка правил. На этот раз пакет соответствует правилу 100 и его IP адрес назначения транслируется обратно на соответствующий IP адрес локальной сети. Затем он обрабатывается правилом `check-state`, и поскольку для него уже присутствует в динамической таблице правило, соответствующее данной сессии, пакет пропускается в локальную сеть. Дальше пакет приходит к отправившему его компьютеру локальной сети, и генерируется новый пакет, запрашивающий новую порцию данных с удаленного сервера. На этот раз пакет сразу проверяется правилом `check-state`, и в случае присутствия исходящей записи данного пакета выполняется действие `skipto 500`. Пакет переходит к правилу 500, транслируется и пропускается во внешнюю сеть.
+
+Для входящего трафика все пакеты, являющиеся частью уже установленной сессии, автоматически разбираются правилом `check-state` и правильно расположенными правилами `divert natd`. Всё, что нам остается сделать, это запретить все плохие пакеты и разрешить прохождение внутрь сети пакетов только для разрешенных сервисов. Допустим, на сервере с межсетевым экраном запущен apache, и мы хотим разрешить людям из глобальной сети доступ на локальный веб-сайт. Новый входящий пакет, запрашивающий начало сессии, соответствует правилу 100, и его IP адрес транслируется как локальный IP системы с межсетевым экраном. Далее пакет проверяется на соответствие вредоносному трафику и в случае отсутствия соответствия попадает на правило 425. В случае соответствия данному правилу происходят две вещи. Пакет правил помещается в динамическую таблицу keep-state, но в этот раз любая новая сессия запросов, порожденных с этого IP, ограничена 2 одновременными соединениями. Это защищает от перегрузки сервис, работающей по указанному номеру порта. В качестве действия в правиле указан `allow`, следовательно пакет пропускается в локальную сеть. Пакет, сформированный в качестве ответа, попадает под `check-state` и распознается им как принадлежащий существующей сессии. Далее он передаётся на правило 500, где происходит обратная трансляция, после чего пакет пропускается на внешний интерфейс.
+
+Пример файла правил #1:
+
+[.programlisting]
+....
+#!/bin/sh
+cmd="ipfw -q add"
+skip="skipto 500"
+pif=rl0
+ks="keep-state"
+good_tcpo="22,25,37,43,53,80,443,110,119"
+
+ipfw -q -f flush
+
+$cmd 002 allow all from any to any via xl0 # разрешаем трафик на локальном интерфейсе
+$cmd 003 allow all from any to any via lo0 # разрешаем трафик на интерфейсе loopback
+
+$cmd 100 divert natd ip from any to any in via $pif
+$cmd 101 check-state
+
+# Разрешенные исходящие пакеты
+$cmd 120 $skip udp from any to xx.168.240.2 53 out via $pif $ks
+$cmd 121 $skip udp from any to xx.168.240.5 53 out via $pif $ks
+$cmd 125 $skip tcp from any to any $good_tcpo out via $pif setup $ks
+$cmd 130 $skip icmp from any to any out via $pif $ks
+$cmd 135 $skip udp from any to any 123 out via $pif $ks
+
+# Запрещаем весь входящий трафик с немаршрутизируемых адресных пространств
+$cmd 300 deny all from 192.168.0.0/16 to any in via $pif #RFC 1918 для локальных IP
+$cmd 301 deny all from 172.16.0.0/12 to any in via $pif #RFC 1918 для локальных IP
+$cmd 302 deny all from 10.0.0.0/8 to any in via $pif #RFC 1918 для локальных IP
+$cmd 303 deny all from 127.0.0.0/8 to any in via $pif #loopback
+$cmd 304 deny all from 0.0.0.0/8 to any in via $pif #loopback
+$cmd 305 deny all from 169.254.0.0/16 to any in via $pif #DHCP авто-конфигурации
+$cmd 306 deny all from 192.0.2.0/24 to any in via $pif #Зарезервировано для документации
+$cmd 307 deny all from 204.152.64.0/23 to any in via $pif #Sun cluster
+$cmd 308 deny all from 224.0.0.0/3 to any in via $pif #Class D & E multicast
+
+# Разрешаем входящие пакеты
+$cmd 400 allow udp from xx.70.207.54 to any 68 in $ks
+$cmd 420 allow tcp from any to me 80 in via $pif setup limit src-addr 1
+
+$cmd 450 deny log ip from any to any
+
+# Раздел skipto для правил с сохранением состояния для исходящих пакетов
+$cmd 500 divert natd ip from any to any out via $pif
+$cmd 510 allow ip from any to any
+
+######################## Окончание файла правил ##################
+....
+
+Следующий пример во многом повторяет то, что приведено выше, но использует самодокументирующий стиль записи с исчерпывающими комментариями для того, чтобы помочь начинающему составителю правил IPFW лучше понимать, для чего предназначено то или иное правило.
+
+Пример файла правил #2:
+
+[.programlisting]
+....
+#!/bin/sh
+################ Начало файла правил IPFW ###############################
+# Сброс всех правил перед началом работы скрипта.
+ipfw -q -f flush
+
+# Задание стандартных переменных
+cmd="ipfw -q add"
+skip="skipto 800"
+pif="rl0" # название внешнего интерфейса,
+ # принадлежащего глобальной сети
+
+#################################################################
+# Нет ограничений на внутреннем интерфейсе локальной сети
+# Замените xl0 на название интерфейса вашей локальной сети
+#################################################################
+$cmd 005 allow all from any to any via xl0
+
+#################################################################
+# Нет ограничений на интерфейсе Loopback
+#################################################################
+$cmd 010 allow all from any to any via lo0
+
+#################################################################
+# Трансляция адреса, если пакет является входящим
+#################################################################
+$cmd 014 divert natd ip from any to any in via $pif
+
+#################################################################
+# Разрешить пакет, если он был ранее добавлен в динамическую
+# таблицу при помощи выражения allow keep-state
+#################################################################
+$cmd 015 check-state
+
+#################################################################
+# Раздел правил для исходящего трафика на внешнем интерфейсе
+# Анализ запросов начала сессии, идущих из-за межсетевого экрана
+# в локальную сеть или от этого шлюза в интернет.
+#################################################################
+
+# Разрешить исходящий трафик к DNS серверу провайдера
+# x.x.x.x должен быть IP адресом DNS сервера вашего провайдера
+# Продублируйте эти строки, если у вас больше одного DNS сервер
+# Эти IP адреса можно взять из файла /etc/resolv.conf
+$cmd 020 $skip tcp from any to x.x.x.x 53 out via $pif setup keep-state
+
+# Разрешить исходящий трафик к DHCP серверу провайдера для cable/DSL конфигураций.
+$cmd 030 $skip udp from any to x.x.x.x 67 out via $pif keep-state
+
+# Разрешить исходящий трафик для незащищенного www соединения
+$cmd 040 $skip tcp from any to any 80 out via $pif setup keep-state
+
+# Разрешить исходящий трафик для защищенного www соединения
+# https с поддержкой TLS и SSL
+$cmd 050 $skip tcp from any to any 443 out via $pif setup keep-state
+
+# Разрешить исходящий POP/SMTP
+$cmd 060 $skip tcp from any to any 25 out via $pif setup keep-state
+$cmd 061 $skip tcp from any to any 110 out via $pif setup keep-state
+
+# Разрешить исходящий трафик для FreeBSD (make install & CVSUP)
+# По сути назначаем пользователю root полные привилегии.
+$cmd 070 $skip tcp from me to any out via $pif setup keep-state uid root
+
+# Разрешаем исходящий icmp ping
+$cmd 080 $skip icmp from any to any out via $pif keep-state
+
+# Разрешаем исходящий трафик Time
+$cmd 090 $skip tcp from any to any 37 out via $pif setup keep-state
+
+# Разрешаем исходящий трафик nntp news (т.е. news groups)
+$cmd 100 $skip tcp from any to any 119 out via $pif setup keep-state
+
+# Разрешаем исходящий защищённый трафик FTP, Telnet и SCP
+# Эта функция использует SSH (secure shell)
+$cmd 110 $skip tcp from any to any 22 out via $pif setup keep-state
+
+# Разрешаем исходящий трафик whois
+$cmd 120 $skip tcp from any to any 43 out via $pif setup keep-state
+
+# Разрешаем исходящий трафик ntp
+$cmd 130 $skip udp from any to any 123 out via $pif keep-state
+
+#################################################################
+# Раздел правил для входящего трафика на внешнем интерфейсе
+# Анализ пакетов, приходящих из глобальной сети,
+# предназначенных для этого шлюза или локальной сети
+#################################################################
+
+# Запрещаем весь входящий трафик с немаршрутизируемых сетей
+$cmd 300 deny all from 192.168.0.0/16 to any in via $pif #RFC 1918 private IP
+$cmd 301 deny all from 172.16.0.0/12 to any in via $pif #RFC 1918 private IP
+$cmd 302 deny all from 10.0.0.0/8 to any in via $pif #RFC 1918 private IP
+$cmd 303 deny all from 127.0.0.0/8 to any in via $pif #loopback
+$cmd 304 deny all from 0.0.0.0/8 to any in via $pif #loopback
+$cmd 305 deny all from 169.254.0.0/16 to any in via $pif #DHCP auto-config
+$cmd 306 deny all from 192.0.2.0/24 to any in via $pif #reserved for docs
+$cmd 307 deny all from 204.152.64.0/23 to any in via $pif #Sun cluster
+$cmd 308 deny all from 224.0.0.0/3 to any in via $pif #Class D & E multicast
+
+# Запрещаем ident
+$cmd 315 deny tcp from any to any 113 in via $pif
+
+# Запрещаем все Netbios службы. 137=name, 138=datagram, 139=session
+# Netbios это MS/Windows сервис обмена.
+# Блокируем MS/Windows hosts2 запросы сервера имен на порту 81
+$cmd 320 deny tcp from any to any 137 in via $pif
+$cmd 321 deny tcp from any to any 138 in via $pif
+$cmd 322 deny tcp from any to any 139 in via $pif
+$cmd 323 deny tcp from any to any 81 in via $pif
+
+# Запрещаем любые опоздавшие пакеты
+$cmd 330 deny all from any to any frag in via $pif
+
+# Запрещаем ACK пакеты, которые не соответствуют динамической таблице правил.
+$cmd 332 deny tcp from any to any established in via $pif
+
+# Разрешаем входящий трафик с DHCP сервера провайдера. Это правило
+# должно содержать IP адрес DHCP сервера вашего провайдера, поскольку
+# только ему разрешено отправлять пакеты данного типа. Необходимо только
+# для проводных и DSL соединений. Для 'user ppp' соединений с глобальной
+# сетью использовать это правило нет необходимости. Это тот же IP адрес,
+# выбранный и используемый вами в разделе правил для исходящего трафика.
+$cmd 360 allow udp from x.x.x.x to any 68 in via $pif keep-state
+
+# Разрешить входящий трафик для www, т.к. я использую Apache сервер.
+$cmd 370 allow tcp from any to me 80 in via $pif setup limit src-addr 2
+
+# Разрешить входящий трафик безопасных FTP, Telnet и SCP из глобальной сети
+$cmd 380 allow tcp from any to me 22 in via $pif setup limit src-addr 2
+
+# Разрешить входящий нешифрованный трафик Telnet из глобальной сети
+# считается небезопасным, потому что ID и PW передаются через глобальную
+# сеть в открытом виде.
+# Удалите этот шаблон, если вы не используете telnet.
+$cmd 390 allow tcp from any to me 23 in via $pif setup limit src-addr 2
+
+# Отбрасываем и заносим в журнал все неразрешенные входящие соединения из глобальной сети
+$cmd 400 deny log all from any to any in via $pif
+
+# Отбрасываем и заносим в журнал все неразрешенные исходящие соединения в глобальную сеть
+$cmd 450 deny log all from any to any out via $pif
+
+# Место для skipto в правилах с сохранением состояния для исходящих соединений
+$cmd 800 divert natd ip from any to any out via $pif
+$cmd 801 allow ip from any to any
+
+# Всё остальное запрещено по умолчанию
+# Запрещаем и заносим в журнал все пакеты для дальнейшего анализа
+$cmd 999 deny log all from any to any
+################ Окончание файла правил IPFW ###############################
+....
diff --git a/documentation/content/ru/books/handbook/geom/_index.adoc b/documentation/content/ru/books/handbook/geom/_index.adoc
new file mode 100644
index 0000000000..625bc6490f
--- /dev/null
+++ b/documentation/content/ru/books/handbook/geom/_index.adoc
@@ -0,0 +1,564 @@
+---
+title: "Глава 18. GEOM: Модульная инфраструктура преобразования дисковых запросов"
+part: Часть III. Системное администрирование
+prev: books/handbook/disks
+next: books/handbook/filesystems
+---
+
+[[geom]]
+= GEOM: Модульная инфраструктура преобразования дисковых запросов
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 18
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../../images/books/handbook/geom/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/geom/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/geom/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[GEOM-synopsis]]
+== Краткий обзор
+
+Эта глава описывает использование дисков, управляемых инфраструктурой GEOM во FreeBSD. Среди прочего, здесь описывается большая часть утилит управления RAID, использующих GEOM для настройки. В этой главе мы не будем вдаваться в подробности взаимодействия GEOM с подсистемой ввода/вывода или с программным кодом, эту информацию вы можете получить на странице справочника man:geom[4]. Эта глава также не является подробным руководством по настройке RAID. Мы обсудим только типы RAID, поддерживаемые GEOM.
+
+После прочтения этой главы вы будете знать:
+
+* Какие типы RAID поддерживает GEOM.
+* Как использовать стандартные утилиты для настройки, обслуживания и управления различными уровнями RAID.
+* Как с помощью GEOM создавать зеркальные, последовательные и шифрованные дисковые последовательности, а так же последовательности из дисков, присоединённых удалённо.
+* Как решать проблемы с дисками, присоединёнными к инфраструктуре GEOM.
+
+Перед чтением этой главы вы должны:
+
+* Понимать, как FreeBSD работает с дисками (crossref:disks[disks, Устройства хранения]).
+* Уметь сконфигурировать и установить новое ядро FreeBSD (crossref:kernelconfig[kernelconfig, Настройка ядра FreeBSD]).
+
+[[GEOM-intro]]
+== Введение в GEOM
+
+GEOM позволяет классам - MBR, BSD labels, и так далее - получить доступ к устройству и управлять им, используя поставщиков GEOM (providers) или специальные файлы устройств, расположенные в каталоге [.filename]#/dev#. GEOM поддерживает различные программные конфигурации RAID, и прозрачно предоставляет доступ к дискам системе и системным приложениям.
+
+[[GEOM-striping]]
+== RAID0 - Создание дисковой последовательности (Striping)
+
+Создание дисковой последовательности (Striping) - метод, применяемый, чтобы скомбинировать несколько физических дисков в один логический. Во многих случаях это делается с использованием аппаратных контроллеров. Дисковая подсистема GEOM предоставляет программную поддержку RAID0, иногда называемую дисковой последовательностью (Stripe).
+
+В RAID уровня 0 данные разбиваются на блоки, которые параллельно записываются на все диски массива. Вместо того, чтобы ждать записи 256k на один диск, RAID0 может параллельно записывать по 64k на каждый из четырёх дисков, обеспечивая более высокую производительность ввода/вывода. Производительность также может быть увеличена за счет использования большего числа дисков.
+
+Все диски последовательности RAID0 должны быть одного размера, так как запись и считывание с дисков происходят параллельно.
+
+image::striping.png[Иллюстрация дисковой последовательности]
+
+[.procedure]
+====
+*Procedure: Создание дисковой последовательности из неформатированных ATA дисков*
+
+. Загрузите модуль [.filename]#geom_stripe.ko#:
++
+[source,bash]
+....
+# kldload geom_stripe
+....
++
+. Убедитесь, что существует подходящая точка монтирования. Если вы планируете сделать логический диск корневым разделом, используйте временную точку монтирования, например [.filename]#/mnt#:
++
+[source,bash]
+....
+# mkdir /mnt
+....
++
+. Определите имена устройств, которые будут объединены в последовательность, и создайте новое устройство для последовательности. Например, чтобы создать дисковую последовательность из двух неиспользуемых и неразмеченных ATA дисков, например [.filename]#/dev/ad2# и [.filename]#/dev/ad3#:
++
+[source,bash]
+....
+# gstripe label -v st0 /dev/ad2 /dev/ad3
+Metadata value stored on /dev/ad2.
+Metadata value stored on /dev/ad3.
+Done.
+....
++
+. Запишите стандартную метку, также известную как таблица разделов, в новый том, и установите стандартный загрузчик:
++
+[source,bash]
+....
+# bsdlabel -wB /dev/stripe/st0
+....
++
+. Теперь в [.filename]#/dev/stripe# кроме [.filename]#st0# появились ещё два устройства - [.filename]#st0a# и [.filename]#st0c#. Теперь создайте файловую систему на устройстве [.filename]#st0a#, используя утилиту `newfs`:
++
+[source,bash]
+....
+# newfs -U /dev/stripe/st0a
+....
++
+На экране промелькнет множество цифр, и через несколько секунд процесс будет завершен. Логический диск создан и готов к монтированию.
+====
+
+Смонтируйте его вручную:
+
+[source,bash]
+....
+# mount /dev/stripe/st0a /mnt
+....
+
+Чтобы монтировать созданную дисковую последовательность автоматически во время загрузки, добавьте информацию о ней в файл [.filename]#/etc/fstab#. Создайте постоянную точку монтирования и назовите её, к примеру, [.filename]#stripe#:
+
+[source,bash]
+....
+# mkdir /stripe
+# echo "/dev/stripe/st0a /stripe ufs rw 2 2" \
+ >> /etc/fstab
+....
+
+Чтобы модуль [.filename]#geom_stripe.ko# автоматически загружался во время инициализации системы, добавьте строку в [.filename]#/boot/loader.conf#:
+
+[source,bash]
+....
+# echo 'geom_stripe_load="YES"' >> /boot/loader.conf
+....
+
+[[GEOM-mirror]]
+== RAID1 - Зеркалирование (Mirroring)
+
+Зеркалирование (Mirroring) - технология, применяемая как в корпоративной среде, так и на домашних компьютерах. Она позволяет создавать резервные копии "на лету". Зеркалирование, по сути, означает, что диск A является копией диска B. Или, возможно, диск C+D является копией диска A+B. Вне зависимости от конфигурации, основной аспект - дублирование информации. Позже, эта информация может быть с легкостью восстановлена или сохранена как резервная копия без остановки системы, или даже физически помещена в хранилище данных.
+
+Перед началом, убедитесь, что у вас есть два физических диска равной емкости. Далее в этом примере подразумевается, что это диски прямого доступа (direct access, man:da[4]) с интерфейсом SCSI.
+
+=== Зеркалирование первичных дисков
+
+В статье предполагается, что FreeBSD установлена на первый жесткий диск, определяемый системой как [.filename]#da0#. Это устройство будет целевым для утилиты man:gmirror[8].
+
+Перед построением зеркала включите дополнительную отладочную информацию и откройте доступ к устройству. Это достигается установкой следующего значения переменной man:sysctl[8] `kern.geom.debugflags`:
+
+[source,bash]
+....
+# sysctl kern.geom.debugflags=17
+....
+
+Теперь создайте зеркало. Начните процесс с сохранения метаданных на первом диске. В результате выполнения следующей команды будет создано устройство вида [.filename]#/dev/mirror/gm#:
+
+[WARNING]
+====
+
+Создание зеркала на диске, с которого произведена загрузка, может повлечь за собой потерю данных в том случае, если данными занят последний сектор диска. Риск повреждения данных меньше, если создание зеркала немедленно следует за свежей установкой FreeBSD.
+====
+
+[source,bash]
+....
+# gmirror label -vb round-robin gm0 /dev/da0
+....
+
+Система должна выдать следующее сообщение:
+
+[source,bash]
+....
+Metadata value stored on /dev/da0.
+Done.
+....
+
+Инициализируйте GEOM, это повлечет за собой загрузку модуля ядра [.filename]#/boot/kernel/geom_mirror.ko#:
+
+[source,bash]
+....
+# gmirror load
+....
+
+[NOTE]
+====
+После успешного завершения команды будет создано устройство [.filename]#gm0# в каталоге [.filename]#/dev/mirror#.
+====
+
+Включите автоматическую загрузку модуля [.filename]#geom_mirror.ko# во время старта операционной системы:
+
+[source,bash]
+....
+# echo 'geom_mirror_load="YES"' >> /boot/loader.conf
+....
+
+Отредактируйте файл [.filename]#/etc/fstab#, заменив в нём упоминания старого имени устройства [.filename]#da0# новым именем устройства зеркала [.filename]#gm0#.
+
+[NOTE]
+====
+Если man:vi[1] - ваш любимый текстовый редактор, то эта задача решается просто:
+
+[source,bash]
+....
+# vi /etc/fstab
+....
+
+Сделайте резервную копию файла [.filename]#fstab#, набрав в man:vi[1] `:w /etc/fstab.bak`. Затем замените все части строк, содержащие имя устройства [.filename]#da0#, на имя [.filename]#gm0#, набрав `:%s/da/mirror\/gm/g`.
+====
+
+Независимо от аппаратного интерфейса дисков (SCSI или ATA), устройство RAID будет именоваться всегда одинаково - [.filename]#gm#. Содержимое файла [.filename]#fstab# должно выглядеть подобно следующему:
+
+[.programlisting]
+....
+# Device Mountpoint FStype Options Dump Pass#
+/dev/mirror/gm0s1b none swap sw 0 0
+/dev/mirror/gm0s1a / ufs rw 1 1
+/dev/mirror/gm0s1d /usr ufs rw 0 0
+/dev/mirror/gm0s1f /home ufs rw 2 2
+#/dev/mirror/gm0s2d /store ufs rw 2 2
+/dev/mirror/gm0s1e /var ufs rw 2 2
+/dev/acd0 /cdrom cd9660 ro,noauto 0 0
+....
+
+Перезагрузите систему:
+
+[source,bash]
+....
+# shutdown -r now
+....
+
+С этого момента во время каждой загрузки система должна использовать устройство [.filename]#gm0# вместо устройства [.filename]#da0#. Удостовериться в этом можно так: дождитесь загрузки системы, наберите команду `mount` и просмотрите её вывод:
+
+[source,bash]
+....
+# mount
+Filesystem 1K-blocks Used Avail Capacity Mounted on
+/dev/mirror/gm0s1a 1012974 224604 707334 24% /
+devfs 1 1 0 100% /dev
+/dev/mirror/gm0s1f 45970182 28596 42263972 0% /home
+/dev/mirror/gm0s1d 6090094 1348356 4254532 24% /usr
+/dev/mirror/gm0s1e 3045006 2241420 559986 80% /var
+devfs 1 1 0 100% /var/named/dev
+....
+
+Как и ожидалось, вывод выглядит корректно. И в заключение, чтобы начать синхронизацию данных, включите в зеркало диск [.filename]#da1# при помощи следующей команды:
+
+[source,bash]
+....
+# gmirror insert gm0 /dev/da1
+....
+
+Во время построения зеркала статус процесса построения может быть проверен следующей командой:
+
+[source,bash]
+....
+# gmirror status
+....
+
+Вывод вышеприведённой команды для построенного и синхронизированного зеркала выглядит подобно следующему:
+
+[source,bash]
+....
+ Name Status Components
+mirror/gm0 COMPLETE da0
+ da1
+....
+
+Если есть какие-либо неполадки или зеркало находится в процессе построения, в выводе команды будет обозначен статус `DEGRADED` вместо статуса `COMPLETE`.
+
+=== Решение проблем
+
+==== Система не загружается
+
+Если система прекращает загрузку и выдает строку:
+
+[.programlisting]
+....
+ffs_mountroot: can't find rootvp
+Root mount failed: 6
+mountroot>
+....
+
+Перезагрузите компьютер кнопкой питания или кнопкой "Reset". В загрузочном меню выберите опцию (6). Это приведет к тому, что система выдаст приглашение man:loader[8]. Загрузите модуль ядра вручную:
+
+[source,bash]
+....
+OK? load geom_mirror
+OK? boot
+....
+
+Если это сработало, модуль ядра по какой-либо причине не загрузился правильно. Проверьте корректность соответствующей записи в [.filename]#/boot/loader.conf#. Если проблема осталась, добавьте строку:
+
+[.programlisting]
+....
+options GEOM_MIRROR
+....
+
+в файл конфигурации ядра, пересоберите и переустановите ядро. Это должно устранить проблему.
+
+=== Восстановление после дисковых сбоев
+
+Примечательной особенностью зеркалирования является то, что если диск вышел из строя, то он, пожалуй, может быть заменён вообще без ущерба для данных.
+
+Принимая во внимание предыдущую конфигурацию RAID1, предположим, что устройство [.filename]#da1# вышло из строя, и ему требуется замена. Перед заменой определите, какой именно диск вышел из строя, а потом выключите систему. Теперь дефектный диск может быть заменён новым, после чего необходимо снова загрузить систему. После загрузки системы для замещения диска в зеркале могут быть использованы следующие команды:
+
+[source,bash]
+....
+# gmirror forget gm0
+....
+
+[source,bash]
+....
+# gmirror insert gm0 /dev/da1
+....
+
+Для наблюдения за статусом построения используйте команду `gmirror status`. Вывод этой команды достаточно прост и понятен.
+
+[[geom-ggate]]
+== Сетевые устройства GEOM Gate
+
+GEOM включает в себя поддержку работы с удаленными устройствами по сети, например с дисками, CD-ROM и т.д. путем использования gate утилит. Это подобно работе с NFS.
+
+Для начала необходимо создать файл экспорта. В этом файле указывается, кому разрешен доступ к экспортируемым ресурсам и какой уровень доступа предоставляется. Например для того, чтобы экспортировать четвертый слайс первого SCSI диска, достаточно следующей записи в файле [.filename]#/etc/gg.exports#:
+
+[.programlisting]
+....
+192.168.1.0/24 RW /dev/da0s4d
+....
+
+Это позволит всем компьютерам внутри частной сети получить доступ к разделу [.filename]#da0s4d#.
+
+Чтобы экспортировать устройство, убедитесь, что оно не смонтировано, и запустите сервер man:ggated[8]:
+
+[source,bash]
+....
+# ggated
+....
+
+Теперь, чтобы смонтировать устройство на клиентском компьютере выполните следующие команды:
+
+[source,bash]
+....
+# ggatec create -o rw 192.168.1.1 /dev/da0s4d
+ggate0
+# mount /dev/ggate0 /mnt
+....
+
+С этого момента устройство доступно в точке монтирования [.filename]#/mnt#.
+
+[NOTE]
+====
+Необходимо заметить, что попытка смонтировать устройство, уже смонтированное как сетевой или локальный диск, закончится неудачей.
+====
+
+Когда устройство больше не нужно, оно может быть размонтировано командой man:umount[8], как любое другое дисковое устройство.
+
+[[geom-glabel]]
+== Метки дисковых устройств
+
+Во время загрузки системы, ядро FreeBSD создает файлы для обнаруженных устройств. Этот метод обнаружения устройств создает некоторые проблемы, например если новое дисковое устройство подключается через USB. Может получиться так, что этому диску будет присвоено имя устройства [.filename]#da0#, а устройство с прежним именем [.filename]#da0# получит следующее имя, [.filename]#da1#. Это приведет к проблемам монтирования файловых систем, записанных в [.filename]#/etc/fstab#. На самом деле, это может даже помешать загрузке системы.
+
+Одно из решений состоит в расположении SCSI устройств в таком порядке, чтобы новые устройства, добавляемые к SCSI контроллеру, занимали свободные номера устройств. Но что делать с USB устройствами, которые могут занять место основного SCSI диска? Это случается потому, что USB устройства обычно тестируются до SCSI контроллера. Решение может состоять в подключении этих устройств после загрузки системы. Другое решение - использование ATA диска и исключение SCSI устройств из [.filename]#/etc/fstab#.
+
+Есть и лучшее решение. С помощью утилиты `glabel`, администратор или пользователь могут пометить дисковые устройства и использовать эти метки в [.filename]#/etc/fstab#. Поскольку `glabel` сохраняет метки в последнем секторе заданного устройства, они сохраняются и после перезагрузки. Используя эти метки вместо имени устройств, можно всегда смонтировать файловую систему независимо от назначенного имени устройства.
+
+[NOTE]
+====
+Очевидно, что метки должны быть постоянными. Утилита `glabel` может использоваться для создания как временных, так и постоянных меток. Только постоянные метки сохраняются после перезагрузок. Прочтите man:glabel[8] для получения более подробной информации о различии между метками.
+====
+
+=== Типы меток и примеры
+
+Существует два типа меток, основной (generic) тип и метки файловой системы. Метки могут быть постоянными или временными. Постоянные метки создаются командой man:tunefs[8] или man:newfs[8]. В дальнейшем они будут автоматически создаваться в подкаталоге каталога [.filename]#/dev#, имя которого определяется в соответствии с типом файловой системы. Например, метки файловых систем UFS2 будут расположены в каталоге [.filename]#/dev/ufs#. Постоянные метки также можно создать при помощи команды `glabel label`. Эти метки не зависят от типа файловой системы, поэтому они будут перечисляться в каталоге [.filename]#/dev/label#.
+
+Временные метки не сохраняются после перезагрузки. Эти метки создаются в каталоге [.filename]#/dev/label#, они хорошо подходят для экспериментов. Временную метку можно создать командой `glabel create`. За более детальной информацией обратитесь к странице справочника man:glabel[8].
+
+Чтобы создать постоянную метку для файловой системы UFS2 не нарушая самих данных, выполните следующую команду:
+
+[source,bash]
+....
+# tunefs -L home /dev/da3
+....
+
+[WARNING]
+====
+
+Если файловая система заполнена, это может привести к повреждению данных; в случае заполненной файловой системы надо или удалить ненужные файлы, или не добавлять метки.
+====
+
+Метка должна появиться в [.filename]#/dev/ufs# и может быть добавлена в [.filename]#/etc/fstab#:
+
+[.programlisting]
+....
+/dev/ufs/home /home ufs rw 2 2
+....
+
+[NOTE]
+====
+Во время запуска `tunefs` файловая система не должна быть смонтирована.
+====
+
+Теперь файловую систему можно смонтировать как обычно:
+
+[source,bash]
+....
+# mount /home
+....
+
+Если модуль ядра [.filename]#geom_label.ko# указан в [.filename]#/boot/loader.conf# и загружается вместе с системой, или в ядре указана опция `GEOM_LABEL`, метку устройства можно изменять без какого-либо негативного для системы эффекта.
+
+Файловая система может быть создана с меткой по умолчанию путем использования флага `-L` команды `newfs`. Обратитесь к странице справочника man:newfs[8] за более подробной информацией.
+
+Для удаления метки можно использовать следующую команду:
+
+[source,bash]
+....
+# glabel destroy home
+....
+
+В следующем примере показано, как устанавливаются метки на разделы загрузочного диска.
+
+.Установка меток на разделы загрузочного диска
+[example]
+====
+Установка и задействование постоянных меток на разделах загрузочного диска предоставит возможность операционной системе загружаться нормально в том случае, если диск был переключен на другой контроллер, или даже переставлен на другую машину. В этом примере был задействован один диск ATA, определяемый системой как [.filename]#ad0#. Также в примере подразумевается, что система использует типичную для FreeBSD схему разделения дискового пространства на слайсы и размещения на них файловых систем [.filename]#/#, [.filename]#/var#, [.filename]#/usr#, [.filename]#/tmp# и раздела подкачки.
+
+Перезагрузите систему, дождитесь меню загрузчика. Нажатием клавиши kbd:[4] выберите однопользовательский режим. Далее, введите следующие команды:
+
+[source,bash]
+....
+# glabel label rootfs /dev/ad0s1a
+GEOM_LABEL: Label for provider /dev/ad0s1a is label/rootfs
+# glabel label var /dev/ad0s1d
+GEOM_LABEL: Label for provider /dev/ad0s1d is label/var
+# glabel label usr /dev/ad0s1f
+GEOM_LABEL: Label for provider /dev/ad0s1f is label/usr
+# glabel label tmp /dev/ad0s1e
+GEOM_LABEL: Label for provider /dev/ad0s1e is label/tmp
+# glabel label swap /dev/ad0s1b
+GEOM_LABEL: Label for provider /dev/ad0s1b is label/swap
+# exit
+....
+
+Система продолжит загрузку в многопользовательский режим. По завершении загрузки откройте файл [.filename]#/etc/fstab# и замените в нём традиционные имена файлов устройств на соответствующие устройствам метки. Результат будет выглядеть подобно следующему:
+
+[.programlisting]
+....
+# Device Mountpoint FStype Options Dump Pass#
+/dev/label/swap none swap sw 0 0
+/dev/label/rootfs / ufs rw 1 1
+/dev/label/tmp /tmp ufs rw 2 2
+/dev/label/usr /usr ufs rw 2 2
+/dev/label/var /var ufs rw 2 2
+....
+
+Перезагрузите еще раз систему. Если всё прошло успешно, система загрузится как обычно, а вывод команды `mount` отобразит следующее:
+
+[source,bash]
+....
+# mount
+/dev/label/rootfs on / (ufs, local)
+devfs on /dev (devfs, local)
+/dev/label/tmp on /tmp (ufs, local, soft-updates)
+/dev/label/usr on /usr (ufs, local, soft-updates)
+/dev/label/var on /var (ufs, local, soft-updates)
+....
+
+====
+
+Начиная с FreeBSD 7.2, GEOM класс man:glabel[8] поддерживает новый тип меток для файловых систем UFS. Новый тип меток базируется на уникальных идентификаторах файловых систем, называемых `ufsid`. Во время загрузки системы они автоматически создаются и помещаются в каталог [.filename]#/dev/ufsid#. Перечисление меток должным образом в файле [.filename]#/etc/fstab# делает возможным монтирование разделов по значениям `ufsid`. Чтобы получить перечень файловых систем и соответствующих им меток `ufsid`, выполните команду `glabel status`:
+
+[source,bash]
+....
+% glabel status
+ Name Status Components
+ufsid/486b6fc38d330916 N/A ad4s1d
+ufsid/486b6fc16926168e N/A ad4s1f
+....
+
+В данном примере [.filename]#ad4s1d# содержит файловую систему [.filename]#/var#, а [.filename]#ad4s1f# соответствует файловой системе [.filename]#/usr#. Эти файловые системы можно также монтировать, указав значения их `ufsid` в файле [.filename]#/etc/fstab#:
+
+[.programlisting]
+....
+/dev/ufsid/486b6fc38d330916 /var ufs rw 2 2
+/dev/ufsid/486b6fc16926168e /usr ufs rw 2 2
+....
+
+Таким способом могут быть смонтированы любые разделы с метками `ufsid`, что исключает необходимость создания постоянных меток вручную и в то же время позволяет воспользоваться преимуществами монтирования по меткам.
+
+[[geom-gjournal]]
+== Журналирование UFS средствами GEOM
+
+С выходом FreeBSD 7.0 был реализован долгожданный механизм ведения журналов для файловых систем. Сама реализация этого механизма осуществляется средствами системы GEOM, а конфигурирование выполняется утилитой man:gjournal[8].
+
+Что такое журналирование? Журналирование сохраняет протокол транзакций файловой системы, то есть: изменения, составляющие логически завершенную операцию записи, сперва вносятся в журнал, а модификация метаданных и данных самого файла выполняется позже. В дальнейшем журнал может быть задействован для повторного выполнения транзакций на файловой системе с целью предотвращения нарушения целостности файловой системы.
+
+Журналирование - это еще одним механизм предотвращения утери данных и нарушения целостности файловой системы. В отличие от механизма Soft Updates, который отслеживает и периодически сохраняет обновления метаданных, и механизма снэпшотов, который создает образ файловой системы, сам журнал хранится в специально отведенном для этой задачи пространстве диска, и, в некоторых случаях, может содержаться целиком на отдельном диске.
+
+В отличие от других реализаций журналирования файловых систем, метод `gjournal` работает на блочном уровне, он не встроен в файловую систему; это лишь надстройка над системой GEOM.
+
+Чтобы включить поддержку `gjournal`, в файле конфигурации ядра FreeBSD должна присутствовать следующая опция (включено по умолчанию для FreeBSD 7.0 и более поздних версий систем):
+
+[.programlisting]
+....
+options UFS_GJOURNAL
+....
+
+Журналируемым устройствам, монтируемым во время загрузки системы, также потребуется модуль ядра [.filename]#geom_journal.ko#. Внесите следующую запись в файл [.filename]#/boot/loader.conf#:
+
+[.programlisting]
+....
+geom_journal_load="YES"
+....
+
+В качестве альтернативы, функции вышеупомянутого модуля можно встроить в специализированное ядро. Для этого добавьте следующую опцию в файл конфигурации ядра:
+
+[.programlisting]
+....
+options GEOM_JOURNAL
+....
+
+Для создания журнала на новой файловой системе выполните следующие шаги (здесь и далее подразумевается, что [.filename]#da4# есть новый SCSI диск):
+
+[source,bash]
+....
+# gjournal load
+# gjournal label /dev/da4
+....
+
+На этом этапе в каталоге [.filename]#/dev# должны присутствовать файлы устройств [.filename]#/dev/da4# и [.filename]#/dev/da4.journal#. Теперь необходимо создать файловую систему:
+
+[source,bash]
+....
+# newfs -O 2 -J /dev/da4.journal
+....
+
+Предыдущая команда создаст файловую систему UFS2 на журналируемом устройстве.
+
+Смонтируйте устройство в требуемый каталог файловой системы:
+
+[source,bash]
+....
+# mount /dev/da4.journal /mnt
+....
+
+[NOTE]
+====
+В случае наличия нескольких слайсов, журнал создается для каждого из них. Например, если есть два слайса, и они называются [.filename]#ad4s1# и [.filename]#ad4s2#, то утилитой `gjournal` создаются файлы устройств [.filename]#ad4s1.journal# и [.filename]#ad4s2.journal#.
+====
+
+Для увеличения производительности может потребоваться хранение журнала на отдельном диске. В таких случаях необходимо указать имя поставщика журнала или устройства хранения после имени устройства, на котором планируется включение журналирования. Журналирование также может быть активировано утилитой `tunefs` на действующих файловых системах; однако, всегда создавайте резервную копию перед попытками изменить настройки файловой системы. В большинстве случаев, выполнение команды `gjournal` завершится ошибкой, если создание журнала невозможно, в то время как некорректное использование команды `tunefs` не защитит против потери данных.
+
+Также возможно журналирование загрузочного диска системы FreeBSD. За детальными инструкциями по этой возможности обратитесь к статье link:{gjournal-desktop}[Настройка журналирования UFS для настольного компьютера].
diff --git a/documentation/content/ru/books/handbook/install/_index.adoc b/documentation/content/ru/books/handbook/install/_index.adoc
new file mode 100644
index 0000000000..867ef59a35
--- /dev/null
+++ b/documentation/content/ru/books/handbook/install/_index.adoc
@@ -0,0 +1,2455 @@
+---
+title: Глава 2. Установка FreeBSD версий 8.X и более ранних
+part: Часть I. В начале
+prev: books/handbook/introduction
+next: books/handbook/bsdinstall
+---
+
+[[install]]
+= Установка FreeBSD версий 8.X и более ранних
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 2
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../../images/books/handbook/install/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/install/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/install/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[install-synopsis]]
+== Краткий обзор
+
+FreeBSD поставляется простой в использовании текстовой программой установки. FreeBSD 9.0-RELEASE и более поздние укомплектованы установщиком, называемым bsdinstall, в то время как в релизах, предшествующих 9.0-RELEASE, для установки применяется sysinstall. В этой главе описывается использование sysinstall для установки FreeBSD. Работа с установщиком bsdinstall описана в crossref:bsdinstall[bsdinstall,Установка FreeBSD версий 9.X и более поздних].
+
+Прочтя эту главу, вы узнаете:
+
+* Как создать дискеты для установки FreeBSD.
+* Как FreeBSD видит и делит на разделы жесткие диски.
+* Как запустить sysinstall.
+* Вопросы, которые sysinstall задаст вам, что имеется ввиду, и как ответить на эти вопросы.
+
+Перед прочтением этой главы вам потребуется:
+
+* Прочитать информацию о поддерживаемом оборудовании, поставляемую с устанавливаемой версией FreeBSD, и убедиться, что ваше оборудование поддерживается.
+
+[NOTE]
+====
+Как правило, эти инструкции по установке написаны для i386(TM) ("PC совместимых") компьютеров. Когда это возможно, приводятся инструкции, специфичные для других платформ. Хотя это руководство поддерживается в актуальном состоянии настолько, насколько это возможно, вы можете обнаружить небольшие различия между программой установки и тем, что показано здесь. Предполагается, что вы будете использовать эту главу в качестве общего руководства, а не как пошаговую инструкцию по установке.
+====
+
+[[install-hardware]]
+== Аппаратные требования
+
+[[install-hardware-minimal]]
+=== Минимальная конфигурация
+
+Минимальная конфигурация для установки FreeBSD зависит от версии FreeBSD и аппаратной архитектуры.
+
+Краткое изложение этой информации дается в последующих разделах. В зависимости от метода, выбранного для установки FreeBSD, вам может потребоваться поддерживаемый дисковод или привод CDROM, а в некоторых случаях и сетевой адаптер. Эта ситуация будет описана в <<install-boot-media>>.
+
+==== Архитектуры FreeBSD/i386 и FreeBSD/pc98
+
+Для версий FreeBSD/i386 и FreeBSD/pc98 требуется 486 процессор или выше, а также как минимум 24 MB памяти. Вам потребуется как минимум 150 MB свободного места на диске для самой минимальной установки.
+
+[NOTE]
+====
+Для старых конфигураций, как правило, больший объем памяти и больший объем диска более важен, чем более быстрый процессор.
+====
+
+==== FreeBSD/amd64
+
+Существует два класса процессоров, на которых может работать FreeBSD/amd64. К первому принадлежат процессоры AMD64, включая AMD Athlon(TM)64, AMD Athlon(TM)64-FX, AMD Opteron(TM) и более новые.
+
+Ко второму классу принадлежат процессоры архитектуры Intel(R) EM64T. Среди них можно назвать семейства Intel(R) Core(TM) 2 Duo, Quad, Extreme, а также Intel(R) Xeon(TM) 3000, 5000 и 7000 серии.
+
+Если ваша система основана на nVidia nForce3 Pro-150, _необходимо_ отключить IO APIC в BIOS. Если для этого нет необходимой опции, отключите ACPI в операционной системе. В чипсете Pro-150 содержатся ошибки, для которых пока не существует исправлений.
+
+==== FreeBSD/sparc64
+
+Для установки FreeBSD/sparc64, вам потребуется поддерживаемая платформа (обратитесь к <<install-hardware-supported>>).
+
+Для FreeBSD/sparc64 потребуется отдельный диск. В настоящее время диск невозможно совместно использовать с другой операционной системой.
+
+[[install-hardware-supported]]
+=== Поддерживаемое оборудование
+
+Список поддерживаемого оборудования поставляется с каждым релизом в FreeBSD в информации о релизе. Этот документ обычно находится в файле [.filename]#HARDWARE.TXT#, в корневом каталоге CDROM или FTP дистрибутива, или меню документации sysinstall. Для данной архитектуры в нем перечислены аппаратные устройства, поддерживаемые данным релизом FreeBSD. Копии списков поддерживаемого оборудования для различных релизов и архитектур также можно просмотреть на странице http://www.FreeBSD.org/ru/releases/[Информации о релизе] веб сайта FreeBSD.
+
+[[install-pre]]
+== Перед установкой
+
+[[install-inventory]]
+=== Соберите информацию о компьютере
+
+Перед установкой FreeBSD попытайтесь собрать информацию об устройствах компьютера. Во время установки FreeBSD покажет информацию об устройствах (жестких дисках, сетевых картах, CDROM и т.д.) с номером модели и производителем. FreeBSD также попытается определить правильную конфигурацию для этих устройств, включая информацию об IRQ и портах ввода-вывода. Из-за возможных проблем с оборудованием этот процесс не всегда завершается успешно, и возможно вам придется исправлять определенную FreeBSD конфигурацию.
+
+Если у вас уже есть установленная операционная система, например Windows(R) или Linux, неплохо будет использовать ее возможности для просмотра настроек оборудования. Если вы не уверены, какие настройки карты расширения использовать, можете найти их на самой карте. Часто используемые номера прерываний 3, 5 и 7, порты ввода- вывода обычно пишутся в шестнадцатеричном виде, например 0x330.
+
+Мы рекомендуем распечатать эту информацию перед установкой FreeBSD. Вам может помочь использование таблицы вроде этой:
+
+.Пример сведений об оборудовании
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Название устройства
+| IRQ
+| Порт ввода-вывода
+| Примечания
+
+|Первый жесткий диск
+|нет
+|нет
+|40 GB, Seagate, первый IDE master
+
+|CDROM
+|нет
+|нет
+|Первый IDE slave
+
+|Второй жесткий диск
+|нет
+|нет
+|20 GB, IBM, второй IDE master
+
+|Первый IDE контроллер
+|14
+|0x1f0
+|
+
+|Сетевая карта
+|нет
+|нет
+|Intel(R) 10/100
+
+|Модем
+|нет
+|нет
+|3Com(R) 56K факс-модем, COM1
+
+|...
+|===
+
+После сбора информации о компонентах компьютера, вы можете проверить их соответствие аппаратным требованиям устанавливаемого релиза FreeBSD.
+
+=== Сделайте резервное копирование данных
+
+Если компьютер, на который вы устанавливаете FreeBSD, содержит важные данные, убедитесь в наличии резервных копий и проверьте их сохранность перед установкой операционной системы. Во время установки FreeBSD запросит подтверждение перед тем, как записать данные на диск, но, если процесс запущен, изменения нельзя отменить.
+
+[[install-where]]
+=== Решите куда установить FreeBSD
+
+Если вы хотите, чтобы FreeBSD использовала весь жесткий диск, не о чем беспокоиться - можете пропустить этот раздел.
+
+Однако, если нужно совмещать FreeBSD с другими операционными системами, необходимо иметь представление как данные размещаются на диске и как это касается вас.
+
+[[install-where-i386]]
+==== Разделы диска для FreeBSD/i386
+
+Диск ПК может быть поделен на отдельные части. Эти части называют _разделами_. Поскольку в FreeBSD также есть разделы, терминология становится запутанной, и поэтому эти части дисков называются дисковыми слайсами, или просто слайсами в FreeBSD. Например, утилита FreeBSD `fdisk`, имеющая дело с дисковыми разделами PC, обращается со слайсами а не с разделами. Первоначально PC поддерживал только четыре раздела на диск. Эти разделы называются _главными разделами_. Чтобы обойти это ограничение и дать возможность создавать более чем четыре раздела, был создан новый тип раздела, _расширенный раздел_. Диск может содержать только один расширенный раздел. Специальные разделы, называемые _логическими разделами_, могут быть созданы внутри расширенного раздела.
+
+Каждый раздел имеет _ID раздела_ - номер, который используется для определения типа данных на разделе. FreeBSD использует ID раздела `165`.
+
+Как правило, каждая операционная система, которую вы используете, определяет разделы своим способом. Например, MS-DOS(R) и ее потомки, такие как Windows(R), присваивают каждому главному и логическому разделу _букву диска_, начиная с [.filename]#C:#.
+
+FreeBSD нужно устанавливать в главный раздел. FreeBSD может хранить все свои данные, включая создаваемые вами файлы, на этом одном разделе. Тем не менее, если дисков много, вы можете создать разделы FreeBSD на всех дисках или на некоторых из них. При установке FreeBSD должен быть доступен по крайней мере один раздел. Это может быть чистый, подготовленный для установки раздел, или раздел с данными, которые больше не нужны.
+
+Если все разделы на диске уже используются, вы должны освободить один из них для FreeBSD, используя программы, поставляемые с имеющейся операционной системой (например, `fdisk` для MS-DOS(R) или Windows(R)).
+
+Если есть резервный раздел, используйте его. Однако, возможно сначала придется ужать один или несколько существующих разделов.
+
+FreeBSD для установки нужен диск не менее 100 MB. Однако, это _очень_минимальная установка, при которой не останется места для ваших личных файлов. Более реальный объем - 250 MB без графической оболочки, и более 350 MB с графической оболочкой. Если вы собираетесь устанавливать большое количество дополнительного ПО, понадобится еще больше дискового пространства.
+
+Для изменения размера разделов и освобождения места под FreeBSD вы можете использовать программу GParted. GParted способна работать с разделами NTFS. Утилита GParted доступна на некоторых Live CD дистрибутивах Linux, например: http://www.sysresccd.org/[SystemRescueCD].
+
+Пользователи неоднократно сталкивались с проблемами при изменении размеров разделов, содержащих Microsoft(R) Vista. Поэтому рекомендуется держать под рукой инсталляционный диск с Microsoft(R) Vista во время выполнения подобных операций. Как и при любых других задачах обслуживания жестких дисков, настоятельно рекомендуется заранее сделать резервные копии данных.
+
+[WARNING]
+====
+
+Неправильное использование этих утилит может привести к уничтожению данных на диске. Удостоверьтесь в наличии свежих и исправных резервных копий данных перед их использованием.
+====
+
+.Использование существующего раздела без изменения
+[example]
+====
+Представьте что в компьютере один 4 GB диск, на котором уже установлена Windows(R), и диск разбит на два логических диска [.filename]#C:# и [.filename]#D:#, каждый по 2 GB. 1 GB данных на [.filename]#C:#, и 0.5 GB данных на [.filename]#D:#.
+
+Это означает, что диск состоит из двух разделов, по одному на каждую букву. Вы можете скопировать все данные с [.filename]#D:# на [.filename]#C:#, это освободит второй раздел для FreeBSD.
+====
+
+.Сжатие существующих разделов
+[example]
+====
+Представьте, что в компьютере один 4 GB диск, на котором уже установлена Windows(R). При установке Windows(R) вы создали один большой раздел, получив при этом диск [.filename]#C:# размером 4 GB. Вы используете 1.5 GB, и хотите выделить 2 GB для FreeBSD.
+
+Для установки FreeBSD нужно выбрать:
+
+. Сделать резервную копию Windows(R), затем переустановить Windows(R), выделив 2 GB под ее раздел.
+. Использовать для сжатия раздела Windows(R) одну из вышеописанных утилит.
+
+====
+
+=== Соберите информацию о конфигурации сети
+
+Если вы хотите подключиться к сети в процессе установки FreeBSD (например, при установке с FTP или NFS сервера), нужно знать конфигурацию сети. Вам будет предложено ввести эту информацию, чтобы FreeBSD смогла подключиться к сети для продолжения установки.
+
+==== Подключение к сети Ethernet, или через кабельный/DSL модем
+
+Если вы подключаетесь к сети Ethernet, или соединение с интернет подключено к Ethernet через кабельный или DSL модем, понадобится следующая информация:
+
+. IP адрес
+. IP адрес шлюза по умолчанию
+. Имя хоста
+. IP адрес DNS сервера
+. Маска подсети
+
+Если у вас нет этой информации, спросите системного администратора или провайдера интернет. Они могут сказать, что данные присваиваются автоматически, с использованием _DHCP_. Если это так, запомните это.
+
+==== Подсоединение с помощью модема
+
+Если вы дозваниваетесь до провайдера с помощью обычного модема, вы все же сможете установить FreeBSD через интернет, но это займет очень много времени.
+
+Вам нужно знать:
+
+. Номер телефона провайдера
+. COM порт, к которому подключен модем
+. Имя пользователя и пароль учетной записи для доступа в интернет
+
+=== Проверьте сведения об обнаруженных ошибках FreeBSD
+
+Хотя проект FreeBSD борется за то, чтобы каждый релиз FreeBSD был настолько стабильным, насколько это возможно, ошибки порой вкрадываются в процесс разработки. В очень редких случаях эти ошибки влияют на процесс установки. Как только эти проблемы обнаруживаются и исправляются, они попадают в http://www.FreeBSD.org/ru/releases/{rel120-current}r/errata/[сообщения об ошибках FreeBSD], находящиеся на сайте FreeBSD. Вы можете проверить сообщения об ошибках перед установкой, чтобы убедиться, что не существует проблем, о которых стоит беспокоиться.
+
+Информация о релизах, включая сообщения об ошибках каждого релиза, находится на странице link:https://www.FreeBSD.org/ru/releases/[информации о релизах] link:https://www.FreeBSD.org/ru/[сайта FreeBSD].
+
+=== Получение установочных файлов FreeBSD
+
+Программа установки FreeBSD может установить FreeBSD из файлов, расположенных в одном из следующих мест:
+
+.Локальный диск
+* CDROM или DVD
+* USB-накопитель
+* Раздел MS-DOS(R) на вашем компьютере
+* Лента SCSI или QIC
+* Гибкие диски
+
+.Сеть
+* FTP сервер (через файрволл или HTTP прокси, если потребуется)
+* NFS сервер
+* Соединение через параллельный или последовательный порт
+
+Если вы купили FreeBSD на CD или DVD, у вас уже есть все, что нужно, переходите к следующему разделу (<<install-boot-media>>).
+
+Если у вас нет установочных файлов FreeBSD, перейдите к <<install-diff-media>>, который описывает, как подготовиться к установке FreeBSD любым указанным выше способом. После прочтения этого раздела, вернитесь сюда и прочтите <<install-boot-media>>.
+
+[[install-boot-media]]
+=== Подготовка загрузочных дисков
+
+Процесс установки FreeBSD начинается с загрузки в ваш компьютер программы установки FreeBSD - эта программа не запускается из других операционных систем. Компьютер обычно загружает операционную систему, установленную на жестком диске, но также может быть настроен на загрузку с привода CDROM или с USB-накопителя.
+
+[TIP]
+====
+
+Если у вас есть FreeBSD на CDROM или DVD (купленный или записанный самостоятельно), и компьютер позволяет загрузку с CDROM или DVD (обычно этот пункт в BIOS называется "Boot Order" или что-то вроде), можете пропустить этот раздел. Образы FreeBSD CDROM и DVD являются загрузочными и могут быть использованы для установки FreeBSD без какой-либо специальной подготовки.
+====
+
+Для создания загрузочного USB-диска выполните следующие шаги:
+
+[.procedure]
+====
+. Получение образов для USB-накопителя
++
+Загрузочные образы для USB-накопителя для FreeBSD 8._X_-RELEASE и более ранних можно найти в каталоге [.filename]#ISO-IMAGES/# по адресу `ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/_arch_/ISO-IMAGES/_version_/FreeBSD-_version_-RELEASE-_arch_-memstick.img`. Замените _arch_ и _version_ именем архитектуры и номером версии операционной системы, которую вы планируете установить. Например, образы USB-накопителя для FreeBSD/i386 {rel112-current}-RELEASE находятся в link:ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/ISO-IMAGES/{rel112-current}/FreeBSD-{rel112-current}-RELEASE-i386-memstick.img[ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/ISO-IMAGES/{rel112-current}/FreeBSD-{rel112-current}-RELEASE-i386-memstick.img].
++
+[TIP]
+======
+
+Для FreeBSD версий 9.0-RELEASE и более поздних путь каталогов отличается от приведенных выше. Детали загрузки образов и установки FreeBSD 9.0-RELEASE и более поздних описаны в crossref:bsdinstall[bsdinstall,Установка FreeBSD версий 9.X и более поздних].
+======
++
+Название файла образа заканчивается на [.filename]#.img#. Каталог [.filename]#ISO-IMAGES/# содержит набор образов, среди которых вам необходимо выбрать один. Выбор зависит от версии устанавливаемой FreeBSD и, в некоторых случаях, от архитектуры оборудования, на которое будет выполняться установка.
++
+[IMPORTANT]
+======
+Перед продолжением сделайте _резервную копию_ данных, находящихся на вашем USB-накопителе, так как последующие действия _сотрут_ все старые данные.
+======
+
+. Запись файла-образа на USB-накопитель
+
+[.procedure]
+======
+*Procedure: Использование FreeBSD для записи файла-образа*
+
+[WARNING]
+****
+
+В данном примере подразумевается, что устройство [.filename]#/dev/da0# является нашим целевым устройством, на которое будет производиться запись образа. Будьте предельно внимательны, так как, указав неверное устройство, вы уничтожите существующие данные.
+****
+.. Запись файла-образа при помощи man:dd[1]
++
+Файл [.filename]#.img#_не_ является обыкновенным файлом, копируемым на накопитель. Это образ содержимого диска. Это значит, что вы _не можете_ просто скопировать файлы с диска на диск. Вместо копирования вы должны использовать man:dd[1] для записи образа непосредственно на накопитель:
++
+[source,bash,subs="attributes"]
+....
+# dd if=FreeBSD-{rel112-current}-RELEASE-i386-memstick.img of=/dev/da0 bs=64k
+....
++
+Если отображается ошибка `Operation not permitted`, убедитесь, что целевое устройство не используется и не примонтировано вручную или автоматически какой-либо полезной утилитой. Далее, повторите попытку еще раз.
+======
+
+[.procedure]
+======
+*Procedure: Использование Windows(R) для записи файла-образа*
+[WARNING]
+****
+
+Удостоверьтесь в том, что вы используете соответствующую целевому устройству букву диска, иначе вы уничтожите существующие данные.
+****
+.. Получение приложения Image Writer for Windows
++
+Приложение Image Writer for Windows является свободно распространяемым ПО, которым можно корректно записать файл-образ на USB-накопитель. Посетите страницу https://launchpad.net/win32-image-writer/[https://launchpad.net/win32-image-writer/], скачайте и распакуйте приложение.
+.. Запись файла-образа при помощи приложения Image Writer
++
+Для запуска приложения дважды щелкните мышей иконку Win32DiskImager. Убедитесь, что буква диска, отображаемая в выпадающем списке `Device` соответствует USB-накопителю. Щелкните мышей на иконку с изображением папки и выберите необходимый файл-образ. Для подтверждения выбора имени файла нажмите кнопку btn:[Save]. Убедитесь, что все введённые данные корректны, и что в других приложениях нет открытых папок или файлов, находящихся на целевом USB-накопителе. И в заключение, щелкните кнопку btn:[Write] для записи файла-образа на накопитель.
+======
+====
+
+Для создания загрузочных дискет для установки FreeBSD/pc98 сделайте следующее:
+
+[.procedure]
+====
+
+. Получение образов загрузочных дискет
++
+Загрузочные дискеты FreeBSD/pc98 могут быть закачаны из каталога floppies по адресу `ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/pc98/_version_-RELEASE/floppies/`. Замените _version_ номером версии, которую вы хотите установить.
++
+Расширение файла образа дискеты - [.filename]#.flp#. Каталог [.filename]#floppies/# содержит множество разных образов. Скачайте [.filename]#boot.flp#, а также несколько файлов согласно типу установки, таких как [.filename]#kern.small*# или [.filename]#kern*#.
++
+[IMPORTANT]
+======
+FTP клиент должен использовать _бинарный режим_ для загрузки образов дискет. Некоторые Web-браузеры используют _текстовый_ (_ASCII_) режим, который точно не позволит загрузиться с этих дискет.
+======
++
+. Подготовка дискет
++
+Необходимо подготовить по одной дискете на каждый загруженный образ. Эти дискеты должны быть без дефектов. Лучший способ проверить это - отформатировать дискеты самостоятельно. Не доверяйте заводскому форматированию дискет. Утилита форматирования в Windows(R) не сообщит о наличии плохих секторов, она просто пометит их как "плохие" и проигнорирует. Советуем использовать новые дискеты если вы выбрали этот способ установки.
++
+[IMPORTANT]
+======
+Если при попытке установки FreeBSD программа установки рушится, зависает, или делает что-то не так, сразу проверьте дискеты. Запишите образы на новые дискеты и попытайтесь еще раз.
+======
++
+. Запись образов на дискеты
++
+Файлы с расширением [.filename]#.flp# это _не_ обычные файлы, которые можно записать на дискету. Это образы всего содержимого дискеты. Это означает, что вы _не можете_ просто скопировать их с одной дискеты на другую. Вместо этого, нужно использовать специальные утилиты для записи образов на диск.
++
+Если вы записываете дискеты на компьютере под MS-DOS(R) / Windows(R), используйте утилиту `fdimage`.
++
+Если вы используете образы с CDROM, и буква вашего CDROM [.filename]#E:#, запустите ее так:
++
+[source,bash]
+....
+E:\> tools\fdimage floppies\boot.flp A:
+....
++
+Повторите эту команду для каждого файла [.filename]#.flp#, вставляя новую дискету каждый раз, пометьте каждую дискету именем файла, который вы скопировали на него. Измените команду если потребуется, в зависимости от места, куда вы поместили файлы [.filename]#.flp#. Если у вас нет CDROM, `fdimage` может быть загружена из каталога link:ftp://ftp.FreeBSD.org/pub/FreeBSD/tools/[tools] FTP сервера FreeBSD.
++
+Если вы записываете дискеты на UNIX(R) (например, на другой системе FreeBSD), используйте утилиту man:dd[1] для записи образов непосредственно на дискеты. Находясь в FreeBSD, запустите:
++
+[source,bash]
+....
+# dd if=boot.flp of=/dev/fd0
+....
++
+Под FreeBSD, [.filename]#/dev/fd0# означает первый гибкий диск (диск [.filename]#A:#). [.filename]#/dev/fd1# будет диском [.filename]#B:#, и так далее. Другие UNIX(R) системы могут по-другому именовать устройства гибких дисков, вам возможно понадобится прочитать документацию по соответствующей системе.
+====
+
+Теперь вы готовы к установке FreeBSD.
+
+[[install-start]]
+== Начало установки
+
+[IMPORTANT]
+====
+Как правило, программа установки не будет производить никаких изменений на дисках, пока не выдаст следующее сообщение:
+
+[.programlisting]
+....
+Last Chance: Are you SURE you want continue the installation?
+
+If you're running this on a disk with data you wish to save then WE
+STRONGLY ENCOURAGE YOU TO MAKE PROPER BACKUPS before proceeding!
+
+We can take no responsibility for lost disk contents!
+....
+
+Установка может быть прервана в любой момент до этого предупреждения без каких-либо изменений на жестком диске. Если вы считаете, что что-то настроили неправильно, можете просто выключить компьютер без риска что-либо повредить.
+====
+
+[[install-starting]]
+=== Загрузка
+
+[[install-starting-i386]]
+==== Загрузка i386(TM)
+
+[.procedure]
+====
+
+. Компьютер выключен.
+. Включите компьютер. После включения он должен показать способ входа в меню установки BIOS, как правило это клавиши kbd:[F2], kbd:[F10], kbd:[Del], или kbd:[Alt+S]. Используете те клавиши, которые показаны на экране. В некоторых случаях компьютер может показывать картинку после запуска. Как правило, нажатие kbd:[Esc] уберет картинку и позволит вам увидеть необходимую информацию.
+. Найдите установки системы, указывающие ей с какого устройства загружаться. Обычно они обозначаются как "Boot Order", и там как правило отображен список устройств, таких как `Floppy`, `CDROM`, `First Hard Disk`, и так далее.
++
+Если вы загружаетесь с CDROM, убедитесь, что он выбран. Если вы загружаетесь с USB-носителя или с дискеты, убедитесь, что выбрано соответствующее устройство. Если вы не уверены, посмотрите руководство к компьютеру и/или к его материнской плате.
++
+Сделайте изменения, затем сохраните их и выйдите. Компьютер должен перезагрузиться.
+. Если вы подготовили "загрузочный" USB-носитель, как описано в <<install-boot-media>>, вставьте его в USB порт перед включением компьютера.
++
+Если вы загружаетесь с CDROM, потребуется сначала включить компьютер и вставить компакт-диск, как только это станет возможно.
++
+[NOTE]
+======
+Для FreeBSD/pc98 существуют образы загрузочных дискет, подготовка которых описана в <<install-boot-media>>. Первая дискета будет содержать [.filename]#boot.flp#. Для загрузки в программу установки вставьте эту дискету в дисковод.
+======
++
+Если компьютер запускается как обычно, и загружает существующую операционную систему, возможны следующие причины:
+
+.. Диск был вставлен недостаточно рано в процессе загрузки. Оставьте его внутри и перегрузите компьютер.
+.. Установки BIOS, измененные ранее, действуют неправильно. Надо изменять их, пока они не заработают.
+.. BIOS вашего компьютера не поддерживает загрузку с выбранного типа носителя.
+
+. FreeBSD начнет загрузку. Если загрузка происходит с CDROM, вы увидите что-то вроде этого (информация о версии удалена):
++
+[source,bash]
+....
+Booting from CD-Rom...
+645MB medium detected
+CD Loader 1.2
+
+Building the boot loader arguments
+Looking up /BOOT/LOADER... Found
+Relocating the loader and the BTX
+Starting the BTX loader
+
+BTX loader 1.00 BTX version is 1.02
+Consoles: internal video/keyboard
+BIOS CD is cd0
+BIOS drive C: is disk0
+BIOS drive D: is disk1
+BIOS 636kB/261056kB available memory
+
+FreeBSD/i386 bootstrap loader, Revision 1.1
+
+Loading /boot/defaults/loader.conf
+/boot/kernel/kernel text=0x64daa0 data=0xa4e80+0xa9e40 syms=[0x4+0x6cac0+0x4+0x88e9d]
+\
+....
++
+Если происходит загрузка с дискеты, вы увидите что-то вроде этого (информация о версии удалена):
++
+[source,bash]
+....
+Booting from Floppy...
+Uncompressing ... done
+
+BTX loader 1.00 BTX version is 1.01
+Console: internal video/keyboard
+BIOS drive A: is disk0
+BIOS drive C: is disk1
+BIOS 639kB/261120kB available memory
+
+FreeBSD/i386 bootstrap loader, Revision 1.1
+
+Loading /boot/defaults/loader.conf
+/kernel text=0x277391 data=0x3268c+0x332a8 |
+
+Insert disk labelled "Kernel floppy 1" and press any key...
+....
++
+Следуя инструкциям, уберите дискету с [.filename]#boot.flp#, вставьте дискету с [.filename]#kern1.flp# и нажмите kbd:[Enter]. Загрузитесь с первой дискеты; последовательно вставляйте остальные диски при появлении соответствующего приглашения.
+. Идет ли загрузка с CDROM, или с USB-носителя, или с дискеты в процессе загрузки появится меню загрузчика FreeBSD:
++
+[[boot-loader-menu]]
+.FreeBSD Boot Loader Menu
+image::boot-loader-menu.png[]
++
+Подождите десять секунд или нажмите kbd:[Enter].
+====
+
+==== Загрузка sparc64
+
+Большинство систем sparc64 настроены на автоматическую загрузку с жесткого диска. Для того, чтобы установить FreeBSD, вам потребуется выполнить загрузку по сети или с компакт-диска, что в свою очередь требует получения доступа к PROM (OpenFirmware).
+
+Чтобы получить доступ к PROM, перезагрузите систему и дождитесь появления сообщений загрузчика. Последние зависят от модели оборудования, но, в общем, выглядят подобно следующим:
+
+[source,bash]
+....
+Sun Blade 100 (UltraSPARC-IIe), Keyboard Present
+Copyright 1998-2001 Sun Microsystems, Inc. All rights reserved.
+OpenBoot 4.2, 128 MB memory installed, Serial #51090132.
+Ethernet address 0:3:ba:b:92:d4, Host ID: 830b92d4.
+....
+
+Если на данном этапе ваша система продолжает загружаться с диска, то для доступа к PROM вам потребуется нажать на клавиатуре сочетания клавиш kbd:[L1+A] или kbd:[Stop+A], или же - послать `BREAK` на последовательной консоли (например, набрав `~#` в man:tip[1] или man:cu[1]). Приглашение PROM выглядит подобно следующему:
+
+[source,bash]
+....
+ok <.>
+ok {0} <.>
+....
+
+<.> Однопроцессорные системы выдают такое приглашение.
+<.> Приглашение, используемое многопроцессорными системами: цифра обозначает номер активного процессора.
+
+На этой стадии необходимо вставить CDROM в привод и набрать `boot cdrom` в приглашении PROM.
+
+[[view-probe]]
+=== Просмотр результатов тестирования устройств
+
+Последние несколько сотен линий, отображенные на экране, сохраняются и могут быть просмотрены.
+
+Для просмотра буфера нажмите kbd:[Scroll Lock]. Это включит прокрутку экрана. Вы можете использовать клавиши навигации или kbd:[PageUp] и kbd:[PageDown] для просмотра результатов. Нажмите kbd:[Scroll Lock] еще раз для отключения прокрутки.
+
+Сделайте это сейчас для просмотра текста, ушедшего за экран, когда ядро закончило тестирование устройств. Вы увидите текст вроде <<install-dev-probe>>, хотя в деталях он будет отличаться в зависимости от устройств, имеющихся в вашем компьютере.
+
+[[install-dev-probe]]
+.Типичный вывод Device Probe
+[source,bash]
+....
+avail memory = 253050880 (247120K bytes)
+Preloaded elf kernel "kernel" at 0xc0817000.
+Preloaded mfs_root "/mfsroot" at 0xc0817084.
+md0: Preloaded image </mfsroot> 4423680 bytes at 0xc03ddcd4
+
+md1: Malloc disk
+Using $PIR table, 4 entries at 0xc00fde60
+npx0: <math processor> on motherboard
+npx0: INT 16 interface
+pcib0: <Host to PCI bridge> on motherboard
+pci0: <PCI bus> on pcib0
+pcib1:<VIA 82C598MVP (Apollo MVP3) PCI-PCI (AGP) bridge> at device 1.0 on pci0
+pci1: <PCI bus> on pcib1
+pci1: <Matrox MGA G200 AGP graphics accelerator> at 0.0 irq 11
+isab0: <VIA 82C586 PCI-ISA bridge> at device 7.0 on pci0
+isa0: <iSA bus> on isab0
+atapci0: <VIA 82C586 ATA33 controller> port 0xe000-0xe00f at device 7.1 on pci0
+ata0: at 0x1f0 irq 14 on atapci0
+ata1: at 0x170 irq 15 on atapci0
+uhci0 <VIA 83C572 USB controller> port 0xe400-0xe41f irq 10 at device 7.2 on pci
+0
+usb0: <VIA 83572 USB controller> on uhci0
+usb0: USB revision 1.0
+uhub0: VIA UHCI root hub, class 9/0, rev 1.00/1.00, addr1
+uhub0: 2 ports with 2 removable, self powered
+pci0: <unknown card> (vendor=0x1106, dev=0x3040) at 7.3
+dc0: <ADMtek AN985 10/100BaseTX> port 0xe800-0xe8ff mem 0xdb000000-0xeb0003ff ir
+q 11 at device 8.0 on pci0
+dc0: Ethernet address: 00:04:5a:74:6b:b5
+miibus0: <MII bus> on dc0
+ukphy0: <Generic IEEE 802.3u media interface> on miibus0
+ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
+ed0: <NE2000 PCI Ethernet (RealTek 8029)> port 0xec00-0xec1f irq 9 at device 10.
+0 on pci0
+ed0 address 52:54:05:de:73:1b, type NE2000 (16 bit)
+isa0: too many dependant configs (8)
+isa0: unexpected small tag 14
+orm0: <Option ROM> at iomem 0xc0000-0xc7fff on isa0
+fdc0: <NEC 72065B or clone> at port 0x3f0-0x3f5,0x3f7 irq 6 drq2 on isa0
+fdc0: FIFO enabled, 8 bytes threshold
+fd0: <1440-KB 3.5" drive> on fdc0 drive 0
+atkbdc0: <Keyboard controller (i8042)> at port 0x60,0x64 on isa0
+atkbd0: <AT Keyboard> flags 0x1 irq1 on atkbdc0
+kbd0 at atkbd0
+psm0: <PS/2 Mouse> irq 12 on atkbdc0
+psm0: model Generic PS/@ mouse, device ID 0
+vga0: <Generic ISA VGA> at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0
+sc0: <System console> at flags 0x100 on isa0
+sc0: VGA <16 virtual consoles, flags=0x300>
+sio0 at port 0x3f8-0x3ff irq 4 flags 0x10 on isa0
+sio0: type 16550A
+sio1 at port 0x2f8-0x2ff irq 3 on isa0
+sio1: type 16550A
+ppc0: <Parallel port> at port 0x378-0x37f irq 7 on isa0
+pppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode
+ppc0: FIFO with 16/16/15 bytes threshold
+plip0: <PLIP network interface> on ppbus0
+ad0: 8063MB <IBM-DHEA-38451> [16383/16/63] at ata0-master UDMA33
+acd0: CD-RW <LITE-ON LTR-1210B> at ata1-slave PIO4
+Mounting root from ufs:/dev/md0c
+/stand/sysinstall running as init on vty0
+....
+
+Внимательно проверьте результаты тестирования устройств и убедитесь, что FreeBSD обнаружила все устройства, какие нужно. Если устройство не найдено, его не будет в списке. crossref:kernelconfig[kernelconfig,Собственное ядро] позволяет добавлять поддержку устройств, отсутствующих в ядре [.filename]#GENERIC#, например звуковых карт.
+
+После проверки аппаратных устройств, появится <<config-country>>. Используйте клавиши навигации для выбора страны, региона или группы. Затем нажмите kbd:[Enter], произойдет выбор страны.
+
+[[config-country]]
+.Меню выбора страны
+image::config-country.png[]
+
+Если вы выбрали страну [.guimenuitem]#United States#, то будет использована стандартная американская раскладка клавиатуры, если же была выбрана другая страна, то отобразится следующее меню. Используя клавиши навигации, выберите необходимую раскладку и нажмите kbd:[Enter].
+
+[[config-keymap]]
+.Меню выбора раскладки клавиатуры
+image::config-keymap.png[]
+
+После меню выбора страны будет отображено главное меню sysinstall.
+
+[[using-sysinstall]]
+== Введение в Sysinstall
+
+Утилита sysinstall это программа установки, предоставляемая проектом FreeBSD. Это консольное приложение, разделенное на несколько меню и экранов, которые вы можете использовать для настройки и управления процессом установки.
+
+Меню sysinstall управляется клавишами навигации, kbd:[Enter], kbd:[Tab], пробелом, и другими. Подробное описание клавиш и их функций содержится в информации по использованию sysinstall.
+
+Для просмотра этой информации убедитесь, что выбраны пункт [.guimenuitem]#Usage# и кнопка btn:[Select], как показано на <<sysinstall-main3>>, затем нажмите kbd:[Enter].
+
+Будут показаны инструкции по использованию меню. После просмотра инструкций, нажмите kbd:[Enter] для возврата в главное меню.
+
+[[sysinstall-main3]]
+.Выбор Usage в главном меню Sysinstall
+image::main1.png[]
+
+[[select-doc]]
+=== Выбор меню документации (Doc)
+
+Из главного меню выберите клавишами навигации [.guimenuitem]#Doc# и нажмите kbd:[Enter].
+
+[[main-doc]]
+.Выбор меню документации
+image::main-doc.png[]
+
+Будет отображено меню документации.
+
+[[docmenu1]]
+.Меню документации Sysinstall
+image::docmenu1.png[]
+
+Рекомендуется прочитать предоставляемую документацию.
+
+Для просмотра документа выберите его с помощью клавиш навигации и нажмите kbd:[Enter]. После прочтения документа нажмите kbd:[Enter] для возврата в меню документации.
+
+Для возврата в главное меню выберите [.guimenuitem]#Exit# с помощью клавиш навигации и нажмите kbd:[Enter].
+
+[[keymap]]
+=== Выбор меню раскладки клавиатуры (Keymap)
+
+Для изменения раскладки клавиатуры выберите из меню с помощью клавиш навигации [.guimenuitem]#Keymap# и нажмите kbd:[Enter]. Это потребуется только при использовании нестандартной или не-US клавиатуры.
+
+[[sysinstall-keymap]]
+.Выбор меню раскладки клавиатуры
+image::main-keymap.png[]
+
+Различные раскладки клавиатуры могут быть выбраны из меню с использованием клавиш навигации, затем следует нажать kbd:[Space]. Нажатие kbd:[Space] еще раз приведет к отмене выбора. Когда необходимые раскладки будут выбраны, перейдите на btn:[OK] с помощью клавиш навигации и нажмите kbd:[Enter].
+
+На экран выведена только часть списка. Нажав kbd:[Tab], можно выбрать btn:[Cancel], вернуться к раскладке по умолчанию и перейти к главному меню.
+
+[[sysinstall-keymap-menu]]
+.Меню раскладки клавиатуры
+image::keymap.png[]
+
+[[viewsetoptions]]
+=== Параметры установки (Options)
+
+Выберите пункт [.guimenuitem]#Options# и нажмите kbd:[Enter].
+
+[[sysinstall-options]]
+.Выбор параметров установки
+image::main-options.png[]
+
+[[options]]
+.Параметры Sysinstall
+image::options.png[]
+
+Параметры по умолчанию обычно устраивают большинство пользователей и не нуждаются в изменении. Имя релиза зависит от устанавливаемой версии.
+
+Описание выбранного пункта будет появляться внизу экрана с синей подсветкой. Обратите внимание, что один из параметров - [.guimenuitem]#Use Defaults#, означает сброс всех параметров к значениям по умолчанию.
+
+Нажатие kbd:[F1] отобразит справку по различным параметрам.
+
+Нажатием kbd:[Q] можно перейти к главному меню.
+
+[[start-install]]
+=== Начало стандартной установки (Standard)
+
+Пункт [.guimenuitem]#Standard# рекомендуется для новых пользователей UNIX(R) или FreeBSD. Используйте клавиши навигации для выбора пункта [.guimenuitem]#Standard#, а затем нажмите kbd:[Enter] для запуска установки.
+
+[[sysinstall-standard]]
+.Начало стандартной установки
+image::main-std.png[]
+
+[[install-steps]]
+== Выделение дискового пространства
+
+Ваша первая задача - выделить дисковое пространство под FreeBSD и разметить его, чтобы sysinstall могла его подготовить. Для этого вам нужно знать, как FreeBSD ищет информацию на диске.
+
+[[install-drive-bios-numbering]]
+=== Нумерация дисков в BIOS
+
+Перед установкой и настройкой операционной системы необходимо знать, как FreeBSD трактует предоставляемую системой BIOS информацию о дисках и их именовении.
+
+В PC, работающем под BIOS-зависимой операционной системой, такой как MS-DOS(R) или Microsoft(R) Windows(R), BIOS может отходить от обычного порядка нумерации дисков. Это позволяет пользователю загружаться не только с так называемого "primary master" диска. Это особенно удобно для тех пользователей, которые покупают второй идентичный первому жесткий диск и регулярно делают копии первого диска на второй. Затем, если первый диск выйдет из строя, будет заражен вирусом или поврежден из-за сбоя операционной системы, он может быть легко восстановлен путем логической перестановки дисков в BIOS. Это все равно что переключить кабели дисков, но без вскрытия корпуса.
+
+Более дорогостоящие системы со SCSI контроллерами зачастую имеют расширения BIOS, позволяющие сходным путем менять порядок до семи SCSI дисков.
+
+Пользователи, привыкшие пользоваться этими полезными функциями, могут быть удивлены, что во FreeBSD результаты не совпадают с ожидаемыми. FreeBSD не использует BIOS, и не знает о "логическом отображении дисков в BIOS". Это может привести к очень сложным ситуациям, особенно когда диски имеют одинаковую геометрию и содержат точную копию данных друг друга.
+
+При использовании FreeBSD всегда восстанавливайте настройки BIOS к первоначальной нумерации перед установкой системы и оставляйте их в таком виде. Если вам понадобится переключить диски, сделайте это, но путем физического переконфигурирования, вскрыв корпус, переключив перемычки и кабели.
+
+****
+Билл разобрал старый Wintel компьютер, чтобы сделать еще один компьютер под FreeBSD для Фреда. Билл установил один SCSI диск как нулевое устройство SCSI и поставил на него FreeBSD.
+
+Фред начал использовать систему, но через несколько дней обнаружил, что старый SCSI диск сообщает о множестве сбоев и сказал об этом Биллу.
+
+Еще через несколько дней Билл решил, что настало время решить проблему, и достал такой же SCSI диск из "заначки" в кладовке. Первая проверка поверхности показала, что диск работает нормально; Билл установил этот диск как четвертое устройство SCSI и скопировал образ диска с нулевого устройства на четвертое. Теперь, когда новый диск был установлен и отлично работал, Билл решил что неплохо бы начать использовать его, и с помощью функции SCSI BIOS поменял порядок дисков, чтобы система могла грузиться с четвертого устройства SCSI. FreeBSD загрузилась и работала без проблем.
+
+Фред поработал еще несколько дней, и скоро они с Биллом решили, что настало время для нового приключения - время обновить версию FreeBSD. Билл удалил нулевое устройство SCSI, потому что оно "подглючивало", и установил на его место такой же диск из "заначки". Затем Билл установил новую версию FreeBSD на новое нулевое устройство SCSI используя дискеты Фреда с интернет сервера FTP. Установка прошла отлично.
+
+Фред использовал новую версию FreeBSD несколько дней и удостоверился, что она вполне подходит для работы в инженерном отделе. Настало время скопировать все архивы со старого диска. Фред смонтировал четвертое устройство SCSI (последнюю копию старой версии FreeBSD) и обнаружил, что ни одного из его драгоценных файлов на четвертом устройстве SCSI нет.
+
+Куда делись данные?
+
+Когда Билл сделал копию с нулевого устройства SCSI на четвертое устройство SCSI, оно стало "клоном". Когда Билл поменял настройки SCSI BIOS, чтобы загрузиться с четвертого устройства SCSI, он всего лишь обманул сам себя. FreeBSD все еще работала с нулевого устройства SCSI. Изменение этих настроек BIOS привело к загрузке части кода Boot и Loader с выбранного в BIOS диска, но после загрузки драйверов FreeBSD настройки BIOS были проигнорированы, и FreeBSD вернулась к нормальной нумерации. Как показано "на пальцах", система продолжила работать с нулевым устройством SCSI, и все данные Фреда остались там, а не на четвертом устройстве SCSI. То, что система грузилась с четвертого устройства SCSI, было всего лишь обманутыми ожиданиями.
+
+Мы рады упомянуть, что данные не были уничтожены или повреждены при нашем исследовании этого феномена. Старое нулевое устройство SCSI было вытащено из груды железа, и все файлы Фреда вернулись к нему.
+
+Хотя в этом рассказе были использованы SCSI диски, с IDE дисками все точно так же.
+****
+
+[[main-fdisk]]
+=== Создание слайсов с использованием FDisk
+
+[NOTE]
+====
+Внесенные вами изменения не будут записываться на диск сразу. Если вы думаете, что сделали ошибку, и хотите начать сначала, можете использовать меню для выхода из sysinstall и попробовать еще раз или нажатием kbd:[U] вызвать опцию [.guimenuitem]#Undo# (отмена). Если вы запутались и не можете выйти, просто выключите компьютер.
+====
+
+После начала стандартной установки в sysinstall будет показано это сообщение:
+
+[source,bash]
+....
+ Message
+ In the next menu, you will need to set up a DOS-style ("fdisk")
+ partitioning scheme for your hard disk. If you simply wish to devote
+ all disk space to FreeBSD (overwriting anything else that might be on
+ the disk(s) selected) then use the (A)ll command to select the default
+ partitioning scheme followed by a (Q)uit. If you wish to allocate only
+ free space to FreeBSD, move to a partition marked "unused" and use the
+ (C)reate command.
+ [ OK ]
+
+ [ Press enter or space ]
+....
+
+Нажмите kbd:[Enter] как предлагается. Будет показан список всех жестких дисков, обнаруженных ядром во время тестирования устройств. <<sysinstall-fdisk-drive1>> показывает пример системы с двумя IDE дисками. Они были названы [.filename]#ad0# и [.filename]#ad2#.
+
+[[sysinstall-fdisk-drive1]]
+.Выберите диск для FDisk
+image::fdisk-drive1.png[]
+
+Вы можете быть удивлены, почему устройства [.filename]#ad1# здесь нет. Почему оно было пропущено?
+
+Предположим, что у вас есть два жестких диска IDE, один master на первом контроллере IDE, а второй master на втором контроллере IDE. Если FreeBSD пронумерует их в том порядке, в котором нашла, [.filename]#ad0# и [.filename]#ad1#, все будет работать.
+
+Но если вы добавите третий диск, как slave устройство на первый контроллер IDE, он станет [.filename]#ad1#, а предыдущий [.filename]#ad1# станет [.filename]#ad2#. Поскольку имена устройств (таких как [.filename]#ad1s1a#) используются для обращения к файловым системам, вы можете вдруг обнаружить, что некоторые из ваших файловых систем больше не отображаются правильно и вам потребуется изменить конфигурацию FreeBSD.
+
+Для обхода этой проблемы, ядро может быть настроено так, чтобы именовать IDE диски на основе их местоположения, а не порядка, в котором они были найдены. С этой схемой master диск на втором контроллере IDE будет _всегда_ устройством [.filename]#ad2#, если даже нет устройств [.filename]#ad0# или [.filename]#ad1#.
+
+Это конфигурация ядра FreeBSD по умолчанию, поэтому на экране показаны [.filename]#ad0# и [.filename]#ad2#. У компьютера, с которого был взят этот снимок экрана, есть по одному IDE диску на обеих master каналах IDE контроллеров и ни одного диска на каналах slave.
+
+Вы должны выбрать диск, на который хотите установить FreeBSD, и нажать btn:[OK]. Запустившийся FDisk будет выглядеть примерно как <<sysinstall-fdisk1>>.
+
+Экран FDisk разбит на три раздела.
+
+Первый раздел, занимающая первые две линии экрана, показывает подробную информацию о выбранном в данный момент диске, включая его имя во FreeBSD, геометрию и общий размер диска.
+
+Второй раздел показывает имеющиеся в данный момент на диске слайсы, где они начинаются и заканчиваются, их размер, имя, которое им дала FreeBSD, описание и подтип. На этом примере показаны два маленьких неиспользованных слайса, которые являются артефактами схемы разметки диска на PC. Также показан один большой FAT слайс, который почти всегда является диском [.filename]#C:# в MS-DOS(R) / Windows(R), и дополнительный слайс, который может содержать диски с другими буквами для MS-DOS(R) / Windows(R).
+
+Третий раздел показывает команды, доступные в FDisk.
+
+[[sysinstall-fdisk1]]
+.Типичные разделы `fdisk` перед редактированием
+image::fdisk-edit1.png[]
+
+Ваши действия теперь будут зависеть от того, как вы хотите разбить диск на слайсы.
+
+Если вы хотите использовать для FreeBSD весь диск (это приведет к удалению всех других данных на этом диске когда вы подтвердите sysinstall продолжение процесса установки), нажмите kbd:[A], что соответствует опции [.guimenuitem]#Использовать весь диск (Use Entire Disk)#. Существующие слайсы будут удалены, и заменены на небольшую область, помеченную как `неиспользуемая (unused)` (это опять же артефакт разметки диска ПК), и один большой слайс для FreeBSD. Когда вы сделаете это, нужно выбрать вновь созданный слайс FreeBSD используя клавиши навигации, а затем нажать kbd:[S], чтобы сделать слайс загрузочным. Экран будет похож на <<sysinstall-fdisk2>>. Обратите внимание, что `A` в колонке `Flags` означает, что слайс _активен_ и с него будет происходить загрузка.
+
+Если вы будете удалять существующий слайс для освобождения места под FreeBSD, выберите слайс, используя клавиши навигации, и нажмите kbd:[D]. Затем можете нажать kbd:[C], и получить приглашение на ввод размера слайса, который вы хотите создать. Введите соответствующее значение и нажмите kbd:[Enter]. Значение по умолчанию в этом поле означает наибольший размер слайса, который может быть выбран; это может быть наибольший непрерывный блок неразмеченного пространства или размер всего жесткого диска.
+
+Если вы уже освободили место для FreeBSD, то можете нажать kbd:[C] для создания нового слайса. Будет также предложено ввести размер слайса, который вы хотите создать.
+
+[[sysinstall-fdisk2]]
+.Разбиение в Fdisk с использованием всего диска
+image::fdisk-edit2.png[]
+
+Когда закончите, нажмите kbd:[Q]. Изменения будут сохранены в sysinstall, но еще не записаны на диск.
+
+[[bootmgr]]
+=== Установка менеджера загрузки (Boot Manager)
+
+Теперь вам предлагается установить менеджер загрузки. Как правило, нужно выбрать установку менеджера загрузки если:
+
+* У вас больше чем один диск и вы устанавливаете FreeBSD не на первый диск.
+* Вы устанавливаете FreeBSD вместе с другой операционной на один и тот же диск, и хотите выбирать при загрузке FreeBSD или другую операционную систему.
+
+Если FreeBSD единственная операционная система, установленная на этом компьютере, и находится на первом жестком диске, подойдет менеджер загрузки [.guimenuitem]#Standard#. Выберите [.guimenuitem]#None# если вы используете менеджер загрузки сторонних разработчиков, способный загрузить FreeBSD.
+
+Сделайте выбор и нажмите kbd:[Enter].
+
+[[sysinstall-bootmgr]]
+.Меню менеджера загрузки Sysinstall
+image::boot-mgr.png[]
+
+Экран подсказки, вызываемый по нажатию kbd:[F1], описывает проблемы, которые могут быть встречены при попытке совместного использования диска операционными системами.
+
+=== Создание слайсов на другом диске
+
+Если дисков больше чем один, вернитесь к экрану выбора дисков (Select Drives) после выбора менеджера загрузки. Если вы собираетесь устанавливать FreeBSD более чем на один диск, можете выбрать другой диск и повторить процесс разбиения на слайсы с использованием FDisk.
+
+[IMPORTANT]
+====
+Если вы устанавливаете FreeBSD не на первый жесткий диск, потребуется установить менеджер загрузки FreeBSD на оба диска.
+====
+
+[[sysinstall-fdisk-drive2]]
+.Выход из выбора диска
+image::fdisk-drive2.png[]
+
+Клавиша kbd:[Tab] переключает между последним выбранным диском, btn:[OK], и btn:[Cancel].
+
+Нажмите kbd:[Tab] один раз для выбора btn:[OK], затем нажмите kbd:[Enter] для продолжения установки.
+
+[[bsdlabeleditor]]
+=== Создание разделов с помощью Disklabel
+
+Теперь вы должны создать несколько разделов внутри каждого только что созданного слайса. Запомните, что у каждого раздела есть буква с `a` до `h`, а разделы `b`, `c`, и `d` имеют соглашения, которых вы должны придерживаться.
+
+Некоторые приложения могут выигрывать от определенных схем разделов, особенно если у вас разделы на более чем одном диске. Тем не менее, для вашей первой установки FreeBSD не нужно слишком углубляться в принципы разбиения диска. Более важно установить FreeBSD и начать ее использовать. Вы всегда можете переустановить FreeBSD для изменения схемы разделов, когда поближе познакомитесь с операционной системой.
+
+Эта схема показывает четыре раздела - один для подкачки и три для файловых систем.
+
+.Планирование разделов для первого диска
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Раздел
+| Файловая система
+| Размер
+| Описание
+
+|`a`
+|[.filename]#/#
+|1 GB
+|Корневая файловая система. Любая другая файловая система будет смонтирована на эту. 1 GB это подходящий размер для этой файловой системы. Вы не будете хранить на ней слишком много данных, а обычная установка FreeBSD разместит здесь около 128 MB данных. Оставшееся пространство используется для временных файлов, а также оставляет возможность расширения для будущих версий FreeBSD, которым может понадобится больше места в [.filename]#/#.
+
+|`b`
+|N/A
+|2-3 x RAM
+|
+
+Раздел подкачки находится на разделе `b`. Выбор правильного размера раздела подкачки это немного искусство. Хороший практический способ выбрать размер подкачки это установить его равным двум или трем размерам доступной физической памяти (RAM). Должно быть хотя бы 64 MB подкачки; если в компьютере меньше чем 32 MB памяти - установите размер подкачки равным 64 MB.
+
+Если у вас больше одного диска, можно расположить подкачку на каждом диске. FreeBSD будет использовать каждый диск, что серьезно увеличит скорость подкачки. В этом случае, определите общий размер подкачки, который вам нужен (например, 128 MB), и поделите его на число имеющихся дисков (например, два) для определения размера разделов подкачки, которые нужно разместить на каждом вашем диске, в этом примере 64 MB на диск.
+
+|`e`
+|[.filename]#/var#
+|512 MB
+|Каталог [.filename]#/var# содержит файлы, которые постоянно меняются; логи и другие административные файлы. Многие из этих файлов интенсивно читаются и записываются в процессе ежедневной работы FreeBSD. Размещение их на отдельной файловой системе позволяет FreeBSD оптимизировать доступ к этим файлам без затрагивания других каталогов, не имеющих такой же модели доступа.
+
+|`f`
+|[.filename]#/usr#
+|Остальная часть диска (по крайней мере - 8 GB)
+|Все другие файлы как правило хранятся в каталоге [.filename]#/usr# и его подкаталогах.
+|===
+
+[WARNING]
+====
+
+Значения, приведённые выше, являются примерными и уместны к использованию лишь опытными пользователями. Остальным - рекомендуется применять опцию автоматического разбиения, называемую `Auto Defaults` в редакторе разделов FreeBSD.
+====
+
+Если вы устанавливаете FreeBSD более чем на один диск, вы должны также создать разделы в других слайсах, которые настроили. Простейший путь сделать это - создать два раздела на каждом диске, один для подкачки, а другой для файловой системы.
+
+.Разметка разделов для остальных дисков
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Раздел
+| Файловая система
+| Размер
+| Описание
+
+|`b`
+|N/A
+|Смотрите описание
+|Как уже обсуждалось, вы можете распространить подкачку на каждый диск. Даже если раздел `a` свободен, соглашение говорит о том, что подкачка находится на разделе `b`.
+
+|`e`
+|/disk_n_
+|Остальная часть диска
+|Остальная часть диска занята одним большим разделом. Он легко может быть помещен на раздел `a` вместо раздела `e`. Однако, соглашение говорит, что раздел `a` зарезервирован на слайсе для корневой ([.filename]#/#) файловой системы. вы можете не следовать этому соглашению, но программа sysinstall будет ему следовать, поэтому приняв его, вы сделаете установку несколько проще. Вы можете монтировать эти файловые системы к любой точке; в этом примере предлагается смонтировать их как каталоги [.filename]#/diskn#, где _n_ это номер, который уникален для каждого диска. Но вы можете использовать другую схему, если захотите.
+|===
+
+Теперь, выбрав разметку разделов, можете приступить к их созданию в sysinstall. Вы увидите это сообщение:
+
+[source,bash]
+....
+ Message
+ Now, you need to create BSD partitions inside of the fdisk
+ partition(s) just created. If you have a reasonable amount of disk
+ space (1 GB or more) and don't have any special requirements, simply
+ use the (A)uto command to allocate space automatically. If you have
+ more specific needs or just don't care for the layout chosen by
+ (A)uto, press F1 for more information on manual layout.
+
+ [ OK ]
+ [ Press enter or space ]
+....
+
+Нажмите kbd:[Enter] для запуска редактора разделов FreeBSD, называемого Disklabel.
+
+<<sysinstall-label>> показывает экран только что запущенного Disklabel. Экран поделен на три раздела.
+
+Первые несколько линий показывают имя диска, с которым вы сейчас работаете и слайс, содержащий раздел, который вы создаете (здесь Disklabel называет это `именем раздела (Partition name)` вместо имени слайса). Этот экран также показывает объем свободного пространства на слайсе, т.е. пространство, выделенное под слайс, но еще не отданное под раздел.
+
+В центре экрана показаны уже созданные разделы, имена файловых систем, содержащихся в разделах, их размер и некоторые опции, применяемые при создания файловых систем.
+
+Нижняя треть экрана показывает управляющие клавиши, работающие в Disklabel.
+
+[[sysinstall-label]]
+.Редактор Sysinstall Disklabel
+image::disklabel-ed1.png[]
+
+Disklabel может автоматически создать разделы и присвоить им размеры по умолчанию. Значения размеров по умолчанию вычисляются с помощью внутреннего алгоритма, исходя из емкости диска. Попробуйте это, нажав kbd:[A]. Вы увидите экран как на <<sysinstall-label2>>. В зависимости от размера диска, значения по умолчанию могут подходить или не подходить вам. Это не имеет значения, если вы не принимаете их.
+
+[NOTE]
+====
+По умолчанию под каталог [.filename]#/tmp# выделяется собственный раздел вместо использования части раздела [.filename]#/#. Это помогает избежать заполнения раздела [.filename]#/# временными файлами.
+====
+
+[[sysinstall-label2]]
+.Редактор Sysinstall Disklabel с установками по умолчанию
+image::disklabel-auto.png[]
+
+Если вы решили не использовать разделы по умолчанию и заменить их на свои, используйте клавиши навигации для выбора первого раздела, затем нажмите kbd:[D] для его удаления. Повторите это для удаления всех предложенных разделов.
+
+Для создания первого раздела (`a`, монтируемого как [.filename]#/# - root), убедитесь, что выбран соответствующий слайс вверху экрана и нажмите kbd:[C]. Появится диалог, предлагающий выбрать размер нового раздела (как показано на <<sysinstall-label-add>>). Вы можете ввести количество блоков диска, или количество мегабайт с `M` после номера, или гигабайт с `G`, или цилиндров с `C`.
+
+[[sysinstall-label-add]]
+.Свободное место для корневого раздела
+image::disklabel-root1.png[]
+
+Размер по умолчанию задан для создания корневого раздела на весь слайс. Если вы используете размеры разделов, описанные ранее в примере, удалите это значение используя kbd:[Backspace], а затем введите `512M`, как показано на <<sysinstall-label-add2>>. Затем нажмите btn:[OK].
+
+[[sysinstall-label-add2]]
+.Редактирование размера корневого раздела
+image::disklabel-root2.png[]
+
+После указания размера раздела вам будет задан вопрос, должен ли этот раздел содержать файловую систему или раздел подкачки. Диалог показан на <<sysinstall-label-type>>. Первый раздел будет содержать файловую систему, поэтому проверьте, что выбрана [.guimenuitem]#FS# и нажмите kbd:[Enter].
+
+[[sysinstall-label-type]]
+.Выбор типа корневого раздела
+image::disklabel-fs.png[]
+
+Наконец, поскольку вы создаете файловую систему, нужно сказать Disklabel где файловая система будет смонтирована. Диалог показан на <<sysinstall-label-mount>>. Точка монтирования корневой файловой системы [.filename]#/#, поэтому введите `/`, и нажмите kbd:[Enter].
+
+[[sysinstall-label-mount]]
+.Выбор точки монтирования корневой файловой системы
+image::disklabel-root3.png[]
+
+На экране будет показан вновь созданный раздел. Вам нужно повторить эту процедуру для других разделов. При создании раздела подкачки вопроса про точку монтирования не будет, поскольку раздел подкачки никогда не монтируется. Когда будете создавать последний раздел, [.filename]#/usr#, можете оставить предложенный размер как есть, чтобы использовать весь остаток слайса.
+
+Последний экран FreeBSD редактора DiskLabel будет похож на <<sysinstall-label4>>, хотя ваш выбор значений может быть другим. Нажмите kbd:[Q], чтобы выйти.
+
+[[sysinstall-label4]]
+.Редактор Sysinstall Disklabel
+image::disklabel-ed2.png[]
+
+[[install-choosing]]
+== Выбор устанавливаемых компонентов
+
+[[distset]]
+=== Выбор дистрибутивного набора (Distribution Set)
+
+Выбор дистрибутивного набора зависит в основном от направления будущего использования системы и от доступного дискового пространства. Предустановленные опции варьируются от наименьшей возможной конфигурации до полной установки. Для новичков в UNIX(R) и/или FreeBSD лучшим выбором будет одна из этих предустановленных опций. Настройка дистрибутивного набора как правило нужна более опытным пользователям.
+
+Нажмите kbd:[F1] для получения информации о дистрибутивных наборах и их содержимом. После просмотра помощи нажмите kbd:[Enter] для возврата к меню выбора дистрибутивного набора.
+
+Если желательно наличие графического интерфейса пользователя, то задачи настройки X сервера и выбора десктопа по умолчанию должны быть выполнены после установки FreeBSD. Более подробная информация по установке и настройке X сервера находится в crossref:x11[x11, X Window System].
+
+Если планируется пересборка ядра, выберите опцию, включающую исходные тексты. Информация о том, зачем пересобирать ядро и как это сделать, находится на crossref:kernelconfig[kernelconfig, Настройка ядра FreeBSD].
+
+Ясно, что наиболее универсальная система включает все. Если места на диске достаточно, выберите [.guimenuitem]#All#, как показано на <<distribution-set1>> и нажмите kbd:[Enter]. Если есть сомнения относительно того, хватит ли диска, используйте наиболее подходящую опцию. Не беспокойтесь о том, какой выбор будет наилучшим, другие части дистрибутива могут быть добавлены после установки.
+
+[[distribution-set1]]
+.Выбор дистрибутивных наборов
+image::dist-set.png[]
+
+[[portscol]]
+=== Установка Коллекции Портов
+
+После выбора подходящего дистрибутива можно будет выбрать установку Коллекции Портов FreeBSD. Коллекция Портов - лёгкий и удобный путь установки программ. Коллекция Портов не содержит исходных кодов программ. Это набор файлов, который автоматизирует загрузку, компилирование и установку пакетов программного обеспечения сторонних разработчиков. crossref:ports[ports, Установка приложений. порты и пакеты] показывает, как использовать Коллекцию Портов.
+
+Программа установки не проверяет, есть ли достаточно места. Выберите эту опцию только в том случае, если его достаточно. В FreeBSD {rel120-current}, Коллекция Портов занимает около {ports-size}. В более современных релизах это значение всегда больше.
+
+[source,bash]
+....
+ User Confirmation Requested
+ Would you like to install the FreeBSD ports collection?
+
+ This will give you ready access to over 24,000 ported software packages,
+ at a cost of around 500 MB of disk space when "clean" and possibly much
+ more than that if a lot of the distribution tarballs are loaded
+ (unless you have the extra CDs from a FreeBSD CD/DVD distribution
+ available and can mount it on /cdrom, in which case this is far less
+ of a problem).
+
+ The ports collection is a very valuable resource and well worth having
+ on your /usr partition, so it is advisable to say Yes to this option.
+
+ For more information on the ports collection & the latest ports,
+ visit:
+ http://www.FreeBSD.org/ports
+
+ [ Yes ] No
+....
+
+Выберите btn:[yes] для установки Коллекции Портов, или btn:[no], чтобы пропустить установку. Нажмите kbd:[Enter], чтобы продолжить. Меню выбора дистрибутивных наборов появится опять.
+
+[[distribution-set2]]
+.Подтверждение выбора дистрибутивного набора
+image::dist-set2.png[]
+
+Если вы согласны с выбранными опциями, переместитесь на [.guimenuitem]#Exit#, убедитесь, что выбран btn:[OK] и нажмите kbd:[Enter], чтобы продолжить.
+
+[[install-media]]
+== Выбор источника для установки
+
+При установке с CDROM или DVD используйте клавиши навигации, для перехода к пункту [.guimenuitem]#Install from a FreeBSD CD/DVD#. Убедитесь, что выбран btn:[OK], и нажмите kbd:[Enter] для запуска установки.
+
+При других методах установки выберите соответствующую опцию и следуйте инструкциям.
+
+Нажмите kbd:[F1] для просмотра справки по источникам установки. Нажмите kbd:[Enter] для возврата к меню выбора источника установки.
+
+[[choose-media]]
+.Выбор источника установки
+image::media.png[]
+
+[NOTE]
+.Режимы установки с FTP
+====
+Есть три режима установки через FTP, которые вы можете выбрать: активный FTP, пассивный FTP, или через HTTP прокси.
+
+Активный FTP: [.guimenuitem]#Install from an FTP server#::
+С этой опцией все закачки по FTP будут выполнены в "активном" режиме. Этот режим не позволяет работать через файрволл, но зачастую позволяет работать со старыми серверами FTP, не поддерживающими пассивный режим. Если соединение прерывается в пассивном режиме (по умолчанию), попробуйте активный!
+
+Пассивный FTP: [.guimenuitem]#Install from an FTP server through a firewall#::
+Эта опция говорит sysinstall использовать "пассивный" режим для работы с FTP. Он позволяет работать через файрволл, не разрешающий входящие соединения на случайных TCP портах.
+
+FTP через HTTP прокси: [.guimenuitem]#Install from an FTP server through a http proxy#::
+Эта опция говорит sysinstall использовать HTTP протокол (как Web-браузер) для работы с FTP через прокси. Прокси будет транслировать все запросы и посылать их на FTP сервер. Это позволяет проходить через файрволл, на котором FTP запрещен, но есть HTTP прокси. В этом случае потребуется указать прокси и FTP сервер.
+
+Для работы с FTP через прокси, необходимо поместить имя сервера как часть имени пользователя после знака "@". Прокси сервер "обманет" настоящий сервер. Например, предположим что вы хотите провести установку с `ftp.FreeBSD.org`, используя FTP через прокси `foo.example.com`, прослушивающем порт 1234.
+
+В этом случае, войдите в меню параметров, установите имя пользователя FTP `ftp@ftp.FreeBSD.org`, а вместо пароля введите свой адрес email. В качестве источника установки выберите FTP (или пассивный FTP, если прокси его поддерживает), и URL `ftp://foo.example.com:1234/pub/FreeBSD`.
+
+Так как [.filename]#/pub/FreeBSD# с сервера `ftp.FreeBSD.org` идет через прокси `foo.example.com`, вы сможете провести установку с _этого_ компьютера (файлы будут загружены с `ftp.FreeBSD.org` как требуется для установки).
+====
+
+[[install-final-warning]]
+== Подтверждение установки
+
+Теперь можно начинать установку. Это последний шанс отменить установку, и таким образом избежать изменений на жестком диске.
+
+[source,bash]
+....
+ User Confirmation Requested
+ Last Chance! Are you SURE you want to continue the installation?
+
+ If you're running this on a disk with data you wish to save then WE
+ STRONGLY ENCOURAGE YOU TO MAKE PROPER BACKUPS before proceeding!
+
+ We can take no responsibility for lost disk contents!
+
+ [ Yes ] No
+....
+
+Выберите btn:[yes] и нажмите kbd:[Enter], чтобы начать.
+
+Время установки сильно зависит от выбранного дистрибутивного набора, источника установки и скорости компьютера. Появится несколько сообщений о статусе процесса установки.
+
+Установка будет завершена, когда отобразится следующее сообщение:
+
+[source,bash]
+....
+ Message
+
+Congratulations! You now have FreeBSD installed on your system.
+
+We will now move on to the final configuration questions.
+For any option you do not wish to configure, simply select No.
+
+If you wish to re-enter this utility after the system is up, you may
+do so by typing: /usr/sbin/sysinstall.
+
+ [ OK ]
+
+ [ Press enter or space ]
+....
+
+Нажмите kbd:[Enter] для начала послеустановочной настройки.
+
+Выбор btn:[no] и нажатие kbd:[Enter] прервет процесс установки, изменения в систему внесены не будут. Появится следующее сообщение:
+
+[source,bash]
+....
+ Message
+Installation complete with some errors. You may wish to scroll
+through the debugging messages on VTY1 with the scroll-lock feature.
+You can also choose "No" at the next prompt and go back into the
+installation menus to retry whichever operations have failed.
+
+ [ OK ]
+....
+
+Это сообщение появилось, поскольку ничего не было установлено. Нажатие kbd:[Enter] вернет вас в главное меню установки, чтобы выйти из нее.
+
+[[install-post]]
+== После установки
+
+После успешной установки необходимо настроить множество параметров. Некоторые параметры могут быть заданы из меню параметров после установки, перед загрузкой установленной FreeBSD, или после нее с использованием `sysinstall`, где надо выбрать пункт [.guimenuitem]#Configure#.
+
+[[inst-network-dev]]
+=== Настройка сетевых устройств (Network Device Configuration)
+
+Если вы настраивали PPP для установки через FTP, этот экран не появится, и настройку можно будет произвести позже как описано выше.
+
+Чтобы лучше узнать о локальных сетях и настройке FreeBSD в качестве шлюза/маршрутизатора, обратитесь к главе crossref:advanced-networking[advanced-networking,Сложные вопросы работы в сети].
+
+[source,bash]
+....
+ User Confirmation Requested
+ Would you like to configure any Ethernet or PPP network devices?
+
+ [ Yes ] No
+....
+
+Для настройки сетевого устройства выберите btn:[yes] и нажмите kbd:[Enter]. Или нажмите btn:[no], чтобы продолжить.
+
+[[ed-config1]]
+.Выбор Ethernet устройства
+image::ed0-conf.png[]
+
+Выберите интерфейс для настройки с помощью клавиш навигации и нажмите kbd:[Enter].
+
+[source,bash]
+....
+ User Confirmation Requested
+ Do you want to try IPv6 configuration of the interface?
+
+ Yes [ No ]
+....
+
+Для частной локальной сети обычный протокол интернет (IPv4) вполне достаточен, поэтому выбрана кнопка btn:[no] и нажат kbd:[Enter].
+
+Если вы хотите подсоединиться к существующей сети IPv6 через сервер RA, выберите btn:[yes] и нажмите kbd:[Enter]. Поиск RA серверов займет несколько секунд.
+
+[source,bash]
+....
+ User Confirmation Requested
+ Do you want to try DHCP configuration of the interface?
+
+ Yes [ No ]
+....
+
+Если DHCP (Dynamic Host Configuration Protocol) не нужен, выберите btn:[no] с помощью клавиш навигации и нажмите kbd:[Enter].
+
+Выбор btn:[yes] запустит dhclient, и, если все пройдет нормально, заполнит информацию о конфигурации сети автоматически. Обратитесь к crossref:network-servers[network-dhcp,Автоматическая настройка сети (DHCP)] за более подробными сведениями.
+
+Следующий экран конфигурации сети показывает настройку устройства Ethernet системы, которая будет работать шлюзом для локальной сети.
+
+[[ed-config2]]
+.Настройка сети для _ed0_
+image::ed0-conf2.png[]
+
+Используйте kbd:[Tab] для выбора полей и заполнения их соответствующими данными:
+
+Host::
+Полное имя хоста, в этом примере `k6-2.example.com`.
+
+Domain::
+Имя домена, в котором находится ваш компьютер, в этом примере `example.com`.
+
+IPv4 Gateway::
+IP хоста, пересылающего пакеты наружу локальной сети. Вам потребуется заполнить его, если это компьютер, подключенный к сети. _Оставьте это поле пустым_, если компьютер является шлюзом в интернет для сети. Шлюз IPv4 известен также как шлюз по умолчанию или маршрут по умолчанию.
+
+Name server::
+IP адрес местного сервера DNS. В этой локальной сети нет DNS сервера, поэтому использован IP адрес DNS сервера провайдера (`208.163.10.2`).
+
+IPv4 address::
+IP адрес, использованный для этого интерфейса, `192.168.0.1`
+
+Netmask::
+Адрес блока, использованного для этой локальной сети, это `192.168.0.0` - `192.168.0.255`. с маской сети `255.255.255.0`.
+
+Дополнительные параметры для ifconfig::
+Любые специфичные для интерфейса опции к `ifconfig`, которые вы хотите добавить. В данном случае ничего.
+
+Используйте kbd:[Tab] для выбора btn:[OK] после окончания настройки и нажмите kbd:[Enter].
+
+[source,bash]
+....
+ User Confirmation Requested
+ Would you like to bring the ed0 interface up right now?
+
+ [ Yes ] No
+....
+
+Выбор btn:[yes] и нажатие kbd:[Enter] введет компьютер в сеть. Тем не менее, компьютеру все еще требуется перезагрузка.
+
+[[gateway]]
+=== Настройка шлюза (Configure Gateway)
+
+[source,bash]
+....
+ User Confirmation Requested
+ Do you want this machine to function as a network gateway?
+
+ [ Yes ] No
+....
+
+Если компьютер будет шлюзом для локальной сети, пересылая пакеты между другими компьютерами, выберите btn:[yes] и нажмите kbd:[Enter]. Если это обычный компьютер, выберите btn:[no] и нажмите kbd:[Enter] для продолжения.
+
+[[inetd-services]]
+=== Настройка сервисов интернет (Configure Internet Services)
+
+[source,bash]
+....
+ User Confirmation Requested
+Do you want to configure inetd and the network services that it provides?
+
+ Yes [ No ]
+....
+
+Если выбрана btn:[no], различные сервисы, такие как telnetd не будут запущены. Это означает, что удаленные пользователи не смогут зайти по telnet на этот компьютер. Локальные пользователи все же смогут заходит на удаленные компьютеры по telnet.
+
+Эти сервисы могут быть включены после установки путем редактирования [.filename]#/etc/inetd.conf# с помощью вашего любимого текстового редактора. Обращайтесь к crossref:network-servers[network-inetd-overview,Обзор] за более подробной информацией.
+
+Выберите btn:[yes] если хотите настроить эти сервисы во время установки. Появится дополнительный запрос подтверждения:
+
+[source,bash]
+....
+ User Confirmation Requested
+The Internet Super Server (inetd) allows a number of simple Internet
+services to be enabled, including finger, ftp and telnetd. Enabling
+these services may increase risk of security problems by increasing
+the exposure of your system.
+
+With this in mind, do you wish to enable inetd?
+
+ [ Yes ] No
+....
+
+Нажмите btn:[yes], чтобы продолжить.
+
+[source,bash]
+....
+ User Confirmation Requested
+inetd(8) relies on its configuration file, /etc/inetd.conf, to determine
+which of its Internet services will be available. The default FreeBSD
+inetd.conf(5) leaves all services disabled by default, so they must be
+specifically enabled in the configuration file before they will
+function, even once inetd(8) is enabled. Note that services for
+IPv6 must be separately enabled from IPv4 services.
+
+Select [Yes] now to invoke an editor on /etc/inetd.conf, or [No] to
+use the current settings.
+
+ [ Yes ] No
+....
+
+Выбор btn:[yes] позволит добавить сервисы путем удаления `#` перед началом строки.
+
+[[inetd-edit]]
+.Редактирование [.filename]#inetd.conf#
+image::edit-inetd-conf.png[]
+
+После добавления нужных сервисов нажатие kbd:[Esc] отобразит меню, позволяющее выйти с сохранением изменений.
+
+[[ssh-login]]
+=== Настройка входа по SSH
+
+[source,bash]
+....
+ User Confirmation Requested
+ Would you like to enable SSH login?
+ Yes [ No ]
+....
+
+Выбор btn:[yes] активирует запуск man:sshd[8] - демона для приложения OpenSSH, что в свою очередь позволит создавать безопасные удалённые соединения c вашей машиной. За более детальной информацией о OpenSSH обратитесь к crossref:security[openssh,OpenSSH].
+
+[[ftpanon]]
+=== Анонимный (Anonymous) FTP
+
+[source,bash]
+....
+ User Confirmation Requested
+ Do you want to have anonymous FTP access to this machine?
+
+ Yes [ No ]
+....
+
+[[deny-anon]]
+==== Запрещение анонимного FTP
+
+Выбор кнопки по умолчанию btn:[no] и нажатие kbd:[Enter] все же позволит пользователям, имеющим учетные записи с паролями, использовать FTP для доступа к компьютеру.
+
+[[ftpallow]]
+==== Разрешение анонимного FTP
+
+Кто угодно сможет получить доступ к компьютеру, если вы разрешите анонимные соединения FTP. Предварительно должны быть рассмотрены возможные проблемы с безопасностью. Более подробная информация о безопасности находится в crossref:security[security, Безопасность].
+
+Чтобы разрешить анонимный FTP, выберите btn:[yes], используя клавиши навигации, и нажмите kbd:[Enter]. От вас потребуется дополнительное подтверждение:
+
+[source,bash]
+....
+ User Confirmation Requested
+ Anonymous FTP permits un-authenticated users to connect to the system
+ FTP server, if FTP service is enabled. Anonymous users are
+ restricted to a specific subset of the file system, and the default
+ configuration provides a drop-box incoming directory to which uploads
+ are permitted. You must separately enable both inetd(8), and enable
+ ftpd(8) in inetd.conf(5) for FTP services to be available. If you
+ did not do so earlier, you will have the opportunity to enable inetd(8)
+ again later.
+
+ If you want the server to be read-only you should leave the upload
+ directory option empty and add the -r command-line option to ftpd(8)
+ in inetd.conf(5)
+
+ Do you wish to continue configuring anonymous FTP?
+
+ [ Yes ] No
+....
+
+В этом сообщении сказано: если вы хотите разрешить анонимный FTP доступ, то вам также придется активировать (см. <<inetd-services>>) сам сервис FTP в [.filename]#/etc/inetd.conf#. Выберите btn:[yes], нажмите kbd:[Enter], далее отобразится следующий экран:
+
+[[anon-ftp2]]
+.Настройка по анонимного FTP по умолчанию
+image::ftp-anon1.png[]
+
+Используя kbd:[Tab] для выбора полей ввода, заполните соответствующую информацию:
+
+UID::
+Идентификатор, который вы намереваетесь присвоить анонимному пользователю FTP. Файлам, загруженным на FTP, будет присвоен этот идентификатор.
+
+Group::
+В эту группу будет входить анонимный пользователь FTP.
+
+Comment::
+Строка с описанием анонимного пользователя; она будет внесена в [.filename]#/etc/passwd#.
+
+FTP Root Directory::
+Часть иерархии файловой системы, в которой будут храниться файлы, доступные анонимному пользователю FTP.
+
+Upload Subdirectory::
+Подкаталог, доступный на запись анонимному пользователю FTP.
+
+Корневой каталог FTP по умолчанию будет размещен в [.filename]#/var#. Если в нем предположительно не хватает места для для нужд FTP, можно использовать каталог [.filename]#/usr#, выбрав корневой каталог FTP (FTP root directory) [.filename]#/usr/ftp#.
+
+Когда будут выбраны подходящие значения, нажмите kbd:[Enter], чтобы продолжить.
+
+[source,bash]
+....
+ User Confirmation Requested
+ Create a welcome message file for anonymous FTP users?
+
+ [ Yes ] No
+....
+
+Если вы выберете btn:[yes] и нажмете kbd:[Enter], запустится редактор, позволяющий отредактировать сообщение FTP.
+
+[[anon-ftp4]]
+.Редактирование FTP Welcome Message
+image::ftp-anon2.png[]
+
+Этот текстовый редактор называется `ee`. Используйте инструкции, чтобы изменить сообщение, или измените сообщение позже, используя выбранный вами редактор. Обратите внимание, что имя/расположение файла показаны внизу окна редактора.
+
+Нажмите kbd:[Esc] и появится меню с пунктом по умолчанию [.guimenuitem]#a) leave editor# (выйти из редактора). Нажмите kbd:[Enter], чтобы выйти и продолжить. Нажмите kbd:[Enter] еще раз, чтобы сохранить изменения, если они были сделаны.
+
+[[nfsconf]]
+=== Настройка сетевой файловой системы (Configure Network File System)
+
+Сетевая файловая система (Network File System, NFS) позволяет совместно использовать файлы в сети. Компьютер может быть настроен как сервер, клиент, или как то и другое. Обратитесь к crossref:network-servers[network-nfs,Network File System (NFS)] за более подробной информацией.
+
+[[nsf-server-options]]
+==== Сервер NFS (NFS Server)
+
+[source,bash]
+....
+ User Confirmation Requested
+ Do you want to configure this machine as an NFS server?
+
+ Yes [ No ]
+....
+
+Если вам не нужен NFS сервер, выберите btn:[no] и нажмите kbd:[Enter].
+
+Если выбран пункт btn:[yes], появится сообщение, говорящее о том, что должен быть создан файл [.filename]#exports#.
+
+[source,bash]
+....
+ Message
+Operating as an NFS server means that you must first configure an
+/etc/exports file to indicate which hosts are allowed certain kinds of
+access to your local filesystems.
+Press [Enter] now to invoke an editor on /etc/exports
+ [ OK ]
+....
+
+Нажмите kbd:[Enter], чтобы продолжить. Запустится текстовый редактор, позволяющий создать и отредактировать файл [.filename]#exports#.
+
+[[nfs-server-edit]]
+.Редактирование [.filename]#exports#
+image::nfs-server-edit.png[]
+
+Используйте инструкции для добавления экспортируемых файловых систем сейчас, или позднее с помощью выбранного вами текстового редактора. Обратите внимание, что имя/расположение файла показаны внизу окна редактора.
+
+Нажмите kbd:[Esc] и появится меню с пунктом по умолчанию [.guimenuitem]#a) leave editor#. Нажмите kbd:[Enter], чтобы выйти и продолжить.
+
+[[nfs-client-options]]
+==== Клиент NFS (NFS Client)
+
+NFS клиент позволяет организовать доступ к серверам NFS.
+
+[source,bash]
+....
+ User Confirmation Requested
+ Do you want to configure this machine as an NFS client?
+
+ Yes [ No ]
+....
+
+С помощью клавиш навигации выберите btn:[yes] или btn:[no], как потребуется, и нажмите kbd:[Enter].
+
+[[console]]
+=== Настройки системной консоли (System Console Settings)
+
+Есть несколько параметров для настройки системной консоли.
+
+[source,bash]
+....
+ User Confirmation Requested
+ Would you like to customize your system console settings?
+
+ [ Yes ] No
+....
+
+Для просмотра и настройки параметров выберите btn:[yes] и нажмите kbd:[Enter].
+
+[[saver-options]]
+.Параметры настройки системной консоли
+image::console-saver1.png[]
+
+Часто используемая опция это хранитель экрана (screen saver). Используйте клавиши навигации для выбора [.guimenuitem]#Saver# и нажмите kbd:[Enter].
+
+[[saver-select]]
+.Параметры хранителя экрана
+image::console-saver2.png[]
+
+Выберите подходящий хранитель экрана с помощью клавиш навигации и нажмите kbd:[Enter]. Опять появится меню настройки системной консоли.
+
+Время по умолчанию 300 секунд. Для изменения временного интервала выберите [.guimenuitem]#Saver# еще раз. В меню настроек хранителя экрана выберите [.guimenuitem]#Timeout# с помощью клавиш навигации и нажмите kbd:[Enter]. Появится меню:
+
+[[saver-timeout]]
+.Временной интервал хранителя экрана
+image::console-saver3.png[]
+
+Значение может быть изменено, затем выберите btn:[OK] и нажмите kbd:[Enter] для возврата в меню настройки системной консоли.
+
+[[saver-exit]]
+.Выход из меню конфигурации консоли
+image::console-saver4.png[]
+
+Выбор [.guimenuitem]#Exit# и нажатие kbd:[Enter] вернет вас к послеустановочной настройке.
+
+[[timezone]]
+=== Установка часового пояса (Setting The Time Zone)
+
+Установка часового пояса на компьютере позволит ему автоматически вносить поправки к местному времени и правильно выполнять другие, связанные с часовым поясом функции.
+
+Пример приведен для компьютера, расположенного в восточном часовом поясе Соединенных Штатов. Ваш выбор будет зависеть от вашего географического положения.
+
+[source,bash]
+....
+ User Confirmation Requested
+ Would you like to set this machine's time zone now?
+
+ [ Yes ] No
+....
+
+Выберите btn:[yes] и нажмите kbd:[Enter] для установки часового пояса.
+
+[source,bash]
+....
+ User Confirmation Requested
+ Is this machine's CMOS clock set to UTC? If it is set to local time
+ or you don't know, please choose NO here!
+
+ Yes [ No ]
+....
+
+Выберите btn:[yes] или btn:[no] в зависимости от настроек часов компьютера и нажмите kbd:[Enter].
+
+[[set-timezone-region]]
+.Выбор региона
+image::timezone1.png[]
+
+Соответствующий регион выбран с помощью клавиш навигации и нажат kbd:[Enter].
+
+[[set-timezone-country]]
+.Выбор страны
+image::timezone2.png[]
+
+Выберите соответствующую страну с помощью клавиш навигации и нажмите kbd:[Enter].
+
+[[set-timezone-locality]]
+.Выбор часового пояса
+image::timezone3.png[]
+
+Выбран соответствующий часовой пояс с помощью клавиш навигации и нажат kbd:[Enter].
+
+[source,bash]
+....
+ Confirmation
+ Does the abbreviation 'EDT' look reasonable?
+
+ [ Yes ] No
+....
+
+Правильно будет согласиться с назначением аббревиатуры временного пояса. Если она подходит, нажмите kbd:[Enter], чтобы продолжить послеустановочную настройку.
+
+[[mouse]]
+=== Настройка мыши (Mouse Settings)
+
+Эти настройки позволят вырезать и вставлять текст в консоли и пользовательских программах с помощью трехкнопочной мыши. Если используется двухкнопочная мышь, обратитесь к странице справочника man:moused[8] после установки, чтобы узнать подробности об эмуляции трехкнопочной мыши. Этот пример приведен для настройки не-USB мыши (например мыши для порта PS/2 или COM):
+
+[source,bash]
+....
+ User Confirmation Requested
+ Does this system have a PS/2, serial, or bus mouse?
+
+ [ Yes ] No
+....
+
+Выберите btn:[yes] для PS/2 мыши, последовательной мыши или мыши типа bus mouse. Выберите btn:[no] для USB мыши и нажмите kbd:[Enter].
+
+[[mouse-protocol]]
+.Выбор протокола мыши
+image::mouse1.png[]
+
+Используйте клавиши навигации для выбора [.guimenuitem]#Type# и нажмите kbd:[Enter].
+
+[[set-mouse-protocol]]
+.Установка протокола мыши
+image::mouse2.png[]
+
+В этом примере использована PS/2 мышь, поэтому подойдет протокол по умолчанию [.guimenuitem]#Auto#. Чтобы изменить протокол, используйте клавиши навигации для выбора другого пункта. Убедитесь, что выбран btn:[OK], и нажмите kbd:[Enter] для выхода из меню.
+
+[[config-mouse-port]]
+.Настройка порта мыши
+image::mouse3.png[]
+
+Используйте клавиши навигации для выбора [.guimenuitem]#Port# и нажмите kbd:[Enter].
+
+[[set-mouse-port]]
+.Установка порта мыши
+image::mouse4.png[]
+
+К этой системе подключена мышь PS/2, поэтому подходит значение по умолчанию [.guimenuitem]#PS/2#. Чтобы изменить порт, используйте клавиши навигации и нажмите kbd:[Enter].
+
+[[test-daemon]]
+.Запуск даемона мыши
+image::mouse5.png[]
+
+Наконец, используйте клавиши навигации для выбора [.guimenuitem]#Enable#, затем нажмите kbd:[Enter] для запуска и тестирования даемона мыши.
+
+[[test-mouse-daemon]]
+.Проверка даемона мыши
+image::mouse6.png[]
+
+Подвигайте курсор по экрану и убедитесь, что он движется правильно. Если это так, выберите btn:[yes] и нажмите kbd:[Enter]. Если нет, мышь не была правильно настроена - выберите btn:[no] и попробуйте использовать другие опции настройки.
+
+Выберите [.guimenuitem]#Exit# с помощью клавиш навигации и нажмите kbd:[Enter] для возврата к послеустановочной настройке.
+
+[[packages]]
+=== Установка пакетов (Install Packages)
+
+Пакеты - это прекомпилированные бинарные файлы и это удобный способ установки программ.
+
+В качестве примера показана установка одного пакета. Если потребуется, можно установить дополнительные пакеты. После установки для добавления пакетов может быть использована команда `sysinstall`.
+
+[source,bash]
+....
+ User Confirmation Requested
+ The FreeBSD package collection is a collection of hundreds of
+ ready-to-run applications, from text editors to games to WEB servers
+ and more. Would you like to browse the collection now?
+
+ [ Yes ] No
+....
+
+Выбор [.guimenuitem]#[ Yes ]# и нажатие kbd:[Enter] приведет к появлению экрана выбора пакетов:
+
+[[package-category]]
+.Выбор категории пакетов
+image::pkg-cat.png[]
+
+Только пакеты с текущего носителя доступны для установки в любое время.
+
+Все доступные пакеты будут показаны если выбрать категорию [.guimenuitem]#All#, можно также выбирать отдельные категории. Перейдите к выбранной категории с помощью клавиш навигации и нажмите kbd:[Enter].
+
+Появится меню, содержащее доступные в данной категории пакеты.
+
+[[package-select]]
+.Выбор пакетов
+image::pkg-sel.png[]
+
+Выбрана оболочка bash. Выберите все необходимые пакеты, перемещаясь по меню и нажимая клавишу пробела на выбираемых пакетах. Краткое описание пакета будет появляться в нижней левой части экрана.
+
+Нажатие kbd:[Tab] переключает между последним выбранным пакетом, btn:[OK], и btn:[Cancel].
+
+После того, как будет закончена отметка пакетов для установки, нажмите kbd:[Tab] один раз для переключения на btn:[OK] и нажмите kbd:[Enter] для переключения на меню выбора пакетов.
+
+Нажимая клавиши навигации влево или вправо, можно переключаться между btn:[OK] и btn:[Cancel]. Этот метод может быть применен также для выбора btn:[OK] и возврата к меню выбора пакетов нажатием kbd:[Enter].
+
+[[package-install]]
+.Установка пакетов
+image::pkg-install.png[]
+
+Используйте kbd:[Tab] и клавиши навигации для выбора btn:[Install] и нажмите kbd:[Enter]. вам потребуется подтвердить установку пакетов:
+
+[[package-install-confirm]]
+.Подтверждение установки пакетов
+image::pkg-confirm.png[]
+
+Выбор btn:[OK] и нажатие kbd:[Enter] запустит установку пакетов. Во время установки будут выдаваться сообщения. Обратите внимание на возможные сообщения об ошибках.
+
+После установки пакетов настройка продолжится. Если вы не выбрали ни один из пакетов и хотите вернуться к завершению настройки, выберите btn:[Install] в любом случае.
+
+[[addusers]]
+=== Добавление пользователей/групп (Add Users/Groups)
+
+В процессе установки нужно добавить хотя бы одного пользователя, чтобы использовать систему без входа под `root`. Корневой каталог обычно мал и запуск приложений под `root` быстро заполнит его. Ниже показано предупреждение:
+
+[source,bash]
+....
+ User Confirmation Requested
+ Would you like to add any initial user accounts to the system? Adding
+ at least one account for yourself at this stage is suggested since
+ working as the "root" user is dangerous (it is easy to do things which
+ adversely affect the entire system).
+
+ [ Yes ] No
+....
+
+Выберите btn:[yes] и нажмите kbd:[Enter], чтобы продолжить добавление пользователя.
+
+[[add-user2]]
+.Выбор User (пользователь)
+image::adduser1.png[]
+
+Выберите [.guimenuitem]#User# с помощью клавиш навигации и нажмите kbd:[Enter].
+
+[[add-user3]]
+.Вод информации о пользователе
+image::adduser2.png[]
+
+При выборе полей с помощью kbd:[Tab] в нижней части экрана будет появляться описание, помогающее ввести необходимую информацию:
+
+Логин (Login ID)::
+Имя нового пользователя (обязательно).
+
+UID::
+Числовой ID (идентификатор) для этого пользователя (оставьте пустым для автоматического выбора).
+
+Группа (Group)::
+Имя группы этого пользователя (оставьте пустым для автоматического выбора).
+
+Пароль (Password)::
+Пароль этого пользователя (заполняйте это поле с осторожностью!).
+
+Полное имя::
+Полное имя пользователя (комментарий).
+
+Член групп (Member groups)::
+Группы, к которым принадлежит пользователь (т.е. имеет права доступа).
+
+Домашний каталог (Home directory)::
+Домашний каталог пользователя (оставьте пустым для выбора по умолчанию).
+
+Оболочка (Login shell)::
+Оболочка пользователя, запускаемая при входе в систему (оставьте пустым для оболочки по умолчанию, например [.filename]#/bin/sh#).
+
+Оболочка была изменена с [.filename]#/bin/sh# на [.filename]#/usr/local/bin/bash# для использования bash, которая была перед этим установлена из пакета. Не пытайтесь использовать несуществующую оболочку, вы не сможете войти в систему. Наиболее часто используемая в мире BSD оболочка это C shell, которую можно обозначить как [.filename]#/bin/tcsh#.
+
+Пользователь был добавлен в группу `wheel`, чтобы иметь возможность стать суперпользователем с привилегиями `root`.
+
+Когда все будет введено, нажмите btn:[OK] и меню управления пользователями и группами (User and Group Management) появится снова:
+
+[[add-user4]]
+.Выход из меню управления пользователями и группами
+image::adduser3.png[]
+
+Сейчас также можно добавить группы, если известно, для чего они потребуются. Иначе в это меню можно войти, запустив `sysinstall` после окончания установки.
+
+После завершения добавления пользователей, выберите [.guimenuitem]#Exit# с помощью клавиш навигации и нажмите kbd:[Enter] для продолжения установки.
+
+[[rootpass]]
+=== Установка пароля `root`
+
+[source,bash]
+....
+ Message
+ Now you must set the system manager's password.
+ This is the password you'll use to log in as "root".
+
+ [ OK ]
+
+ [ Press enter or space ]
+....
+
+Нажмите kbd:[Enter] для установки пароля `root`.
+
+Необходимо два раза правильно ввести пароль. Излишне упоминать, что должна быть возможность восстановления пароля, если вы его забудете. Обратите внимание, что ни набираемый пароль, ни звездочки на экран не выдаются.
+
+[source,bash]
+....
+New password:
+Retype new password :
+....
+
+Установка продолжится после успешного ввода пароля.
+
+[[exit-inst]]
+=== Выход из установки (Exiting Install)
+
+Если нужно настроить <<network-services,дополнительные сетевые устройства>>, или произвести другие настройки, вы можете сделать это сейчас или после установки с помощью `sysinstall`.
+
+[source,bash]
+....
+ User Confirmation Requested
+ Visit the general configuration menu for a chance to set any last
+ options?
+
+ Yes [ No ]
+....
+
+Выберите btn:[no] с помощью клавиш навигации и нажмите kbd:[Enter] для возврата к главному меню установки.
+
+[[final-main]]
+.Выход из установки
+image::mainexit.png[]
+
+Выберите btn:[X Exit Install] с помощью клавиш навигации и нажмите kbd:[Enter]. Будет задан вопрос о подтверждении выхода из установки:
+
+[source,bash]
+....
+ User Confirmation Requested
+ Are you sure you wish to exit? The system will reboot.
+
+ [ Yes ] No
+....
+
+Выберите btn:[yes]. Если вы загружались с привода CDROM, следующее сообщение напомнит вам о необходимости извлечь диск:
+
+[source,bash]
+....
+ Message
+ Be sure to remove the media from the drive.
+
+ [ OK ]
+ [ Press enter or space ]
+....
+
+CDROM заблокирован, пока компьютер не начнет перегружаться. CDROM будет разблокирован и диск нужно будет извлечь из привода (быстро). Выберите btn:[OK].
+
+Система начнет перезагрузку, смотрите за сообщениями об ошибках, которые могут появиться. За подробностями по процессу загрузки обратитесь к <<freebsdboot>>.
+
+[[network-services]]
+=== Настройка дополнительных сетевых сервисов
+
+Настройка сетевых сервисов может быть пугающей задачей для новых пользователей, если у них нет опыта в этой области. Работа в сети, включая интернет, критична для многих современных операционных систем, включая FreeBSD; очень важно иметь некоторые знания о дополнительных сетевых возможностях FreeBSD. Настраивая их во время установки, пользователь получает некоторую информацию о различных доступных сервисах.
+
+Сетевые сервисы - это программы, принимающие данные из любой точки сети. Чтобы убедиться, что эти программы не делают ничего "вредного", требуется особое внимание. К сожалению, программисты не совершенны и время от времени допускают ошибки в сетевых сервисах; эти ошибки позволяют атакующим взломать их и использовать в собственных целях. Важно, чтобы вы включали сетевые сервисы только в том случае, если знаете, какие сервисы нужны. В случае сомнений лучше не включать сервис, пока он не понадобится. Вы всегда можете включить его позже, запустив sysinstall еще раз, или используя возможности, предоставляемые файлом [.filename]#/etc/rc.conf#.
+
+Выбор опции menu:Networking[] отобразит меню, похожее на это:
+
+[[network-configuration]]
+.Верхняя часть меню настройки сети (Network Configuration)
+image::net-config-menu1.png[]
+
+Первая опция, [.guimenuitem]#Interfaces# (интерфейсы), была ранее описана в <<inst-network-dev>>, эту опцию можно проигнорировать.
+
+Выбор опции [.guimenuitem]#AMD# добавит поддержку BSD утилиты автоматического монтирования. Она обычно используется вместе с протоколом NFS (смотрите ниже) для автоматического монтирования удаленных файловых систем. Здесь не требуется специальной конфигурации.
+
+Следующая линия это опция флаги [.guimenuitem]#AMD# (flags). Когда эта опция выбрана, появится меню для ввода специфичных флагов AMD. Меню уже содержит набор различных опций:
+
+[source,bash]
+....
+-a /.amd_mnt -l syslog /host /etc/amd.map /net /etc/amd.map
+....
+
+Опция `-a` указывает месторасположение монтирования систем по умолчанию, в этом примере [.filename]#/.amd_mnt#. Опция `-l` указывает [.filename]#log# файл по умолчанию; тем не менее, если для ведения логов используется `syslogd`, все логи отправляются даемону системных логов. Каталог [.filename]#/host# используется для монтирования экспортированных файловых систем с удаленного хоста, а [.filename]#/net# для монтирования экспортированных файловых систем с IP адреса. Файл [.filename]#/etc/amd.map# определяет опции по умолчанию для монтируемых AMD каталогов.
+
+Опция [.guimenuitem]#Anon FTP# позволяет получить анонимный доступ к FTP. Выберите ее, чтобы сделать этот компьютер анонимным FTP сервером. Помните о риске безопасности, создаваемом этой опцией. Будет отображено еще одно меню для разъяснения риска безопасности и для более тонкой настройки.
+
+Опция [.guimenuitem]#Gateway# сделает компьютер шлюзом, как было объяснено ранее. Этот пункт может быть использован для отмены опции [.guimenuitem]#Gateway#, если она была ошибочно установлена в процессе установки.
+
+Опцию [.guimenuitem]#Inetd# можно использовать для настройки или полного отключения даемона man:inetd[8], как было описано выше.
+
+Опция [.guimenuitem]#Mail# используется для настройки системного MTA по умолчанию (Mail Transfer Agent, агент передачи почты). Выбор этой опции приведет к появлению следующего меню:
+
+[[mta-selection]]
+.Выбор MTA по умолчанию
+image::mta-main.png[]
+
+Здесь предоставляется выбор MTA для установки по умолчанию. MTA это почтовый сервер, доставляющий почту пользователям системы или интернет.
+
+Выбор [.guimenuitem]#Sendmail# приведет к установке популярного сервера sendmail, MTA по умолчанию для FreeBSD. Опция [.guimenuitem]#Sendmail local# настроит sendmail в качестве MTA по умолчанию, но отключит возможность получения входящей почты из интернет. Другие MTA, представленные здесь, [.guimenuitem]#Postfix# и [.guimenuitem]#Exim#, действуют подобно [.guimenuitem]#Sendmail#. Оба они доставляют почту; тем не менее, некоторые пользователи предпочитают эти альтернативы sendmail.
+
+После выбора MTA или пропуска этого пункта появится меню настройки сети со следующей опцией, клиент [.guimenuitem]#NFS#.
+
+Клиент [.guimenuitem]#NFS# позволяет настроить систему для соединения с сервером через NFS. Сервер NFS дает другим машинам доступ к файловой системе через протокол NFS. Если это отдельно стоящий компьютер, опцию можно не выбирать. NFS может потребовать дополнительной настройки позже; обращайтесь к crossref:network-servers[network-nfs,Network File System (NFS)] за более подробной информацией о настройке сервера и клиента.
+
+Ниже находится опция [.guimenuitem]#NFS# сервер, позволяющая вам настроить систему для работы в качестве NFS сервера. Она добавляет требуемую информацию для запуска процедуры вызова удаленных сервисов RPC (remote procedure call services). RPC используется для организации соединения между хостами и программами.
+
+Следующая строка это [.guimenuitem]#Ntpdate#, которая отвечает за синхронизацию времени. Когда эта опция выбрана, появится приблизительно такое меню:
+
+[[Ntpdate-config]]
+.Настройка Ntpdate
+image::ntp-config.png[]
+
+Выберите из этого меню ближайший к вашему местонахождению сервер. Выбор ближайшего сервера сделает синхронизацию времени более точной, поскольку у более дальнего сервера может быть более длинная задержка соединения.
+
+Следующая опция это выбор PCNFSD. Эта опция устанавливает пакет package:net/pcnfsd[] из Коллекции Портов. Это полезная утилита, предоставляющая сервисы авторизации NFS для систем, в которых собственная отсутствует, таких как Microsoft MS-DOS(R).
+
+Теперь вы можете прокрутить меню немного вниз, чтобы увидеть другие опции:
+
+[[Network-configuration-cont]]
+.Нижняя часть меню настройки сети
+image::net-config-menu2.png[]
+
+Утилиты man:rpcbind[8], man:rpc.statd[8] и man:rpc.lockd[8] для удаленного вызова процедур (Remote Procedure Calls, RPC). Утилита `rpcbind` управляет соединением между NFS серверами и клиентами, она требуется серверу NFS для корректной работы. Даемон rpc.statd взаимодействует с даемонами rpc.statd на других хостах для обеспечения мониторинга статуса. Полученный статус обычно хранится в файле [.filename]#/var/db/statd.status#. Последняя опция это [.guimenuitem]#rpc.lockd#, которая, будучи выбранной, предоставляет сервисы блокировки файлов. Она обычно используется с rpc.statd для отслеживания хостов, запрашивающих блокировки и частоты этих запросов. Хотя две последние опции прекрасно подходят для отладки, они не требуются серверам и клиентам NFS для корректной работы.
+
+Ниже в списке опций находится [.guimenuitem]#Routed#, даемон маршрутизации. Утилита man:routed[8] управляет сетевыми таблицами маршрутизации, обнаруживает широковещательные маршрутизаторы, и предоставляет копию таблиц маршрутизации любому физически подключенному к сети хосту по запросу. Это обычно используется компьютерами, являющимися шлюзом для локальной сети. Когда эта опция выбрана, появится меню выбора местоположения утилиты по умолчанию. Значение по умолчанию уже выбрано, чтобы подтвердить его нажмите kbd:[Enter]. Появится следующее меню, запрашивающее флаги для routed. По умолчанию это флаг `-q`, он должен уже быть на экране.
+
+На следующей линии находится опция [.guimenuitem]#Rwhod#, выбор которой приведет к запуску даемона man:rwhod[8] при старте системы. Утилита `rwhod` периодически рассылает широковещательные системные сообщения по сети или собирает их в режиме "потребителя". Дополнительную информацию можно найти на страницах справочника man:ruptime[1] и man:rwho[1].
+
+Следующая перед последней опцией в списке это даемон man:sshd[8]. Это сервер безопасной оболочки (secure shell) из OpenSSH и он настоятельно рекомендуется для использования вместо стандартных серверов telnet и FTP. Сервер sshd используется для создания безопасных соединений от одного хоста к другому с использованием шифрования.
+
+И наконец, опция [.guimenuitem]#TCP# Extensions. Она включает расширения TCP, определенные в RFC 1323 и RFC 1644. Хотя для многих хостов они могут повысить скорость соединения, с другими соединение может быть оборвано. Для серверов эти расширения не рекомендуются, но клиентским компьютерам могут дать некоторые преимущества.
+
+Теперь, после настройки сетевых сервисов, вы можете прокрутить меню к верхнему пункту, [.guimenuitem]#X Exit#, и перейти к следующему шагу, или же просто покинуть sysinstall, дважды нажав [.guimenuitem]#X Exit#, а после - btn:[X Exit Install].
+
+[[freebsdboot]]
+=== Загрузочный процесс FreeBSD (FreeBSD Bootup)
+
+[[freebsdboot-i386]]
+==== Загрузка FreeBSD/i386
+
+Если все пройдет нормально, вы увидите прокручивающиеся за экран сообщения, затем приглашение ко входу в систему. Вы может просмотреть сообщения, нажав kbd:[Scroll-Lock] и используя kbd:[PgUp] и kbd:[PgDn]. Нажатие kbd:[Scroll-Lock] еще раз вернет вас к приглашению.
+
+Все сообщение может не отобразиться (ограничение буфера), но может быть просмотрено путем ввода команды `dmesg` в командной строке.
+
+Войдите, используя имя пользователя/пароль, добавленные во время установки (`rpratt` в этом примере). Избегайте входа под `root`, если это не требуется.
+
+Типичные сообщения при загрузке (информация о версии удалена):
+
+[source,bash]
+....
+Copyright (c) 1992-2002 The FreeBSD Project.
+Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
+ The Regents of the University of California. All rights reserved.
+
+Timecounter "i8254" frequency 1193182 Hz
+CPU: AMD-K6(tm) 3D processor (300.68-MHz 586-class CPU)
+ Origin = "AuthenticAMD" Id = 0x580 Stepping = 0
+ Features=0x8001bf<FPU,VME,DE,PSE,TSC,MSR,MCE,CX8,MMX>
+ AMD Features=0x80000800<SYSCALL,3DNow!>
+real memory = 268435456 (262144K bytes)
+config> di sn0
+config> di lnc0
+config> di le0
+config> di ie0
+config> di fe0
+config> di cs0
+config> di bt0
+config> di aic0
+config> di aha0
+config> di adv0
+config> q
+avail memory = 256311296 (250304K bytes)
+Preloaded elf kernel "kernel" at 0xc0491000.
+Preloaded userconfig_script "/boot/kernel.conf" at 0xc049109c.
+md0: Malloc disk
+Using $PIR table, 4 entries at 0xc00fde60
+npx0: <math processor> on motherboard
+npx0: INT 16 interface
+pcib0: <Host to PCI bridge> on motherboard
+pci0: <PCI bus> on pcib0
+pcib1: <VIA 82C598MVP (Apollo MVP3) PCI-PCI (AGP) bridge> at device 1.0 on pci0
+pci1: <PCI bus> on pcib1
+pci1: <Matrox MGA G200 AGP graphics accelerator> at 0.0 irq 11
+isab0: <VIA 82C586 PCI-ISA bridge> at device 7.0 on pci0
+isa0: <ISA bus> on isab0
+atapci0: <VIA 82C586 ATA33 controller> port 0xe000-0xe00f at device 7.1 on pci0
+ata0: at 0x1f0 irq 14 on atapci0
+ata1: at 0x170 irq 15 on atapci0
+uhci0: <VIA 83C572 USB controller> port 0xe400-0xe41f irq 10 at device 7.2 on pci0
+usb0: <VIA 83C572 USB controller> on uhci0
+usb0: USB revision 1.0
+uhub0: VIA UHCI root hub, class 9/0, rev 1.00/1.00, addr 1
+uhub0: 2 ports with 2 removable, self powered
+chip1: <VIA 82C586B ACPI interface> at device 7.3 on pci0
+ed0: <NE2000 PCI Ethernet (RealTek 8029)> port 0xe800-0xe81f irq 9 at
+device 10.0 on pci0
+ed0: address 52:54:05:de:73:1b, type NE2000 (16 bit)
+isa0: too many dependant configs (8)
+isa0: unexpected small tag 14
+fdc0: <NEC 72065B or clone> at port 0x3f0-0x3f5,0x3f7 irq 6 drq 2 on isa0
+fdc0: FIFO enabled, 8 bytes threshold
+fd0: <1440-KB 3.5" drive> on fdc0 drive 0
+atkbdc0: <keyboard controller (i8042)> at port 0x60-0x64 on isa0
+atkbd0: <AT Keyboard> flags 0x1 irq 1 on atkbdc0
+kbd0 at atkbd0
+psm0: <PS/2 Mouse> irq 12 on atkbdc0
+psm0: model Generic PS/2 mouse, device ID 0
+vga0: <Generic ISA VGA> at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0
+sc0: <System console> at flags 0x1 on isa0
+sc0: VGA <16 virtual consoles, flags=0x300>
+sio0 at port 0x3f8-0x3ff irq 4 flags 0x10 on isa0
+sio0: type 16550A
+sio1 at port 0x2f8-0x2ff irq 3 on isa0
+sio1: type 16550A
+ppc0: <Parallel port> at port 0x378-0x37f irq 7 on isa0
+ppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode
+ppc0: FIFO with 16/16/15 bytes threshold
+ppbus0: IEEE1284 device found /NIBBLE
+Probing for PnP devices on ppbus0:
+plip0: <PLIP network interface> on ppbus0
+lpt0: <Printer> on ppbus0
+lpt0: Interrupt-driven port
+ppi0: <Parallel I/O> on ppbus0
+ad0: 8063MB <IBM-DHEA-38451> [16383/16/63] at ata0-master using UDMA33
+ad2: 8063MB <IBM-DHEA-38451> [16383/16/63] at ata1-master using UDMA33
+acd0: CDROM <DELTA OTC-H101/ST3 F/W by OIPD> at ata0-slave using PIO4
+Mounting root from ufs:/dev/ad0s1a
+swapon: adding /dev/ad0s1b as swap device
+Automatic boot in progress...
+/dev/ad0s1a: FILESYSTEM CLEAN; SKIPPING CHECKS
+/dev/ad0s1a: clean, 48752 free (552 frags, 6025 blocks, 0.9% fragmentation)
+/dev/ad0s1f: FILESYSTEM CLEAN; SKIPPING CHECKS
+/dev/ad0s1f: clean, 128997 free (21 frags, 16122 blocks, 0.0% fragmentation)
+/dev/ad0s1g: FILESYSTEM CLEAN; SKIPPING CHECKS
+/dev/ad0s1g: clean, 3036299 free (43175 frags, 374073 blocks, 1.3% fragmentation)
+/dev/ad0s1e: filesystem CLEAN; SKIPPING CHECKS
+/dev/ad0s1e: clean, 128193 free (17 frags, 16022 blocks, 0.0% fragmentation)
+Doing initial network setup: hostname.
+ed0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
+ inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255
+ inet6 fe80::5054::5ff::fede:731b%ed0 prefixlen 64 tentative scopeid 0x1
+ ether 52:54:05:de:73:1b
+lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
+ inet6 fe80::1%lo0 prefixlen 64 scopeid 0x8
+ inet6 ::1 prefixlen 128
+ inet 127.0.0.1 netmask 0xff000000
+Additional routing options: IP gateway=YES TCP keepalive=YES
+routing daemons:.
+additional daemons: syslogd.
+Doing additional network setup:.
+Starting final network daemons: creating ssh RSA host key
+Generating public/private rsa1 key pair.
+Your identification has been saved in /etc/ssh/ssh_host_key.
+Your public key has been saved in /etc/ssh/ssh_host_key.pub.
+The key fingerprint is:
+cd:76:89:16:69:0e:d0:6e:f8:66:d0:07:26:3c:7e:2d root@k6-2.example.com
+ creating ssh DSA host key
+Generating public/private dsa key pair.
+Your identification has been saved in /etc/ssh/ssh_host_dsa_key.
+Your public key has been saved in /etc/ssh/ssh_host_dsa_key.pub.
+The key fingerprint is:
+f9:a1:a9:47:c4:ad:f9:8d:52:b8:b8:ff:8c:ad:2d:e6 root@k6-2.example.com.
+setting ELF ldconfig path: /usr/lib /usr/lib/compat /usr/X11R6/lib
+/usr/local/lib
+a.out ldconfig path: /usr/lib/aout /usr/lib/compat/aout /usr/X11R6/lib/aout
+starting standard daemons: inetd cron sshd usbd sendmail.
+Initial rc.i386 initialization:.
+rc.i386 configuring syscons: blank_time screensaver moused.
+Additional ABI support: linux.
+Local package initialization:.
+Additional TCP options:.
+
+FreeBSD/i386 (k6-2.example.com) (ttyv0)
+
+login: rpratt
+Password:
+....
+
+Генерирование ключей RSA и DSA может занять некоторое время на медленных компьютерах. Это может случиться только при первой загрузке свежеустановленной системы. Последующие загрузки будут быстрее.
+
+Если X сервер был настроен и был выбран десктоп по умолчанию, он может быть запущен из командной строки командой `startx`.
+
+[[shutdown]]
+=== Завершение работы FreeBSD (FreeBSD Shutdown)
+
+Важно правильно завершать работу операционной системы. Нельзя просто выключать питание. Сначала нужно стать суперпользователем, введя в командной строке `su` и пароль `root`. Это сработает только если пользователь является членом группы `wheel`. Или зайдите под `root` и используйте команду `shutdown -h now`.
+
+[source,bash]
+....
+The operating system has halted.
+Please press any key to reboot.
+....
+
+Можно безопасно выключать питание после того, как будет выполнена команда shutdown и появится сообщение "Please press any key to reboot". Если вместо выключения питания будет нажата любая клавиша, система перезагрузится.
+
+Вы также можете использовать комбинацию клавиш kbd:[Ctrl+Alt+Del] для перезагрузки системы, хотя это не рекомендуется в обычной ситуации.
+
+[[install-trouble]]
+== Решение проблем
+
+Следующий раздел описывает основные проблемы при установке, о которых обычно сообщают пользователи. Здесь также несколько вопросов и ответов от тех, кто хочет настроить двойную загрузку FreeBSD и MS-DOS(R) или Windows(R).
+
+=== Что делать, если что-то идет не так
+
+По причине различных ограничений архитектуры PC, невозможно протестировать устройства достоверно на 100%, тем не менее, есть несколько вещей, которые вы можете сделать, если тестирование завершится неудачно.
+
+Сверьтесь с http://www.FreeBSD.org/releases/[Информацией об оборудовании] для вашей версии FreeBSD, чтобы убедиться, что ваше оборудование поддерживается.
+
+Если оборудование поддерживается, но все же происходят зависания или вы встретились с другими проблемами, потребуется собрать crossref:kernelconfig[kernelconfig,собственное ядро]. Это позволит вам добавить поддержку аппаратных устройств, отсутствующих в ядре [.filename]#GENERIC#. Ядро на загрузочном диске настроено в предположении, что у большинства аппаратных устройств IRQ, адреса ввода-вывода и каналы DMA установлены производителем к значениям по умолчанию. Если оборудование было перенастроено, вам скорее всего потребуется отредактировать конфигурацию ядра и перекомпилировать его, чтобы сообщить FreeBSD, где что искать.
+
+Возможно также, что тестирование устройства, которого нет, приведет позже к ошибке тестирования существующего устройства. В этом случае тестирование конфликтующего драйвера (драйверов) должно быть запрещено.
+
+[NOTE]
+====
+Некоторые проблемы установки можно обойти или уменьшить, обновив встроенное программное обеспечение различных компонент оборудования, особенно материнской платы. Встроенное программное обеспечение также называют BIOS и у большинства производителей компьютеров или материнских плат есть Web-сайты, где можно найти обновления и информацию об обновлениях.
+
+Большинство производителей настоятельно советуют не обновлять BIOS пока не возникнет серьезной необходимости, например появление критически важных обновлений. Процесс обновления _может_ пойти неверно, что приведет к неустранимому повреждению микросхемы BIOS.
+====
+
+=== Использование файловых систем MS-DOS(R) и Windows(R)
+
+В настоящее время, FreeBSD не поддерживает файловые системы, сжатые с помощью программы Double Space(TM). Поэтому файловая система должна быть разжата, чтобы FreeBSD смогла получить доступ к данным. Это может быть сделано с помощью приложения Compression Agent, находящегося в меню [.guimenuitem]#Пуск#> [.guimenuitem]#Программы# > [.guimenuitem]#Системные#.
+
+FreeBSD поддерживает файловые системы MS-DOS(R) (иногда называемые файловыми системами FAT). Команда man:mount_msdosfs[8] включает такие файловые системы в существующую иерархию, тем самым обеспечивая доступ к их содержимому. Как правило, утилита man:mount_msdosfs[8] непосредственно не вызывается; вместо этого она выполняется системой при наличии соответствующей записи в [.filename]#/etc/fstab# или же вызывается утилитой man:mount[8], запущенной с соответствующими параметрами.
+
+Ниже приведен пример записи в [.filename]#/etc/fstab# для файловой системы MS-DOS(R):
+
+[.programlisting]
+....
+/dev/ad0sN /dos msdosfs rw 0 0
+....
+
+[NOTE]
+====
+Каталог [.filename]#/dos# должен быть создан заранее. Формат файла [.filename]#/etc/fstab# подробно описан в man:fstab[5].
+====
+
+Также приведем пример монтирования файловой системы MS-DOS(R) посредством man:mount[8]:
+
+[source,bash]
+....
+# mount -t msdosfs /dev/ad0s1 /mnt
+....
+
+В этом примере файловая система MS-DOS(R) расположена на первом разделе первого жесткого диска. Ваша конфигурация может быть другой, проверьте вывод команд `dmesg` и `mount`. Они должны предоставить достаточно информации для определения названий разделов.
+
+[NOTE]
+====
+Способ нумерации дисковых слайсов (то есть, "разделов" в терминах MS-DOS(R)) может отличаться от способа, принятого в других операционных системах. В частности, расширенным разделам MS-DOS(R) присваиваются номера, следующие за первичными разделами MS-DOS(R). Утилита man:fdisk[8] поможет определить, какие слайсы принадлежат FreeBSD, а какие - другим операционным системам.
+====
+
+Разделы NTFS также можно смонтировать похожим способом, используя команду man:mount_ntfs[8].
+
+=== Решение проблем: вопросы и ответы
+
+==== Моя система зависает на этапе определения оборудования во время загрузки, или система ведет себя странно во время установки, или же не определяется привод гибкого диска.
+
+На архитектурах i386, amd64 и ia64 при конфигурировании оборудования, обнаруженного во время загрузки, FreeBSD повсеместно использует систему ACPI. К сожалению, до сих пор находятся неполадки как в драйвере ACPI, так и в материнских платах, так и в их BIOS. Использование ACPI можно отключить установив переменную `hint.acpi.0.disabled` на третьем этапе загрузки:
+
+[source,bash]
+....
+ set hint.acpi.0.disabled="1"
+....
+
+Эта настройка сбрасывается каждый раз при перезагрузке системы, поэтому необходимо добавить строку `hint.acpi.0.disabled="1"` в файл [.filename]#/boot/loader.conf#. Информация о загрузчике приведена в crossref:boot[boot-synopsis,Описание].
+
+==== Выполняется первая загрузка после установки FreeBSD, ядро загружается и определяет аппаратное обеспечение, но загрузка останавливается с сообщением типа:
+
+Это древняя проблема, проявляющаяся в случаях, когда загрузочный диск не является первым диском в системе. BIOS использует свою схему нумерации дисков по сравнению с FreeBSD, и сложно правильно решить, как соответствуют эти нумерации.
+
+В случае, если загрузочный диск не является первым диском в системе, то FreeBSD потребуется некоторая помощь. Есть два возможных случая, и в обоих вам придется сообщить FreeBSD где находится корневая файловая система. Это делается указанием вручную следующих данных: номера диска (согласно нумерации BIOS), типа диска и номера диска (согласно определениям FreeBSD).
+
+Первый случай: у вас имеется два IDE диска, каждый из них сконфигурирован как мастер на соответствующей шине IDE, и вы намереваетесь загрузить FreeBSD с второго диска. BIOS определяет эти диски как `disk 0` и `disk 1`, в то время как FreeBSD определяет их как [.filename]#ad0# и [.filename]#ad2#.
+
+FreeBSD находится на `disk 1` (BIOS-нумерация), его тип - `ad` и номер - 2 (по данным FreeBSD), следовательно, необходимо указать:
+
+[source,bash]
+....
+ 1:ad(2,a)kernel
+....
+
+Заметьте, если второй диск настроен как подчиненный (slave) на первой шине IDE, то указание вышеприведённого необязательно (а по существу, еще и неверно).
+
+Второй случай подразумевает загрузку с диска SCSI при существующих в системе дисках IDE. В этом случае, согласно определениям FreeBSD номер диска меньше, чем номер по представлениям BIOS. Если у вас есть два диска IDE и диск SCSI, то, согласно BIOS, номер SCSI диска - 2, а согласно FreeBSD, тип - `da` и номер - 0, следовательно, вам необходимо указать следующее:
+
+[source,bash]
+....
+ 2:da(0,a)kernel
+....
+
+чтобы сообщить FreeBSD, что вы намереваетесь загрузить систему с диска 2 по нумерации BIOS, который является первым диском в системе. Если бы у вас был один диск IDE, вам бы пришлось использовать `1:` (по нумерации BIOS).
+
+Определив верные параметры, внесите их в том виде, как вы их набирали, в файл [.filename]#/boot.config#. Если не указывается иначе, то FreeBSD будет использовать содержимое этого файла как значение по умолчанию в приглашении `boot:`.
+
+==== Я перехожу к загрузке с жесткого диска впервые после установки FreeBSD, но приглашение Boot Manager всякий раз выводит только F? в меню загрузчика, и на этом загрузка прерывается.
+
+При установке FreeBSD в редакторе разделов была указана неверная геометрия жесткого диска. Вернитесь в редактор разделов и укажите действительную геометрию вашего жесткого диска. Вам придется переустановить заново FreeBSD.
+
+Если вы затрудняетесь определить верную геометрию для вашей машины, то сделайте следующее: установите небольшой раздел MS-DOS(R) вначале диска, а FreeBSD разместите после него. Установочная программа обнаружит раздел MS-DOS(R) и попробует определить значение геометрии по этому разделу, что, как правило, завершается успехом.
+
+Следующий способ не рекомендуется, он оставлен здесь для справки:
+
+[.blockquote]
+Если вы устанавливаете выделенный сервер FreeBSD или рабочую станцию, в которых вопросы совместного существования MS-DOS(R), Linux или иной операционной системы в будущем не возникнут, то у вас есть возможность использовать весь диск (опция [.guimenuitem]#A# в редакторе разделов), после выбора которой FreeBSD займет весь диск от самого первого до самого последнего сектора. При этом, все вопросы геометрии диска станут неактуальными.
+
+==== Система определяет мою сетевую карту man:ed[4], но я постоянно получаю сообщения device timeout.
+
+Возможно ваша сетевая карта находится не на том IRQ, которое указано в файле [.filename]#/boot/device.hints#. Драйвер man:ed[4] по умолчанию не использует "программную" конфигурацию (значения, вводимые утилитой EZSETUP в MS-DOS(R)), но ситуация изменится, если вы укажете `-1` в значении хинт-переменной для этого интерфейса.
+
+Либо осуществите ручное конфигурирование устройства переключением джамперов на карте (также может потребоваться изменение конфигурации ядра), либо же смените значение IRQ на `-1`, установив переменную `hint.ed.0.irq="-1"`. Это укажет ядру использовать программное конфигурирование.
+
+Также вероятно, что ваша карта находится на IRQ номер 9, которое используется совместно с IRQ номер 2, и которое часто является причиной проблем (особенно, если ваш VGA адаптер занимает IRQ номер 2!). Постарайтесь избежать использования IRQ номер 2 или 9 вообще.
+
+==== Когда sysinstall запущен в терминале X11, то желтый шрифт на светло сером фоне практически не различим. Есть ли способ обеспечить лучший контраст colorcontrast для этого приложения?
+
+Если вы уже установили X11, а цвета, выбираемые по умолчанию утилитой sysinstall, делают текст неразборчивым в man:xterm[1] или man:rxvt[1], то добавьте следующую строку `XTerm*color7: #c0c0c0` в ваш [.filename]##~/.Xdefaults## и вы получите более тёмный фоновый серый цвет.
+
+[[install-advanced]]
+== Расширенное руководство по установке
+
+Этот раздел описывает особые случаи установки FreeBSD.
+
+[[headless-install]]
+=== Установка FreeBSD на систему без монитора или клавиатуры
+
+Этот тип установки называется "установка без монитора", потому что на компьютере, на который вы пробуете установить FreeBSD или не подсоединен монитор, или даже нет VGA выхода. Вы спросите, как это возможно? Используя последовательную консоль. Последовательная консоль в своей основе имеет другой компьютер, который служит дисплеем и клавиатурой для системы. Чтобы сделать это, создайте инсталляционный USB-накопитель, как описано в <<install-boot-media>>, или скачайте надлежащий установочный образ ISO (описано в <<install-cdrom>>).
+
+Чтобы модифицировать настройки источника установки для загрузки с последовательной консоли, следуйте этой инструкции:
+
+[.procedure]
+====
+. Загрузка с USB-накопителя с выводом на последовательную консоль
++
+Если вы произведете загрузку с только что созданного USB-накопителя, FreeBSD загрузится в нормальный режим установки. Мы хотим, чтобы FreeBSD загрузилась на последовательную консоль для нашей установки. Чтобы сделать это, смонтируйте USB-накопитель на вашу систему FreeBSD используя команду man:mount[8].
++
+[source,bash]
+....
+# mount /dev/da0a /mnt
+....
++
+[NOTE]
+======
+Измените названия файла устройства и точки монтирования в соответствии со значениями для вашей конфигурации.
+======
++
+Теперь необходимо настроить USB-накопитель для загрузки на последовательную консоль. В файл [.filename]#loader.conf#, находящийся на файловой системе USB-накопителя, добавьте запись, устанавливающую в качестве системной консоли последовательную консоль.
++
+[source,bash]
+....
+# echo 'console="comconsole"' >> /mnt/boot/loader.conf
+....
++
+Далее, когда ваш USB-накопитель правильно настроен, размонтируйте его с помощью команды man:umount[8]:
++
+[source,bash]
+....
+# umount /mnt
+....
++
+Теперь извлеките USB-накопитель и перейдите к третьему пункту этой инструкции.
+. Загрузка с CD с выводом на последовательную консоль
++
+Если вы произведете загрузку с только что записанного установочного CD диска (подробности создания которого описаны в <<install-cdrom>>), FreeBSD загрузится в нормальный режим установки. Однако, вам необходимо, чтобы FreeBSD загрузилась на последовательную консоль. Для этого придется исправить ISO образ заранее, до его записи на диск CD-R.
++
+В приведённом далее примере подразумевается, что подготовку образа вы выполняете на вашем втором компьютере, работающем под управлением FreeBSD. Также подразумевается, что на нём есть файл загрузочного ISO образа, например [.filename]#FreeBSD-{rel120-current}-RELEASE-i386-disc1.iso#. Извлеките из образа все файлы утилитой man:tar[1]:
++
+[source,bash,subs="attributes"]
+....
+# mkdir /path/to/headless-iso
+# tar -C /path/to/headless-iso -pxvf FreeBSD-{rel120-current}-RELEASE-i386-disc1.iso
+....
++
+Теперь необходимо внести некоторые изменения в набор файлов и каталогов, полученных из образа. Добавьте в файл [.filename]#loader.conf# запись, устанавливающую в качестве системной консоли последовательную консоль.
++
+[source,bash]
+....
+# echo 'console="comconsole"' >> /path/to/headless-iso/boot/loader.conf
+....
++
+Далее необходимо создать новый образ ISO из извлеченного и исправленного старого образа. Для этого воспользуйтесь утилитой man:mkisofs[8] (порт package:sysutils/cdrtools[]):
++
+[source,bash,subs="attributes"]
+....
+# mkisofs -v -b boot/cdboot -no-emul-boot -r -J -V "Headless_install" \
+ -o Headless-FreeBSD-{rel120-current}-RELEASE-i386-disc1.iso /path/to/headless-iso
+....
++
+А теперь, имея в распоряжении модифицированный новый образ ISO, самое время записать его на диск CD-R при помощи вашей любимой программы для записи дисков.
+. Подсоединение нуль-модемного кабеля
++
+Теперь нужно соединить два компьютера crossref:serialcomms[term-cables-null,нуль-модемным кабелем]. Просто подсоедините этот кабель к последовательным портам двух компьютеров. _Обычный последовательный кабель не будет работать_, вам потребуется нуль-модемный кабель, поскольку в нем некоторые линии соединены накрест.
+. Загрузка для установки
++
+Настало время начать установку. Вставьте USB-накопитель в компьютер, на который вы будете производить установку без монитора и включите его. Если же вы используете загрузочный CD диск, вставьте его в привод после того, как включите машину.
+. Подключение к компьютеру без монитора
++
+Теперь вы можете подключиться к этому компьютеру с помощью man:cu[1]:
++
+[source,bash]
+....
+# cu -l /dev/cuau0
+....
+====
+
+Это все! Теперь вы можете управлять компьютером без монитора через сессию `cu`. Машина загрузит ядро, а затем появится выбор типа терминала. Выберите цветную консоль FreeBSD и проводите установку!
+
+[[install-diff-media]]
+== Подготовка собственного источника установки
+
+[NOTE]
+====
+Чтобы не повторяться, "диск FreeBSD" в данном случае означает FreeBSD CDROM или DVD, который вы купили или подготовили самостоятельно.
+====
+
+Может быть несколько ситуаций, в которых вам потребуется подготовить собственный диск и/или источник для установки FreeBSD. Это может быть физический носитель, такой как лента, или источник, с которого sysinstall сможет взять файлы, такой как локальный сервер FTP, или раздел MS-DOS(R).
+
+Например:
+
+* У вас есть много компьютеров, подсоединенных к локальной сети, и один диск с FreeBSD. Вы хотите создать локальный сервер FTP, используя содержимое диска FreeBSD, а затем использовать с ваших компьютеров этот локальный сервер FTP вместо подсоединения к интернет.
+* У вас есть диск с FreeBSD, и FreeBSD не распознает ваш CD/DVD привод, а MS-DOS(R) / Windows(R) распознает. Вы хотите скопировать файлы установки FreeBSD на раздел MS-DOS(R) этого же компьютера и установить FreeBSD, используя эти файлы.
+* На компьютере, на который вы хотите провести установку, нет ни привода CD/DVD, ни сетевой карты, но вы можете подсоединиться в "Laplink-стиле" последовательным или параллельным кабелем к другому компьютеру, на котором они есть.
+* Вы хотите создать ленту, которую можно использовать для установки FreeBSD.
+
+[[install-cdrom]]
+=== Создание установочного CDROM
+
+В составе каждого релиза проект FreeBSD предоставляет доступ как минимум к двум образам CDROM ("ISO images") для каждой поддерживаемой архитектуры. Эти образы могут быть записаны ("прожжены") на CD если у вас есть CD-рекордер, а затем использованы для установки FreeBSD. Если у вас есть CD-рекордер и дешевый канал интернет, это простейший путь установить FreeBSD.
+
+[.procedure]
+====
+
+. Скачайте соответствующие ISO образы
++
+ISO образы для каждого релиза могут быть загружены с [.filename]#ftp://ftp.FreeBSD.org/pub/FreeBSD/ISO-IMAGES-архитектура/версия# или с ближайшего зеркала. Замените _архитектура_ и _версия_ в соответствии архитектурой и номером релиза соответственно.
++
+Этот каталог обычно содержит следующие образы:
++
+.Названия ISO-образов дисков FreeBSD и их значения
+[cols="1,1", frame="none", options="header"]
+|===
+| Имя файла
+| Содержимое
+
+|[.filename]#FreeBSD-version-RELEASE-arch-bootonly.iso#
+|Этот образ CD предоставляет возможность начать процесс установки, загрузившись с диска в приводе CD-ROM. Однако, в нём отсутствуют архивы, необходимые для установки FreeBSD с этого же диска. Подразумевается, что необходимые файлы будут скачаны из доступных в сети источников (например, c сервера FTP).
+
+|[.filename]#FreeBSD-version-RELEASE-arch-dvd1.iso.gz#
+|Этот образ DVD содержит всё необходимое для установки базовой системы FreeBSD, а также - документацию и набор прекомпилированных пакетов. Также образ поддерживает возможность загрузки в режим "livefs".
+
+|[.filename]#FreeBSD-version-RELEASE-arch-memstick.img#
+|Этот образ предназначен для создания загрузочных USB-накопителей. Такой накопитель может использоваться для установки операционной системы на машины, поддерживающие загрузку с USB дисков. USB-накопитель также может использоваться для аварийного восстановления системы (содержит "livefs"). В образе также имеются пакеты с документацией.
+
+|[.filename]#FreeBSD-version-RELEASE-arch-disc1.iso#
+|Этот образ CD содержит базовую систему FreeBSD и набор пакетов с документацией.
+
+|[.filename]#FreeBSD-version-RELEASE-arch-disc2.iso#
+|Этот образ CD содержит пакеты сторонних разработчиков, которые смогли поместиться на диск. Для FreeBSD 9._X_ подобные образы не создавались.
+
+|[.filename]#FreeBSD-version-RELEASE-arch-disc3.iso#
+|Еще один образ CD, заполненный пакетами сторонних разработчиков. Этот образ не создавался для FreeBSD 9._X_.
+
+|[.filename]#FreeBSD-version-RELEASE-arch-livefs.iso#
+|Данный образ CD поддерживает загрузку в режим аварийного восстановления системы (содержит "livefs") и не предназначен для выполнения установки операционной системы с самого диска.
+|===
++
+Вы _должны_ загрузить либо ISO-образ `bootonly`, либо образ `disc1`. Не загружайте их оба, так как образ `disc1` содержит всё, что есть на ISO-образе bootonly.
++
+Используйте ISO-образ `bootonly`, если доступ в Internet для вас обходится недорого. Он позволит вам установить FreeBSD, и вы сможете установить впоследствии программы сторонних производителей используя систему портов/пакетов (смотрите crossref:ports[ports, Установка приложений. порты и пакеты]) если необходимо.
++
+Используйте образ `dvd1`, если вы хотите установить релиз FreeBSD и получить достаточный набор программ сторонних производителей, расположенных на этом диске.
++
+Дополнительные образы дисков полезны, но не необходимы, особенно если у вас есть высокоскоростной доступ к интернет.
+. Запись CD
++
+Затем вам нужно записать образы CD на диски. Если вы делаете это из другой системы FreeBSD, обратитесь к crossref:disks[creating-cds,Запись и использование оптических носителей (CD)] за более подробной информацией (в частности, crossref:disks[burncd,burncd] и crossref:disks[cdrecord,cdrecord]).
++
+Если вы делаете это в другой системе, потребуется использовать те утилиты для управления CD-рекордером, которые есть в этой системе. Образы дисков предоставляются в стандартном формате ISO, который поддерживается многими программами.
+====
+
+[NOTE]
+====
+Если вы интересуетесь созданием собственных вариантов релизов FreeBSD, пожалуйста, прочтите статью о link:{releng}[Процессе подготовки релизов].
+====
+
+[[install-ftp]]
+=== Создание локального сервера FTP с FreeBSD
+
+Диск FreeBSD сформирован так же, как и сервер FTP. Это сильно упрощает создание локального сервера FTP, который может быть использован другими компьютерами вашей сети для установки FreeBSD.
+
+[.procedure]
+====
+
+. Убедитесь, что на компьютере FreeBSD, на котором будет установлен сервер FTP, CDROM находится в приводе и смонтируйте [.filename]#/cdrom#.
++
+[source,bash]
+....
+# mount /cdrom
+....
++
+. Создайте учетную запись для anonymous FTP в [.filename]#/etc/passwd#. Сделайте это, отредактировав [.filename]#/etc/passwd# с помощью man:vipw[8] и добавив эту строку:
++
+[.programlisting]
+....
+ftp:*:99:99::0:0:FTP:/cdrom:/nonexistent
+....
++
+. Убедитесь что сервис FTP включен в [.filename]#/etc/inetd.conf#.
+====
+
+Всякий, кто может подсоединиться по сети к вашему компьютеру, может выбрать тип носителя FTP и набрать `ftp://_ваш компьютер_` после выбора "Other" в меню серверов FTP во время установки.
+
+[NOTE]
+====
+Если загрузочный носитель (обычно это дискеты) для ваших FTP-клиентов в точности не соответствует версии, находящейся на локальном сервере FTP, то sysinstall не позволит вам завершить установку. Если версии похожи и вы хотите это явно указать, то перейдите в меню Options и замените название дистрибутива на [.guimenuitem]#any#.
+====
+
+[WARNING]
+====
+
+Этот подход хорош для компьютера в вашей локальной сети, защищенного с помощью файрволла. Предоставление сервиса FTP другим компьютерам через интернет (а не через локальную сеть) привлекает к вашему компьютеру внимание кракеров и других лиц, чье внимание нежелательно. Мы настоятельно рекомендуем придерживаться правильной политики безопасности, если вы делаете это.
+====
+
+=== Создание дискет для установки
+
+Если вам требуется выполнить установку с дискет (чего мы _не_ рекомендуем делать) или по причине не поддерживаемого оборудования, или просто потому, что вы не любите простых путей, потребуется сначала подготовить несколько дискет для установки.
+
+Как минимум, вам потребуется столько 1.44 MB дискет, сколько нужно, чтобы вместить все файлы из каталога [.filename]#base# (base distribution). Если вы подготавливаете эти дискеты из MS-DOS(R), они _должны_ быть отформатированы с помощью команды MS-DOS(R) `FORMAT`. Если вы используете Windows(R), используйте Explorer для форматирования дисков (кликните правой кнопкой мыши на диске [.filename]#A:# и выберите "Format").
+
+_Не_ доверяйте заводскому форматированию дискет. Отформатируйте их еще раз самостоятельно, просто для уверенности. Множество проблем, о которых сообщали наши пользователи, были результатом использования неправильно отформатированных дисков, поэтому мы сейчас обращаем на это внимание.
+
+Если вы создаете образы на другом компьютере FreeBSD, форматирование все еще не лишне, хотя вам не потребуется создавать файловую систему MS-DOS(R) на каждой дискете. Вы можете использовать `bsdlabel` и `newfs` для создания на них файловых систем UFS, в следующей последовательности (для 3.5" 1.44 MB дискет):
+
+[source,bash]
+....
+# fdformat -f 1440 fd0.1440
+# bsdlabel -w fd0.1440 floppy3
+# newfs -t 2 -u 18 -l 1 -i 65536 /dev/fd0
+....
+
+Затем вы можете смонтировать их и писать на них как на любую другую файловую систему.
+
+После форматирования дискет вам потребуется скопировать на них файлы. Файлы дистрибутива разделены на части, размер которых позволяет легко разместить пять частей на обычной 1.44 MB дискете. Заполните все дискеты файлами, помещая столько файлов на одну дискету, сколько уместится, пока у вас не будет всех необходимых компонент дистрибутива. Каждый компонент должен располагаться в подкаталоге на дискете, например [.filename]#a:\base\base.aa#, [.filename]#a:\base\base.ab#, и так далее.
+
+[IMPORTANT]
+====
+Файл [.filename]#base.inf# также необходимо поместить на первую дискету набора [.filename]#base#. Прочитав этот файл, установочная программа определяет, сколько частей необходимо скопировать и соединить для сборки дистрибутива.
+====
+
+Как только в процессе установки появится экран Media, выберите [.guimenuitem]#Floppy# и установка продолжится.
+
+[[install-msdos]]
+=== Установка с раздела MS-DOS(R)
+
+Чтобы подготовиться к установке с раздела MS-DOS(R), скопируйте файлы с дистрибутива в каталог [.filename]#freebsd# корневого каталога раздела. Например, [.filename]#c:\freebsd#. Структура каталога CDROM или сервера FTP должна быть в точности воспроизведена в этом каталоге, мы предлагаем использовать команду MS-DOS(R) `xcopy` если вы копируете дистрибутив с CD. Например, чтобы подготовить минимальную установку FreeBSD:
+
+[source,bash]
+....
+C:\> md c:\freebsd
+C:\> xcopy e:\bin c:\freebsd\bin\ /s
+C:\> xcopy e:\manpages c:\freebsd\manpages\ /s
+....
+
+Предполагается, что на [.filename]#C:# есть свободное место, а на [.filename]#E:# смонтирован CDROM.
+
+Если у вас нет CDROM, можно загрузить дистрибутив с link:ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/{rel120-current}-RELEASE/[ftp.FreeBSD.org]. Каждый компонент находится в своем собственном каталоге, например компонент _base_ можно найти в каталоге link:ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/{rel120-current}-RELEASE/base/[{rel120-current}/base/].
+
+Все компоненты, которые вы будете устанавливать с раздела MS-DOS(R) (и для которых у вас есть место), нужно расположить в [.filename]#c:\freebsd# - для минимальной установки нужна только компонента `BIN`.
+
+=== Создание ленты для установки
+
+Установка с ленты это возможно самый простой метод, уступающий только установке с FTP или CDROM. Программа установки может найти на ленте файлы, которые записаны на нее с помощью tar. После получения всех файлов дистрибутива, которые вам нужны, запишите их на ленту с помощью tar:
+
+[source,bash]
+....
+# cd /freebsd/distdir
+# tar cvf /dev/rwt0 dist1 ... dist2
+....
+
+Когда вы приступите к установке, нужно убедиться в наличии достаточного места во временном каталоге (который будет предложено выбрать), чтобы поместилось _все_ содержимое записанной ленты. Поскольку лента - устройство не-произвольного доступа, этот метод установки требует некоторого места во временном хранилище.
+
+[NOTE]
+====
+При начале установки лента должна быть в приводе _до_ загрузки с дискеты. В ином случае она может быть не найдена при тестировании устройств.
+====
+
+=== Перед установкой по сети
+
+Есть три возможных типа установки по сети. Ethernet (стандартный Ethernet контроллер), последовательный порт (PPP), или параллельный порт (PLIP (laplink кабель)).
+
+Для самой быстрой установки по сети хорошим выбором будет Ethernet адаптер! FreeBSD поддерживает большинство PC Ethernet карт; список поддерживаемых карт (и требуемых для них установок) предоставляется в информации об оборудовании для каждого релиза FreeBSD. Если вы используете одну из поддерживаемых PCMCIA Ethernet карт, убедитесь также, что она подключена _перед_ тем, как ноутбук будет включен! К сожалению, FreeBSD в настоящее время не поддерживает горячее подключение PCMCIA карт во время установки.
+
+Вам также потребуется знать IP адрес в сети, сетевую маску для класса подсети, и имя компьютера. Если вы делаете установку через соединение PPP и у вас нет статического IP, не бойтесь, IP адрес будет динамически выделен вам провайдером. Системный администратор может подсказать вам, какие значения использовать для данной установки по сети. Если вы будете обращаться к другим хостам по имени, а не по IP адресу, понадобится также сервер DNS и, возможно, адрес шлюза (если вы используете PPP, это IP адрес вашего провайдера), чтобы связаться с ним. Если вы хотите производить установку с FTP через HTTP прокси, потребуется также адрес прокси. Если вы не знаете ответов на все или большинство этих вопросов, свяжитесь с системным администратором или ISP _перед_ тем, как начать этот тип установки.
+
+Если вы используете модем, PPP это конечно почти единственный выбор. Убедитесь что у вас есть информация о провайдере, так как она понадобится на довольно ранней стадии процесса установки.
+
+Если вы используете PAP или CHAP для соединения с провайдером (другими словами, вы можете соединяться с провайдером из Windows(R) без использования скрипта), все что вам понадобится это ввести `dial` в приглашении ppp. Иначе вам нужно знать, как дозвониться до провайдера с помощью "AT команд", специфичных для вашего модема, так как программа дозвона PPP предоставляет только очень простой эмулятор терминала. Обратитесь к crossref:ppp-and-slip[userppp,руководству] user-ppp и link:{faq}#ppp/[FAQ] для получения более подробных сведений. Если у вас проблемы, логи могут быть выведены на экран с помощью команды `set log local ...`.
+
+Если доступно постоянное соединение с другой машиной FreeBSD, вы можете также подумать об установке через параллельный порт "laplink" кабелем. Скорость соединения через параллельный порт значительно выше, чем обычно возможно через последовательную линию (до 50 кбайт/с), это приведет к ускорению установки.
+
+==== Перед установкой через NFS
+
+Установка через NFS очень проста. Просто скопируйте компоненты FreeBSD, которые вам нужны, на NFS сервер, а затем укажите на него при выборе источника установки NFS.
+
+Если этот сервер поддерживает только "привилегированные порты" (это как правило так для рабочих станций Sun), потребуется установить параметр `NFS Secure` в меню menu:Options[] перед тем, как начать установку.
+
+Если у вас Ethernet карта плохого качества с низкой скоростью передачи данных, вы возможно захотите переключить флаг `NFS Slow` в Options.
+
+Чтобы установка по NFS работала, сервер должен поддерживать монтирование подкаталогов, например, если установочный каталог дистрибутива FreeBSD {rel120-current} находится на: [.filename]#ziggy:/usr/archive/stuff/FreeBSD#, `ziggy` должен позволять непосредственное монтирование [.filename]#/usr/archive/stuff/FreeBSD#, а не только [.filename]#/usr# или [.filename]#/usr/archive/stuff#.
+
+В файле FreeBSD [.filename]#/etc/exports# это управляется параметром `-alldirs`. Другие NFS серверы могут иметь другие соглашения. Если вы получаете сообщения сервера `permission denied`, это может означать, что соответствующая опция не включена.
diff --git a/documentation/content/ru/books/handbook/introduction/_index.adoc b/documentation/content/ru/books/handbook/introduction/_index.adoc
new file mode 100644
index 0000000000..01bfb6462f
--- /dev/null
+++ b/documentation/content/ru/books/handbook/introduction/_index.adoc
@@ -0,0 +1,212 @@
+---
+title: Глава 1. Введение
+part: Часть I. В начале
+prev: books/handbook/parti
+next: books/handbook/install
+---
+
+[[introduction]]
+= Введение
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 1
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[introduction-synopsis]]
+== Краткий обзор
+
+Мы благодарим вас за интерес к FreeBSD! Следующая глава расскажет о некоторых аспектах проекта FreeBSD, таких как история, цели, модель разработки, и прочее.
+
+Из этой главы вы узнаете:
+
+* Какое отношение имеет FreeBSD к другим операционным системам.
+* Историю проекта FreeBSD.
+* Цели проекта FreeBSD.
+* Основы модели разработки FreeBSD с открытыми исходными текстами.
+* И, конечно, откуда появилось имя "FreeBSD".
+
+[[nutshell]]
+== Добро пожаловать во FreeBSD!
+
+FreeBSD - это основанная на 4.4BSD-Lite операционная система для компьютеров Intel (x86 и Itanium(R)), AMD64, Alpha(TM) и Sun UltraSPARC(R). Ведется работа по портированию и на другие архитектуры. Вы можете также прочесть об <<history,истории FreeBSD>>, или о <<relnotes,текущем релизе>>. Если вы заинтересованы в помощи проекту (кодом, аппаратным обеспечением, деньгами), прочтите статью link:{contributing}[Помощь FreeBSD].
+
+=== Что может FreeBSD?
+
+FreeBSD имеет заслуживающие внимания возможности. Некоторые из них:
+
+* _Вытесняющая многозадачность_ с динамическим регулированием приоритетов, позволяющая плавно и справедливо распределить ресурсы компьютера между приложениями и пользователями, даже при тяжелейших нагрузках.
+* _Многопользовательская поддержка_, которая позволяет множеству людей использовать FreeBSD совместно для различных задач. Это значит, например, что системная периферия, такая как принтеры и ленточные устройства, правильно разделяется всеми пользователями в системе или сети, и что пользователям или группам пользователей могут быть установлены лимиты каждого ресурса, защищая критические системные ресурсы от перегрузок.
+* Мощный _TCP/IP-стек_ с поддержкой промышленных стандартов, таких как SLIP, PPP, NFS, DHCP и NIS. Это означает, что FreeBSD может легко взаимодействовать с другими системами, а также работать сервером масштаба предприятия, предоставляя жизненно важные функции, такие как NFS (удалённый доступ к файлам) и услуги электронной почты, или представить вашу организацию в Интернете, обеспечивая работу служб WWW, FTP, маршрутизацию и функции межсетевого экрана (брандмауэра).
+* _Защита памяти_ гарантирует, что приложения (или пользователи) не смогут чинить препятствия друг другу. Фатальная ошибка в выполнении одного приложения не скажется на работоспособности всей системы.
+* FreeBSD _32-разрядная_ операционная система (_64-разрядная_ на Alpha, Itanium(R), AMD64, и UltraSPARC(R)) и изначально создавалась именно такой.
+* Промышленный стандарт _X Window System_ (X11R6) предоставляет графический интерфейс пользователя (GUI) для большинства VGA карт и мониторов, и поставляется с полными исходными текстами.
+* _Двоичная совместимость_ с большинством программ, созданных для Linux, SCO, SVR4, BSDI и NetBSD.
+* Тысячи _готовых к использованию_ приложений доступны из коллекций _портов_ и _пакетов_ FreeBSD. Зачем искать что-то в сети, когда вы можете найти всё прямо здесь?
+* Тысячи других _легко адаптируемых_ приложений доступны в Интернете. FreeBSD совместима по исходным текстам с большинством популярных коммерческих UNIX(R)-систем и, таким образом, большинство приложений требуют лишь небольших изменений для сборки (или не требуют вообще).
+* _Виртуальная память_ с поддержкой сброса неиспользуемых страниц по требованию и "объединение виртуальной памяти и буферного кэша" спроектированы так, чтобы максимально эффективно удовлетворить приложения с огромными аппетитами к памяти и, в то же время, сохранить интерактивность для остальных пользователей.
+* Поддержка _симметричной многопроцессорности_ (SMP) для машин с несколькими процессорами.
+* Полный комплект инструментов для разработчика: _C_, _C++_ и _Fortran_. Множество дополнительных языков программирования для исследований и разработки также доступны из коллекций портов и пакетов.
+* Доступность _исходных текстов_ всей системы означает, что вы имеете максимальный контроль над операционной средой. Зачем выбирать закрытые решения и уповать на милость производителя, когда вы можете получить по-настоящему открытую систему?
+* Обширная _online-документация_.
+* _И многое-многое другое!_
+
+FreeBSD основана на 4.4BSD-Lite от Computer Systems Research Group (CSRG) Калифорнийского Университета, Беркли, и продолжает славную традицию разработки BSD-систем. В дополнении к прекрасной работе, предоставленной CSRG, Проект FreeBSD тратит многие тысячи часов для тонкой настройки системы для максимальной производительности и надёжности в условиях максимально приближенным к "боевым". Когда большинство коммерческих гигантов только пытаются достичь такого уровня возможностей, производительности и надежности операционных систем для ПК, FreeBSD может предложить все это прямо _сейчас_!
+
+Применение FreeBSD в действительности ограничено только вашим воображением. От разработки программного обеспечения до автоматизации производства, от складского учета до дистанционной коррекции азимутов спутниковых антенн; если задачи можно решить с помощью коммерческих UNIX(R)-систем, скорее всего, они решаемы и с помощью FreeBSD! FreeBSD также существенно выигрывает за счет буквально тысяч высококачественных приложений, разработанных исследовательскими центрами и университетами во всём мире, и доступных за минимальную цену или даже бесплатно. Коммерческие приложения также доступны, и их с каждым днем становится всё больше.
+
+Поскольку исходные тексты FreeBSD общедоступны, система может быть оптимизирована в почти невероятной степени для специальных приложений или проектов, а это, обычно, невозможно при использовании операционных систем от большинства коммерческих производителей. Вот несколько примеров того, как сейчас используется FreeBSD:
+
+* _Интернет-службы:_ мощнейший TCP/IP стек делает FreeBSD идеальной платформой для большинства Интернет-приложений, таких как:
+
+** FTP-серверы
+** Серверы World Wide Web (как стандартные, так и защищённые [SSL])
+** Межсетевые экраны (firewalls) и шлюзы NAT ("IP-маскарадинг")
+** Серверы электронной почты
+** Серверы новостей или дискуссионных групп USENET
+** и многое другое...
++
+Вы можете начать своё знакомство с FreeBSD, используя недорогой ПК класса 386, а впоследствии увеличить её мощь до сервера масштаба предприятия с четырьмя процессорами Xeon и RAID контроллером.
+* _Образование:_ Вы студент и ваше образование связано с компьютерами или другими инженерными дисциплинами? Нет лучшего пути начать изучение операционных систем, архитектуры компьютера и работы в сети, чем освоить FreeBSD. Количество свободно доступных пакетов САПР, математических и графических пакетов также делают её чрезвычайно полезной для тех, кто использует компьютер как инструмент для выполнения _другой_ работы!
+* _Исследования:_ За счёт доступности исходных текстов для всей системы, FreeBSD - превосходная платформа как для изучения операционных систем и исследований в других областях компьютерных наук. Свободная природа FreeBSD позволяет удалённым группам сотрудничать, обмениваться идеями и совместными разработками, не беспокоясь о наличии специальных лицензий или ограничений на то, что может обсуждаться в открытых форумах.
+* _Работа в сети:_ Нужен новый маршрутизатор? Сервер имён (DNS)? Межсетевой экран, защищающий от проникновения извне в вашу сеть? FreeBSD может превратить давно списанный и пылящийся в углу 386-й или 486-й ПК в мощный маршрутизатор с возможностью фильтрации пакетов.
+* _Рабочая станция X Window:_ FreeBSD прекрасный выбор, если вам нужен недорогой X-терминал, использующий свободно распространяемый сервер X11. В отличие от X-терминала, на FreeBSD можно запускать множество приложений локально, если требуется, таким образом перенеся часть нагрузки с центрального сервера. FreeBSD может быть загружена "на бездисковой станции", что делает рабочую станцию ещё дешевле и проще в администрировании.
+* _Разработка программного обеспечения:_ Базовая поставка FreeBSD распространяется с полным набором инструментов для разработки, включая знаменитые компилятор GNU C/C++ и отладчик.
+
+FreeBSD доступна как в исходных текстах, так и в двоичном виде на CDROM, DVD и через анонимный доступ к FTP. Подробнее о том, как получить FreeBSD, см. в crossref:mirrors[mirrors, Получение FreeBSD].
+
+=== Кто использует FreeBSD?
+
+FreeBSD используется в качестве платформы на некоторых крупнейших сайтах в интернет, включая:
+
+* http://www.yahoo.com/[Yahoo!]
+* http://www.apache.org/[Apache]
+* http://www.bluemountain.com/[Blue Mountain Arts]
+* http://www.pair.com/[Pair Networks]
+* http://www.sony.co.jp/[Sony Japan]
+* http://www.netcraft.com/[Netcraft]
+* http://www.wni.com/[Weathernews]
+* http://www.supervalu.com/[Supervalu]
+* http://www.telehouse.com/[TELEHOUSE America]
+* http://www.sophos.com/[Sophos Anti-Virus]
+* http://www.jmawired.com/[JMA Wired]
+
+и на многих других.
+
+[[history]]
+== О Проекте FreeBSD
+
+В следующей части рассказывается о том, что из себя представляет проект, включая краткую историю, цели проекта и модель разработки проекта.
+
+[[intro-history]]
+=== Краткая история FreeBSD
+
+Проект FreeBSD возник в первой половине 1993 года, частично как результат развития "Неофициального комплекта исправлений к 386BSD (patchkit)", последними 3-мя координаторами этого проекта: Nate Williams, Rod Grimes и мною.
+
+Нашей главной задачей было зафиксировать промежуточное состояние проекта 386BSD, чтобы исправить множество проблем, которые механизм patchkit (набор исправлений) не мог решить. Некоторые из вас, возможно, помнят раннее рабочее название этого проекта: "386BSD 0.5" или "386BSD Interim".
+
+386BSD была операционной системой Билла Джолица, которая на тот момент сильно страдала от почти годичного пренебрежения к ней автора. Так как patchkit разрастался, его поддержание становилось более неудобным день от дня, мы пришли к единодушному соглашению, что нужно что-то делать, и решили помочь Биллу, предоставив этот промежуточный "очистительный" снимок состояния системы. Эти планы были грубо оборваны, когда Билл внезапно решил прекратить поддержку проекта без каких-либо ясных комментариев, что должно быть сделано.
+
+Нам потребовалось немного времени, чтобы прийти к решению продолжать следовать той же цели, даже без поддержки Билла, и мы приняли имя "FreeBSD", придуманное Дэвидом Гринмэном. Наши начальные цели были определены после консультаций с пользователями существовавшей системы, и как только стало понятно, что проект на пути к тому, чтобы стать реальностью, я связался с компанией Walnut Creek CDROM и поделился идеями о путях последующего улучшения каналов распространения FreeBSD для множества пользователей без доступа к Internet. Компания Walnut Creek CDROM не только поддержала идею распространения FreeBSD на CD, но ещё и предоставила проекту компьютер для работы и быстрый доступ к Интернету. Без почти беспрецедентной веры Walnut Creek CDROM в этот, в то время, полностью неизвестный проект, вряд ли FreeBSD зашла бы так далеко и так быстро, как сегодня.
+
+Первым дистрибутивом, распространяемым как на CDROM, так и в сети, стала FreeBSD 1.0, выпущенная в декабре 1993 года. Эта версия была выполнена на основе ленты 4.3BSD-Lite ("Net/2") из Калифорнийского Университета в Беркли, с многочисленными добавлениями из проекта 386BSD и Фонда Свободного Программного Обеспечения. Это был довольно внушительный успех для первой попытки, и мы закрепили его с выходом FreeBSD 1.1 RELEASE в мае 1994 года.
+
+В это же время, на горизонте сгустились тучи в связи с назревающим скандалом между Novell и Калифорнийским Университетом, Беркли. Это был вялотекущий судебный процесс о легальности версии Net/2 из Беркли. По условиям достигнутого соглашения, Калифорнийский Университет признавал, что большие куски Net/2 были "унаследованным" кодом, права на который принадлежат компании Novell, которая, в свою очередь, приобрела эти права ранее у AT&T. Взамен Беркли получил "благословение" Novell на то, что версия 4.4BSD-Lite после её выхода будет объявлена полностью "свободной", а всем пользователям Net/2 будет настоятельно рекомендовано перейти на неё. Это также касалось FreeBSD, и проекту было дано время до конца июля 1994 года для прекращения распространения его продукта, базирующегося на Net/2. На этих условиях проекту было разрешено выпустить последний релиз до окончания срока, и это была FreeBSD 1.1.5.1.
+
+Тогда проект FreeBSD приступил к сложнейшей задаче буквально пересоздания с нуля на основе абсолютно новой и довольно неполной системы 4.4BSD-Lite. Версии "Lite" были в прямом смысле light (лёгкими) отчасти потому, что группа CSRG удалила большие куски кода, необходимого для создания реально загружающейся системы (по причине различных лицензионных требований), и фактически порт 4.4BSD для платформы Intel был очень неполным. Проекту потребовалось время почти до ноября 1994 года для того, чтобы выполнить этот переход, и на этом этапе FreeBSD 2.0 была опубликована в сети и на CDROM (в конце декабря). Несмотря на множество "острых углов" в этой версии, она пользовалась значительным успехом и была продолжена более устойчивой и простой в установке FreeBSD 2.0.5, выпущенной в июне 1995 года.
+
+Мы выпустили FreeBSD 2.1.5 в августе 1996, и она стала достаточно популярной среди ISP и в коммерческой среде, чтобы выпустить еще один релиз из ветви 2.1-STABLE. Это была FreeBSD 2.1.7.1, вышедшая в феврале 1997 и завершившая главную ветвь разработки 2.1-STABLE. Сейчас в режиме поддержки, в эту ветвь (RELENG_2_1_0) вносятся только улучшения защиты и другие критически важные исправления.
+
+FreeBSD 2.2 была ответвлена от основной линии разработки ("-CURRENT") в ноябре 1996 как ветвь RELENG_2_2, а первая полная версия (2.2.1) появилась в апреле 1997. Последующие версии ветви 2.2 появлялись летом и в конце 1997 года, а последняя версия (2.2.8) вышла в ноябре 1998. Первая официальная версия 3.0 была подготовлена к выходу в октябре 1998, завершив развитие ветви 2.2
+
+Третье ветвление произошло 20 января 1999 года: появились ветви 4.0-CURRENT и 3.X-STABLE. Из ветви 3.X-STABLE были получены: 3.1 - 15 февраля 1999, 3.2 - 15 мая 1999, 3.3 - 16 сентября 1999, 3.4 - 20 декабря 1999, 3.5 - 24 июня 2000, за которым последовал через несколько дней немного обновленный релиз 3.5.1, содержащий несколько исправлений в области защиты Kerberos. Это был последний релиз из ветви 3.X.
+
+Другое ветвление было выполнено 13 марта 2000 года, в результате чего появилась ветвь 4.X-STABLE. Из этой ветви было выпущено несколько релизов: 4.0-RELEASE был представлен в марте 2000 года, а последний 4.11-RELEASE был выпущен в январе 2005 года.
+
+Долгожданный 5.0-RELEASE был анонсирован 19 января 2003 года. Он стал кульминацией приблизительно трех лет работы, с этого релиза начался курс FreeBSD на расширенную поддержку мультипроцессорности и потоков в приложениях, а также появилась поддержка платформ UltraSPARC(R) и `ia64`. За этим релизом последовал релиз 5.1 в июне 2003 года. Последним релизом 5.X из ветви -CURRENT стал 5.2.1-RELEASE, представленный в феврале 2004.
+
+Ветвь RELENG_5 была создана в августе 2004, затем последовал выпуск релиза 5.3-RELEASE, который открыл серию релизов из ветви 5-STABLE. Самый последний релиз {rel112-current}-RELEASE был выпущен {rel112-current-date}. Из ветви RELENG_5 релизы больше выпускаться не будут.
+
+Очередная ветвь, RELENG_6, была создана в июле 2005 года. 6.0-RELEASE, первый релиз из этой ветви, был выпущен в ноябре 2005 года. Последний из релизов ветви RELENG_6, {rel120-current}-RELEASE, был выпущен {rel120-current-date}. Из ветви RELENG_6 будут выпускаться еще релизы.
+
+На данный момент, долговременные разработки и проекты продолжаются в ветке 7.X-CURRENT, и по ходу разработки будут доступны снэпшот-релизы 7.X на CDROM (и, конечно же, в сети), постоянно выкладываемые на link:ftp://current.FreeBSD.org/pub/FreeBSD/snapshots/[сервер снэпшотов] как промежуточные результаты.
+
+[[goals]]
+=== Цели Проекта FreeBSD
+
+Целью Проекта FreeBSD является предоставление программного обеспечения, которое может быть использовано для любых целей и без дополнительных ограничений. Многие из нас внесли значительный вклад в код (и проект) и совершенно не против получать за это иногда финансовую компенсацию, но мы определенно не собираемся ее требовать. Мы верим, что первая и основная наша "миссия" это предоставление кода для всех, кому он необходим, и для любых целей, так чтобы этот код становился всё более распространённым и предоставлял самые широкие возможности. Это, я верю, является одной из наиболее фундаментальных целей Свободного Программного Обеспечения, и мы с энтузиазмом поддерживаем её.
+
+Тот код в нашем дереве исходных текстов, который попадает под Стандартную Общественную Лицензию GNU (GPL) или Стандартную Общественную Лицензию Ограниченного Применения GNU (LGPL), предоставляется с дополнительными условиями, хотя они обеспечивают только возможность доступа, а не его ограничение. По причине дополнительных сложностей, которые могут появится при коммерческом использовании GPL-продуктов, мы предпочитаем ПО, предоставленное под более свободной лицензией BSD, когда это возможно.
+
+[[development]]
+=== Модель Разработки FreeBSD
+
+Разработка FreeBSD - это очень открытый и гибкий процесс. FreeBSD в буквальном смысле создана из кода, предоставленного сотнями людей со всего мира, в чем вы можете убедится, взглянув на link:{contributors}[список этих людей]. Инфраструктура разработки FreeBSD позволяет этим сотням разработчиков сотрудничать с помощью Интернета. Мы постоянно ищем новых разработчиков и новые идеи, и те, кто заинтересован в более тесном взаимодействии и хочет принять участие в проекте, должны просто связаться с нами в рассылке link:{freebsd-hackers-url}[freebsd-hackers]. Для тех, кто желает уведомить других пользователей FreeBSD об основных направлениях работы, доступен {freebsd-announce}.
+
+Для независимой работы или тесного сотрудничества, полезно знать о проекте и процессе разработки FreeBSD следующее:
+
+CVS-репозиторий[[development-cvs-repository]]::
+Главное дерево исходных текстов FreeBSD поддерживается с помощью http://ximbiot.com/cvs/wiki/[CVS] (Concurrent Versions System), свободно доступной системой контроля исходных текстов, которая поставляется вместе с FreeBSD. Основной http://www.FreeBSD.org/cgi/cvsweb.cgi[CVS репозиторий] располагается на компьютере, находящемся в городе Санта Клара, Калифорния (США), откуда и распространяется на множество зеркал по всему миру. Дерево CVS, содержащее ветви crossref:cutting-edge[current,-CURRENT] и crossref:cutting-edge[stable,-STABLE], может быть легко скопировано на ваш локальный компьютер. Дополнительную информацию о том, как это сделать, можно найти в разделе crossref:cutting-edge[synching,Синхронизация дерева исходных текстов].
+
+Список коммиттеров[[development-committers]]::
+_Коммиттеры_ - это люди, которые имеют доступ на _запись_ к главному дереву CVS, и имеют право вносить изменения в главное дерево исходных текстов FreeBSD (термин "коммиттер" появился от названия команды man:cvs[1] `commit`, которая используется для внесения изменений в CVS-репозиторий). Лучший способ предоставить ваши соображения на рассмотрение коммиттеров - использовать команду man:send-pr[1]. Если что-то произошло с системой, вы можете достучаться до них посылкой письма по адресу {committers-name}.
+
+Core-группа FreeBSD [[development-core]]::
+_Core-группа FreeBSD_ могла бы быть эквивалентом Совета Директоров, если бы Проект FreeBSD был компанией. Главная задача Core-группы - гарантировать, что проект в целом в хорошем состоянии и движется в правильном направлении. Приглашение постоянных и ответственных разработчиков присоединиться к группе коммиттеров - одна из функций Core-группы, так же, как и приглашение новых членов в Core-группу по мере того, как другие уходят. Нынешний состав команды был выбран из рядов коммиттеров путем общего голосования в июле 2006 года. Выборы проходят каждые 2 года.
++
+Некоторые члены Core-группы имеют особые области ответственности, то есть, они являются ответственными за работу отдельной большой части системы. Полный список разработчиков FreeBSD и областей их ответственности можно найти в link:{contributors}[Списке участников].
++
+[NOTE]
+====
+Большинство членов Core-группы - волонтёры, и не получают никакой финансовой выгоды от участия в проекте, поэтому вы не должны рассматривать возложенную на них "ответственность" как "гарантированную поддержку". Аналогия с "советом директоров" не очень точна и, вероятно, гораздо правильнее будет сказать, что это люди, которые посвятили себя FreeBSD, хотя и достойны лучшей участи!
+====
+
+Внешняя помощь::
+Последней, но однозначно не менее значимой, и наибольшей группой разработчиков являются сами пользователи, которые предоставляют комментарии и исправления ошибок нам на почти постоянной основе. Основной путь участвовать в не централизованной разработке - это подписка на {freebsd-hackers}, где обсуждаются подобные вещи. Обратитесь к crossref:eresources[eresources, Ресурсы в интернет] за дальнейшей информацией о различных списках рассылки FreeBSD.
++
+link:{contributors}[Список участников проекта FreeBSD] очень длинный и постоянно растет, так почему бы вам не присоединится к нему, предоставив что-нибудь проекту FreeBSD сегодня?
++
+Предоставление кода - не единственный способ помочь проекту; более полный список того, что необходимо сделать, можно найти на link:https://www.FreeBSD.org/ru/[Web-сайте проекта FreeBSD].
+
+Вообще говоря, наша модель разработки организована как "нечеткий набор концентрированных колец". Централизованная модель разработана для удобства _пользователей_ FreeBSD, которые получают простую систему контроля за одной центральной базой кода, и позволяет не оставить за бортом проекта потенциальных помощников! Мы желаем предоставить стабильную операционную систему с большим количеством согласованных crossref:ports[ports,прикладных программ], которые пользователи смогут легко установить и использовать - наша модель очень хорошо подходит для решения этой задачи.
+
+Всё, что мы просим от желающих присоединится к нам как разработчики, - хотя бы часть той преданности постоянному успеху FreeBSD, которой отличаются нынешние разработчики!
+
+[[relnotes]]
+=== Текущая версия FreeBSD
+
+FreeBSD - это свободно доступная, с полными исходными текстами, основанная на 4.4BSD-Lite версия для компьютерных систем, основанных на Intel i386(TM), i486(TM), Pentium(R), Pentium(R) Pro, Celeron(R), Pentium(R) II, Pentium(R) III, Pentium(R) 4 (или совместимыми), Xeon(TM), DEC Alpha(TM) и Sun UltraSPARC(R). В основном она базируется на программном обеспечении от группы CSRG, U.C. Berkley, с некоторым дополнениями из NetBSD, OpenBSD, 386BSD и Free Software Foundation.
+
+С момента выпуска FreeBSD версии 2.0 в конце 1994 года, производительность, возможности и стабильность FreeBSD существенно возросли. Самое большое изменение - это полное обновление системы виртуальной памяти с объединением виртуальной памяти и буферного кэша файловой системы, что не только увеличивает производительность, но и уменьшает количество используемой FreeBSD памяти, делая 5 Mбайтовую конфигурацию более приемлемым минимумом. Другие улучшения включают полную поддержку клиента и сервера NIS, поддержку транзакций TCP, поддержку "дозвона по запросу" в PPP, встроенную поддержку DHCP, улучшенную подсистемe SCSI, поддержку адаптеров ISDN, ATM, FDDI, Fast и Gigabit Ethernet (1000 Mбит), улучшенную поддержку новейших контролеров Adaptec и многие тысячи исправленных ошибок.
+
+В дополнение к базовой системе, FreeBSD предоставляет коллекцию портированого ПО, включающую тысячи популярных программ. На момент подготовки этого документа в ней было более {numports} портов! В коллекцию входят множество программ от http-серверов до игр, языков программирования, текстовых редакторов и всего прочего. Полная Коллекция Портов требует приблизительно {ports-size} дискового пространства, потому что порт представляет собой "изменения" оригинальных исходных текстов. Это сильно упрощает нам процесс обновления портов и существенно уменьшает объём занимаемого дискового пространства по сравнению со старой (1.0) Коллекцией Портов. Для того, чтобы скомпилировать и установить программу, необходимо всего лишь перейти в каталог порта программы, набрать `make install` и дать системе сделать все остальное. Полные исходные тексты для каждого порта, который вы устанавливаете, загружаются автоматически с CDROM или локального FTP-сервера, поэтому вам нужно только дисковое пространство для сборки необходимых портов. Почти каждый порт предоставляется также как скомпилированный "пакет", который может быть установлен с помощью простой команды (`pkg_add`) теми, кто предпочитает не компилировать порты из исходных текстов. Дополнительная информация о пакетах и портах находится в crossref:ports[ports, Установка приложений. порты и пакеты].
+
+Множество дополнительных документов, которые могут пригодиться в процессе установки и использования FreeBSD, находятся в каталоге [.filename]#/usr/shared/doc# на любой машине, работающей под управлением современной версии FreeBSD. Вы можете просматривать локально установленные документы с помощью любого браузера, поддерживающего HTML, используя следующие ссылки:
+
+Руководство FreeBSD::
+link:file://localhost/usr/shared/doc/ru_RU.KOI8-R/books/handbook/index.html[/usr/shared/doc/ru_RU.KOI8-R/books/handbook/index.html]
+
+FreeBSD FAQ (Часто задаваемые вопросы)::
+link:file://localhost/usr/shared/doc/ru_RU.KOI8-R/books/faq/index.html[/usr/shared/doc/ru_RU.KOI8-R/books/faq/index.html]
+
+Вы также можете просмотреть основные (и наиболее часто обновляемые) копии на http://www.FreeBSD.org/ru/[http://www.FreeBSD.org/ru/].
diff --git a/documentation/content/ru/books/handbook/kernelconfig/_index.adoc b/documentation/content/ru/books/handbook/kernelconfig/_index.adoc
new file mode 100644
index 0000000000..de35065902
--- /dev/null
+++ b/documentation/content/ru/books/handbook/kernelconfig/_index.adoc
@@ -0,0 +1,1174 @@
+---
+title: Глава 9. Настройка ядра FreeBSD
+part: Часть II. Общие задачи
+prev: books/handbook/multimedia
+next: books/handbook/printing
+---
+
+[[kernelconfig]]
+= Настройка ядра FreeBSD
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 9
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/kernelconfig/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/kernelconfig/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/kernelconfig/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[kernelconfig-synopsis]]
+== Краткий обзор
+
+Ядро - это основная часть операционной системы FreeBSD. Оно ответственно за управление памятью, параметры безопасности, работу с сетью, доступ к дискам и многое другое. Несмотря на то, что FreeBSD становится всё более динамически конфигурируемой, иногда приходится собирать собственное ядро.
+
+После прочтения этой главы вы узнаете:
+
+* Почему вам может понадобиться сборка собственного ядра.
+* Как написать файл конфигурации ядра или изменить существующий.
+* Как использовать файл конфигурации ядра для того, чтобы создать и собрать новое ядро.
+* Как установить новое ядро.
+* Что делать, если что-то не работает или работает не так, как должно.
+
+Все команды, приводимые в этой главе в качестве примера, должны выполняться от пользователя `root`.
+
+[[kernelconfig-custom-kernel]]
+== Зачем собирать собственное ядро?
+
+Традиционно в FreeBSD использовалось так называемое "монолитное" ядро. Это означает, что ядро - это одна большая программа, которая поддерживает фиксированный набор устройств и в случае, если необходимо изменить его поведение, требуется сборка нового ядра и перезагрузка компьютера уже с новым ядром.
+
+На сегодняшний день FreeBSD быстро продвигается к модели, в которой большая часть функциональности содержится в модулях, которые могут быть при необходимости динамически загружены и выгружены из ядра. Это позволяет ядру использовать устройства, которые "внезапно" появились в системе (например, устройства PCMCIA в лэптопе) или добавлять новую функциональность в ядро, которая не была необходима в момент первоначальной сборки ядра. Такой подход известен как модульность ядра.
+
+Несмотря на это, всё ещё иногда бывает необходимо, чтобы некоторая функциональность была вкомпилирована в ядро статически. В некоторых случаях это продиктовано тем, что эта функциональность настолько сильно привязана к ядру, что не может быть динамически загружаемой. В других случаях это может быть просто потому, что никто не уделил время написанию динамически загружаемого модуля для этой функциональности.
+
+Сборка собственного ядра - один из наиболее важных ритуалов, совершаемых опытными пользователями BSD. Несмотря на длительность этого процесса, ваша FreeBSD останется только в выигрыше. В отличие от ядра [.filename]#GENERIC#, которое должно поддерживать широкий спектр аппаратного обеспечения, собственное ядро содержит поддержку аппаратного обеспечения только _вашего_ компьютера. Это может давать следующие преимущества:
+
+* Меньшее время загрузки. Поскольку ядро будет пытаться определить только то аппаратное обеспечение, которое установлено в вашем компьютере, время, которое потребуется системе для загрузки, может значительно уменьшиться.
+* Уменьшение использования памяти. Собственное ядро часто использует меньше памяти, чем ядро [.filename]#GENERIC#, так как из него исключены лишние драйвера и неиспользуемые функциональные возможности. Это важно тем, что часть оперативной памяти постоянно занята кодом ядра и поэтому не может быть выделена приложениям. Именно по этой причине собственное ядро особенно полезно при использовании систем с малым объемом оперативной памяти.
+* Поддержка дополнительного аппаратного обеспечения. Собственное ядро позволяет вам добавить поддержку устройств, отсутствующих в ядре [.filename]#GENERIC#.
+
+[[kernelconfig-devices]]
+== Определение аппаратного обеспечения
+
+Перед тем, как углубиться в конфигурирование ядра, было бы разумно составить перечень установленного в компьютер аппаратного обеспечения. Если FreeBSD не является основной операционной системой, то перечень оборудования может быть легко составлен на основании анализа конфигурации текущей операционной системы. Например, Диспетчер устройств (Device Manager) от Microsoft(R) обычно содержит необходимую информацию об установленных устройствах. Диспетчер устройств находится на панели управления (control panel).
+
+[NOTE]
+====
+У некоторых версий Microsoft(R) Windows(R) есть значок Система (System), вызов которого отобразит экран, содержащий среди прочих и Диспетчер устройств.
+====
+
+Если других операционных систем на машине не установлено, системному администратору придется искать эту информацию самостоятельно. Один из методов подразумевает использование утилиты man:dmesg[8] и команды man:man[1]. У большинства драйверов во FreeBSD есть страницы справочника, содержащие список поддерживаемого оборудования, а найденные во время начальной загрузки устройства будут перечислены в man:dmesg[8]. К примеру, следующие строки информируют о том, что драйвер [.filename]#psm# обнаружил мышь:
+
+[.programlisting]
+....
+psm0: <PS/2 Mouse> irq 12 on atkbdc0
+psm0: [GIANT-LOCKED]
+psm0: [ITHREAD]
+psm0: model Generic PS/2 mouse, device ID 0
+....
+
+Этот драйвер необходимо будет включить в конфигурацию собственного ядра или загрузить посредством man:loader.conf[5].
+
+В некоторых случаях `dmesg` отображает только системные сообщения вместо сообщений начальной загрузки. В таких случаях необходимо обращаться к файлу [.filename]#/var/run/dmesg.boot#.
+
+Еще один метод нахождения аппаратного обеспечения подразумевает использование достаточно информативной утилиты man:pciconf[8]. Например:
+
+[.programlisting]
+....
+ath0@pci0:3:0:0: class=0x020000 card=0x058a1014 chip=0x1014168c rev=0x01 hdr=0x00
+ vendor = 'Atheros Communications Inc.'
+ device = 'AR5212 Atheros AR5212 802.11abg wireless'
+ class = network
+ subclass = ethernet
+....
+
+Эта часть вывода, полученная в результате запуска команды `pciconf -lv`, показывает, что драйвер [.filename]#ath# обнаружил беспроводное Ethernet устройство. Набрав `man _ath_`, вы получите страницу справочника man:ath[4].
+
+Также, для извлечения необходимой информации, можно воспользоваться ключом `-k` к команде man:man[1]. В вышеприведенном случае можно набрать:
+
+[source,bash]
+....
+# man -k Atheros
+....
+
+чтобы получить страницы справочника, содержащие определенное слово:
+
+[.programlisting]
+....
+ath(4) - Atheros IEEE 802.11 wireless network driver
+ath_hal(4) - Atheros Hardware Access Layer (HAL)
+....
+
+Теперь, имея в распоряжении перечень аппаратного оборудования, можно безбоязненно приступить к сборке специализированного ядра.
+
+[[kernelconfig-modules]]
+== Драйвера, подсистемы и модули ядра
+
+Перед построением специализированного ядра, обдумайте причины, побудившие вас к этому. Если требуется поддержка специального оборудования, то она наверняка уже реализована в виде модуля.
+
+Модули ядра находятся в каталоге [.filename]#/boot/kernel#, и они могут быть динамически включены в работающее ядро при помощи man:kldload[8]. Если не все, то большинство драйверов существуют в виде модулей, и у них есть соответствующая страница справочника. К примеру, в предыдущем разделе упоминался драйвер [.filename]#ath# беспроводного Ethernet устройства. Соответствующая ему страница справочника гласит:
+
+[.programlisting]
+....
+Alternatively, to load the driver as a module at boot time, place the
+following line in man:loader.conf[5]:
+
+ if_ath_load="YES"
+....
+
+Как уже выше сказано, добавление строки `if_ath_load="YES"` в файл [.filename]#/boot/loader.conf# позволит динамически загружать этот модуль во время загрузки системы.
+
+В некоторых случаях, однако, интересующего вас модуля не существует. Чаще всего это справедливо для определенных подсистем и очень важных драйверов. Например, поддержка файловой системы FreeBSD (FFS) является обязательной опцией в ядре. Как и поддержка сети (INET). К сожалению, единственный способ определить является ли драйвер обязательным - это проверить наличие соответствующего модуля.
+
+[WARNING]
+====
+
+Довольно легко удалить поддержку устройства или опцию, получив тем самым неработоспособное ядро. Например, если драйвер man:ata[4] изъят из конфигурации ядра, то система, использующая диски ATA, может не загрузиться без записи о модуле, добавленной в [.filename]#loader.conf#. Если есть сомнения, проверьте наличие модуля, и только потом исключайте поддержку в ядре.
+====
+
+[[kernelconfig-building]]
+== Сборка и установка собственного ядра
+
+[NOTE]
+====
+Для сборки ядра необходимо наличие всех исходных файлов FreeBSD.
+====
+
+Во-первых, давайте сделаем краткий обзор каталога, в котором будет происходить сборка ядра. Все каталоги, которые будут упоминаться, будут относительными по отношению к основному каталогу [.filename]#/usr/src/sys#, который также доступен как каталог [.filename]#/sys#. Этот каталог содержит множество подкаталогов, представляющих собой различные части ядра, но наиболее важным для нас будет каталог [.filename]#arch/conf#, в котором вы будете редактировать конфигурационный файл ядра и в котором находится каталог [.filename]#compile#, где будет собираться ваше ядро. _arch_ может быть [.filename]#i386#, [.filename]#amd64#, [.filename]#ia64#, [.filename]#powerpc#, [.filename]#sparc64# или [.filename]#pc98# (альтернативная ветвь аппаратного обеспечения, популярная в Японии). Все, что находится внутри каталога определенной архитектуры, относится только к этой архитектуре; остальной код является машинно независимым и общим для всех платформ, на которые FreeBSD может быть потенциально портирована. Обратите внимание на логическую структуру каталогов, в которой каждое поддерживаемое устройство, каждая файловая система и каждая опция размещается в своём собственном каталоге.
+
+В примерах этой главы подразумевается, что вы используете архитектуру i386. Если архитектура вашей системы отличается от используемой в примерах, то вам необходимо будет соответственно изменить имена каталогов.
+
+[NOTE]
+====
+Если каталог [.filename]#/usr/src/# отсутствует в вашей системе (или этот каталог пуст), то это значит, что исходные тексты не были установлены. Наиболее простой способ установить их - воспользоваться man:csup[1], как описано в crossref:cutting-edge[synching,Синхронизация исходных текстов]. Далее, создайте символическую ссылку на [.filename]#/usr/src/sys/#:
+
+[source,bash]
+....
+# ln -s /usr/src/sys /sys
+....
+
+====
+
+Затем, перейдите в каталог [.filename]#arch/conf# и скопируйте файл конфигурации [.filename]#GENERIC# в файл с выбранным вами именем. Например:
+
+[source,bash]
+....
+# cd /usr/src/sys/i386/conf
+# cp GENERIC MYKERNEL
+....
+
+По традиции имя состоит из букв в верхнем регистре, и если вы поддерживаете несколько компьютеров FreeBSD на различном оборудовании, хорошая идея добавлять это имя к имени хоста. Мы назвали ядро [.filename]#MYKERNEL# в этом примере.
+
+[TIP]
+====
+
+Помещение файла конфигурации ядра в [.filename]#/usr/src# может быть плохой идеей. Если вы испытываете проблемы, их можно решить удалив [.filename]#/usr/src# и начав все с начала. После этого обычно требуется несколько секунд, чтобы понять, что вы удалили собственный файл настройки ядра. Не редактируйте непосредственно [.filename]#GENERIC#, он может быть также перезаписан и при следующем crossref:cutting-edge[updating-upgrading,обновлении дерева исходных текстов], и изменения ядра будут потеряны.
+
+Вы можете сохранить файл конфигурации ядра в другом месте, а затем создать символическую ссылку на этот файл в каталоге [.filename]#i386#.
+
+Например:
+
+[source,bash]
+....
+# cd /usr/src/sys/i386/conf
+# mkdir /root/kernels
+# cp GENERIC /root/kernels/MYKERNEL
+# ln -s /root/kernels/MYKERNEL
+....
+
+====
+
+Теперь отредактируйте файл [.filename]#MYKERNEL# в своём любимом текстовом редакторе. Если вы только начинаете, единственным доступным редактором скорее всего будет vi, который слишком сложен для того, чтобы описать его здесь, но в <<bibliography,библиографии>> перечислено множество книг, в которых его использование хорошо освещено. Однако FreeBSD предоставляет более простой редактор ee, который, если вы - новичок, подойдёт вам больше всего. Не стесняйтесь изменять строки комментариев в начале файла, с тем, чтобы отобразить вашу конфигурацию или изменения, которые вы сделали по сравнению с [.filename]#GENERIC#.
+
+Если вам приходилось собирать ядро для SunOS(TM) или какой-либо другой операционной системы типа BSD, многое из того, что содержится в этом файле будет очень знакомо вам. Если же вы, напротив, использовали другую операционную систему, такую как DOS, файл конфигурации [.filename]#GENERIC# может показаться вам крайне сложным, поэтому следуйте инструкциям в разделе <<kernelconfig-config,Конфигурационный файл>> медленно и внимательно.
+
+[NOTE]
+====
+Если вы crossref:cutting-edge[updating-upgrading,синхронизируете дерево исходных текстов] с деревом проекта FreeBSD, не забудьте свериться с файлом [.filename]#/usr/src/UPDATING# перед обновлением. В этом файле описаны все важные вопросы и области исходного кода, требующие особого внимания. [.filename]#/usr/src/UPDATING# всегда соответствует версии ваших исходных текстов FreeBSD, поэтому является более актуальным источником информации, чем это руководство.
+====
+
+Теперь вы должны скомпилировать ядро.
+
+[.procedure]
+====
+*Procedure: Сборка ядра*
+
+[NOTE]
+======
+Для сборки ядра необходимо наличие всех исходных файлов FreeBSD.
+======
+
+. Перейдите в каталог [.filename]#/usr/src#:
++
+[source,bash]
+....
+# cd /usr/src
+....
++
+. Соберите ядро:
++
+[source,bash]
+....
+# make buildkernel KERNCONF=MYKERNEL
+....
++
+. Установите новое ядро:
++
+[source,bash]
+....
+# make installkernel KERNCONF=MYKERNEL
+....
+====
+
+[TIP]
+====
+
+По умолчанию, при построении ядра, _все_ модули ядра так же будут пересобраны. Если вы хотите обновить ядро быстрее или построить только определённые модули, то вам нужно отредактировать файл [.filename]#/etc/make.conf# перед началом процесса сборки ядра:
+
+[.programlisting]
+....
+MODULES_OVERRIDE = linux acpi sound/sound sound/driver/ds1 ntfs
+....
+
+Эта переменная устанавливает список модулей, которые нужно построить вместо построения всех модулей.
+
+[.programlisting]
+....
+WITHOUT_MODULES = linux acpi sound ntfs
+....
+
+В этой переменной перечисляются основные модули, которые необходимо исключить из процесса сборки. За другими переменными, которые вы можете посчитать полезными в процессе сборки ядра, обращайтесь к странице справочника man:make.conf[5].
+====
+
+Новое ядро будет скопировано в каталог [.filename]#/boot/kernel# как [.filename]#/boot/kernel/kernel#, а старое ядро будет перемещено в [.filename]#/boot/kernel.old/kernel#. Теперь перезагрузите систему для того, чтобы использовать новое ядро. Если что-то пойдёт не так, вы можете обратиться к разделу <<kernelconfig-trouble,Решение проблем>> в конце этой главы, который может оказаться полезен. Не забудьте прочитать раздел, который объясняет как исправить ситуацию, когда ядро <<kernelconfig-noboot,не загружается>>.
+
+[NOTE]
+====
+Другие файлы, относящиеся к процессу загрузки, такие как загрузчик (man:loader[8]) и его конфигурационные файлы, размещаются в [.filename]#/boot#. Модули сторонних производителей могут быть помещены в [.filename]#/boot/kernel#, хотя пользователи должны знать, что очень важно, чтобы модули были синхронизированы с собранным ядром. Модули, не рассчитанные на работу с собранным ядром, могут вызвать нестабильность и некорректность работы.
+====
+
+[[kernelconfig-config]]
+== Конфигурационный файл
+
+Формат конфигурационного файла достаточно прост. Каждая строка представляет собой ключевое слово и один или более аргументов. Для простоты большинство строк содержат только один аргумент. Всё, что следует за символом `#` является комментарием и игнорируется. Следующие разделы описывают каждый параметр, в порядке, в котором они появляются в [.filename]##GENERIC##. [[kernelconfig-options]] За полным списком архитектурно-зависимых параметров и устройств обратитесь к файлу [.filename]##NOTES## в том же каталоге, что и [.filename]##GENERIC##. Архитектурно независимые параметры находятся в [.filename]##/usr/src/sys/conf/NOTES##.
+
+Директива `include` стала доступной для использования в конфигурационных файлах. Она позволяет включать в текущий конфигурационный файл содержимое другого файла, тем самым упрощая процесс внесения небольших изменений в существующий файл. Например, если вам необходимо добавить всего несколько дополнительных опций или драйверов в ядро [.filename]#GENERIC#, то вам придется поддерживать только разницу к файлу GENERIC:
+
+[.programlisting]
+....
+include GENERIC
+ident MYKERNEL
+
+options IPFIREWALL
+options DUMMYNET
+options IPFIREWALL_DEFAULT_TO_ACCEPT
+options IPDIVERT
+....
+
+Большинство администраторов оценят значительные преимущества перед старым способом - написанием конфигурационного файла "с нуля": ваш конфигурационный файл будет отображать только изменения относительно [.filename]#GENERIC#. А после обновлений исходного кода, новые функциональные возможности, появившиеся в GENERIC, будут добавлены и в вашу конфигурацию, если только не препятствовать этому директивами `nooptions` или `nodevice`. Далее в этом разделе описывается типовой конфигурационный файл, его опции и устройства, а также их роли.
+
+[NOTE]
+====
+Для сборки ядра со всеми возможными опциями (обычно используется для тестирования), выполните от имени суперпользователя (`root`) следующую команду:
+
+[source,bash]
+....
+# cd /usr/src/sys/i386/conf && make LINT
+....
+
+====
+
+Это пример конфигурационного файла ядра [.filename]#GENERIC# с различными дополнительными комментариями, которые могут понадобиться для ясности. Этот пример должен совпадать с вашей копией в [.filename]#/usr/src/sys/i386/conf/GENERIC# практически полностью.
+
+[.programlisting]
+....
+machine i386
+....
+
+Это архитектура машины. Она должна быть одной из следующих: `amd64`, `i386`, `ia64`, `pc98`, `powerpc`, или `sparc64`.
+
+[.programlisting]
+....
+cpu I486_CPU
+cpu I586_CPU
+cpu I686_CPU
+....
+
+Эта опция указывает тип процессора, который используется в вашей системе. В конфигурационном файле может быть несколько вхождений этой опции (например, если вы не уверены, какой из типов процессора необходимо использовать - `I586_CPU` или `I686_CPU`), но для собственного ядра лучше указывать только тот тип процессора, который установлен в вашей системе. Если вы не уверены, какой тип необходимо использовать вам, вы можете воспользоваться файлом [.filename]#/var/run/dmesg.boot#, чтобы увидеть протокол загрузки системы.
+
+[.programlisting]
+....
+ident GENERIC
+....
+
+Этот параметр определяет "метку" ядра. Необходимо, чтобы она соответствовала названию файла конфигурации ядра, например `_MYKERNEL_`, если вы следовали инструкциям в предыдущих примерах. Значение, которое вы присвоите параметру `ident` будет выводиться в процессе загрузки, поэтому полезно давать новым ядрам другие имена для того, чтобы отличать их от обычного ядра (например, если вы хотите собрать экспериментальное ядро).
+
+[.programlisting]
+....
+#To statically compile in device wiring instead of /boot/device.hints
+#hints "GENERIC.hints" # Default places to look for devices.
+....
+
+man:device.hints[5] используются для настройки параметров драйверов устройств. Путь по умолчанию, который man:loader[8] будет проверять при загрузке - [.filename]#/boot/device.hints#. Используя опцию `hints` вы можете вкомпилировать эти параметры статически в ваше ядро. В этом случае не требуется создавать файл [.filename]#device.hints# в каталоге [.filename]#/boot#.
+
+[.programlisting]
+....
+makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols
+....
+
+При обычном построении ядра в сборку включается отладочная информация: опция `-g` передается компилятору man:gcc[1].
+
+[.programlisting]
+....
+options SCHED_ULE # ULE scheduler
+....
+
+Планировщик по умолчанию во FreeBSD. Оставьте эту опцию.
+
+[.programlisting]
+....
+options PREEMPTION # Enable kernel thread preemption
+....
+
+Позволяет высокоприоритетным нитям ядра вытеснять конкурентов, находящихся в режиме выполнения. Эта опция может помочь повысить реактивность системы по отношению к внешним воздействиям, например, за счет снижения латентности нитей, обрабатывающих прерывания.
+
+[.programlisting]
+....
+options INET # InterNETworking
+....
+
+Поддержка сетевых возможностей. Оставьте эту опцию включенной, даже если вы не планируете подключаться к сети. Большинство программ требуют, чтобы работал хотя бы интерфейс обратной связи (loopback) (т.е. создание сетевых соединений внутри вашего ПК), так что эта опция в принципе является обязательной.
+
+[.programlisting]
+....
+options INET6 # IPv6 communications protocols
+....
+
+Включает поддержку коммуникационных протоколов IPv6.
+
+[.programlisting]
+....
+options FFS # Berkeley Fast Filesystem
+....
+
+Включает поддержку основной файловой системы. Не удаляйте эту опцию, если вы планируете загружаться с жесткого диска.
+
+[.programlisting]
+....
+options SOFTUPDATES # Enable FFS Soft Updates support
+....
+
+Этот параметр включает в ядре технологию Soft Updates, которая повышает скорость записи на диски. Несмотря на то, что эта технология включена в ядре, она должна быть включена для отдельных дисков. Просмотрите вывод команды man:mount[8] чтобы определить, включены ли Soft Updates для дисков вашей системы. Если вы не увидите параметр `soft-updates`, вам будет необходимо активировать его при помощи команды man:tunefs[8] (для существующих файловых систем) или команды man:newfs[8] (для новых файловых систем).
+
+[.programlisting]
+....
+options UFS_ACL # Support for access control lists
+....
+
+Этот параметр включает в ядре поддержку списков управления доступом (ACL). Основывается на использовании расширенных атрибутов и UFS2, детальное описание вы сможете найти в crossref:security[fs-acl,Списки контроля доступа файловой системы (ACL)]. ACL включены по умолчанию и не должны выключаться в случае, если они ранее использовались на файловой системе, так как это удалит списки управления доступом и изменит то, как защищены файлы, непредсказуемым образом.
+
+[.programlisting]
+....
+options UFS_DIRHASH # Improve performance on big directories
+....
+
+Эта опция включает функциональность, которая повышает скорость дисковых операций на больших каталогах в обмен на использование дополнительной памяти. Для большого сервера или рабочей станции рекомендуется оставить ее включенной, и выключить для системы, для которой более приоритетна память, чем скорость доступа к дискам, например для брандмауэра.
+
+[.programlisting]
+....
+options MD_ROOT # MD is a potential root device
+....
+
+Этот параметр включает поддержку использования дисков в памяти для корневой файловой системы.
+
+[.programlisting]
+....
+options NFSCLIENT # Network Filesystem Client
+options NFSSERVER # Network Filesystem Server
+options NFS_ROOT # NFS usable as /, requires NFSCLIENT
+....
+
+Сетевая файловая система. Если вы не планируете монтировать разделы с файлового сервера UNIX(R) через TCP/IP, вы можете исключить этот параметр из конфигурационного файла ядра.
+
+[.programlisting]
+....
+options MSDOSFS # MSDOS Filesystem
+....
+
+Файловая система MS-DOS(R). Если вы не собираетесь монтировать форматированный в DOS раздел жесткого диска в момент загрузки, вы можете безопасно закомментировать этот параметр. Необходимый модуль будет автоматически загружен, когда вы в первый раз смонтируете раздел DOS, так, как это описано ниже. Кроме того, замечательный пакет package:emulators/mtools[] позволяет получить доступ к DOS дискетам без необходимости монтировать и размонтировать их (и не требует наличия `MSDOSFS`).
+
+[.programlisting]
+....
+options CD9660 # ISO 9660 Filesystem
+....
+
+Файловая система ISO 9660 для компакт-дисков. Если у вас нет привода CDROM или вы будете лишь изредка монтировать компакт-диски с данными, закомментируйте эту строку, так как необходимый модуль будет загружен автоматически при первом монтировании компакт-диска с данными. Для использования звуковых компакт-дисков эта файловая система не потребуется.
+
+[.programlisting]
+....
+options PROCFS # Process filesystem (requires PSEUDOFS)
+....
+
+Файловая система процессов. Это "виртуальная" файловая система монтируемая в [.filename]#/proc#, которая позволяет таким приложениям, как man:ps[1] выдавать вам больше информации о запущенных процессах. Использование `PROCFS` не требуется, так как большинство мониторинговых и отладочных инструментов было адаптировано для работы без `PROCFS`: система по умолчанию не монтирует файловую систему процессов.
+
+[.programlisting]
+....
+options PSEUDOFS # Pseudo-filesystem framework
+....
+
+Ядра, которые используют `PROCFS`, должны также включать поддержку `PSEUDOFS`,
+
+[.programlisting]
+....
+options GEOM_PART_GPT # GUID Partition Tables.
+....
+
+Добавляет поддержку http://en.wikipedia.org/wiki/GUID_Partition_Table[Таблиц Разделов GUID]. Этот параметр делает возможным наличие большого количества разделов на одном диске, до 128 в стандартной конфигурации.
+
+[.programlisting]
+....
+options COMPAT_43 # Compatible with BSD 4.3 [KEEP THIS!]
+....
+
+Совместимость с 4.3BSD. Не выключайте эту опцию; некоторые приложения будут вести себя странно, если этой опции не будет в ядре.
+
+[.programlisting]
+....
+options COMPAT_FREEBSD4 # Compatible with FreeBSD4
+....
+
+Эта опция требуется для поддержки приложений, собранных на более старых версиях FreeBSD, которые используют старые интерфейсы вызовов. Рекомендуется использовать данную опцию на всех системах на платформах i386(TM), на которых могут запускаться старые приложения; платформы, поддержка которых появилась только в FreeBSD 5.X, например ia64 и sparc64, не требуют этой опции.
+
+[.programlisting]
+....
+options COMPAT_FREEBSD5 # Compatible with FreeBSD5
+....
+
+Эта опция необходима для поддержки приложений, скомпилированных на FreeBSD 5.X и использующих интерфейс системных вызовов FreeBSD 5.X.
+
+[.programlisting]
+....
+options COMPAT_FREEBSD6 # Compatible with FreeBSD6
+....
+
+Эта опция требуется для поддержки приложений, собранных на FreeBSD версий 6.X, которые используют интерфейсы системных вызовов FreeBSD 6.X.
+
+[.programlisting]
+....
+options COMPAT_FREEBSD7 # Compatible with FreeBSD7
+....
+
+Эта опция требуется на системах FreeBSD версий 8 и более поздних для поддержки приложений, собранных для FreeBSD 7.X и использующих интерфейсы системных вызовов FreeBSD 7.X.
+
+[.programlisting]
+....
+options SCSI_DELAY=5000 # Delay (in ms) before probing SCSI
+....
+
+Этот параметр заставляет ядро приостановиться на 5 секунд перед тем, как идентифицировать каждое устройство SCSI в вашей системе. Если у вас установлены только жесткие диски IDE, вы можете игнорировать эту опцию, в противном случае, возможно, вы захотите уменьшить это число, для того чтобы ускорить загрузку. Естественно, если вы сделаете это, а у FreeBSD появятся проблемы с распознанием ваших устройств SCSI, необходимо будет увеличить этот параметр.
+
+[.programlisting]
+....
+options KTRACE # ktrace(1) support
+....
+
+Включает поддержку трассировки процессов, что удобно при отладке.
+
+[.programlisting]
+....
+options SYSVSHM # SYSV-style shared memory
+....
+
+Этот параметр предоставляет поддержку разделяемой памяти System V. Наиболее распространенное применение этого - расширение XSHM в X, которое многие приложения, интенсивно работающие с графикой, будут автоматически использовать для повышения скорости работы. Если вы используете X, эта опция будет необходима.
+
+[.programlisting]
+....
+options SYSVMSG # SYSV-style message queues
+....
+
+Поддержка сообщений System V. Этот параметр добавляет в ядро всего лишь несколько сотен байт.
+
+[.programlisting]
+....
+options SYSVSEM # SYSV-style semaphores
+....
+
+Поддержка семафоров System V. Не настолько часто используемая возможность, но в ядро добавляет всего несколько сотен байт.
+
+[NOTE]
+====
+Команда man:ipcs[1] с параметром `-p` покажет все процессы, которые используют любую из этих возможностей System V.
+====
+
+[.programlisting]
+....
+options _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions
+....
+
+Расширения реального времени, добавленные 1993 POSIX(R). Определенные приложения из коллекции используют их, например StarOffice(TM).
+
+[.programlisting]
+....
+options KBD_INSTALL_CDEV # install a CDEV entry in /dev
+....
+
+Этот параметр разрешает формирование файлов устройств в [.filename]#/dev# для клавиатур.
+
+[.programlisting]
+....
+options ADAPTIVE_GIANT # Giant mutex is adaptive.
+....
+
+Giant - имя механизма защиты ("спящего" мьютекса) для крупных наборов ресурсов ядра. На нынешний момент Giant представляется фактически непригодным для использования в связи с серьезными потерями в производительности, и активно заменяется на механизмы, защищающие отдельные ресурсы ядра. Параметр `ADAPTIVE_GIANT` включает Giant в число адаптивных мьютексов: в случае, когда нить ядра нуждается в Giant, а он уже захвачен нитью, выполняющейся на другом процессоре, первая нить будет продолжать выполнение и ждать освобождения Giant. В норме нить должна была бы уснуть, пока не настанет очередной момент ее выполнения. Если вы не уверены, оставьте этот параметр в покое.
+
+[NOTE]
+====
+Для FreeBSD 8.0-RELEASE и более поздних версий, все мьютексы являются адаптивными по умолчанию, если обратное не указано специально опцией `NO_ADAPTIVE_MUTEXES`. Следовательно, Giant также адаптивен по умолчанию, и поэтому опция `ADAPTIVE_GIANT` была удалена из файла конфигурации ядра.
+====
+
+[.programlisting]
+....
+device apic # I/O APIC
+....
+
+Устройство apic разрешает использование набора I/O APIC для распределения прерываний. Оно может быть использовано как с однопроцессорными, так и с многопроцессорными ядрами (для последних наличие apic является обязательным). Для поддержки многопроцессорности добавьте строку `options SMP`.
+
+[NOTE]
+====
+Устройство apic существует только на архитектурах i386. На других архитектурах этот конфигурационный параметр использовать не следует.
+====
+
+[.programlisting]
+....
+device eisa
+....
+
+Включите эту опцию если у вас материнская плата EISA. Это включает автоопределение и конфигурирование поддержки всех устройств на шине EISA.
+
+[.programlisting]
+....
+device pci
+....
+
+Включите этот параметр, если у вас материнская плата с поддержкой PCI. Это включит автоопределение карт PCI и проксирование из шины PCI в шину ISA.
+
+[.programlisting]
+....
+# Floppy drives
+device fdc
+....
+
+Контроллер флоппи-диска.
+
+[.programlisting]
+....
+# ATA and ATAPI devices
+device ata
+....
+
+Этот драйвер поддерживает все устройства ATA и ATAPI. Вам необходима только одна строка `device ata` в ядре для того, чтобы обнаружить все PCI устройства ATA/ATAPI в современных машинах.
+
+[.programlisting]
+....
+device atadisk # ATA disk drives
+....
+
+Эта строка необходима вместе с `device ata` для поддержки дисков ATA.
+
+[.programlisting]
+....
+device ataraid # ATA RAID drives
+....
+
+Эта строка необходима вместе с `device ata` для поддержки дисков ATA RAID.
+
+[.programlisting]
+....
+
+device atapicd # ATAPI CDROM drives
+....
+
+Поддержка приводов ATAPI CDROM. Используется вместе с `device ata`.
+
+[.programlisting]
+....
+device atapifd # ATAPI floppy drives
+....
+
+Поддержка флоппи-приводов ATAPI. Используется вместе с `device ata`.
+
+[.programlisting]
+....
+device atapist # ATAPI tape drives
+....
+
+Поддержка ленточных приводов ATAPI (стримеров). Используется вместе с `device ata`.
+
+[.programlisting]
+....
+options ATA_STATIC_ID # Static device numbering
+....
+
+Заставляет драйвер нумеровать устройства статически; в противном случае происходит динамическая нумерация.
+
+[.programlisting]
+....
+# SCSI Controllers
+device ahb # EISA AHA1742 family
+device ahc # AHA2940 and onboard AIC7xxx devices
+options AHC_REG_PRETTY_PRINT # Print register bitfields in debug
+ # output. Adds ~128k to driver.
+device ahd # AHA39320/29320 and onboard AIC79xx devices
+options AHD_REG_PRETTY_PRINT # Print register bitfields in debug
+ # output. Adds ~215k to driver.
+device amd # AMD 53C974 (Teckram DC-390(T))
+device isp # Qlogic family
+#device ispfw # Firmware for QLogic HBAs- normally a module
+device mpt # LSI-Logic MPT-Fusion
+#device ncr # NCR/Symbios Logic
+device sym # NCR/Symbios Logic (newer chipsets + those of `ncr')
+device trm # Tekram DC395U/UW/F DC315U adapters
+
+device adv # Advansys SCSI adapters
+device adw # Advansys wide SCSI adapters
+device aha # Adaptec 154x SCSI adapters
+device aic # Adaptec 15[012]x SCSI adapters, AIC-6[23]60.
+device bt # Buslogic/Mylex MultiMaster SCSI adapters
+
+device ncv # NCR 53C500
+device nsp # Workbit Ninja SCSI-3
+device stg # TMC 18C30/18C50
+....
+
+Контроллеры SCSI. Закомментируйте те, которых у вас в системе нет. Если у вас в системе исключительно IDE устройства, вы можете удалить все эти строки. Строки вида `*_REG_PRETTY_PRINT` включают режим отладки для соответствующих драйверов.
+
+[.programlisting]
+....
+# SCSI peripherals
+device scbus # SCSI bus (required for SCSI)
+device ch # SCSI media changers
+device da # Direct Access (disks)
+device sa # Sequential Access (tape etc)
+device cd # CD
+device pass # Passthrough device (direct SCSI access)
+device ses # SCSI Environmental Services (and SAF-TE)
+....
+
+Периферийные устройства SCSI. Опять-таки, закомментируйте те, которых у вас в системе нет, или, если у вас в наличии исключительно IDE, можете удалить все.
+
+[NOTE]
+====
+USB man:umass[4] драйвер (и некоторые другие драйверы) используют подсистему SCSI, хотя и не являются настоящими SCSI устройствами. Следовательно, вам необходимо сохранить поддержку SCSI, если какой-либо из этих драйверов включен в конфигурацию ядра.
+====
+
+[.programlisting]
+....
+# RAID controllers interfaced to the SCSI subsystem
+device amr # AMI MegaRAID
+device arcmsr # Areca SATA II RAID
+device asr # DPT SmartRAID V, VI and Adaptec SCSI RAID
+device ciss # Compaq Smart RAID 5*
+device dpt # DPT Smartcache III, IV - See NOTES for options
+device hptmv # Highpoint RocketRAID 182x
+device hptrr # Highpoint RocketRAID 17xx, 22xx, 23xx, 25xx
+device iir # Intel Integrated RAID
+device ips # IBM (Adaptec) ServeRAID
+device mly # Mylex AcceleRAID/eXtremeRAID
+device twa # 3ware 9000 series PATA/SATA RAID
+
+# RAID controllers
+device aac # Adaptec FSA RAID
+device aacp # SCSI passthrough for aac (requires CAM)
+device ida # Compaq Smart RAID
+device mfi # LSI MegaRAID SAS
+device mlx # Mylex DAC960 family
+device pst # Promise Supertrak SX6000
+device twe # 3ware ATA RAID
+....
+
+Поддерживаемые RAID-контроллеры. Если у вас нет таковых, можете их закомментировать или удалить эти строки.
+
+[.programlisting]
+....
+# atkbdc0 controls both the keyboard and the PS/2 mouse
+device atkbdc # AT keyboard controller
+....
+
+Контроллер клавиатуры (`atkbdc`) предоставляет средства ввода/вывода для клавиатуры AT и PS/2 устройств. Этот контроллер необходим драйверу клавиатуры (`atkbd`) и PS/2 устройств (`psm`).
+
+[.programlisting]
+....
+device atkbd # AT keyboard
+....
+
+Драйвер `atkbd` вместе с контроллером `atkbdc` предоставляет доступ к клавиатуре AT 84 или улучшенной клавиатуре AT, которая подключена к контроллеру AT клавиатуры.
+
+[.programlisting]
+....
+device psm # PS/2 mouse
+....
+
+Используйте это устройство, если ваша мышь включается в порт PS/2.
+
+[.programlisting]
+....
+device kbdmux # keyboard multiplexer
+....
+
+Поддержка мультиплексора клавиатур. Если использование двух и более клавиатур не планируется, можете смело исключать этот параметр.
+
+[.programlisting]
+....
+device vga # VGA video card driver
+....
+
+Драйвер видеокарты.
+
+[.programlisting]
+....
+
+device splash # Splash screen and screen saver support
+....
+
+Заставка при загрузке. Хранители экрана также требуют этого устройства.
+
+[.programlisting]
+....
+# syscons is the default console driver, resembling an SCO console
+device sc
+....
+
+`sc` - это драйвер консоли по умолчанию, который имитирует консоль SCO. Так как большая часть консольных полноэкранных приложений обращаются к консоли через терминальную библиотеку [.filename]#termcap#, вас не должно волновать, будете ли вы использовать этот драйвер, либо драйвер `vt`, который является `VT220`-совместимым драйвером консоли. Если у вас возникнут какие-либо проблемы с приложениями, работающими с этим драйвером консоли, установите переменную окружения `TERM` в значение `scoansi`.
+
+[.programlisting]
+....
+# Enable this for the pcvt (VT220 compatible) console driver
+#device vt
+#options XSERVER # support for X server on a vt console
+#options FAT_CURSOR # start with block cursor
+....
+
+VT220-совместимый драйвер консоли, обратно совместимый с VT100/102. Он работает лучше на некоторых лэптопах, у которых возникают проблемы несовместимости с `sc`. Также, установите переменную окружения `TERM` в значение `vt100` или `vt220`. Этот драйвер также может быть полезен в случаях подключения к большому количеству различных машин через сеть, на которых параметры для устройства `sc` для [.filename]#termcap# или [.filename]#terminfo# могут отсутствовать - `vt100` присутствует практически на любой платформе.
+
+[.programlisting]
+....
+device agp
+....
+
+Включите эту опцию, если у вас есть AGP карта в системе. Это включит поддержку AGP и AGP GART для тех карт, которые поддерживают эту возможность.
+
+[.programlisting]
+....
+# Power management support (see NOTES for more options)
+#device apm
+....
+
+Поддержка Advanced Power Management. Чаще всего используется в лэптопах, хотя и отключена по умолчанию.
+
+[.programlisting]
+....
+# Add suspend/resume support for the i8254.
+device pmtimer
+....
+
+Устройство таймера для управления энергопотреблением, APM и ACPI.
+
+[.programlisting]
+....
+# PCCARD (PCMCIA) support
+# PCMCIA and cardbus bridge support
+device cbb # cardbus (yenta) bridge
+device pccard # PC Card (16-bit) bus
+device cardbus # CardBus (32-bit) bus
+....
+
+Поддержка PCMCIA. Включите ее, если вы используете лэптоп.
+
+[.programlisting]
+....
+# Serial (COM) ports
+device sio # 8250, 16[45]50 based serial ports
+....
+
+Четыре последовательных порта, которые известны как [.filename]#COM# порты в мире MS-DOS(R)/Windows(R)
+
+[NOTE]
+====
+Если у вас есть внутренний модем на [.filename]#COM4# и последовательный порт [.filename]#COM2#, вам понадобится поменять IRQ модема на 2 (по непонятным техническим причинам IRQ2 = IRQ9) для того, чтобы получить к нему доступ из FreeBSD. Если у вас есть многопортовая карта с последовательными портами, ознакомьтесь с man:sio[4] чтобы узнать корректные значения для добавления в [.filename]#/boot/device.hints#. Некоторые видеокарты (в частности те, что используют чипы S3) используют адреса ввода/вывода в форме `0x*2e8` и, так как многие дешевые последовательные карты не полностью раскодируют шестнадцатибитное пространство адресов ввода/вывода, они конфликтуют с этими картами, в итоге [.filename]#COM4# оказывается практически недоступным.
+
+Каждый последовательный порт требует уникального IRQ (кроме тех случаев, когда вы используете мультипортовую карту, которая поддерживает совместное использование прерываний), поэтому значения IRQ по умолчанию для [.filename]#COM3# и [.filename]#COM4# не могут быть использованы.
+====
+
+[.programlisting]
+....
+# Parallel port
+device ppc
+....
+
+Интерфейс параллельного порта на шине ISA.
+
+[.programlisting]
+....
+device ppbus # Parallel port bus (required)
+....
+
+Поддержка шины параллельного порта.
+
+[.programlisting]
+....
+device lpt # Printer
+....
+
+Поддержка принтеров на параллельном порту.
+
+[NOTE]
+====
+Все три последних устройства необходимы для поддержка принтеров на параллельном порту.
+====
+
+[.programlisting]
+....
+device plip # TCP/IP over parallel
+....
+
+Драйвер TCP/IP через параллельный порт.
+
+[.programlisting]
+....
+device ppi # Parallel port interface device
+....
+
+Поддержка ввода/вывода общего назначения ("geek port") + IEEE1284 ввода/вывода.
+
+[.programlisting]
+....
+#device vpo # Requires scbus and da
+....
+
+Драйвер привода Iomega Zip. Требует наличия `scbus` и `da`. Наилучшая производительность достигается с портами в режиме EPP 1.9.
+
+[.programlisting]
+....
+#device puc
+....
+
+Раскомментируйте это устройство, если у вас есть "простая" последовательная или параллельная PCI карта, поддерживаемая драйвером man:puc[4].
+
+[.programlisting]
+....
+# PCI Ethernet NICs.
+device de # DEC/Intel DC21x4x (Tulip)
+device em # Intel PRO/1000 adapter Gigabit Ethernet Card
+device ixgb # Intel PRO/10GbE Ethernet Card
+device txp # 3Com 3cR990 (Typhoon)
+device vx # 3Com 3c590, 3c595 (Vortex)
+....
+
+Драйвера сетевых карт PCI. Закомментируйте или удалите драйвера тех карт, которые отсутствуют в вашей системе.
+
+[.programlisting]
+....
+# PCI Ethernet NICs that use the common MII bus controller code.
+# NOTE: Be sure to keep the 'device miibus' line in order to use these NICs!
+device miibus # MII bus support
+....
+
+Поддержка шины MII требуется для некоторых PCI 10/100 Ethernet карт, которые используют MII-совместимые передатчики или реализуют интерфейс управления передатчиком, который имитирует MII. Добавление `device miibus` в конфигурационный файл ядра включает поддержку стандартного API miibus и всех драйверов PHY, включая стандартный для тех PHY, которые не обрабатываются специфическим образом конкретным драйвером.
+
+[.programlisting]
+....
+device bfe # Broadcom BCM440x 10/100 Ethernet
+device bge # Broadcom BCM570xx Gigabit Ethernet
+device dc # DEC/Intel 21143 and various workalikes
+device fxp # Intel EtherExpress PRO/100B (82557, 82558)
+device lge # Level 1 LXT1001 gigabit ethernet
+device msk # Marvell/SysKonnect Yukon II Gigabit Ethernet
+device nge # NatSemi DP83820 gigabit ethernet
+device pcn # AMD Am79C97x PCI 10/100 (precedence over 'lnc')
+device re # RealTek 8139C+/8169/8169S/8110S
+device rl # RealTek 8129/8139
+device sf # Adaptec AIC-6915 (Starfire)
+device sis # Silicon Integrated Systems SiS 900/SiS 7016
+device sk # SysKonnect SK-984x > SK-982x gigabit Ethernet
+device ste # Sundance ST201 (D-Link DFE-550TX)
+device stge # Sundance/Tamarack TC9021 gigabit Ethernet
+device ti # Alteon Networks Tigon I/II gigabit Ethernet
+device tl # Texas Instruments ThunderLAN
+device tx # SMC EtherPower II (83c170 EPIC)
+device vge # VIA VT612x gigabit ethernet
+device vr # VIA Rhine, Rhine II
+device wb # Winbond W89C840F
+device xl # 3Com 3c90x (Boomerang, Cyclone)
+....
+
+Драйвера, которые используют контроллер шины MII.
+
+[.programlisting]
+....
+# ISA Ethernet NICs. pccard NICs included.
+device cs # Crystal Semiconductor CS89x0 NIC
+# 'device ed' requires 'device miibus'
+device ed # NE[12]000, SMC Ultra, 3c503, DS8390 cards
+device ex # Intel EtherExpress Pro/10 and Pro/10+
+device ep # Etherlink III based cards
+device fe # Fujitsu MB8696x based cards
+device ie # EtherExpress 8/16, 3C507, StarLAN 10 etc.
+device lnc # NE2100, NE32-VL Lance Ethernet cards
+device sn # SMC's 9000 series of Ethernet chips
+device xe # Xircom pccard Ethernet
+
+# ISA devices that use the old ISA shims
+#device le
+....
+
+Драйвера сетевых карт ISA. Ознакомьтесь с файлом [.filename]#/usr/src/sys/i386/conf/NOTES#, чтобы узнать, какие сетевые карты каким драйвером поддерживаются.
+
+[.programlisting]
+....
+# Wireless NIC cards
+device wlan # 802.11 support
+....
+
+Generic 802.11 support. This line is required for wireless networking.
+
+[.programlisting]
+....
+device wlan_wep # 802.11 WEP support
+device wlan_ccmp # 802.11 CCMP support
+device wlan_tkip # 802.11 TKIP support
+....
+
+Crypto support for 802.11 devices. These lines are needed if you intend to use encryption and 802.11i security protocols.
+
+[.programlisting]
+....
+device an # Aironet 4500/4800 802.11 wireless NICs.
+device ath # Atheros pci/cardbus NIC's
+device ath_hal # Atheros HAL (Hardware Access Layer)
+device ath_rate_sample # SampleRate tx rate control for ath
+device awi # BayStack 660 and others
+device wi # WaveLAN/Intersil/Symbol 802.11 wireless NICs.
+#device wl # Older non 802.11 Wavelan wireless NIC.
+....
+
+Поддержка различных беспроводных карт.
+
+[.programlisting]
+....
+# Pseudo devices
+device loop # Network loopback
+....
+
+Стандартное устройство обратной связи для TCP/IP. Если вы запускаете telnet или FTP по отношению `localhost` (он же `127.0.0.1`), то соединение пройдёт через это устройство. Этот параметр _обязателен_.
+
+[.programlisting]
+....
+device random # Entropy device
+....
+
+Генератор случайных чисел для криптографической защиты.
+
+[.programlisting]
+....
+device ether # Ethernet support
+....
+
+`ether` необходим лишь в случае, если у вас есть сетевая карта. Он включает поддержку стандартного кода протокола Ethernet.
+
+[.programlisting]
+....
+device sl # Kernel SLIP
+....
+
+`sl` - это поддержка SLIP. SLIP был практически вытеснен PPP, который легче настраивается, лучше подходит для соединений модем-модем и имеет больше возможностей.
+
+[.programlisting]
+....
+device ppp # Kernel PPP
+....
+
+Поддержка PPP в ядре для соединений dial-up. Также существует версия PPP, реализованного как приложение, использующее `tun`, и предлагающее большую гибкость и большее количество возможностей, как, например, соединение при необходимости (наличии обращения к сети).
+
+[.programlisting]
+....
+device tun # Packet tunnel.
+....
+
+Используется пользовательским программным обеспечением PPP. Обратитесь к разделу crossref:ppp-and-slip[userppp,PPP] этой книги за дальнейшей информацией.
+
+[.programlisting]
+....
+
+device pty # Pseudo-ttys (telnet etc)
+....
+
+"псевдо-терминал" или имитированный порт для входа. Используется входящими `telnet` и `rlogin`-сессиями, приложением xterm и некоторыми другими приложениями, такими как Emacs.
+
+[.programlisting]
+....
+device md # Memory disks
+....
+
+Псевдо-устройства дисков в памяти.
+
+[.programlisting]
+....
+device gif # IPv6 and IPv4 tunneling
+....
+
+Поддержка туннелирования IPv6 через IPv4, IPv4 через IPv6, IPv4 через IPv4 и IPv6 через IPv6. Устройство `gif` является "автоклонируемым", и будет срздавать файлы устройств по мере необходимости.
+
+[.programlisting]
+....
+device faith # IPv6-to-IPv4 relaying (translation)
+....
+
+Это псевдо-устройство захватывает пакеты, которые были посланы ему и перенаправляет их даемону трансляции IPv4/IPv6.
+
+[.programlisting]
+....
+# The `bpf' device enables the Berkeley Packet Filter.
+# Be aware of the administrative consequences of enabling this!
+# Note that 'bpf' is required for DHCP.
+device bpf # Berkeley packet filter
+....
+
+Фильтр пакетов Berkeley. Это псевдо-устройство позволяет переводить сетевые интерфейсы в "неразборчивый" (promiscuous) режим, в котором перехватывается любой пакет в широковещательной сети (например ethernet). Эти пакеты могут быть сохранены на диск и/или исследованы при помощи man:tcpdump[1].
+
+[NOTE]
+====
+Устройство man:bpf[4] также используется программой man:dhclient[8] для того, чтобы получить адрес шлюза по умолчанию и т.п. Если вы используете DCHP, не удаляйте эту опцию.
+====
+
+[.programlisting]
+....
+# USB support
+device uhci # UHCI PCI->USB interface
+device ohci # OHCI PCI->USB interface
+device ehci # EHCI PCI->USB interface (USB 2.0)
+device usb # USB Bus (required)
+#device udbp # USB Double Bulk Pipe devices
+device ugen # Generic
+device uhid # Human Interface Devices
+device ukbd # Keyboard
+device ulpt # Printer
+device umass # Disks/Mass storage - Requires scbus and da
+device ums # Mouse
+device ural # Ralink Technology RT2500USB wireless NICs
+device urio # Diamond Rio 500 MP3 player
+device uscanner # Scanners
+# USB Ethernet, requires mii
+device aue # ADMtek USB Ethernet
+device axe # ASIX Electronics USB Ethernet
+device cdce # Generic USB over Ethernet
+device cue # CATC USB Ethernet
+device kue # Kawasaki LSI USB Ethernet
+device rue # RealTek RTL8150 USB Ethernet
+....
+
+Поддержка различных USB устройств.
+
+[.programlisting]
+....
+# FireWire support
+device firewire # FireWire bus code
+device sbp # SCSI over FireWire (Requires scbus and da)
+device fwe # Ethernet over FireWire (non-standard!)
+....
+
+Поддержка различных устройств Firewire.
+
+За дальнейшей информацией о дополнительных устройствах, поддерживаемых FreeBSD, обратитесь к файлу [.filename]#/usr/src/sys/i386/conf/NOTES#.
+
+=== Конфигурации с большим количеством оперативной памяти (PAE)
+
+Машины с большим количеством оперативной памяти, в которых требуется более 4 гигабайт в пользовательском адресном пространстве и адресном пространстве ядра (User+Kernel Virtual Address, KVA) в обычном случае не смогут использовать более 4 гигабайт. Для решения этой проблемы Intel добавили поддержку 36-битной адресации в Pentium(R) Pro и более поздних моделях процессоров.
+
+Расширение физического адресного пространства (PAE) в процессорах Intel(R) Pentium(R) Pro и более поздних позволяет использовать до 64 гигабайт оперативной памяти. FreeBSD имеет поддержку этой возможности посредством опции ядра `PAE`, доступной во всех текущих версиях FreeBSD. В связи с ограничениями архитектуры Intel, не делается никакого различия между памятью ниже или выше 4 гигабайт. Память, размещенная выше 4 гигабайт, просто добавляется к доступной памяти.
+
+Для того, чтобы включить PAE в ядре, просто добавьте приведенную строку в конфигурационный файл ядра:
+
+[.programlisting]
+....
+options PAE
+....
+
+[NOTE]
+====
+Поддержка PAE в FreeBSD существует только для процессоров Intel(R) IA-32. Также следует заметить, что PAE в FreeBSD не было полностью протестировано и должно считаться находящимся в состоянии бета-тестирования по сравнению с другими, стабильными возможностями FreeBSD.
+====
+
+Поддержка PAE в FreeBSD имеет следующие ограничения:
+
+* Процесс не может получить доступ к более, чем 4 гигабайтам пространства VM.
+* Драйверы устройств, которые не используют интерфейс man:bus_dma[9], приведут к повреждению информации в ядре с включенным PAE. Не рекомендуется использовать такие драйверы. По этой причине в FreeBSD включен конфигурационный файл ядра [.filename]#PAE#, из которого удалены все драйверы, о которых известно, что они не работают при включенной поддержке PAE.
+* Некоторые системные переменные определяют использование ресурсов памяти по количеству доступной физической памяти. Такие переменные могут привести к ненужному чрезмерному выделению памяти из-за особенностей работы системы PAE. Один из таких примеров - переменная `kern.maxvnodes`, которая управляет максимальным количеством vnode, разрешенных в ядре. Рекомендуется установить эту и подобные ей переменные вручную в адекватные значения.
+* Возможно, понадобится увеличить пространство виртуальных адресов ядра (KVA) или уменьшить какую-либо переменную (см. выше), значение которой было неоправданно велико и могло привести к исчерпанию KVA. Для этого может быть использована опция ядра `KVA_PAGES`.
+
+В случае сомнений относительно производительности и стабильности рекомендуется обратиться к странице руководства man:tuning[7]. Страница руководства man:pae[4] содержит свежую информацию о поддержке PAE в FreeBSD.
+
+[[kernelconfig-trouble]]
+== Решение проблем
+
+Существует четыре категории проблем, которые могут возникнуть при сборке собственного ядра. Вот они:
+
+Не удаётся отработать команде `config`:::
+Если команда man:config[8] не может отработать, то, скорее всего, вы допустили где-нибудь маленькую ошибку. К счастью, man:config[8] выведет номер проблемной строки, поэтому вы можете быстро найти строку, содержащую ошибку. Например, если вы видите:
++
+[source,bash]
+....
+config: line 17: syntax error
+....
++
+Убедитесь, что опция введена верно путём сравнения с файлом [.filename]#GENERIC# или другим источником.
+
+Не удаётся отработать команде `make`:::
+Если не удаётся отработать команде `make`, обычно это означает ошибку в описании конфигурации ядра, которая не достаточно тривиальна для того, чтобы man:config[8] мог обнаружить её. Опять-таки, просмотрите файл конфигурации, и, если вы все еще не можете решить проблему, напишите письмо в {freebsd-questions}, включив в письмо файл конфигурации ядра. Скорее всего проблема будет решена быстро.
+
+Ядро не загружается:[[kernelconfig-noboot]]::
+Если ваше новое ядро не загружается или ему не удаётся обнаружить ваши устройства - не паникуйте! К счастью, в FreeBSD существует отличный механизм для восстановления после установки несовместимого ядра. Просто выберите ядро, которое хотите загрузить, в загрузчике FreeBSD. Доступ к нему вы можете получить, когда система находится в стартовом меню. Выберите шестой пункт ("Escape to a loader prompt"), введите команду `boot _kernel.old_`, или используйте любое другое ядро, которое загрузится без проблем. Во время переконфигурирования ядра всегда полезно оставлять копию ядра, о котором известно, что оно рабочее.
++
+После загрузки с рабочим ядром вы можете проверить ваш файл конфигурации и попробовать собрать ядро опять. Очень полезным в данном случае окажется файл [.filename]#/var/log/messages#, в котором, среди других записей, имеются сообщения ядра от каждой успешной загрузки. Также, команда man:dmesg[8] выведет сообщения ядра от текущей загрузки.
++
+[NOTE]
+====
+Если у вас возникли проблемы со сборкой ядра, убедитесь, что вы сохранили ядро [.filename]#GENERIC# или другое рабочее ядро под другим именем, чтобы оно не было удалено при следующей сборке. Вы не можете использовать [.filename]#kernel.old#, потому что при установке нового ядра [.filename]#kernel.old# перезаписывается последним установленным ядром, которое может оказаться нерабочим. Также, как можно скорее переместите рабочее ядро в [.filename]#/boot/kernel#, так как некоторые команды, такие как man:ps[1] будут работать некорректно. Для этого просто переместите каталог, содержащий работоспособное ядро:
+
+[source,bash]
+....
+# mv /boot/kernel /boot/kernel.bad
+# mv /boot/kernel.good /boot/kernel
+....
+
+====
+
+Ядро работает, но man:ps[1] больше не работает:::
+Если вы установили версию ядра отличную от той, с которой были собраны ваши системные утилиты, например, ядро от -CURRENT на системе -RELEASE, большая часть системных команд, таких как man:ps[1] и man:vmstat[8] не будут больше работать. Вам потребуется crossref:cutting-edge[makeworld,перекомпилировать и установить систему] той же версии исходных текстов, что и ядро. Это одна из причин, по которой не следует использовать версию ядра, отличную от версии всей остальной системы.
diff --git a/documentation/content/ru/books/handbook/l10n/_index.adoc b/documentation/content/ru/books/handbook/l10n/_index.adoc
new file mode 100644
index 0000000000..d7ae32e5a0
--- /dev/null
+++ b/documentation/content/ru/books/handbook/l10n/_index.adoc
@@ -0,0 +1,579 @@
+---
+title: Глава 20. Локализация - использование и настройка i18n/L10n
+part: Часть III. Системное администрирование
+prev: books/handbook/filesystems
+next: books/handbook/cutting-edge
+---
+
+[[l10n]]
+= Локализация - использование и настройка i18n/L10n
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 20
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/l10n/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/l10n/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/l10n/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[l10n-synopsis]]
+== Краткий обзор
+
+FreeBSD - это распределенный проект, пользователи и контрибьюторы которого находятся в самых разных частях света. Поэтому FreeBSD поддерживает локализацию на многие языки, что позволяет просматривать, вводить и обрабатывать данные на языках, отличных от английского. Можно выбрать среди большинства основных языков, в том числе: китайский, немецкий, японский, корейский, французский, русский и вьетнамский.
+
+Термин интернационализация (`internationalization`) сокращают до i18n, по числу символов в английском слове. Сокращение L10n аналогично получается от слова `localization`. i18n/L10n методы, протоколы и приложения позволяют пользователям использовать языки по своему выбору.
+
+В этой главе обсуждаются особенности интернационализации и локализации FreeBSD, включая следующие темы:
+
+* Схема именования локалей.
+* Установка региональных настроек для оболочки.
+* Локализация консоли.
+* Локализация Xorg.
+* Поиск i18n-совместимых приложений.
+* Информация по настройке для некоторых языков.
+
+Перед чтением этой главы вам следует знать:
+
+* Как crossref:ports[ports,установить дополнительные приложения сторонних разработчиков].
+
+[[using-localization]]
+== Использование локализации
+
+Настройки локализации состоят из трёх компонентов: код языка, код страны и кодировка. Из этих частей формируются названия локалей:
+
+[.programlisting]
+....
+КодЯзыка_КодСтраны.Кодировка
+....
+
+_КодЯзыка_ и _КодСтраны_ используются для определения страны и конкретного диалекта языка. <<locale-lang-country>> содержит некоторые примеры пар __КодЯзыка_КодСтраны__:
+
+[[locale-lang-country]]
+.Основные коды языка и страны
+[cols="1,1", frame="none", options="header"]
+|===
+| КодЯзыка_КодСтраны
+| Описание
+
+|en_US
+|Английский, Соединенные Штаты
+
+|ru_RU
+|Русский, Россия
+
+|zh_TW
+|Традиционный китайский, Тайвань
+|===
+
+Полный список локалей доступен по команде:
+
+[source,bash]
+....
+% locale -a | more
+....
+
+Чтобы определить текущую локаль:
+
+[source,bash]
+....
+% locale
+....
+
+Специфичные для языков наборы символов ISO8859-1, ISO8859-15, KOI8-R, CP437 описаны в man:multibyte[3]. Актуальный список наборов символов находится на сайте http://www.iana.org/assignments/character-sets[IANA Registry].
+
+Некоторые языки, такие как китайский или японский, не могут быть представлены с использованием символов ASCII, и для них требуется дополненная языковая кодировка с использованием расширенного или многобайтового представления символов. Такими кодировками являются EUC и Big5. Старые приложения могут ошибочно принимать символы в таких кодировках за управляющие, в то время как новые обычно их распознают. В зависимости от реализации, пользователю может потребоваться компиляция приложения с поддержкой расширенного или многобайтового представления символов или правильная его настройка.
+
+[NOTE]
+====
+Во FreeBSD используются Xorg-совместимые кодировки.
+====
+
+В продолжении этого раздела рассматриваются различные способы настройки локализации в системе FreeBSD. В следующем разделе выносятся соображения по поиску и компиляции приложений с поддержкой i18n.
+
+[[setting-locale]]
+=== Настройка локализации для оболочки
+
+Для настроек локализации используется пользовательский [.filename]#~/.login_conf# или инициализационый файл пользовательской оболочки: [.filename]#~/.profile#, [.filename]#~/.bashrc# или [.filename]#~/.cshrc#.
+
+Следует задать две переменные окружения:
+
+* `LANG` задаёт локаль
+*
++
+`MM_CHARSET` задаёт набор символов MIME для приложений
+
+В дополнение к настройкам пользовательской оболочки эти переменные также следует задать в конфигурации конкретного приложения и в конфигурации Xorg.
+
+Существует два способа выполнить необходимые присвоения переменным: <<login-class,класс логина>>, который является рекомендуемым, и <<startup-file,файл инициализации>>. В следующих двух разделах будет показано, как использовать оба способа.
+
+[[login-class]]
+==== Настройка через классы логина
+
+Первый способ является рекомендуемым, поскольку в нём необходимые для выбора локализации и набора символов MIME значения переменных окружения присваиваются для всех оболочек. Эту процедуру может выполнить пользователь для себя, а также это может сделать в виде настройки суперпользователь для всех пользователей системы.
+
+В этом минимальном примере обе переменные задаются для кодировки Latin-1 в [.filename]#.login_conf# домашнего каталога отдельного пользователя:
+
+[.programlisting]
+....
+me:\
+ :charset=ISO-8859-1:\
+ :lang=de_DE.ISO8859-1:
+....
+
+Ниже дан [.filename]#~/.login_conf#, в котором переменные заданы для традиционного китайского в кодировке BIG-5. Здесь нужно больше переменных, потому что некоторые программы некорректно воспринимают переменные окружения локализации для Китая, Японии и Кореи:
+
+[.programlisting]
+....
+#Пользователи, которые не хотят использовать денежные единицы
+#и форматы времени Тайваня, могут вручную изменить каждую переменную
+me:\
+ :lang=zh_TW.Big5:\
+ :setenv=LC_ALL=zh_TW.Big5,LC_COLLATE=zh_TW.Big5,LC_CTYPE=zh_TW.Big5,LC_MESSAGES=zh_TW.Big5,LC_MONETARY=zh_TW.Big5,LC_NUMERIC=zh_TW.Big5,LC_TIME=zh_TW.Big5:\
+ :charset=big5:\
+ :xmodifiers="@im=gcin": #Set gcin as the XIM Input Server
+....
+
+Как вариант, суперпользователь может настроить локализацию для всех пользователей системы. Следующие переменные в [.filename]#/etc/login.conf# используются для установки локализации и набора символов MIME:
+
+[.programlisting]
+....
+название_языка|подробное описание:\
+ :charset=кодировка_MIME:\
+ :lang=название_локализации:\
+ :tc=default:
+....
+
+Таким образом, на предыдущем примере с Latin-1 это бы выглядело так:
+
+[.programlisting]
+....
+german|German Users Accounts:\
+ :charset=ISO-8859-1:\
+ :lang=de_DE.ISO8859-1:\
+ :tc=default:
+....
+
+За информацией по этим переменным обращайтесь к man:login.conf[5]. Отметим, что там уже присутствует класс _russian_.
+
+После каждого изменения [.filename]#/etc/login.conf# не забывайте выполнить команду для обновления базы данных:
+
+[source,bash]
+....
+# cap_mkdb /etc/login.conf
+....
+
+===== Утилиты для смены класса логина
+
+В дополнение к ручному редактированию [.filename]#/etc/login.conf# имеется несколько утилит, которые позволяют задать локаль при создании новых пользователей:
+
+Если для добавлении новых пользователей используется `vipw`, то чтобы задать локаль, укажите _язык_:
+
+[.programlisting]
+....
+user:password:1111:11:язык:0:0:User Name:/home/user:/bin/sh
+....
+
+Если для добавления новых пользователей используется `adduser`, то язык по умолчанию можно предварительно выбрать для всех новых пользователей или указать его для отдельного пользователя.
+
+Если все новые пользователи используют общий язык, задайте `defaultclass=_язык_` в [.filename]#/etc/adduser.conf#.
+
+Чтобы переопределить эту настройку при создании пользователя, введите требуемую локаль в запросе командной строки:
+
+[source,bash]
+....
+Enter login class: default []:
+....
+
+или укажите её в команде man:adduser[8]:
+
+[source,bash]
+....
+# adduser -class язык
+....
+
+Если для добавления новых пользователей используется `pw`, укажите локаль так:
+
+[source,bash]
+....
+# pw useradd имя_пользователя -L язык
+....
+
+Изменить класс логина у существующего пользователя можно с помощью `chpass`, передав имя пользователя через параметр:
+
+[source,bash]
+....
+# chpass имя_пользователя
+....
+
+[[startup-file]]
+==== Файл инициализации оболочки
+
+Второй способ не рекомендуется, поскольку для каждой используемой оболочки требуется ручная конфигурация, при этом в каждой оболочке используется собственный файл конфигурации и разный синтаксис. Например, чтобы задать немецкий язык в оболочке `sh`, эти строчки можно было бы добавить в [.filename]#~/.profile# для настройки оболочки отдельного пользователя. Также их можно было бы добавить в [.filename]#/etc/profile# или [.filename]#/usr/shared/skel/dot.profile#, чтобы применить ко всем пользователям:
+
+[.programlisting]
+....
+LANG=de_DE.ISO8859-1; export LANG
+MM_CHARSET=ISO-8859-1; export MM_CHARSET
+....
+
+Тем не менее, путь к файлу конфигурации и используемый синтаксис отличаются в оболочке `csh`. Следующие настройки можно одинаково успешно задать в [.filename]#~/.csh.login#, [.filename]#/etc/csh.login# и [.filename]#/usr/shared/skel/dot.login#:
+
+[.programlisting]
+....
+setenv LANG de_DE.ISO8859-1
+setenv MM_CHARSET ISO-8859-1
+....
+
+Используемый в [.filename]#~/.xinitrc# синтаксис для настройки Xorg также зависит от оболочки. Первый пример для оболочки `sh`, и второй для `csh`:
+
+[.programlisting]
+....
+LANG=de_DE.ISO8859-1; export LANG
+....
+
+[.programlisting]
+....
+setenv LANG de_DE.ISO8859-1
+....
+
+[[setting-console]]
+=== Настройка консоли
+
+Для консоли имеется несколько локализованных шрифтов. Для их просмотра наберите `ls /usr/shared/syscons/fonts`. Чтобы настроить консольный шрифт, укажите в [.filename]#/etc/rc.conf#_имя_шрифта_ без расширения [.filename]#.fnt#:
+
+[.programlisting]
+....
+font8x16=имя_шрифта
+font8x14=имя_шрифта
+font8x8=имя_шрифта
+....
+
+Значения keymap и screenmap можно задать в [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+scrnmap=название_screenmap
+keymap=название_keymap
+keychange="последовательность fkey_number"
+....
+
+Чтобы просмотреть доступные таблицы screenmap, наберите `ls /usr/shared/syscons/scrnmaps`. Значение _screenmap_ указывается без расширения [.filename]#.scm#. Таблица screenmap с соответствующим шрифтом обычно используется в качестве обходного пути для расширения 8 бит до 9 бит в матрице символов шрифта адаптора VGA. Это будет приводить к вынесению букв за границы псевдографической области, если используется 8-битный шрифт.
+
+Чтобы просмотреть доступные таблицы keymap, наберите `ls /usr/shared/syscons/keymaps`. Значение _keymap_ указывается без расширения [.filename]#.kbd#. Чтобы проверить keymap без перезагрузки системы, используйте man:kbdmap[1].
+
+Запись `keychange` обычно нужна для сопоставления функциональных клавиш выбранному типу терминала, поскольку последовательности функциональных клавиш не могут быть определены в keymap.
+
+После этого задайте правильный консольный тип терминала в [.filename]#/etc/ttys# для всех виртуальных терминалов. <<locale-charset>> содержит доступные типы терминалов:
+[[locale-charset]]
+.Типы терминалов для набора символов
+[cols="1,1", frame="none", options="header"]
+|===
+| Набор символов
+| Тип терминала
+
+|ISO8859-1 or ISO8859-15
+|`cons25l1`
+
+|ISO8859-2
+|`cons25l2`
+
+|ISO8859-7
+|`cons25l7`
+
+|KOI8-R
+|`cons25r`
+
+|KOI8-U
+|`cons25u`
+
+|CP437 (VGA default)
+|`cons25`
+
+|US-ASCII
+|`cons25w`
+|===
+
+Для языков с расширенной или многобайтовой кодировкой установите консоль для данного языка из Коллекции Портов FreeBSD. <<locale-console>> содержит доступные порты. После установки смотрите [.filename]#pkg-message# или страницы Справочника по конфигурации и использованию данного порта.
+[[locale-console]]
+.Доступные консоли из Коллекции Портов
+[cols="1,1", frame="none", options="header"]
+|===
+| Язык
+| Расположение порта
+
+|Традиционный китайский (BIG-5)
+|package:chinese/big5con[]
+
+|Chinese/Japanese/Korean
+|package:chinese/cce[]
+
+|Chinese/Japanese/Korean
+|package:chinese/zhcon[]
+
+|Japanese
+|package:chinese/kon2[]
+
+|Japanese
+|package:japanese/kon2-14dot[]
+
+|Japanese
+|package:japanese/kon2-16dot[]
+|===
+
+Если moused включен в [.filename]#/etc/rc.conf#, может потребоваться дополнительная настройка. По умолчанию драйвер man:syscons[4] выделяет для курсора мыши в таблице символов диапазон `0xd0`-`0xd3`. Если в языке этот диапазон используется, переместите диапазон курсора посредством добавления следующей строки в [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+mousechar_start=3
+....
+
+=== Настройка Xorg
+
+crossref:x11[x11, X Window System] описывает процедуру установки и настройки Xorg. Для настройки локализации Xorg в Коллекции Портов FreeBSD имеются дополнительные шрифты и методы ввода. Настройки i18n для отдельных приложений, такие как шрифты и меню, можно внести в [.filename]#~/.Xresources#, чтобы меню в графических приложениях отображались на выбранном языке.
+
+Протокол X Input Method (XIM) - это стандарт Xorg для ввода неанглийских символов. <<locale-xim>> описывает приложения для методов ввода, которые содержатся в Коллекции Портов FreeBSD. Также доступны дополнительные приложения Fcitx и Uim.
+[[locale-xim]]
+.Доступные метода ввода
+[cols="1,1", frame="none", options="header"]
+|===
+| Язык
+| Метод ввода
+
+|китайский
+|package:chinese/gcin[]
+
+|китайский
+|package:chinese/ibus-chewing[]
+
+|китайский
+|package:chinese/ibus-pinyin[]
+
+|китайский
+|package:chinese/oxim[]
+
+|китайский
+|package:chinese/scim-fcitx[]
+
+|китайский
+|package:chinese/scim-pinyin[]
+
+|китайский
+|package:chinese/scim-tables[]
+
+|японский
+|package:japanese/ibus-anthy[]
+
+|японский
+|package:japanese/ibus-mozc[]
+
+|японский
+|package:japanese/ibus-skk[]
+
+|японский
+|package:japanese/im-ja[]
+
+|японский
+|package:japanese/kinput2[]
+
+|японский
+|package:japanese/scim-anthy[]
+
+|японский
+|package:japanese/scim-canna[]
+
+|японский
+|package:japanese/scim-honoka[]
+
+|японский
+|package:japanese/scim-honoka-plugin-romkan[]
+
+|японский
+|package:japanese/scim-honoka-plugin-wnn[]
+
+|японский
+|package:japanese/scim-prime[]
+
+|японский
+|package:japanese/scim-skk[]
+
+|японский
+|package:japanese/scim-tables[]
+
+|японский
+|package:japanese/scim-tomoe[]
+
+|японский
+|package:japanese/scim-uim[]
+
+|японский
+|package:japanese/skkinput[]
+
+|японский
+|package:japanese/skkinput3[]
+
+|японский
+|package:japanese/uim-anthy[]
+
+|корейский
+|package:korean/ibus-hangul[]
+
+|корейский
+|package:korean/imhangul[]
+
+|корейский
+|package:korean/nabi[]
+
+|корейский
+|package:korean/scim-hangul[]
+
+|корейский
+|package:korean/scim-tables[]
+
+|вьетнамский
+|package:vietnamese/xvnkb[]
+
+|вьетнамский
+|package:vietnamese/x-unikey[]
+|===
+
+[[l10n-compiling]]
+== Поиск приложений i18n
+
+i18n приложения пишутся с применением набора i18n в библиотеках. Это позволяет разработчикам писать простые файлы и переводить отображаемые меню и надписи на любые языки.
+
+В link:https://www.FreeBSD.org/ru/ports/[Коллекции портов FreeBSD] содержится множество приложений со встроенной поддержкой символов с расширенным и многобайтовым представлением для нескольких языков. Чтобы упростить поиск таких приложений, в их названии содержится аббревиатура `i18n`. Тем не менее, они не всегда поддерживают нужный язык.
+
+Некоторые приложения могут быть собраны с конкретной кодировкой. Обычно это делается через [.filename]#Makefile# порта или передачей параметра configure. Для получения этой информации смотрите документацию i18n для соответствующего порта FreeBSD.
+
+[[lang-setup]]
+== Настройка локализации для некоторых языков
+
+В этом разделе приведены примеры локализации системы FreeBSD на русский язык. В завершение приводится дополнительная информация для локализации на другие языки.
+
+[[ru-localize]]
+=== Русский язык (кодировка KOI8-R)
+
+В этом разделе приведены настройки, специфичные для локализации системы FreeBSD на русский язык. Для более полного описания каждой из настроек обращайтесь к разделу <<using-localization,Использование локализации>>.
+
+Чтобы задать эту локаль для программной оболочки, добавьте в [.filename]#~/.login_conf# каждого пользователя следующие строки:
+
+[.programlisting]
+....
+me:My Account:\
+ :charset=KOI8-R:\
+ :lang=ru_RU.KOI8-R:
+....
+
+Чтобы настроить консоль, добавьте в [.filename]#/etc/rc.conf# такие строки:
+
+[.programlisting]
+....
+keymap="ru.utf-8"
+scrnmap="utf-82cp866"
+font8x16="cp866b-8x16"
+font8x14="cp866-8x14"
+font8x8="cp866-8x8"
+mousechar_start=3
+....
+
+Для каждой записи `ttyv` в [.filename]#/etc/ttys# используйте `cons25r` в качестве типа терминала.
+
+Чтобы настроить печать, требуется специальный выходной фильтр для перекодировки из KOI8-R в CP866, поскольку большинство принтеров для России поставляются с аппаратной кодовой страницей CP866. Для этой цели в состав FreeBSD включён фильтр по умолчанию [.filename]#/usr/libexec/lpr/ru/koi2alt#. Для его использования добавьте в [.filename]#/etc/printcap# такую запись:
+
+[.programlisting]
+....
+lp|Russian local line printer:\
+ :sh:of=/usr/libexec/lpr/ru/koi2alt:\
+ :lp=/dev/lpt0:sd=/var/spool/output/lpd:lf=/var/log/lpd-errs:
+....
+
+Обратитесь к man:printcap[5] за более подробным разъяснением.
+
+Чтобы настроить поддержку русских названий имён файлов при монтировании файловых систем MS-DOS(R), включите в добавляемую в [.filename]#/etc/fstab# запись `-L` с названием локали:
+
+[.programlisting]
+....
+/dev/ad0s2 /dos/c msdos rw,-Lru_RU.KOI8-R 0 0
+....
+
+За дополнительной информацией обращайтесь к странице справочника man:mount_msdosfs[8].
+
+Чтобы настроить русские шрифты в Xorg, установите пакет package:x11-fonts/xorg-fonts-cyrillic[]. Затем проверьте раздел `"Files"` в [.filename]#/etc/X11/xorg.conf#. _Перед_ всеми записями `FontPath` должна быть добавлена следующая строка:
+
+[.programlisting]
+....
+FontPath "/usr/local/lib/X11/fonts/cyrillic"
+....
+
+Дополнительные кириллические шрифты доступны в Коллекции Портов.
+
+Для настройки ввода на русском языке добавьте следующие строки в [.filename]#/etc/xorg.conf#, раздел `"Keyboard"`:
+
+[.programlisting]
+....
+Option "XkbLayout" "us,ru"
+Option "XkbOptions" "grp:toggle"
+....
+
+Убедитесь, что в этом файле закомментирован `XkbDisable`.
+
+Для `grp:toggle` используйте kbd:[Right Alt], для `grp:ctrl_shift_toggle` - kbd:[Ctrl+Shift]. Для `grp:caps_toggle` используйте kbd:[CapsLock]. Прежняя функция kbd:[CapsLock] всё ещё доступна в режиме LAT с использованием kbd:[Shift+CapsLock]. `grp:caps_toggle` по неустановленной причине не работает в Xorg.
+
+Если на клавиатуре есть клавиши "Windows(R)" и некоторые неалфавитные клавиши работают неправильно, добавьте в [.filename]#/etc/xorg.conf# следующую строку:
+
+[.programlisting]
+....
+Option "XkbVariant" ",winkeys"
+....
+
+[NOTE]
+====
+Ввод с клавиатуры XKB на русском может не работать с нелокализованными приложениями. Минимально локализованные приложения должны в начале программы вызывать функцию `XtSetLanguageProc (NULL, NULL, NULL);`.
+====
+
+За дальнейшими инструкциями по локализации приложений Xorg обращайтесь к странице http://koi8.pp.ru/xwin.html[http://koi8.pp.ru/xwin.html]. Для получения более общей информации по KOI8-R смотрите http://koi8.pp.ru/[http://koi8.pp.ru/].
+
+=== Информация для других языков
+
+В этом разделе приводится дополнительная информация по настройке других локалей.
+
+Традиционный китайский для Тайваня::
+У проекта FreeBSD-Taiwan есть http://netlab.cse.yzu.edu.tw/\~statue/freebsd/zh-tut/[FreeBSD Chinese HOWTO].
+
+Локализация на греческий язык::
+Исчерпывающая статья по поддержке греческого во FreeBSD есть в официальной греческой документации https://www.FreeBSD.org/doc/el/articles/greek-language-support/[здесь].
+
+Локализация на японский и корейский языки::
+Для японского обратитесь к http://www.jp.FreeBSD.org/[http://www.jp.FreeBSD.org/], а для корейского к http://www.kr.FreeBSD.org/[http://www.kr.FreeBSD.org/].
+
+Неанглоязычная документация FreeBSD::
+Контрибьюторы FreeBSD перевели отдельные части документации FreeBSD на другие языки. Эти переводы доступны по ссылкам на link:https://www.FreeBSD.org/[сайте FreeBSD] или из каталога [.filename]#/usr/shared/doc#.
diff --git a/documentation/content/ru/books/handbook/linuxemu/_index.adoc b/documentation/content/ru/books/handbook/linuxemu/_index.adoc
new file mode 100644
index 0000000000..1affed1071
--- /dev/null
+++ b/documentation/content/ru/books/handbook/linuxemu/_index.adoc
@@ -0,0 +1,2224 @@
+---
+title: Глава 11. Двоичная совместимость с Linux
+part: Часть II. Общие задачи
+prev: books/handbook/printing
+next: books/handbook/partiii
+---
+
+[[linuxemu]]
+= Двоичная совместимость с Linux
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 11
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/linuxemu/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/linuxemu/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/linuxemu/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[linuxemu-synopsis]]
+== Краткий обзор
+
+FreeBSD предоставляет двоичную совместимость с несколькими другими UNIX(R)-подобными операционными системами, включая Linux. Возможно, вы спрашиваете себя, зачем FreeBSD нужно уметь работать с приложениями, написанными для Linux? Ответ на этот вопрос достаточно прост: многие компании и разработчики производят программное обеспечение только для Linux, так как эта операционная система очень быстро завоевала огромную популярность в компьютерном мире. Пользователям же FreeBSD приходится обращаться к этим компаниям и разработчикам с просьбами выпустить версии своих программ специально для FreeBSD. Проблема в том, что большинство производителей программного обеспечения не осознают, насколько бы увеличился их рынок сбыта, выпускай они также FreeBSD-версии, и продолжают разрабатывать только под Linux. Что же делать пользователям FreeBSD? В этой ситуации на помощь приходит двоичная совместимость FreeBSD с Linux.
+
+Вкратце, эта совместимость позволяет пользователям FreeBSD работать с 90% приложений для Linux без каких-либо модификаций последних. Среди этих приложений: StarOffice(TM), Linux-версия man:getenv[3], Adobe(R) Acrobat(R), RealPlayer, VMware, Oracle(R), WordPerfect, Doom, Quake, и многие другие. Есть сведения, что в некоторых ситуациях эти Linux-программы показывали более высокую производительность при работе под FreeBSD, чем под Linux.
+
+Конечно, существуют некоторые особенности Linux, которые не поддерживаются в полной мере под FreeBSD. Например, не будут работать приложения Linux, использующие специфичные вызовы i386(TM), такие как переключение в виртуальный режим 8086.
+
+При чтении этой главы вы узнаете:
+
+* Как включить двоичную совместимость с Linux в вашей системе.
+* Как установить дополнительные совместно используемые (shared) библиотеки Linux.
+* Как установить приложения Linux в систему FreeBSD.
+* Детали реализации совместимости с Linux в ОС FreeBSD.
+
+Перед прочтением этой главы вам потребуется:
+
+* Узнать как устанавливать дополнительное программное обеспечение сторонних разработчиков (crossref:ports[ports, Установка приложений. порты и пакеты]).
+
+[[linuxemu-lbc-install]]
+== Установка
+
+Двоичная совместимость с Linux не включена по умолчанию. Простейший способ включения этой функциональности заключается в загрузке KLD-объекта `linux` ("Kernel LoaDable object"). Вы можете загрузить этот модуль, набрав следующее, как пользователь `root`:
+
+[source,bash]
+....
+# kldload linux
+....
+
+Если вы хотите, чтобы совместимость с Linux была включена постоянно, необходимо добавить в [.filename]#/etc/rc.conf# следующую строку:
+
+[.programlisting]
+....
+linux_enable="YES"
+....
+
+Для проверки того, загружен ли модуль, может быть использована команда man:kldstat[8]:
+
+[source,bash]
+....
+% kldstat
+Id Refs Address Size Name
+ 1 2 0xc0100000 16bdb8 kernel
+ 7 1 0xc24db000 d000 linux.ko
+....
+
+Если по какой-либо причине вы не хотите или не можете загрузить KLD, вы можете статически включить поддержку Linux в ядро, добавив опцию `options COMPAT_LINUX` в файл конфигурации ядра. Затем соберите и установите новое ядро, следуя описанию в crossref:kernelconfig[kernelconfig, Настройка ядра FreeBSD].
+
+=== Установка необходимых библиотек Linux
+
+Установить все требуемые библиотеки можно двумя путями: либо используя порт <<linuxemu-libs-port,linux_base>>, либо установив их <<linuxemu-libs-manually,вручную>>.
+
+[[linuxemu-libs-port]]
+==== Установка с помощью порта linux_base
+
+Этот метод является самым простым, и мы рекомендуем воспользоваться именно им. Процесс аналогичен установке любого другого порта из link:file://localhost/usr/ports/[Коллекции Портов]. Просто выполните следующие команды:
+
+[source,bash]
+....
+# cd /usr/ports/emulators/linux_base-fc4
+# make install distclean
+....
+
+Теперь вы можете работать с приложениями для Linux. Некоторые программы, возможно, будут сообщать о несоответствии подверсий некоторых системных библиотек. Однако обычно это не вызывает каких-либо неудобств.
+
+[NOTE]
+====
+Возможно наличие нескольких версий порта package:emulators/linux_base[], соответствующих различным версиям разных дистрибутивов Linux. Вы должны установить порт, наиболее близко соответствующий требованиям приложений Linux, которые будут установлены.
+====
+
+[[linuxemu-libs-manually]]
+==== Установка библиотек вручную
+
+Если у вас не установлена коллекция портов, можно установить требуемые библиотеки вручную. Вам понадобятся совместно используемые библиотеки для Linux, которые нужны программам, и runtime-компоновщик. Вам также потребуется создать "теневой корневой каталог", [.filename]#/compat/linux#, где будут расположены Linux-библиотеки. Если Linux-программе нужно загрузить какую-либо совместно используемую библиотеку, FreeBSD сперва будет пытаться найти ее в этом дереве. Так, если программа загружает, например, [.filename]#/lib/libc.so#, FreeBSD попытается открыть [.filename]#/compat/linux/lib/libc.so#, и если такого файла не существует, будет пытаться открыть [.filename]#/lib/libc.so#. Разделяемые библиотеки должны находиться в теневом дереве, а не в каталогах, выдаваемых загрузчиком Linux `ld.so`.
+
+Обычно вам придется добавлять совместно используемые библиотеки, от которых зависят Linux-программы, только при нескольких первых установках приложений Linux на вашу систему FreeBSD. По мере работы, у вас в системе накопится достаточный набор совместно используемых библиотек Linux для запуска новых Linux-программ без дополнительных действий.
+
+==== Как установить дополнительные совместно используемые библиотеки
+
+Что, если при установленном [.filename]#linux_base# порте ваше приложение все равно сообщает об отсутствии необходимой библиотеки? Как узнать, какая именно нужна библиотека и где ее взять? В принципе, есть два способа. Вам необходимо иметь привилегии пользователя `root` для их осуществления.
+
+Если у вас есть доступ к машине, на которой установлен Linux, узнайте, какие библиотеки использует Linux-приложение, и просто скопируйте из на свою машину. Рассмотрим следующий пример:
+
+Допустим, вы скачали по FTP Linux-версию Doom и установили ее на Linux-машине. Вы можете узнать, какие совместно используемые библиотеки нужны Doom, с помощью команды `ldd linuxdoom`:
+
+[source,bash]
+....
+% ldd linuxdoom
+libXt.so.3 (DLL Jump 3.1) => /usr/X11/lib/libXt.so.3.1.0
+libX11.so.3 (DLL Jump 3.1) => /usr/X11/lib/libX11.so.3.1.0
+libc.so.4 (DLL Jump 4.5pl26) => /lib/libc.so.4.6.29
+....
+
+Вам потребуются все файлы, перечисленные в последнем столбце. Скопируйте их в дерево [.filename]#/compat/linux# на вашей системе, а также создайте символические ссылки на эти файлы с именами из первого столбца, соответственно. В итоге, у вас в системе FreeBSD должны быть следующие файлы:
+
+[source,bash]
+....
+/compat/linux/usr/X11/lib/libXt.so.3.1.0
+/compat/linux/usr/X11/lib/libXt.so.3 -> libXt.so.3.1.0
+/compat/linux/usr/X11/lib/libX11.so.3.1.0
+/compat/linux/usr/X11/lib/libX11.so.3 -> libX11.so.3.1.0
+/compat/linux/lib/libc.so.4.6.29
+/compat/linux/lib/libc.so.4 -> libc.so.4.6.29
+....
+
+[NOTE]
+====
+Учтите, что если у вас уже есть совместно используемая библиотека Linux с соответствующим первому столбцу результатов `ldd` основным номером версии, вам не обязательно копировать файл, указанный в последнем столбце, в вашу систему. Уже существующий файл должен подойти. Рекомендуется, однако, все равно скопировать совместно используемую библиотеку, если ее версия новее. Предыдущую версию библиотеки можно удалить, если вы создали символическую ссылку на новую. Итак, если у вас в системе есть следующие библиотеки:
+
+[source,bash]
+....
+/compat/linux/lib/libc.so.4.6.27
+/compat/linux/lib/libc.so.4 -> libc.so.4.6.27
+....
+
+и какое-либо приложение требует библиотеку более поздней версии, судя по результатам команды `ldd`:
+
+[source,bash]
+....
+libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29
+....
+
+Если версии немного отличаются в последней цифре, копировать [.filename]#/lib/libc.so.4.6.29# необязательно, так как программа, скорее всего, будет нормально работать и с немного устаревшей версией. Тем не менее, вы можете заменить [.filename]#libc.so#:
+
+[source,bash]
+....
+/compat/linux/lib/libc.so.4.6.29
+/compat/linux/lib/libc.so.4 -> libc.so.4.6.29
+....
+====
+
+[NOTE]
+====
+Символические ссылки важны _только_ для Linux-программ. Runtime-компоновщик FreeBSD самостоятельно подберет правильные номера версий библиотек, и вам не нужно об этом беспокоиться.
+====
+
+=== Установка двоичных файлов Linux ELF
+
+Для ELF-файлов иногда требуется сделать так называемый "branding" (маркировать его). Если попытаться запустить не маркированный ELF-файл, вы получите следующее сообщение об ошибке:
+
+[source,bash]
+....
+% ./моя-linux-elf-программа
+ELF binary type not known
+Abort
+....
+
+Чтобы помочь ядру FreeBSD отличить ELF-файл FreeBSD от двоичного файла Linux, используется утилита man:brandelf[1]:
+
+[source,bash]
+....
+% brandelf -t Linux моя-linux-elf-программа
+....
+
+В настоящее время набор инструментальных средств GNU (GNU toolchain) помещает необходимую маркировочную информацию в двоичные ELF-файлы автоматически, поэтому необходимость в этом действии возникает всё реже.
+
+=== Конфигурирование распознавания имен хостов
+
+Если DNS не работает или вы получаете это сообщение:
+
+[source,bash]
+....
+resolv+: "bind" is an invalid keyword resolv+:
+"hosts" is an invalid keyword
+....
+
+то вам нужно создать (изменить) файл [.filename]#/compat/linux/etc/host.conf#, содержащий:
+
+[.programlisting]
+....
+order hosts, bind
+multi on
+....
+
+Таким образом, вы указываете, то сначала производится поиск в файле [.filename]#/etc/hosts#, а только затем запрашивается DNS. Когда файл [.filename]#/compat/linux/etc/host.conf# отсутствует, Linux-приложения находят файл [.filename]#/etc/host.conf# для FreeBSD и сообщают о несовместимом синтаксисе. Если вы не настраивали сервер имен с помощью файла [.filename]#/etc/resolv.conf#, уберите `bind` из файла [.filename]#/compat/linux/etc/host.conf#.
+
+[[linuxemu-mathematica]]
+== Установка Mathematica(R)
+
+Ниже описано, как установить Linux-версию пакета Mathematica(R) 5.X на систему FreeBSD.
+
+Linux версия Mathematica(R) или Mathematica(R) for Students можно заказать непосредственно в компании Wolfram по адресу http://www.wolfram.com/[http://www.wolfram.com/].
+
+=== Использование установщика Mathematica(R)
+
+Сначала вы должны указать FreeBSD, что Linux бинарники от Mathematica(R) используют Linux ABI. Самый простой путь сделать это-установить марку ELF Linux по умолчанию для всех немаркированных двоичных файлов с помощью команды:
+
+[source,bash]
+....
+# sysctl kern.fallback_elf_brand=3
+....
+
+FreeBSD будет считать, что все немаркированные двоичные ELF-файлы используют Linux ABI, и вы сможете запустить MathInstaller прямо с CDROM.
+
+Теперь, скопируйте файл [.filename]#MathInstaller# на ваш жёсткий диск:
+
+[source,bash]
+....
+# mount /cdrom
+# cp /cdrom/Unix/Installers/Linux/MathInstaller /localdir/
+....
+
+и в этом файле замените `/bin/sh` в в первой строке на `/compat/linux/bin/sh`. Этим мы убедимся, что установщик будет выполняться Linux версией man:sh[1]. Дальше, замените все вхождения `Linux)` на `FreeBSD)` с помощью текстового редактора или с помощью скрипта, представленного ниже, в следующей главе. Это укажет установщику Mathematica(R), вызывающему `uname -s` для определения операционной системы, относиться к FreeBSD, как к Linux подобной операционной системе. Теперь, запуск `MathInstaller` установит Mathematica(R).
+
+=== Modifying the Mathematica(R) Executables
+
+Скрипты командной оболочки, которые Mathematica(R) создала во время установки, должны быть изменены перед тем, как вы сможете использовать их. Если вы выбрали [.filename]#/usr/local/bin# в качестве директории для помещения исполняемых файлов Mathematica(R), то вы обнаружите в этом каталоге ссылки на файлы [.filename]#math#, [.filename]#mathematica#, [.filename]#Mathematica#, и [.filename]#MathKernel#. В каждом из них замените `Linux)` на `FreeBSD)` с помощью текстового редактора или с помощью следующего скрипта командной оболочки:
+
+[.programlisting]
+....
+#!/bin/sh
+cd /usr/local/bin
+for i in math mathematica Mathematica MathKernel
+ do sed 's/Linux)/FreeBSD)/g' $i > $i.tmp
+ sed 's/\/bin\/sh/\/compat\/linux\/bin\/sh/g' $i.tmp > $i
+ rm $i.tmp
+ chmod a+x $i
+done
+....
+
+=== Получение пароля к пакету Mathematica(R)
+
+Когда вы запустите Mathematica(R) в первый раз, у вас будет запрошен пароль. Если вы еще не получили пароль от Wolfram, запустите программу `mathinfo` в директории установки для получения вашего "machine ID". Этот machine ID основан исключительно на MAC адресе вашей первичной Ethernet карты, так что, вы не сможете использовать вашу копию Mathematica(R) на разных машинах.
+
+При регистрации по электронной почте, по телефону или по факсу вы сообщаете "machine ID", а в ответ получаете пароль, состоящий из нескольких групп чисел.
+
+=== Использование интерфейса Mathematica(R) по сети
+
+Mathematica(R) использует специальные шрифты для отображения некоторых символов, которые отсутствуют в стандартных шрифтах (символы интегралов, сумм, греческий алфавит и другие). Протокол X требует, чтобы эти шрифты были установлены _локально_. Это означает, что вы должны скопировать эти шрифты с компакт-диска или хоста, на котором установлена Mathematica(R), на вашу машину. Обычно эти шрифты находятся в каталоге [.filename]#/cdrom/Unix/Files/SystemFiles/Fonts# компакт-диска или в каталоге [.filename]#/usr/local/mathematica/SystemFiles/Fonts# на диске. Собственно файлы со шрифтами находятся в подкаталогах [.filename]#Type1# и [.filename]#X#. О том, как их использовать, читайте ниже.
+
+Можно просто скопировать их в один из существующих каталогов шрифтов в каталоге [.filename]#/usr/X11R6/lib/X11/fonts#. В этом случае придётся отредактировать файл [.filename]#fonts.dir#, добавив в него названия шрифтов и изменив число шрифтов в первой строке. Можно также запустить программу man:mkfontdir[1], находясь в том каталоге, куда вы скопировали шрифты.
+
+Есть альтернативный способ: скопировать каталоги в [.filename]#/usr/X11R6/lib/X11/fonts#:
+
+[source,bash]
+....
+# cd /usr/X11R6/lib/X11/fonts
+# mkdir X
+# mkdir MathType1
+# cd /cdrom/Unix/Files/SystemFiles/Fonts
+# cp X/* /usr/X11R6/lib/X11/fonts/X
+# cp Type1/* /usr/X11R6/lib/X11/fonts/MathType1
+# cd /usr/X11R6/lib/X11/fonts/X
+# mkfontdir
+# cd ../MathType1
+# mkfontdir
+....
+
+Теперь добавьте каталоги с новыми шрифтами в путь к шрифтам:
+
+[source,bash]
+....
+# xset fp+ /usr/X11R6/lib/X11/fonts/X
+# xset fp+ /usr/X11R6/lib/X11/fonts/MathType1
+# xset fp rehash
+....
+
+Если вы используете сервер Xorg, то можно просто прописать эти каталоги в файле [.filename]#xorg.conf#.
+
+[NOTE]
+====
+Для сервера XFree86(TM), файл конфигурации [.filename]#XF86Config#.
+====
+
+Если на вашем компьютере _нет_ каталога [.filename]#/usr/X11R6/lib/X11/fonts/Type1#, замените [.filename]#MathType1# на [.filename]#Type1# в предыдущем примере.
+
+[[linuxemu-maple]]
+== Установка Maple(TM)
+
+Maple(TM) - коммерческая математическая программа, аналогичная Mathematica(R). Это программное обеспечение надо купить у http://www.maplesoft.com/[http://www.maplesoft.com/], а потом зарегистрироваться там для получения файла лицензии. Для установки этого программного обеспечения в ОС FreeBSD используется следующая последовательность простых шагов.
+
+[.procedure]
+====
+
+. Выполните скрипт командного интерпретатора [.filename]#INSTALL# из дистрибутива. Выберите опцию "RedHat", когда будет предложено программой установки. Обычно установка выполняется в каталог [.filename]#/usr/local/maple#.
+. Если вы этого ещё не сделали, купите лицензию на Maple(TM) в компании Maple Waterloo Software (http://register.maplesoft.com/[http://register.maplesoft.com/]) и скопируйте ее в файл [.filename]#/usr/local/maple/license/license.dat#.
+. Установите диспетчер лицензий FLEXlm, выполнив скрипт установки [.filename]#INSTALL_LIC#, входящий в состав Maple(TM). Укажите основное имя хоста вашей машины для сервера лицензий.
+. Исправьте файл [.filename]#/usr/local/maple/bin/maple.system.type# с помощью следующего патча:
++
+[.programlisting]
+....
+ ----- snip ------------------
+*** maple.system.type.orig Sun Jul 8 16:35:33 2001
+--- maple.system.type Sun Jul 8 16:35:51 2001
+***************
+*** 72,77 ****
+--- 72,78 ----
+ # the IBM RS/6000 AIX case
+ MAPLE_BIN="bin.IBM_RISC_UNIX"
+ ;;
++ "FreeBSD"|\
+ "Linux")
+ # the Linux/x86 case
+ # We have two Linux implementations, one for Red Hat and
+ ----- snip end of patch -----
+....
++
+Учтите, что после `"FreeBSD"|\` не должно быть никаких пробелов.
++
+Этот патч заставляет Maple(TM) распознавать "FreeBSD" как тип Linux-системы. Скрипт командного интерпретатора [.filename]#bin/maple# вызывает скрипт [.filename]#bin/maple.system.type#, который, в свою очередь, вызывает `uname -a` для получения имени операционной системы. В зависимости от имени ОС он определяет, какие двоичные модули использовать.
+. Запустите сервер лицензий.
++
+Следующий скрипт, установленный в файл [.filename]#/usr/local/etc/rc.d/lmgrd.sh#, обеспечивает удобный способ запуска `lmgrd`:
++
+[.programlisting]
+....
+ ----- snip ------------
+
+#! /bin/sh
+PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin
+PATH=${PATH}:/usr/local/maple/bin:/usr/local/maple/FLEXlm/UNIX/LINUX
+export PATH
+
+LICENSE_FILE=/usr/local/maple/license/license.dat
+LOG=/var/log/lmgrd.log
+
+case "$1" in
+start)
+ lmgrd -c ${LICENSE_FILE} 2>> ${LOG} 1>&2
+ echo -n " lmgrd"
+ ;;
+stop)
+ lmgrd -c ${LICENSE_FILE} -x lmdown 2>> ${LOG} 1>&2
+ ;;
+*)
+ echo "Usage: `basename $0` {start|stop}" 1>&2
+ exit 64
+ ;;
+esac
+
+exit 0
+ ----- snip ------------
+....
++
+. Выполните тестовый запуск Maple(TM):
++
+[source,bash]
+....
+% cd /usr/local/maple/bin
+% ./xmaple
+....
++
+Программа должна запуститься и работать. Не забудьте написать в Maplesoft и сообщить, что хотели бы видеть версию специально для FreeBSD!
+====
+
+=== Типичные проблемы
+
+* Работать с диспетчером лицензий FLEXlm может быть непросто. Дополнительную документацию по нему можно найти на сайте http://www.globetrotter.com/[http://www.globetrotter.com/].
+* `lmgrd` очень требователен к файлу лицензии и выдает дамп памяти при выявлении любых проблем. Правильный файл лицензии должен иметь следующий вид:
++
+[.programlisting]
+....
+# =======================================================
+# License File for UNIX Installations ("Pointer File")
+# =======================================================
+SERVER chillig ANY
+#USE_SERVER
+VENDOR maplelmg
+
+FEATURE Maple maplelmg 2000.0831 permanent 1 XXXXXXXXXXXX \
+ PLATFORMS=i86_r ISSUER="Waterloo Maple Inc." \
+ ISSUED=11-may-2000 NOTICE=" Technische Universitat Wien" \
+ SN=XXXXXXXXX
+....
++
+[NOTE]
+====
+Серийный номер и ключ забиты символами 'X'. `chillig` - имя хоста.
+====
++
+Редактирование файла лицензий возможно, если только не трогать строку "FEATURE" (которая защищена лицензионным ключом).
+
+[[linuxemu-matlab]]
+== Установка MATLAB(R)
+
+Этот документ описывает процесс установки Linux-версии MATLAB(R) версии 6.5 на систему FreeBSD. Эта программа работает вполне нормально, за исключением Java Virtual Machine(TM) (см. <<matlab-jre>>).
+
+Linux-версию MATLAB(R) можно приобрести непосредственно в компании The MathWorks на сайте http://www.mathworks.com[http://www.mathworks.com]. Не забудьте получить файл лицензии или инструкции по его созданию. По ходу дела дайте знать производителю, что хотели бы увидеть версию их ПО специально для FreeBSD.
+
+=== Процесс установки MATLAB(R)
+
+Для установки MATLAB(R) выполните следующие шаги:
+
+[.procedure]
+====
+
+. Вставьте инсталляционный CD и смонтируйте его. Станьте пользователем `root`, как рекомендует скрипт установки. Для запуска скрипта установки наберите:
++
+[source,bash]
+....
+# /compat/linux/bin/sh /cdrom/install
+....
++
+[TIP]
+======
+
+Запускается графический инсталлятор. Если вы получаете сообщения о невозможности открыть дисплей, наберите `setenv HOME ~_USER_`, где _USER_ - пользователь, от имени которого выполнена команда man:su[1].
+======
++
+. При запросе корневого каталога MATLAB(R), наберите: `/compat/linux/usr/local/matlab`.
++
+[TIP]
+======
+
+Чтобы упростить набор остальных команд в ходе установки, выполните в командном интерпретаторе следующую команду: `set MATLAB=/compat/linux/usr/local/matlab`
+======
++
+. Отредактируйте файл лицензии в соответствии с инструкциями в полученной лицензии MATLAB(R).
++
+[TIP]
+======
+
+Этот файл можно подготовить заранее с помощью любого текстового редактора и скопировать его в [.filename]#$MATLAB/license.dat# до того, как инсталлятор попросит его отредактировать.
+======
++
+. Завершите процесс установки.
+====
+
+В этот момент ваша установка MATLAB(R) завершена. Следующие шаги позволяют "связать" эту программу с вашей системой FreeBSD.
+
+=== Запуск диспетчера лицензий
+
+[.procedure]
+====
+
+. Создайте символические ссылки для скриптов диспетчера лицензий:
++
+[source,bash]
+....
+# ln -s $MATLAB/etc/lmboot /usr/local/etc/lmboot_TMW
+# ln -s $MATLAB/etc/lmdown /usr/local/etc/lmdown_TMW
+....
++
+. Создайте файл запуска [.filename]#/usr/local/etc/rc.d/flexlm.sh#. Представленный ниже пример - измененная версия входящего в дистрибутив файла [.filename]#$MATLAB/etc/rc.lm.glnx86#. Изменены местонахождения файлов и диспетчер лицензий запускается под эмулятором Linux.
++
+[.programlisting]
+....
+#!/bin/sh
+case "$1" in
+ start)
+ if [ -f /usr/local/etc/lmboot_TMW ]; then
+ /compat/linux/bin/sh /usr/local/etc/lmboot_TMW -u username && echo 'MATLAB_lmgrd'
+ fi
+ ;;
+ stop)
+ if [ -f /usr/local/etc/lmdown_TMW ]; then
+ /compat/linux/bin/sh /usr/local/etc/lmdown_TMW > /dev/null 2>&1
+ fi
+ ;;
+ *)
+ echo "Usage: $0 {start|stop}"
+ exit 1
+ ;;
+esac
+
+exit 0
+....
++
+[IMPORTANT]
+======
+Этот файл надо сделать выполняемым:
+
+[source,bash]
+....
+# chmod +x /usr/local/etc/rc.d/flexlm.sh
+....
+
+Вы также должны заменить _username_ именем пользователя в вашей системе (но не `root`).
+======
++
+. Запустите диспетчер лицензий с помощью команды:
++
+[source,bash]
+....
+# /usr/local/etc/rc.d/flexlm.sh start
+....
+====
+
+[[matlab-jre]]
+=== Связь с Java(TM) Runtime Environment
+
+Измените ссылку Java(TM) Runtime Environment (JRE) так, чтобы он ссылалась на версию, работающую в FreeBSD:
+
+[source,bash]
+....
+# cd $MATLAB/sys/java/jre/glnx86/
+# unlink jre; ln -s ./jre1.1.8 ./jre
+....
+
+=== Создание скрипта запуска MATLAB(R)
+
+[.procedure]
+====
+
+. Поместите следующий скрипт запуска в файл [.filename]#/usr/local/bin/matlab#:
++
+[.programlisting]
+....
+#!/bin/sh
+/compat/linux/bin/sh /compat/linux/usr/local/matlab/bin/matlab "$@"
+....
++
+. Затем выполните команду `chmod +x /usr/local/bin/matlab`.
+====
+
+[TIP]
+====
+
+В зависимости от версии package:emulators/linux_base[], при выполнении этого скрипта могут быть выданы сообщения об ошибках. Чтобы избежать этого, отредактируйте файл [.filename]#/compat/linux/usr/local/matlab/bin/matlab# и измените строку вида:
+
+[.programlisting]
+....
+if [ `expr "$lscmd" : '.*->.*'` -ne 0 ]; then
+....
+
+(в версии 13.0.1 это строка 410) на следующую строку:
+
+[.programlisting]
+....
+if test -L $newbase; then
+....
+
+====
+
+=== Создание скрипта остановки MATLAB(R)
+
+Следующие действия необходимы для решения проблемы с некорректным завершением работы MATLAB(R).
+
+[.procedure]
+====
+
+. Создайте файл [.filename]#$MATLAB/toolbox/local/finish.m# и поместите в него одну строку:
++
+[.programlisting]
+....
+! $MATLAB/bin/finish.sh
+....
++
+[NOTE]
+======
+`$MATLAB` - литерал.
+======
++
+[TIP]
+======
+
+В том же каталоге находятся файлы [.filename]#finishsav.m# и [.filename]#finishdlg.m#, которые позволяют сохранять рабочее пространство перед выходом. Если вы используете любой из них, вставьте представленную выше строку сразу после команды `save`.
+======
++
+. Создайте файл [.filename]#$MATLAB/bin/finish.sh#, который будет содержать следующий скрипт:
++
+[.programlisting]
+....
+#!/usr/compat/linux/bin/sh
+(sleep 5; killall -1 matlab_helper) &
+exit 0
+....
++
+. Сделайте этот файл выполняемым:
++
+[source,bash]
+....
+# chmod +x $MATLAB/bin/finish.sh
+....
+====
+
+[[matlab-using]]
+=== Использование MATLAB(R)
+
+В этот момент все готово для выполнения команды `matlab` и начала использования этой программы.
+
+[[linuxemu-oracle]]
+== Установка Oracle(R)
+
+=== Введение
+
+Ниже описан процесс установки Oracle(R) 8.0.5 и Oracle(R) 8.0.5.1 Enterprise Edition для Linux на систему FreeBSD.
+
+=== Установка Linux-среды
+
+Удостоверьтесь, что порты package:emulators/linux_base[] и package:devel/linux_devtools[] установлены на вашей системе. Если у вас возникнут трудности с этими портами, воспользуйтесь пакетами или более ранними их версиями из Коллекции Портов.
+
+Если вы хотите использовать интеллектуальный агент (intelligent agent), придется также установить пакет TCL от Red Hat: [.filename]#tcl-8.0.3-20.i386.rpm#. Универсальная команда для установки пакетов с помощью официального порта RPM (package:archivers/rpm[]):
+
+[source,bash]
+....
+# rpm -i --ignoreos --root /compat/linux --dbpath /var/lib/rpm пакет
+....
+
+Установка этого _пакета_ должна пройти без каких-либо ошибок.
+
+=== Создание среды Oracle(R)
+
+Прежде чем вы сможете установить Oracle(R), необходимо настроить соответствующую среду. В этом документе описано, что _специально_ нужно сделать, чтобы запустить Oracle(R) для Linux под FreeBSD - это не пересказ официального руководства по установке Oracle(R).
+
+[[linuxemu-kernel-tuning]]
+==== Настройка ядра
+
+Как описано в руководстве по установке Oracle(R), необходимо установить максимальный размер совместно используемой (shared) памяти. Не используйте `SHMMAX` под FreeBSD. `SHMMAX` просто вычисляется, исходя из `SHMMAXPGS` и `PGSIZE`. Следовательно, нужно задавать `SHMMAXPGS`. За информацией о прочих опциях обратитесь к официальному руководству. Пример настроек:
+
+[.programlisting]
+....
+options SHMMAXPGS=10000
+options SHMMNI=100
+options SHMSEG=10
+options SEMMNS=200
+options SEMMNI=70
+options SEMMSL=61
+....
+
+Установите эти опции в зависимости от того, как и для чего вы будете использовать Oracle(R).
+
+Не забудьте добавить следующие строки в файл конфигурации ядра:
+
+[.programlisting]
+....
+options SYSVSHM # совместно используемая память SysV
+options SYSVSEM # семафоры SysV
+options SYSVMSG # межпроцессное взаимодействие SysV
+....
+
+[[linuxemu-oracle-account]]
+==== Учетная запись Oracle(R)
+
+Создайте специальную учетную запись `oracle`, как и любую другую учетную запись. Единственное отличие в том, что для `oracle` необходимо указать командный интерпретатор Linux. Добавьте [.filename]#/compat/linux/bin/bash# в [.filename]#/etc/shells# и установите для `oracle` командный интерпретатор [.filename]#/compat/linux/bin/bash#.
+
+[[linuxemu-environment]]
+==== Переменные среды
+
+Кроме стандартных переменных среды Oracle(R), таких как `ORACLE_HOME` и `ORACLE_SID`, вам нужно будет установить следующие переменные среды:
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Переменная
+| Значение
+
+|`LD_LIBRARY_PATH`
+|`$ORACLE_HOME/lib`
+
+|`CLASSPATH`
+|`$ORACLE_HOME/jdbc/lib/classes111.zip`
+
+|`PATH`
+|`/compat/linux/bin /compat/linux/sbin /compat/linux/usr/bin /compat/linux/usr/sbin /bin /sbin /usr/bin /usr/sbin /usr/local/bin $ORACLE_HOME/bin`
+|===
+
+Желательно устанавливать все переменные среды в файле [.filename]#.profile#. Вот реальный пример:
+
+[.programlisting]
+....
+ORACLE_BASE=/oracle; export ORACLE_BASE
+ORACLE_HOME=/oracle; export ORACLE_HOME
+LD_LIBRARY_PATH=$ORACLE_HOME/lib
+export LD_LIBRARY_PATH
+ORACLE_SID=ORCL; export ORACLE_SID
+ORACLE_TERM=386x; export ORACLE_TERM
+CLASSPATH=$ORACLE_HOME/jdbc/lib/classes111.zip
+export CLASSPATH
+PATH=/compat/linux/bin:/compat/linux/sbin:/compat/linux/usr/bin
+PATH=$PATH:/compat/linux/usr/sbin:/bin:/sbin:/usr/bin:/usr/sbin
+PATH=$PATH:/usr/local/bin:$ORACLE_HOME/bin
+export PATH
+....
+
+=== Установка Oracle(R)
+
+Из-за небольшой несовместимости с Linux-эмулятором, вам нужно будет создать подкаталог [.filename]#.oracle# в каталоге [.filename]#/var/tmp# прежде, чем можно будет начать установку. Сделайте ее владельцем пользователя `oracle`. Если вы все сделали правильно, то установка Oracle(R) должна пройти без проблем. Если какие-либо трудности все же возникли, проверьте еще раз все конфигурационные файлы и/или целостность дистрибутива Oracle(R). После окончания установки Oracle(R) примените патчи, описанные в следующих двух подразделах.
+
+Одна из часто возникающих проблем - неправильно установленный адаптер TCP-протокола. В результате, невозможно запустить процессы прослушивания TCP. Вот решение проблемы:
+
+[source,bash]
+....
+# cd $ORACLE_HOME/network/lib
+# make -f ins_network.mk ntcontab.o
+# cd $ORACLE_HOME/lib
+# ar r libnetwork.a ntcontab.o
+# cd $ORACLE_HOME/network/lib
+# make -f ins_network.mk install
+....
+
+Не забудьте повторно запустить [.filename]#root.sh#!
+
+[[linuxemu-patch-root]]
+==== Изменение root.sh
+
+При установке Oracle(R) необходимо выполнить некоторые действия от имени пользователя `root`. Они записаны в скрипте командного интерпретатора [.filename]#root.sh#, который находится в каталоге [.filename]#orainst#. Перед запуском, примените к нему следующий патч (исправляет местонахождение утилиты chown), либо запускайте его в командном интерпретаторе Linux.
+
+[.programlisting]
+....
+*** orainst/root.sh.orig Tue Oct 6 21:57:33 1998
+--- orainst/root.sh Mon Dec 28 15:58:53 1998
+***************
+*** 31,37 ****
+# This is the default value for CHOWN
+# It will redefined later in this script for those ports
+# which have it conditionally defined in ss_install.h
+! CHOWN=/bin/chown
+#
+# Define variables to be used in this script
+--- 31,37 ----
+# This is the default value for CHOWN
+# It will redefined later in this script for those ports
+# which have it conditionally defined in ss_install.h
+! CHOWN=/usr/sbin/chown
+#
+# Define variables to be used in this script
+....
+
+Если вы устанавливаете Oracle(R) не с компакт-диска, можно изменить исходный файл [.filename]#root.sh#. Он называется [.filename]#rthd.sh# и находится в каталоге [.filename]#orainst#.
+
+[[linuxemu-patch-tcl]]
+==== Изменение genclntsh
+
+Скрипт `genclntsh` используется для того, чтобы создать единую совместно используемую клиентскую библиотеку, которая используется для создания демонстраций. Примените следующий патч, чтобы закомментировать определение переменной `PATH`:
+
+[.programlisting]
+....
+*** bin/genclntsh.orig Wed Sep 30 07:37:19 1998
+--- bin/genclntsh Tue Dec 22 15:36:49 1998
+***************
+*** 32,38 ****
+#
+# Explicit path to ensure that we're using the correct commands
+#PATH=/usr/bin:/usr/ccs/bin export PATH
+! PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH
+#
+# each product MUST provide a $PRODUCT/admin/shrept.lst
+--- 32,38 ----
+#
+# Explicit path to ensure that we're using the correct commands
+#PATH=/usr/bin:/usr/ccs/bin export PATH
+! #PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH
+#
+# each product MUST provide a $PRODUCT/admin/shrept.lst
+....
+
+=== Запуск Oracle(R)
+
+Теперь, если вы все сделали правильно, то можете использовать Oracle(R) так же, как и в системе Linux.
+
+[[sapr3]]
+== Установка SAP(R) R/3(R)
+
+Инсталляции систем SAP(R) на базе FreeBSD не будут поддерживаться службой поддержки SAP(R) - они предоставляют поддержку только на сертифицированных платформах.
+
+[[preface]]
+=== Предисловие
+
+Этот документ описывает возможный способ установки системы SAP(R) R/3(R) с СУБД Oracle(R) Database на машине с ОС FreeBSD, включая установку FreeBSD и Oracle(R). Будут описаны две разные конфигурации:
+
+* SAP(R) R/3(R) 4.6B (IDES) с Oracle(R) 8.0.5 на FreeBSD 4.3-STABLE
+* SAP(R) R/3(R) 4.6C с Oracle(R) 8.1.7 на FreeBSD 4.5-STABLE
+
+Хотя в этом документе мы пытаемся подробно описать все важные шаги, он не заменяет руководства по установке Oracle(R) и SAP(R) R/3(R).
+
+По специфическим вопросам SAP(R) и Oracle(R) обратитесь к документации, поставляемой в составе SAP(R) R/3(R) Linux edition, а также к другим источникам информации об Oracle(R) и SAP(R) OSS.
+
+[[software]]
+=== Программное обеспечение
+
+Для установки SAP(R) были использованы следующие диски CD-ROM:
+
+[[software-46b]]
+==== SAP(R) R/3(R) 4.6B, Oracle(R) 8.0.5
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Имя
+| Номер
+| Описание
+
+|KERNEL
+|51009113
+|SAP Kernel Oracle / Installation / AIX, Linux, Solaris
+
+|RDBMS
+|51007558
+|Oracle / RDBMS 8.0.5.X / Linux
+
+|EXPORT1
+|51010208
+|IDES / DB-Export / Диск 1 из 6
+
+|EXPORT2
+|51010209
+|IDES / DB-Export / Диск 2 из 6
+
+|EXPORT3
+|51010210
+|IDES / DB-Export / Диск 3 из 6
+
+|EXPORT4
+|51010211
+|IDES / DB-Export / Диск 4 из 6
+
+|EXPORT5
+|51010212
+|IDES / DB-Export / Диск 5 из 6
+
+|EXPORT6
+|51010213
+|IDES / DB-Export / Диск 6 из 6
+|===
+
+Кроме того, мы использовали CD Oracle(R) 8 Server (Опытная версия 8.0.5 для Linux, ядро версии 2.0.33), который не обязательно понадобится, и FreeBSD 4.3-STABLE (она вышла всего через несколько дней после 4.3 RELEASE).
+
+[[software-46c]]
+==== SAP(R) R/3(R) 4.6C SR2, Oracle(R) 8.1.7
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Имя
+| Номер
+| Описание
+
+|KERNEL
+|51014004
+|SAP Kernel Oracle / SAP Kernel Version 4.6D / DEC, Linux
+
+|RDBMS
+|51012930
+|Oracle 8.1.7/ RDBMS / Linux
+
+|EXPORT1
+|51013953
+|Release 4.6C SR2 / Export / Диск 1 из 4
+
+|EXPORT1
+|51013953
+|Release 4.6C SR2 / Export / Диск 2 из 4
+
+|EXPORT1
+|51013953
+|Release 4.6C SR2 / Export / Диск 3 bp 4
+
+|EXPORT1
+|51013953
+|Release 4.6C SR2 / Export / Диск 4 из 4
+
+|LANG1
+|51013954
+|Release 4.6C SR2 / Language / DE, EN, FR / Диск 1 из 3
+|===
+
+В зависимости от языков, которые необходимо установить, могут потребоваться дополнительные CD. Здесь мы использовали только немецкий и английский языки, поэтому потребовался только первый языковой CD. Обратите внимание, что номера всех EXPORT CD идентичны. Все три языковых CD тоже имеют один номер (это отличается от нумерации CD в версии 4.6B IDES). На момент написания этого раздела (20.03.2002) установленное ПО работало на FreeBSD 4.5-STABLE.
+
+[[sap-notes]]
+=== Примечания по SAP(R)
+
+Прочитайте следующие документы перед установкой SAP(R) R/3(R) - они пригодятся в ходе установки:
+
+[[sap-notes-46b]]
+==== SAP(R) R/3(R) 4.6B, Oracle(R) 8.0.5
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Номер
+| Название
+
+|0171356
+|SAP Software on Linux: Essential Comments
+
+|0201147
+|INST: 4.6C R/3 Inst. on UNIX - Oracle
+
+|0373203
+|Update / Migration Oracle 8.0.5 --> 8.0.6/8.1.6 LINUX
+
+|0072984
+|Release of Digital UNIX 4.0B for Oracle
+
+|0130581
+|R3SETUP step DIPGNTAB terminates
+
+|0144978
+|Your system has not been installed correctly
+
+|0162266
+|Questions and tips for R3SETUP on Windows NT / W2K
+|===
+
+[[sap-notes-46c]]
+==== SAP(R) R/3(R) 4.6C, Oracle(R) 8.1.7
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Номер
+| Название
+
+|0015023
+|Initializing table TCPDB (RSXP0004) (EBCDIC)
+
+|0045619
+|R/3 with several languages or typefaces
+
+|0171356
+|SAP Software on Linux: Essential Comments
+
+|0195603
+|RedHat 6.1 Enterprise version: Known problems
+
+|0212876
+|The new archiving tool SAPCAR
+
+|0300900
+|Linux: Released DELL Hardware
+
+|0377187
+|RedHat 6.2: important remarks
+
+|0387074
+|INST: R/3 4.6C SR2 Installation on UNIX
+
+|0387077
+|INST: R/3 4.6C SR2 Inst. on UNIX - Oracle
+
+|0387078
+|SAP Software on UNIX: OS Dependencies 4.6C SR2
+|===
+
+[[hardware-requirements]]
+=== Требования к аппаратному обеспечению
+
+Следующего оборудования достаточно для установки SAP(R) R/3(R) System. Для производственного использования необходима более точная оценка параметров:
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Компонент
+| 4.6B
+| 4.6C
+
+|Процессор
+|2 x 800MHz Pentium(R) III
+|2 x 800MHz Pentium(R) III
+
+|Память
+|1GB ECC
+|2GB ECC
+
+|Объем дисков
+|50-60GB (IDES)
+|50-60GB (IDES)
+|===
+
+Для производственного использования рекомендуются процессоры Xeon(TM) с большим кешем, высокоскоростной доступ к дискам (SCSI, аппаратный RAID-контроллер), USV и ECC-RAM. Большой объем дискового пространства связан с заранее сконфигурированной системой IDES, которая создает 27 Гбайт файлов базы данных по ходу установки. Этого пространства также достаточно для исходных производственных систем и прикладных данных.
+
+[[hardware-46b]]
+==== SAP(R) R/3(R) 4.6B, Oracle(R) 8.0.5
+
+Было использовано следующее стандартное оборудование: двухпроцессорная материнская плата с двумя процессорами Pentium(R) III 800 MHz, SCSI-контроллером Adaptec(R) 29160 Ultra160 (для работы с 40/80 Гбайт стримером DLT и приводом CDROM), Mylex(R) AcceleRAID(TM) (2 канала, firmware 6.00-1-00 с 32 Мбайт RAM). К RAID-контроллеру Mylex(R) подключены два диска по 17 Гбайт (зеркалированы) и четыре диска по 36 Гбайт (RAID уровня 5).
+
+[[hardware-46c]]
+==== SAP(R) R/3(R) 4.6C, Oracle(R) 8.1.7
+
+Для этой установки был использован Dell(TM) PowerEdge(TM) 2500: двухпроцессорная плата с двумя процессорами Pentium(R) III 1000 MHz (256 Кбайт кэш), 2 Гбайта PC133 ECC SDRAM, PERC/3 DC PCI RAID-контроллер со 128 Мбайтами и приводом EIDE DVD-ROM. К RAID-контроллеру подключены два диска по 18 Гбайт (зеркалированы) и четыре диска по 36 Гбайт (RAID уровня 5).
+
+[[installation]]
+=== Установка FreeBSD
+
+Сначала надо установить FreeBSD. Есть несколько способов сделать это; подробнее см. crossref:install[install-diff-media,Подготовка собственного источника установки].
+
+[[disk-layout]]
+==== Компоновка дисков
+
+Для простоты диски при установке SAP(R) R/3(R) 46B и SAP(R) R/3(R) 46C SR2 использовались одинаково. Изменились только имена устройств, поскольку установка выполнялась на разное оборудование ([.filename]#/dev/da# и [.filename]#/dev/amr#, соответственно, так что при использовании AMI MegaRAID(R) будут задействованы устройства [.filename]#/dev/amr0s1a# вместо [.filename]#/dev/da0s1a#):
+
+[.informaltable]
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Файловая система
+| Размер (в блока по 1 Кбайту)
+| Размер (Гбайт)
+| Смонтирована в
+
+|[.filename]#/dev/da0s1a#
+|1.016.303
+|1
+|[.filename]#/#
+
+|[.filename]#/dev/da0s1b#
+|
+|6
+|swap
+
+|[.filename]#/dev/da0s1e#
+|2.032.623
+|2
+|[.filename]#/var#
+
+|[.filename]#/dev/da0s1f#
+|8.205.339
+|8
+|[.filename]#/usr#
+
+|[.filename]#/dev/da1s1e#
+|45.734.361
+|45
+|[.filename]#/compat/linux/oracle#
+
+|[.filename]#/dev/da1s1f#
+|2.032.623
+|2
+|[.filename]#/compat/linux/sapmnt#
+
+|[.filename]#/dev/da1s1g#
+|2.032.623
+|2
+|[.filename]#/compat/linux/usr/sap#
+|===
+
+Конфигурируем и инициализируем заранее два логических диска с помощью ПО RAID Mylex(R) или PERC/3. Программы конфигурирования можно запустить в ходе загрузки BIOS.
+
+Обратите внимание, что использованная компоновка дисков немного отличается от рекомендованной SAP(R), поскольку SAP(R) рекомендует монтировать подкаталоги Oracle(R) (и некоторые другие) отдельно - мы решили просто создать подкаталоги.
+
+[[makeworldandnewkernel]]
+==== `make world` и новое ядро
+
+Загрузите последние исходные коды ветки -STABLE. Пересоздайте систему и ваше специализированное ядро после необходимых изменений в файле конфигурации ядра. В него надо включить <<kerneltuning,параметры ядра>>, требуемые для SAP(R) R/3(R) и Oracle(R).
+
+[[installingthelinuxenviornment]]
+=== Установка среды Linux
+
+[[installinglinuxbase-system]]
+==== Установка базовой системы Linux
+
+Сначала необходимо установить порт <<linuxemu-libs-port,linux_base>> (от имени пользователя `root`):
+
+[source,bash]
+....
+# cd /usr/ports/emulators/linux_base
+# make install distclean
+....
+
+[[installinglinuxdevelopment]]
+==== Установка среды разработки Linux
+
+Среда разработки Linux необходима, если вы хотите установить Oracle(R) в ОС FreeBSD, как описано в <<linuxemu-oracle>>:
+
+[source,bash]
+....
+# cd /usr/ports/devel/linux_devtools
+# make install distclean
+....
+
+Среда разработки Linux была установлена только для SAP(R) R/3(R) 46B IDES. Она не нужна, если сервер Oracle(R) не перекомпоновывается в системе FreeBSD. Именно так и происходит, если вы используете tar-архив (tarball) Oracle(R) с Linux-системы.
+
+[[installingnecessaryrpms]]
+==== Установка необходимых пакетов RPM
+
+Для запуска программы `R3SETUP` необходима поддержка модулей PAM. В ходе первой установки SAP(R) на ОС FreeBSD 4.3-STABLE мы попытались установить PAM со всеми необходимыми пакетами и, в конце концов, принудительно установили пакет PAM, что и сработало. Для SAP(R) R/3(R) 4.6C SR2 мы сразу принудительно установили PAM RPM, что тоже сработало, так что похоже, что пакеты, от которых декларирована зависимость, не нужны:
+
+[source,bash]
+....
+# rpm -i --ignoreos --nodeps --root /compat/linux --dbpath /var/lib/rpm \
+pam-0.68-7.i386.rpm
+....
+
+Чтобы Oracle(R) 8.0.5 мог запустить интеллектуального агента, нам также пришлось установить пакет RedHat Tcl [.filename]#tcl-8.0.5-30.i386.rpm# (иначе перекомпоновка в ходе установки Oracle(R) не выполнится). Есть и другие проблемы с перекомпоновкой Oracle(R), но это проблема Oracle(R) на Linux, не связанная с особенностями FreeBSD.
+
+[[linuxprocandfallbackelfbrand]]
+==== Дополнительные советы
+
+Может также иметь смысл добавить `linprocfs` в [.filename]#/etc/fstab#; подробнее об этом см. на странице справочника man:linprocfs[5]. Еще можно установить параметр `kern.fallback_elf_brand=3` в файле [.filename]#/etc/sysctl.conf#.
+
+[[creatingsapr3env]]
+=== Создание среды SAP(R) R/3(R)
+
+[[filesystemsandmountpoints]]
+==== Создание необходимых файловых систем и точек монтирования
+
+Для простой установки достаточно создать следующие файловые системы:
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| точка монтирования
+| размер в Гбайтах
+
+|[.filename]#/compat/linux/oracle#
+|45 GB
+
+|[.filename]#/compat/linux/sapmnt#
+|2 GB
+
+|[.filename]#/compat/linux/usr/sap#
+|2 GB
+|===
+
+Также необходимо создать несколько ссылок. В противном случае, инсталлятор SAP(R) будет выдавать сообщения об ошибках, поскольку он проверяет созданные ссылки:
+
+[source,bash]
+....
+# ln -s /compat/linux/oracle /oracle
+# ln -s /compat/linux/sapmnt /sapmnt
+# ln -s /compat/linux/usr/sap /usr/sap
+....
+
+Возможные сообщения об ошибках в ходе установки (в данном случае, для установки System _PRD_ и SAP(R) R/3(R) 4.6C SR2):
+
+[source,bash]
+....
+INFO 2002-03-19 16:45:36 R3LINKS_IND_IND SyLinkCreate:200
+ Checking existence of symbolic link /usr/sap/PRD/SYS/exe/dbg to
+ /sapmnt/PRD/exe. Creating if it does not exist...
+
+WARNING 2002-03-19 16:45:36 R3LINKS_IND_IND SyLinkCreate:400
+ Link /usr/sap/PRD/SYS/exe/dbg exists but it points to file
+ /compat/linux/sapmnt/PRD/exe instead of /sapmnt/PRD/exe. The
+ program cannot go on as long as this link exists at this
+ location. Move the link to another location.
+
+ERROR 2002-03-19 16:45:36 R3LINKS_IND_IND Ins_SetupLinks:0
+ can not setup link '/usr/sap/PRD/SYS/exe/dbg' with content
+ '/sapmnt/PRD/exe'
+....
+
+[[creatingusersanddirectories]]
+==== Создание пользователей и каталогов
+
+Для системы SAP(R) R/3(R) необходимы два пользователя и три группы. Имена пользователей зависят от идентификатора системы SAP(R) (SID), который состоит из трех букв. Некоторые из этих идентификаторов зарезервированы SAP(R) (например, `SAP` и `NIX`. Полный список см. в документации SAP(R)). Для установки IDES мы использовали `IDS`, а для установки 4.6C SR2 - `PRD`, поскольку эта система предназначалась для промышленного использования. Поэтому нам понадобились следующие группы (идентификаторы групп могут отличаться, мы просто указали наши значения, использованные при установке):
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| идентификатор группы
+| имя группы
+| описание
+
+|100
+|dba
+|Администратор базы данных
+
+|101
+|sapsys
+|Система SAP(R)
+
+|102
+|oper
+|Оператор базы данных
+|===
+
+Для стандартной установки Oracle(R) используется только группа `dba`. В качестве группы `oper` используется та же группа `dba` (подробнее об этом см. в документации Oracle(R) и SAP(R)).
+
+Нам также нужны следующие пользователи:
+
+[.informaltable]
+[cols="1,1,1,1,1,1", frame="none", options="header"]
+|===
+| идентификатор пользователя
+| имя пользователя
+| общий вид имени
+| группа
+| дополнительные группы
+| описание
+
+|1000
+|idsadm/prdadm
+|_sid_adm
+|sapsys
+|oper
+|Администратор SAP(R)
+
+|1002
+|oraids/oraprd
+|ora_sid_
+|dba
+|oper
+|Администратор Oracle(R)
+|===
+
+Добавление пользователей с помощью man:adduser[8] требует следующих параметров для "Администратора SAP(R)" (обратите внимание на командный интерпретатор и начальный каталог):
+
+[.programlisting]
+....
+Name: sidadm
+Password: ******
+Fullname: SAP Administrator SID
+Uid: 1000
+Gid: 101 (sapsys)
+Class:
+Groups: sapsys dba
+HOME: /home/sidadm
+Shell: bash (/compat/linux/bin/bash)
+....
+
+а для "Администратора Oracle(R)":
+
+[.programlisting]
+....
+Name: orasid
+Password: ******
+Fullname: Oracle Administrator SID
+Uid: 1002
+Gid: 100 (dba)
+Class:
+Groups: dba
+HOME: /oracle/sid
+Shell: bash (/compat/linux/bin/bash)
+....
+
+Для него также надо указать группу `oper`, если вы используете обе группы, `dba` и `oper`.
+
+[[creatingdirectories]]
+==== Создание каталогов
+
+Эти каталоги обычно создаются в отдельных файловых системах. Впрочем, все зависит от ваших требований. Мы решили создавать их как обычные каталоги, поскольку в любом случае они находятся на одном массиве RAID 5:
+
+Сначала мы установим владельцев и права для ряда каталогов (от имени пользователя `root`):
+
+[source,bash]
+....
+# chmod 775 /oracle
+# chmod 777 /sapmnt
+# chown root:dba /oracle
+# chown sidadm:sapsys /compat/linux/usr/sap
+# chmod 775 /compat/linux/usr/sap
+....
+
+Затем, мы создадим каталоги от имени пользователя `ora_sid_`. Все они будут размещены в каталоге [.filename]#/oracle/SID#:
+
+[source,bash]
+....
+# su - orasid
+# cd /oracle/SID
+# mkdir mirrlogA mirrlogB origlogA origlogB
+# mkdir sapdata1 sapdata2 sapdata3 sapdata4 sapdata5 sapdata6
+# mkdir saparch sapreorg
+# exit
+....
+
+Для установки Oracle(R) 8.1.7 потребуется несколько дополнительных каталогов:
+
+[source,bash]
+....
+# su - orasid
+# cd /oracle
+# mkdir 805_32
+# mkdir client stage
+# mkdir client/80x_32
+# mkdir stage/817_32
+# cd /oracle/SID
+# mkdir 817_32
+....
+
+[NOTE]
+====
+Каталог [.filename]#client/80x_32# должен иметь точно такое имя. Не заменяйте _x_ числом или другим символом.
+====
+
+На третьем шаге мы создаем каталоги от имени пользователя `_sid_adm`:
+
+[source,bash]
+....
+# su - sidadm
+# cd /usr/sap
+# mkdir SID
+# mkdir trans
+# exit
+....
+
+[[entriesinslashetcslashservices]]
+==== Записи в файле [.filename]#/etc/services#
+
+Для системы SAP(R) R/3(R) необходим ряд записей в файле [.filename]#/etc/services#, которые не будут правильно созданы при установке под FreeBSD. Пожалуйста, добавьте следующие записи (потребуются, по крайней мере, записи, соответствующие номеру экземпляра - в данном случае, `00`. Не повредит добавить все записи, от `00` до `99`, для `dp`, `gw`, `sp` и `ms`). Если вы собираетесь использовать SAProuter или вам необходим доступ к SAP(R) OSS, потребуется также запись для `99`, поскольку порт 3299 обычно используется для процесса SAProuter в целевой системе:
+
+[.programlisting]
+....
+
+sapdp00 3200/tcp # SAP Dispatcher. 3200 + Instance-Number
+sapgw00 3300/tcp # SAP Gateway. 3300 + Instance-Number
+sapsp00 3400/tcp # 3400 + Instance-Number
+sapms00 3500/tcp # 3500 + Instance-Number
+sapmsSID 3600/tcp # SAP Message Server. 3600 + Instance-Number
+sapgw00s 4800/tcp # SAP Secure Gateway 4800 + Instance-Number
+....
+
+[[necessarylocales]]
+==== Необходимые локали
+
+Системе SAP(R) нужны, по крайней мере, две локали, не входящие в стандартную установку RedHat. SAP(R) предлагает необходимые пакеты RPM для загрузки со своего FTP-сервера (который доступен только для клиентов с доступом к OSS). См. список необходимых пакетов RPM в заметке 0171356.
+
+Можно также просто создать соответствующие ссылки (например, с _de_DE_ и _en_US_), но мы не рекомендуем это для производственной системы (хотя это и сработало для системы IDES безо всяких проблем). Необходимы следующие локали:
+
+[.programlisting]
+....
+de_DE.ISO-8859-1
+en_US.ISO-8859-1
+....
+
+Создайте ссылки следующим образом:
+
+[source,bash]
+....
+# cd /compat/linux/usr/shared/locale
+# ln -s de_DE de_DE.ISO-8859-1
+# ln -s en_US en_US.ISO-8859-1
+....
+
+Если их не будет, в ходе установки возникнет ряд проблем. Если их просто проигнорировать (установив `STATUS` для соответствующих шагов равным `OK` в файле [.filename]#CENTRDB.R3S#), нельзя будет зарегистрироваться в системе SAP(R) без дополнительных усилий.
+
+[[kerneltuning]]
+==== Настройка ядра
+
+Системам SAP(R) R/3(R) надо много ресурсов. Поэтому мы добавили следующие параметры в файл конфигурации ядра:
+
+[.programlisting]
+....
+# Для пожирателей памяти (SAP и Oracle):
+options MAXDSIZ="(1024*1024*1024)"
+options DFLDSIZ="(1024*1024*1024)"
+# Необходимые опции System V.
+options SYSVSHM #совместно используемая память в стиле SYSV
+options SHMMAXPGS=262144 #макс. количество страниц совместно используемой
+#options SHMMAXPGS=393216 #use this for the 46C inst.parameters
+options SHMMNI=256 #макс. количество идентификаторов совместно используемой
+options SHMSEG=100 #макс. количество сегментов разд. памяти на процесс
+options SYSVMSG #очереди сообщений в стиле SYSV
+options MSGSEG=32767 #макс. количество сегментов сообщений в системе
+options MSGSSZ=32 #размер сегмента сообщений. ДОЛЖЕН быть степенью 2
+options MSGMNB=65535 #макс. символов на очередь сообщений
+options MSGTQL=2046 #макс. количество сообщений в системе
+options SYSVSEM #семафоры в стиле SYSV
+options SEMMNU=256 #количество структур UNDO семафоров
+options SEMMNS=1024 #количество семафоров в системе
+options SEMMNI=520 #количество идентификаторов семафоров
+options SEMUME=100 #количество ключей UNDO
+....
+
+Минимальные значения указаны в документации, поставляемой вместе с SAP(R). Поскольку описания для Linux нет, дополнительную информацию см. в разделе HP-UX (32-bit). Поскольку в системе, на которую устанавливалась версия 4.6C SR2, оперативной памяти больше, сегменты совместно используемой можно сделать больше как для SAP(R), так и для Oracle(R), поэтому задайте большее количество страниц совместно используемой памяти.
+
+[NOTE]
+====
+При стандартной установке FreeBSD на i386(TM), задайте значения `MAXDSIZ` и `DFLDSIZ` не более 1 Гбайта. В противном случае могут выдаваться странные ошибки вроде `ORA-27102: out of memory` и `Linux Error: 12: Cannot allocate memory`.
+====
+
+[[installingsapr3]]
+=== Установка SAP(R) R/3(R)
+
+[[preparingsapcdroms]]
+==== Подготовка дисков CDROM SAP(R)
+
+В ходе установки придется монтировать и демонтировать много дисков CDROM. При наличии достаточного количества приводов CDROM, можно смонтировать их все. Мы же решили скопировать содержимое дисков CDROM в соответствующие каталоги:
+
+[.programlisting]
+....
+/oracle/SID/sapreorg/имя_cd
+....
+
+где _имя_cd_ - одно из следующих [.filename]#KERNEL#, [.filename]#RDBMS#, [.filename]#EXPORT1#, [.filename]#EXPORT2#, [.filename]#EXPORT3#, [.filename]#EXPORT4#, [.filename]#EXPORT5# и [.filename]#EXPORT6# для установки 4.6B/IDES, и [.filename]#KERNEL#, [.filename]#RDBMS#, [.filename]#DISK1#, [.filename]#DISK2#, [.filename]#DISK3#, [.filename]#DISK4# и [.filename]#LANG# для установки 4.6C SR2. Все имена файлов на смонтированных дисках должны быть в верхнем регистре, в противном случае, используйте при монтировании опцию `-g`. Поэтому используйте следующие команды:
+
+[source,bash]
+....
+# mount_cd9660 -g /dev/cd0a /mnt
+# cp -R /mnt/* /oracle/SID/sapreorg/имя_cd
+# umount /mnt
+....
+
+[[runningtheinstall-script]]
+==== Запуск скрипта установки
+
+Сначала надо подготовить каталог [.filename]#install#:
+
+[source,bash]
+....
+# cd /oracle/SID/sapreorg
+# mkdir install
+# cd install
+....
+
+Затем запускается скрипт установки, который скопирует почти все необходимые файлы в каталог [.filename]#install#:
+
+[source,bash]
+....
+# /oracle/SID/sapreorg/KERNEL/UNIX/INSTTOOL.SH
+....
+
+Дистрибутив IDES (4.6B) включает полностью настроенную демонстрационную систему SAP(R) R/3(R), поэтому он включает шесть дисков EXPORT CD, а не три. В этот момент шаблон установки [.filename]#CENTRDB.R3S# предназначен для установки стандартного центрального экземпляра (R/3(R) и базы данных), а не для установки центрального экземпляра IDES, поэтому необходимо скопировать соответствующий файл [.filename]#CENTRDB.R3S# из каталога [.filename]#EXPORT1#, иначе команда `R3SETUP` запросит только три диска EXPORT CDs.
+
+Более новый релиз SAP(R) 4.6C SR2 включает четыре диска EXPORT CD. Шаги установки определяет файл параметров [.filename]#CENTRAL.R3S#. В отличие от прежних релизов, больше нет отдельных шаблонов установки для центрального экземпляра с базой данных или без нее. SAP(R) использует отдельный шаблон для установки базы данных. Для перезапуска установки в дальнейшем, однако, достаточно перезапустить исходный файл.
+
+В ходе установки и после нее SAP(R) требует, чтобы команда `hostname` возвращала только имя компьютера, не уточнённое именем домена. Поэтому либо задайте имя хоста в соответствии с этим требованием, либо настройте псевдоним с помощью команды `alias hostname='hostname -s'` для пользователей `ora_sid_` и `_sid_adm` (и для пользователя `root`, про крайней мере, в ходе шагов по установке, выполняемых от имени `root`). Можно также изменить файлы [.filename]#.profile# и [.filename]#.login# для обоих пользователей, которые создаются в ходе установки SAP(R).
+
+[[startr3setup-46B]]
+==== Запуск `R3SETUP` 4.6B
+
+Проверьте, что переменная среды `LD_LIBRARY_PATH` установлена правильно:
+
+[source,bash]
+....
+# export LD_LIBRARY_PATH=/oracle/IDS/lib:/sapmnt/IDS/exe:/oracle/805_32/lib
+....
+
+Выполните команду `R3SETUP` от имени пользователя `root` из каталога установки:
+
+[source,bash]
+....
+# cd /oracle/IDS/sapreorg/install
+# ./R3SETUP -f CENTRDB.R3S
+....
+
+Скрипт затем задает ряд вопросов (стандартные ответы даны в скобках, а затем представлены реальные ответы):
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Вопрос
+| Стандартное значение
+| Ответ
+
+|Enter SAP System ID
+|[C11]
+|IDSkbd:[Enter]
+
+|Enter SAP Instance Number
+|[00]
+|kbd:[Enter]
+
+|Enter SAPMOUNT Directory
+|[/sapmnt]
+|kbd:[Enter]
+
+|Enter name of SAP central host
+|[troubadix.domain.de]
+|kbd:[Enter]
+
+|Enter name of SAP db host
+|[troubadix]
+|kbd:[Enter]
+
+|Select character set
+|[1] (WE8DEC)
+|kbd:[Enter]
+
+|Enter Oracle server version (1) Oracle 8.0.5, (2) Oracle 8.0.6, (3) Oracle 8.1.5, (4) Oracle 8.1.6
+|
+|1kbd:[Enter]
+
+|Extract Oracle Client archive
+|[1] (Yes, extract)
+|kbd:[Enter]
+
+|Enter path to KERNEL CD
+|[/sapcd]
+|/oracle/IDS/sapreorg/KERNEL
+
+|Enter path to RDBMS CD
+|[/sapcd]
+|/oracle/IDS/sapreorg/RDBMS
+
+|Enter path to EXPORT1 CD
+|[/sapcd]
+|/oracle/IDS/sapreorg/EXPORT1
+
+|Directory to copy EXPORT1 CD
+|[/oracle/IDS/sapreorg/CD4_DIR]
+|kbd:[Enter]
+
+|Enter path to EXPORT2 CD
+|[/sapcd]
+|/oracle/IDS/sapreorg/EXPORT2
+
+|Directory to copy EXPORT2 CD
+|[/oracle/IDS/sapreorg/CD5_DIR]
+|kbd:[Enter]
+
+|Enter path to EXPORT3 CD
+|[/sapcd]
+|/oracle/IDS/sapreorg/EXPORT3
+
+|Directory to copy EXPORT3 CD
+|[/oracle/IDS/sapreorg/CD6_DIR]
+|kbd:[Enter]
+
+|Enter path to EXPORT4 CD
+|[/sapcd]
+|/oracle/IDS/sapreorg/EXPORT4
+
+|Directory to copy EXPORT4 CD
+|[/oracle/IDS/sapreorg/CD7_DIR]
+|kbd:[Enter]
+
+|Enter path to EXPORT5 CD
+|[/sapcd]
+|/oracle/IDS/sapreorg/EXPORT5
+
+|Directory to copy EXPORT5 CD
+|[/oracle/IDS/sapreorg/CD8_DIR]
+|kbd:[Enter]
+
+|Enter path to EXPORT6 CD
+|[/sapcd]
+|/oracle/IDS/sapreorg/EXPORT6
+
+|Directory to copy EXPORT6 CD
+|[/oracle/IDS/sapreorg/CD9_DIR]
+|kbd:[Enter]
+
+|Enter amount of RAM for SAP + DB
+|
+|850kbd:[Enter] (in Megabytes)
+
+|Service Entry Message Server
+|[3600]
+|kbd:[Enter]
+
+|Enter Group-ID of sapsys
+|[101]
+|kbd:[Enter]
+
+|Enter Group-ID of oper
+|[102]
+|kbd:[Enter]
+
+|Enter Group-ID of dba
+|[100]
+|kbd:[Enter]
+
+|Enter User-ID of _sid_adm
+|[1000]
+|kbd:[Enter]
+
+|Enter User-ID of ora_sid_
+|[1002]
+|kbd:[Enter]
+
+|Number of parallel procs
+|[2]
+|kbd:[Enter]
+|===
+
+Если вы не скопировали диски в разные каталоги, инсталлятор SAP(R) не сможет найти необходимые CD (идентифицируемые файлом [.filename]#LABEL.ASC# на диске) и попросит затем вставить и смонтировать CD, и подтвердить или ввести точку его монтирования.
+
+Файл [.filename]#CENTRDB.R3S# может содержать ошибки. В нашем случае, он снова запросил EXPORT4 CD, но указал корректный ключ (6_LOCATION, затем 7_LOCATION и т.д.), так что, можно просто продолжать вводить корректные значения.
+
+За исключением нескольких упомянутых ниже проблем, все должно идти нормально до момента, когда придется устанавливать программное обеспечение для работы с базой данных Oracle(R).
+
+[[startr3setup-46C]]
+==== Запуск `R3SETUP` 4.6C SR2
+
+Проверьте, что переменная среды `LD_LIBRARY_PATH` установлена правильно. Это значение отличается от использованного при установке версии 4.6B с Oracle(R) 8.0.5:
+
+[source,bash]
+....
+# export LD_LIBRARY_PATH=/sapmnt/PRD/exe:/oracle/PRD/817_32/lib
+....
+
+Выполните команду `R3SETUP` от имени пользователя `root` из каталога установки:
+
+[source,bash]
+....
+# cd /oracle/PRD/sapreorg/install
+# ./R3SETUP -f CENTRAL.R3S
+....
+
+Скрипт затем задаст ряд вопросов (стандартные значения даны в скобках, а затем идут реальные ответы):
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Вопрос
+| Стандартное значение
+| Ответ
+
+|Enter SAP System ID
+|[C11]
+|PRDkbd:[Enter]
+
+|Enter SAP Instance Number
+|[00]
+|kbd:[Enter]
+
+|Enter SAPMOUNT Directory
+|[/sapmnt]
+|kbd:[Enter]
+
+|Enter name of SAP central host
+|[majestix]
+|kbd:[Enter]
+
+|Enter Database System ID
+|[PRD]
+|PRDkbd:[Enter]
+
+|Enter name of SAP db host
+|[majestix]
+|kbd:[Enter]
+
+|Select character set
+|[1] (WE8DEC)
+|kbd:[Enter]
+
+|Enter Oracle server version (2) Oracle 8.1.7
+|
+|2kbd:[Enter]
+
+|Extract Oracle Client archive
+|[1] (Yes, extract)
+|kbd:[Enter]
+
+|Enter path to KERNEL CD
+|[/sapcd]
+|/oracle/PRD/sapreorg/KERNEL
+
+|Enter amount of RAM for SAP + DB
+|2044
+|1800kbd:[Enter] (in Megabytes)
+
+|Service Entry Message Server
+|[3600]
+|kbd:[Enter]
+
+|Enter Group-ID of sapsys
+|[100]
+|kbd:[Enter]
+
+|Enter Group-ID of oper
+|[101]
+|kbd:[Enter]
+
+|Enter Group-ID of dba
+|[102]
+|kbd:[Enter]
+
+|Enter User-ID of `oraprd`
+|[1002]
+|kbd:[Enter]
+
+|Enter User-ID of `prdadm`
+|[1000]
+|kbd:[Enter]
+
+|LDAP support
+|
+|3kbd:[Enter] (no support)
+
+|Installation step completed
+|[1] (continue)
+|kbd:[Enter]
+
+|Choose installation service
+|[1] (DB inst,file)
+|kbd:[Enter]
+|===
+
+Пока создание пользователей дает сообщение об ошибке при установке на стадиях OSUSERDBSID_IND_ORA (создание пользователя `ora_sid_`) и OSUSERSIDADM_IND_ORA (создание пользователя `_sid_adm`).
+
+За исключением некоторых упомянутых далее проблем, все должно идти нормально до момента, когда придется устанавливать программное обеспечение для работы с базой данных Oracle(R).
+
+[[installingoracle805]]
+=== Установка Oracle(R) 8.0.5
+
+Описания возможных проблем с Linux и Сервером Oracle(R) см. в соответствующих файлах SAP(R) Notes и Oracle(R) [.filename]#Readme#. Большинство, если не все проблемы, связаны с несовместимыми библиотеками.
+
+Подробнее об установке Oracle(R) см. в разделе <<linuxemu-oracle,Установка Oracle(R)>>.
+
+[[installingtheoracle805withorainst]]
+==== Установка Oracle(R) 8.0.5 с помощью `orainst`
+
+Если надо использовать Oracle(R) 8.0.5, для успешной перекомпоновки понадобится несколько дополнительных библиотек, поскольку Oracle(R) 8.0.5 был скомпонован со старой версией glibc (RedHat 6.0), но уже RedHat 6.1 использует новую библиотеку glibc. Так что, для успешной перекомпоновки нужно установить следующие дополнительные пакеты:
+
+[.filename]#compat-libs-5.2-2.i386.rpm#
+
+[.filename]#compat-glibc-5.2-2.0.7.2.i386.rpm#
+
+[.filename]#compat-egcs-5.2-1.0.3a.1.i386.rpm#
+
+[.filename]#compat-egcs-c++-5.2-1.0.3a.1.i386.rpm#
+
+[.filename]#compat-binutils-5.2-2.9.1.0.23.1.i386.rpm#
+
+Дополнительную информацию см. в файлах SAP(R) Notes или Oracle(R) [.filename]#Readme#. Если установить эти пакеты не представляется возможным (на момент установки у нас не было времени, чтобы это проверить), можно использовать исходные двоичные модули или перекомпонованные двоичные модули с исходной системы RedHat.
+
+Для компиляции интеллектуального агента должен быть установлен пакет RedHat Tcl. Если вы не можете найти пакет [.filename]#tcl-8.0.3-20.i386.rpm#, подойдет и более новый, вроде [.filename]#tcl-8.0.5-30.i386.rpm# для RedHat 6.1.
+
+За исключением перекомпоновки, установка выполняется просто:
+
+[source,bash]
+....
+# su - oraids
+# export TERM=xterm
+# export ORACLE_TERM=xterm
+# export ORACLE_HOME=/oracle/IDS
+# cd $ORACLE_HOME/orainst_sap
+# ./orainst
+....
+
+Нажимайте на всех экранах клавишу kbd:[Enter], пока программное обеспечение не будет установлено, убрав только пометку выбора с _Oracle(R) On-Line Text Viewer_, поскольку этого компонента для Linux сейчас нет. Oracle(R) затем захочет перекомпоновать модули с помощью `i386-glibc20-linux-gcc` вместо имеющихся `gcc`, `egcs` или `i386-redhat-linux-gcc`.
+
+Из-за нехватки времени мы решили использовать двоичные модули из версии Oracle(R) 8.0.5 PreProduction после того, как первая попытка заставить работать версию с RDBMS CD провалилась, - попытки найти и загрузить требуемые пакеты RPM нам показались настоящим кошмаром.
+
+[[installingtheoracle805preproduction]]
+==== Установка Oracle(R) 8.0.5 Pre-production Release для Linux (ядро 2.0.33)
+
+Эту установку выполнить очень легко. Монтируем CD, запускаем инсталлятор. Затем он запрашивает местонахождение начального каталога Oracle(R) и копирует туда двоичные модули. Мы, однако, не удаляли остатки прежних попыток установить RDBMS.
+
+В конечном итоге, базу данных Oracle(R) удалось запустить без проблем.
+
+[[installingoracle817]]
+=== Установка tar-архива Oracle(R) 8.1.7 для Linux
+
+Создайте tar-архив [.filename]#oracle81732.tgz# каталога установки на Linux-системе и разархивируйте его в каталог [.filename]#/oracle/SID/817_32/#.
+
+[[continuewithsapr4installation]]
+=== Продолжение установки SAP(R) R/3(R)
+
+Сначала проверьте настройку среды для пользователей `idsamd` (_sid_adm) и `oraids` (ora_sid_). У них обоих должны теперь быть файлы [.filename]#.profile#, [.filename]#.login# и [.filename]#.cshrc#, использующие `hostname`. Если имя хоста в системе полностью уточнено, надо заменить `hostname` командой `hostname -s` во всех трех файлах.
+
+[[databaseload]]
+==== Загрузка базы данных
+
+Потом команду `R3SETUP` можно либо перезапустить, либо продолжить (в зависимости от того, была ли завершена ее работа). `R3SETUP` затем создает табличные пространства и загружает данные (для 46B IDES - с дисков от EXPORT1 до EXPORT6, для 46C - с дисков от DISK1 до DISK4) в базу данных с помощью утилиты `R3load`.
+
+После завершения загрузки базы данных (это может занять несколько часов), будет запрошено несколько паролей. Для тестовых установок можно использовать хорошо известные стандартные пароли (но если защита важна - используйте другие!):
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Вопрос
+| Ответ
+
+|Enter Password for sapr3
+|sapkbd:[Enter]
+
+|Confirum Password for sapr3
+|sapkbd:[Enter]
+
+|Enter Password for sys
+|change_on_installkbd:[Enter]
+
+|Confirm Password for sys
+|change_on_installkbd:[Enter]
+
+|Enter Password for system
+|managerkbd:[Enter]
+
+|Confirm Password for system
+|managerkbd:[Enter]
+|===
+
+Мы столкнулись с несколькими проблемами с `dipgntab` при установке 4.6B.
+
+[[listener]]
+==== Процесс прослушивания
+
+Запустите процесс прослушивания (Oracle(R) Listener) от имени пользователя `ora_sid_` следующим образом:
+
+[source,bash]
+....
+% umask 0; lsnrctl start
+....
+
+В противном случае, вы можете получить сообщение об ошибке ORA-12546, поскольку у сокетов будут неправильные права доступа. См. SAP(R) Note 072984.
+
+[[mnlstables]]
+==== Обновление таблиц MNLS
+
+Если вы планируете использовать в системе SAP(R) языки, для которых не подходит кодировка Latin-1, придется изменить таблицы Multi National Language Support. Эта процедура описана в SAP(R) OSS Notes 15023 и 45619. Если же нет, можете пропустить этот вопрос в ходе установки SAP(R).
+
+[NOTE]
+====
+Если вам не нужна поддержка MNLS, все равно необходимо проверить таблицу TCPDB и инициализировать ее, если это еще не было сделано. Дополнительную информацию см. в SAP(R) Note 0015023 и 0045619.
+====
+
+[[postinstallationsteps]]
+=== Шаги после установки
+
+[[requestsapr3licensekey]]
+==== Запрос лицензионного ключа SAP(R) R/3(R)
+
+Вы должны запросить ваш лицензионный ключ SAP(R) R/3(R). Это необходимо, поскольку временная лицензия, использованная в ходе установки, действительна только четыре недели. Сначала получите ключ оборудования. Зарегистрируйтесь как пользователь `idsadm` и вызовите команду `saplicense`:
+
+[source,bash]
+....
+# /sapmnt/IDS/exe/saplicense -get
+....
+
+При вызове команды `saplicense` без параметров будет выдан список опций. После получения лицензионного ключа, его можно установить с помощью команды:
+
+[source,bash]
+....
+# /sapmnt/IDS/exe/saplicense -install
+....
+
+Затем вас попросят ввести следующие значения:
+
+[.programlisting]
+....
+SAP SYSTEM ID = SID, 3 символа
+CUSTOMER KEY = ключ оборудования, 11 символов
+INSTALLATION NO = установка, 10 цифр
+EXPIRATION DATE = yyyymmdd, обычно - "99991231"
+LICENSE KEY = лицензионный ключ, 24 символа
+....
+
+[[creatingusers]]
+==== Создание пользователей
+
+Создайте пользователя в клиенте 000 (некоторые задачи обязательно надо выполнять из клиента 000, от имени пользователя, отличающегося от `sap*` и `ddic`). В качестве имени пользователя мы обычно выбираем `wartung` (или `service`, по английски). Требуются профили `sap_new` и `sap_all`. Для дополнительной защиты надо изменить пароли стандартных пользователей на всех клиентах (в том числе, пользователей `sap*` и `ddic`).
+
+[[configtranssysprofileopermodesetc]]
+==== Конфигурирование системы передачи, профиля, режимов работы и т.п.
+
+В клиенте 000, от имени пользователя, отличающегося от `ddic` и `sap*`, выполните, как минимум, следующее:
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Задача
+| Транзакция
+
+|Сконфигурируйте систему передачи, например, как _Stand-Alone Transport Domain Entity_
+|STMS
+
+|Создайте/Отредактируйте профиль для системы
+|RZ10
+
+|Сконфигурируйте режимы работы и экземпляры
+|RZ04
+|===
+
+Эти и другие шаги, которые надо выполнить после установки, подробно описаны в руководствах по установке SAP(R).
+
+[[editintsidsap]]
+==== Редактирование [.filename]#initsid.sap# ([.filename]#initIDS.sap#)
+
+Файл [.filename]#/oracle/IDS/dbs/initIDS.sap# содержит профиль резервного копирования SAP(R). Здесь надо задать размер используемой ленты, тип сжатия и т.д. Чтобы можно было использовать `sapdba` / `brbackup`, мы изменили следующие значения:
+
+[.programlisting]
+....
+compress = hardware
+archive_function = copy_delete_save
+cpio_flags = "-ov --format=newc --block-size=128 --quiet"
+cpio_in_flags = "-iuv --block-size=128 --quiet"
+tape_size = 38000M
+tape_address = /dev/nsa0
+tape_address_rew = /dev/sa0
+....
+
+Объяснения:
+
+`compress`: мы использовали ленту HP DLT1, которая поддерживает аппаратное сжатие.
+
+`archive_function`: этот параметр задает стандартное поведение для сохранения архивных журналов Oracle(R): новые журнальные файлы сохраняются на ленту, уже сохраненные файлы журнала сохраняются еще раз, а затем удаляются. Это предотвращает многочисленные проблемы, если потребуется восстановить базу данных, а одна из архивных лент окажется сбойной.
+
+`cpio_flags`: по умолчанию используется `-B`, что устанавливает размер блока 5120 байт. Для лент DLT компания HP рекомендует размер блока не меньше 32 Кбайт, поэтому мы использовали значение `--block-size=128` для задания размера блока 64 Кбайта. Опция `--format=newc` необходима, поскольку у нас есть индексные дескрипторы (inodes) с номерами больше 65535. Последняя опция, `--quiet` необходима потому, что иначе команда `brbackup` выдает сообщение об ошибке, как только команда `cpio` выдаст количество сохраненных блоков.
+
+`cpio_in_flags`: флаги, необходимые для загрузки данных с ленты. Формат распознается автоматически.
+
+`tape_size`: обычно этот параметр задает реальную ёмкость ленты. Из соображений надежности (мы используем аппаратное сжатие), задано значение несколько меньше фактического.
+
+`tape_address`: устройство без перемотки для использования в команде `cpio`.
+
+`tape_address_rew`: устройство с перемоткой для использования в команде `cpio`.
+
+==== Проблемы конфигурирования после установки
+
+Следующие параметры SAP(R) надо настроить после установки (примеры для IDES 46B, 1 Гбайт памяти):
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Имя
+| Значение
+
+|ztta/roll_extension
+|250000000
+
+|abap/heap_area_dia
+|300000000
+
+|abap/heap_area_nondia
+|400000000
+
+|em/initial_size_MB
+|256
+
+|em/blocksize_kB
+|1024
+
+|ipc/shm_psize_40
+|70000000
+|===
+
+SAP(R) Note 0013026:
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Имя
+| Значение
+
+|ztta/dynpro_area
+|2500000
+|===
+
+SAP(R) Note 0157246:
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Имя
+| Значение
+
+|rdisp/ROLL_MAXFS
+|16000
+
+|rdisp/PG_MAXFS
+|30000
+|===
+
+[NOTE]
+====
+При указанных выше параметрах в системе с 1 Гбайт памяти можно обнаружить примерно следующее использование памяти:
+
+[.programlisting]
+....
+Mem: 547M Active, 305M Inact, 109M Wired, 40M Cache, 112M Buf, 3492K Free
+....
+
+====
+
+[[problemsduringinstallation]]
+=== Проблемы в ходе установки
+
+[[restartr3setup]]
+==== Перезапуск `R3SETUP` после устранения проблемы
+
+`R3SETUP` останавливается при выявлении ошибки. Если вы просмотрели соответствующие журнальные файлы и исправили ошибку, придется запускать `R3SETUP` снова, обычно выбирая REPEAT как опцию для последнего шага, на котором команда `R3SETUP` выдала сообщение об ошибке.
+
+Для перезапуска команды `R3SETUP` просто запустите её с соответствующим файлом [.filename]#R3S#:
+
+[source,bash]
+....
+# ./R3SETUP -f CENTRDB.R3S
+....
+
+для 4.6B или с файлом
+
+[source,bash]
+....
+# ./R3SETUP -f CENTRAL.R3S
+....
+
+для 4.6C, независимо от того, произошла ли ошибка при работе с файлом [.filename]#CENTRAL.R3S# или [.filename]#DATABASE.R3S#.
+
+[NOTE]
+====
+На некоторых стадиях команда `R3SETUP` предполагает, что запущены и работают процессы как сервера базы данных, так и SAP(R) (поскольку эти шаги уже выполнены). Если возникнут ошибки и, например, запустить сервер базы данных не получится, придется вручную запускать сервер базы данных и SAP(R) после исправления ошибок и до повторного запуска `R3SETUP`.
+
+Не забудьте также снова запустить процесс прослушивания Oracle(R) (как пользователь `ora_sid_` с помощью команды `umask 0; lsnrctl start`), если он тоже был остановлен (например, из-за необходимой перезагрузки системы).
+====
+
+[[indoraduringduringr3setup]]
+==== OSUSERSIDADM_IND_ORA в ходе `R3SETUP`
+
+Если `R3SETUP` выдает сообщения об ошибках на этом этапе, отредактируйте используемый при этом файл шаблона `R3SETUP` ([.filename]#CENTRDB.R3S# (4.6B), либо [.filename]#CENTRAL.R3S# или [.filename]#DATABASE.R3S# (4.6C)). Найдите раздел `[OSUSERSIDADM_IND_ORA]` или поищите единственную запись `STATUS=ERROR` и отредактируйте следующие значения:
+
+[.programlisting]
+....
+HOME=/home/sidadm (было пусто)
+STATUS=OK (был статус ERROR)
+....
+
+Затем надо снова перезапустить `R3SETUP`.
+
+[[indoraduringr3setup]]
+==== OSUSERDBSID_IND_ORA в ходе `R3SETUP`
+
+Возможно, команда `R3SETUP` также выдаст сообщения об ошибке на этой стадии. Ошибка здесь аналогична возникающей на стадии OSUSERSIDADM_IND_ORA. Просто отредактируйте используемый файл шаблона `R3SETUP` ([.filename]#CENTRDB.R3S# (4.6B), либо [.filename]#CENTRAL.R3S# или [.filename]#DATABASE.R3S# (4.6C)). Найдите раздел `[OSUSERDBSID_IND_ORA]` или поищите единственную запись `STATUS=ERROR` и отредактируйте следующее значение в этом разделе:
+
+[.programlisting]
+....
+STATUS=OK
+....
+
+Затем перезапустите `R3SETUP`.
+
+[[oraviewvrffilenotfound]]
+==== `oraview.vrf FILE NOT FOUND` в ходе установки Oracle(R)
+
+Вы не сняли выбор с _Oracle(R) On-Line Text Viewer_ перед началом установки. Он помечен для установки, хотя этот продукт и не доступен сейчас для Linux. Снимите пометку с этого продукта в меню установки Oracle(R) и перезапустите установку.
+
+[[textenvincalid]]
+==== `TEXTENV_INVALID` в ходе `R3SETUP`, RFC или запуска SAPgui
+
+Если возникает эта ошибка, не найдена нужная локаль. SAP(R) Note 0171356 перечисляет необходимые пакеты RPM, которые надо установить (например, [.filename]#saplocales-1.0-3#, [.filename]#saposcheck-1.0-1# для RedHat 6.1). Если игнорировать все ошибки и менять `STATUS` соответствующих шагов с `ERROR` на `OK` (в файле [.filename]#CENTRDB.R3S#) каждый раз, когда `R3SETUP` сообщает об ошибке и просто перезапуск ать `R3SETUP`, система SAP(R) не будет правильно сконфигурирована, и вы затем не сможете подключиться к системе с помощью SAPgui, хотя запустить систему и получится. Попытка подключения с помощью старой Linux-версии SAPgui приведет к выдаче следующих сообщений:
+
+[.programlisting]
+....
+Sat May 5 14:23:14 2001
+*** ERROR => no valid userarea given [trgmsgo. 0401]
+Sat May 5 14:23:22 2001
+*** ERROR => ERROR NR 24 occured [trgmsgi. 0410]
+*** ERROR => Error when generating text environment. [trgmsgi. 0435]
+*** ERROR => function failed [trgmsgi. 0447]
+*** ERROR => no socket operation allowed [trxio.c 3363]
+Speicherzugriffsfehler
+....
+
+Это связано с тем, что система SAP(R) R/3(R) не может корректно назначить локаль и сама не была надлежащим образом сконфигурирована (не хватает записей в некоторых таблицах базы данных). Чтобы можно было подключиться к SAP(R), добавьте следующие записи в файл [.filename]#DEFAULT.PFL# (см. Note 0043288):
+
+[.programlisting]
+....
+abap/set_etct_env_at_new_mode = 0
+install/collate/active = 0
+rscp/TCP0B = TCP0B
+....
+
+Перезапустите систему SAP(R). Теперь вы можете подключиться к системе, хотя специфические для страны языковые установки могут работать не так, как предполагалось. После исправления настроек страны (и добавления соответствующих локалей) эти записи можно удалить из файла [.filename]#DEFAULT.PFL# и перезапустить систему SAP(R).
+
+[[ora-00001]]
+==== ORA-00001
+
+Эта ошибка возникает только с Oracle(R) 8.1.7 на FreeBSD. Причина в том, что сервер Oracle(R) не может правильно проинициализироваться и аварийно завершает работу, оставляя не освобожденными в системе семафоры и совместно используемую память. При следующей попытке запустить сервер базы данных выдается ошибка ORA-00001.
+
+Найдите оставшиеся семафоры и сегменты памяти с помощью команды `ipcs -a` и удалите с помощью `ipcrm`.
+
+[[ora-00445pmon]]
+==== ORA-00445 (фоновый процесс PMON не запущен)
+
+Эта ошибка произошла с Oracle(R) 8.1.7. Она выдается, если сервер был запущен с помощью обычного скрипта `startsap` (например, `startsap_majestix_00`) от имени пользователя `prdadm`.
+
+Возможный способ обхода - запускать сервер базы данных от имени пользователя `oraprd` с помощью `svrmgrl`:
+
+[source,bash]
+....
+% svrmgrl
+SVRMGR> connect internal;
+SVRMGR> startup;
+SVRMGR> exit
+....
+
+[[ora-12546]]
+==== ORA-12546 (запускайте процесс прослушивания с правильными правами)
+
+Запускайте процесс прослушивания Oracle(R) от имени пользователя `oraids` следующими командами:
+
+[source,bash]
+....
+# umask 0; lsnrctl start
+....
+
+В противном случае, вы можете получить сообщение об ошибке ORA-12546, поскольку сокеты не будут иметь нужных прав доступа. См. SAP(R) Note 0072984.
+
+[[ora-27102]]
+==== ORA-27102 (не хватает памяти)
+
+Эта ошибка произошла при попытке использовать значения `MAXDSIZ` и `DFLDSIZ` больше 1 Гбайта (1024x1024x1024). Кроме того, мы получили `Linux Error 12: Cannot allocate memory`.
+
+[[dipgntabindind]]
+==== [DIPGNTAB_IND_IND] в ходе `R3SETUP`
+
+В общем случае, см. SAP(R) Note 0130581 (прекращается работа `R3SETUP` на шаге `DIPGNTAB`). В ходе установки IDES-версии по каким-то причинам процесс установки использовал вместо правильного имени системы SAP(R), "IDS", пустую строку, `""`. Это приводит к небольшим проблемам при доступе к каталогам, поскольку пути генерируются динамически на базе _SID_ (в данном случае, IDS). Поэтому вместо обращения к:
+
+[.programlisting]
+....
+/usr/sap/IDS/SYS/...
+/usr/sap/IDS/DVMGS00
+....
+
+используются следующие пути:
+
+[.programlisting]
+....
+/usr/sap//SYS/...
+/usr/sap/D00
+....
+
+Чтобы продолжить установку мы создали ссылку и дополнительный каталог:
+
+[source,bash]
+....
+# pwd
+/compat/linux/usr/sap
+# ls -l
+total 4
+drwxr-xr-x 3 idsadm sapsys 512 May 5 11:20 D00
+drwxr-x--x 5 idsadm sapsys 512 May 5 11:35 IDS
+lrwxr-xr-x 1 root sapsys 7 May 5 11:35 SYS -> IDS/SYS
+drwxrwxr-x 2 idsadm sapsys 512 May 5 13:00 tmp
+drwxrwxr-x 11 idsadm sapsys 512 May 4 14:20 trans
+....
+
+Мы также нашли документы SAP(R) Notes (0029227 и 0008401), описывающие это поведение. Мы не столкнулись с подобными проблемами при установке SAP(R) 4.6C.
+
+[[rfcrswboiniindind]]
+==== [RFCRSWBOINI_IND_IND] в ходе `R3SETUP`
+
+В ходе установки SAP(R) 4.6C, эта ошибка возникла в результате другой ошибки, произошедшей ранее по ходу установки. В данном случае придется просмотреть соответствующие журнальные файлы и устранить исходную проблему.
+
+Если после просмотра журнальных файлов выявлена только эта ошибка (проверьте SAP(R) Notes), можно поменять `STATUS` соответствующего шага с `ERROR` на `OK` (в файле [.filename]#CENTRDB.R3S#) и перезапустить `R3SETUP`. После установки надо выполнить отчет `RSWBOINS` из транзакции SE38. Дополнительную информацию о стадиях `RFCRSWBOINI` и `RFCRADDBDIF` см. в SAP(R) Note 0162266.
+
+[[rfcraddbdifindind]]
+==== [RFCRADDBDIF_IND_IND] в ходе `R3SETUP`
+
+Здесь применяются те же ограничения: проверьте путем просмотра журнальных файлов, что эта ошибка не вызвана какими-то предыдущими проблемами.
+
+Если подтверждается, что применим документ SAP(R) Note 0162266, просто поменяйте `STATUS` соответствующего шага с `ERROR` на `OK` (в файле [.filename]#CENTRDB.R3S#) и перезапустите `R3SETUP`. После установки надо выполнить отчет `RADDBDIF` из транзакции SE38.
+
+[[sigactionsig31]]
+==== sigaction sig31: File size limit exceeded
+
+Это сообщение об ошибке выдается в ходе запуска процессов SAP(R)_disp+work_. Если SAP(R) запускается скриптом `startsap`, запускаются отдельные подпроцессы, выполняющие грязную работу по запуску всех остальных процессов SAP(R). В результате, сам скрипт не получит уведомления, если что-то пойдет не так.
+
+Чтобы проверить, нормально ли запустились процессы SAP(R), посмотрите на состояние процессов с помощью команды `ps ax | grep _SID_`, которая выдаст список всех процессов Oracle(R) и SAP(R). Если похоже, что некоторых процессов не хватает или вы не можете подключиться к системе SAP(R), просмотрите соответствующие журнальные файлы, которые можно найти в каталоге [.filename]#/usr/sap/SID/DVEBMGSnr/work/#. Надо просматривать файлы [.filename]#dev_ms# и [.filename]#dev_disp#.
+
+Сигнал 31 выдается, если объем памяти, совместно используемой Oracle(R) и SAP(R), превосходит заданный в файле конфигурации ядра, и от него можно избавиться, указав большее значение:
+
+[.programlisting]
+....
+# большее значение для производственных систем 46C:
+options SHMMAXPGS=393216
+# меньшее значение, достаточное для 46B:
+#options SHMMAXPGS=262144
+....
+
+[[saposcolfails]]
+==== Сбой при запуске `saposcol`
+
+Есть ряд проблем с программой `saposcol` (версии 4.6D). Система SAP(R) использует `saposcol` для сбора данных о производительности системы. Эта программа не нужна для использования системы SAP(R), так что проблему можно отнести к несерьезным. Более старые версии (4.6B) работают, но собирают не все данные (многие вызовы просто возвращают 0, например, для использования процессора).
+
+[[linuxemu-advanced]]
+== Дополнительные сведения
+
+Если вы интересуетесь, как обеспечивается двоичная совместимость с Linux, этот раздел для вас. Большинство материала взято из электронного письма, адресованного Terry Lambert mailto:tlambert@primenet.com[tlambert@primenet.com] в {freebsd-chat} (ID письма: `<199906020108.SAA07001@usr09.primenet.com>`).
+
+=== Как все это устроено?
+
+FreeBSD поддерживает абстракцию, называемую "загрузчик выполняемых классов". Фактически, он является первой стадией системного вызова man:execve[2].
+
+На самом деле, FreeBSD имеет список загрузчиков вместо одного, завершающийся загрузчиком `#!` для запуска любых командных интерпретаторов и скриптов.
+
+Исторически сложилось, что единственный загрузчик в UNIX(R) системах проверял "магическое число" (чаще всего первые 4 или 8 байт файла), чтобы определить, известен ли формат двоичного файла системе, и если да, то вызвал соответствующий загрузчик.
+
+Если файл не опознавался системой как двоичный, системный вызов man:execve[2] возвращал ошибку, и текущий командный интерпретатор начинал выполнять файл как скрипт.
+
+По умолчанию скрипт выполнялся "текущим командным интерпретатором".
+
+Позднее, man:sh[1] был модифицирован, так, чтобы проверять первые два символа в файле, и если они оказывались `:\n`, то файл выполнялся как сценарий для man:csh[1] (утверждается, что SCO были первыми, кто сделал эту модификацию).
+
+FreeBSD сейчас ведет себя по-другому: пробегает по списку загрузчиков,включающему специальный загрузчик `#!`, который вызывает нужный интерпретатор, указанный после этих символов до следующего пробела, или [.filename]##/bin/sh##, если не нашел подходящего.
+
+Для поддержки Linux ABI FreeBSD ищет магическое число, соответствующее двоичному файлу ELF (на этой стадии не различаются FreeBSD, Solaris(TM), Linux или любая другая ОС поддерживающая формат ELF).
+
+Далее, ELF-загрузчик определяет "марку" (brand) двоичного файла ELF (специальный комментарий в ELF-файле, отсутствующий в двоичных файлах ELF SVR4/Solaris(TM)).
+
+Соответственно, Linux программы должны быть "маркированы" для `Linux` (например, с помощью утилиты man:brandelf[1]):
+
+[source,bash]
+....
+# brandelf -t Linux file
+....
+
+Когда это сделано, загрузчик ELF выявит марку `Linux` в файле.
+
+Когда ELF-загрузчик находит "марку" `Linux`, он заменяет соответствующий указатель в структуре `proc`. Все системные вызовы индексируются через этот указатель (в традиционной UNIX(R) системе это массив структур `sysent[]`, содержащий системные вызовы). Кроме того, процесс помечается для специальной обработки вектора обработчиков сигналов, а также ряда других (небольших) исправлений, которые осуществляются специальным модулем ядра для поддержки Linux.
+
+Вектор системных вызовов Linux содержит, среди прочего, список записей `sysent[]`, адреса которых находятся в модуле ядра.
+
+При выполнении системного вызова из двоичного файла Linux, код обработчика разыменовывает указатель на функцию системного вызова из структуры `proc`, и получает точки входа системных вызовов Linux, а не FreeBSD.
+
+Плюс ко всему, в Linux-режиме динамически "изменяется корень" файловой системы при поиске файлов; фактически так же, как и параметр `union` при монтировании файловых систем (не путать с `unionfs`!). Сперва, файл ищется в каталоге [.filename]#/compat/linux/исходное_полное_имя# и только затем, в случае неудачи, в [.filename]#/исходное_полное_имя#. Это гарантирует, что программы, которым требуются другие программы, смогут работать (например, весь набор инструментальных средств Linux сможет работать в среде поддержки Linux ABI). Это также дает возможность Linux программам выполнять FreeBSD команды, если не найдется соответствующих Linux команд. Например, можно скопировать FreeBSD man:uname[1] в дерево каталогов [.filename]#/compat/linux#, и Linux-программы не смогут разобраться, что они работают не в Linux.
+
+Фактически, имеется ядро Linux в ядре FreeBSD; различные базовые функции, реализующие все услуги ядра, идентичны как в записях таблицы системных вызовов FreeBSD, так и в записях таблицы системных вызовов Linux: операции с файловой системой, виртуальная память, средства доставки сигналов, System V IPC ... Единственное отличие в том, что FreeBSD-программы получают _интерфейсные_ функции FreeBSD, а Linux-программы получают _интерфейсные_ функции Linux (в большинстве более старых ОС есть только их собственные интерфейсные функции: функции берутся из статического глобального массива структур `sysent[]`, а не из массива, полученного разыменованием динамически проинициализированного указателя в структуре `proc` процесса, выполняющего вызов).
+
+Какая же реализация ABI для FreeBSD "родная"? Это не имеет значения. Единственное различие (на данный момент, в будущем все может и, вероятно, изменится), пожалуй, в том, что функции системных вызовов FreeBSD зашиты в ядро, а для Linux они могут быть либо статически скомпонованы в ядро, либо получаться через модуль ядра.
+
+Да, но можно ли назвать это эмуляцией? Нет. Это реализация ABI, а не эмуляция. Как таковой, эмулятор (или симулятор) отсутствует.
+
+В таком случае, почему же иногда говорят об "эмуляции Linux"? Чтобы "насолить" FreeBSD! Фактически, причина в том, что на момент первой реализации не существовало слова, которое бы точнее описывало этот процесс. Нельзя было сказать, что FreeBSD запускает приложения Linux (без перекомпиляции или загрузки соответствующего модуля ядра это невозможно). Но надо было как-то описать, что загружается - отсюда и "эмулятор Linux".
diff --git a/documentation/content/ru/books/handbook/mac/_index.adoc b/documentation/content/ru/books/handbook/mac/_index.adoc
new file mode 100644
index 0000000000..714a5272e4
--- /dev/null
+++ b/documentation/content/ru/books/handbook/mac/_index.adoc
@@ -0,0 +1,1126 @@
+---
+title: Глава 15. Принудительный контроль доступа (MAC)
+part: Часть III. Системное администрирование
+prev: books/handbook/security
+next: books/handbook/audit
+---
+
+[[mac]]
+= Принудительный контроль доступа (MAC)
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 15
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/mac/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/mac/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/mac/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[mac-synopsis]]
+== Краткий обзор
+
+FreeBSD 5.X представляет новые расширения системы безопасности от проекта TrustedBSD, основанные на документах POSIX(R).1e. Два из наиболее важных нововведений в механизмах безопасности это списки контроля доступа файловой системы (Access Control Lists, ACLs) и принудительный контроль доступа Mandatory Access Control, MAC). Инфраструктура позволяет загружать новые модули контроля доступа, реализуя новые политики безопасности. Некоторые из них предоставляют защиту ключевых подсистем, защищая определенный сервис, в то время как другие предоставляют исчерпывающую систему безопасности с метками на всех субъектах и объектах. Контроль называется принудительным, поскольку применение контроля производится администраторами и системой, и не зависит от решения пользователей, как это происходит при обычном контроле доступа (Discretionary Access Control, DAC, стандартные файловые и System V IPC права в FreeBSD).
+
+Вся эта глава фокусируется на инфраструктуре принудительного контроля доступа и настройке подключаемых модулей, реализующих различные политики безопасности.
+
+После прочтения этой главы вы узнаете:
+
+* Какие модули MAC включены в настоящее время в FreeBSD, какие политики с ними связаны.
+* Что способны реализовать политики MAC, различие между политиками с метками (label) и без меток.
+* Как эффективно настроить систему для использования инфраструктуры MAC.
+* Как настроить различные политики, используемые модулями MAC.
+* Как реализовать более защищенную среду, используя инфраструктуру MAC и приведенные примеры.
+* Как протестировать настройку MAC, чтобы убедиться, что инфраструктура была реализована правильно.
+
+Перед прочтением этой главы вам потребуется:
+
+* Понимание основ UNIX(R) и FreeBSD (crossref:basics[basics, Основы UNIX]).
+* Ознакомиться с основами настройки/компилирования ядра (crossref:kernelconfig[kernelconfig, Настройка ядра FreeBSD]).
+* Иметь некоторые понятия о безопасности и как она относится к FreeBSD (crossref:security[security, Безопасность]).
+
+[WARNING]
+====
+
+Неправильное использование информации этой главы может вызвать потерю доступа к системе, проблемы у пользователей, или невозможность запуска XFree86(TM). Что более важно, MAC не должен восприниматься как полная защита системы. Инфраструктура MAC лишь усиливает имеющуюся систему безопасности: без применения методов защиты и регулярных проверок, система никогда не станет полностью защищенной.
+
+Необходимо также учесть, что примеры, приведенные в этой главе, это всего лишь примеры. Не рекомендуется дублирование этих настроек для реальных задач. Реализация политик безопасности требует вдумчивого планирования. Тот, кто не понял полностью как все это на самом деле работает, может столкнуться с необходимостью повторной полной перенастройки системы безопасности для многих файлов и каталогов.
+====
+
+=== Что не будет затронуто
+
+В этой главе охвачен широкий спектр вопросов безопасности, относящихся к инфраструктуре MAC. однако разработка политик MAC не будет затронута. Несколько модулей, включенных в инфраструктуру MAC, имеют особые характеристики, которые предназначены для тестирования и разработки новых модулей. Это относится к модулям/политикам man:mac_test[4], man:mac_stub[4] и man:mac_none[4]. За дальнейшей информацией по этим модулям и различным предоставляемым ими механизмам, обратитесь к соответствующим страницам справочника.
+
+[[mac-inline-glossary]]
+== Ключевые термины этой главы
+
+Перед чтением этой главы необходимо ознакомиться с некоторыми ключевыми терминами. Это возможно разрешит возникающие вопросы и предотвратит перегрузку материала новыми терминами и информацией.
+
+* _отдел_ (compartment): Отдел это набор программ и данных, которые необходимо отделить, и где пользователи получают явный доступ к отдельным компонентам системы. Отдел представляет группирование, например рабочую группу, департамент, проект или тему. С использованием отделов возможна реализация политики с явно определенным доступом.
+* _целостность_ (integrity): Целостность, как ключевая концепция, это уровень доверия, который может быть присвоен данным. Поскольку целостность данных повышается, это дает возможность доверять данным.
+* _метка_ (label): Метка является инструментом безопасности, она может быть применена к файлам, каталогам и другим сущностям системы. Ее можно представить как штамп конфиденциальности; метка, помещенная на файл, описывает уровень секретности данного файла и разрешит доступ только файлам, пользователям, ресурсам и т.д. с теми же или меньшими установками безопасности. Некоторые из политик могут обрабатывать метки различными способами; это будет обсуждаться в разделе политик ниже.
+* _multilabel_ (множественные метки): свойство `multilabel` это параметр файловой системы, который может быть установлен в однопользовательском режиме с помощью утилиты man:tunefs[8], во время загрузки через файл man:fstab[5], или при создании новой файловой системы. Этот параметр позволяет администратору помещать различные метки MAC на различные объекты. разрешает помещение множественных MAC меток на файлы и каталоги файловой системы. Этот параметр применим только к политикам с метками.
+* _объект_ (object): Объект или системный объект это сущность, через которую информация проходит к _субъекту_. Это могут быть каталоги, файлы, поля, экраны, клавиатуры, память, магнитные накопители, принтеры или любые другие устройства хранения/перемещения данных. В сущности это контейнер данных или ресурс системы; доступ к _объекту_ фактически означает доступ к данным.
+* _политика_ (policy): Набор правил, определяющих как достичь объекта. _Политика_ обычно документирует обращение с определенными элементами. В этой главе _политика_ будет означать _политику безопасности_; т.е. коллекцию правил, которые будут контролировать поток данных и определять кто будет иметь доступ к этим данным.
++
+* _чувствительность_ (sensitivity): Обычно используется при обсуждении MLS. Уровень чувствительности это термин, используемый для описания того, насколько важны или секретны данные. Увеличение уровня чувствительности означает важность данных.
+* _одиночная метка_ (single label): означает, что вся файловая система использует одну метку для определения доступа всего потока данных. Когда файловая система использует эту установку, что происходит всегда, если не установлен параметр `multilabel`, ко всем файлам будет применяться одна и та же установка метки.
+* _субъект_ (subject): субъект это любая активная сущность, вызывающая перемещение информации между _объектами_; т.е. пользователь, пользовательский обработчик, системный процесс и т.д. В FreeBSD это почти всегда поток, работающий в процессе или представляющий пользователя.
+
+[[mac-initial]]
+== Описание MAC
+
+Усвоив все эти термины, рассмотрим как MAC повышает безопасность системы в целом. Различные политики, предоставляемые инфраструктурой MAC, могут быть использованы для защиты сети и файловых систем, блокирования доступа пользователей к определенным портам и сокетам, и так далее. Возможно, наилучшее использование политик это сочетание их вместе путем загрузки нескольких модулей одновременно, для создания многослойной защищенной среды. В многослойной среде безопасности несколько политик обеспечивают контролируемость защиты. Это отличается от усиления защиты, когда обычно усиливаются элементы системы, используемой в определенных целях. Единственным недостатком является дополнительная административная нагрузка в случае множественных меток файловой системы, установки сетевого доступа по пользователям, и т.д.
+
+Эти недостатки минимальны по сравнению с длительным эффектом функционирования инфраструктуры; например, возможность выбора политик, необходимых для определенных конфигураций, уменьшает потерю производительности. Возможность удаления поддержки не используемых политик может увеличить общую производительность системы, а также дает гибкость выбора. Хорошая реализация удовлетворит общие требования безопасности и будет эффективно использовать различные политики, предоставляемые инфраструктурой.
+
+Система, использующая возможности MAC, должна как минимум гарантировать, что пользователю не разрешается самостоятельно изменять атрибуты безопасности; все утилиты пользователя, программы и скрипты должны работать с ограничениями доступа, налагаемыми выбранной политикой; весь контроль правил доступа MAC находится в руках системного администратора.
+
+Право выбора правильных политик безопасности принадлежит только системному администратору. В некоторых случаях может потребоваться ограничение доступа через сеть; для этого могут пригодиться man:mac_portacl[4], man:mac_ifoff[4] и даже man:mac_biba[4]. В других случаях может быть необходима строгая конфиденциальность объектов в файловой системе. Для этого существуют политики man:mac_bsdextended[4] и man:mac_mls[4].
+
+Выбор политики может быть сделан на основе конфигурации сети. Возможно только определенным пользователям можно разрешить доступ через man:ssh[1] к сети или интернет. В таких ситуациях подойдет политика man:mac_portacl[4]. Но что необходимо сделать для файловых систем? Должен ли доступ к определенным каталогам быть запрещен для других групп или определенных пользователей? Или мы должны ограничить доступ пользователей или утилит к определенным файлам путем классификации определенных объектов?
+
+В случае файловой системы, доступ может считаться конфиденциальным для отдельных пользователей, но не для всех. Например, большая команда разработчиков может быть разбита на небольшие группы. Разработчикам проекта A может быть не разрешен доступ к объектам, написанным разработчиками из проекта B. Хотя им может понадобиться доступ к объектам, созданным разработчиками проекта C; это реально встречающаяся ситуация. С помощью различных политик, предоставляемых инфраструктурой MAC, пользователи могут быть разделены на эти три группы и затем получить доступ к соответствующим областям без опасности утечки информации.
+
+Таким образом, каждая политика имеет уникальный способ взаимодействия с общей безопасностью системы. Выбор политики должен быть основан на хорошо продуманной политике безопасности. Во многих случаях политика должна быть полностью пересмотрена и реализована заново для всей системы. Понимание различных политик, предоставляемых инфраструктурой MAC, поможет администраторам выбрать лучшую политику в своей ситуации.
+
+Стандартное ядро FreeBSD не включает параметр MAC; необходимо добавить следующий параметр ядра перед тем, как пробовать какие-либо из примеров или применять информацию этой главы:
+
+[.programlisting]
+....
+options MAC
+....
+
+Затем необходимо пересобрать и переустановить ядро.
+
+[CAUTION]
+====
+
+Хотя различные страницы справочника для модулей MAC сообщают, что они могут быть встроены в ядро, возможна блокировка доступа системы к сети и другие побочные эффекты. Включение MAC очень похоже на включение брандмауэра, но необходимо быть внимательным, чтобы полностью не заблокировать систему. Необходимо предусмотреть возможность возврата к предыдущей конфигурации, а реализация MAC удаленно должна производиться с особой осторожностью.
+====
+
+[[mac-understandlabel]]
+== Метки MAC
+
+Метка MAC это атрибут безопасности, который может быть применен к субъектам и объектам всей системы.
+
+При установке метки пользователь должен в точности понимать, что именно она делает. Атрибуты, доступные для объекта, зависят от загруженной политики, а политики интерпретируют свои атрибуты совершенно различным образом. Результатом недостаточного понимания настроек может стать их неправильная реализация, что может привести к неожиданному, и возможно нежелательному поведению системы.
+
+Метка безопасности на объекте используется политикой для определения правил доступа. Для некоторых политик метка сама по себе содержит всю необходимую для этого информацию, в других моделях метки могут обрабатываться как часть большого набора правил, и т.д.
+
+Например, установка метки в `biba/low` на файле присвоит этому файлу метку, обрабатываемую политикой Biba со значением "low".
+
+Несколько политик, поддерживающих метки в FreeBSD, предоставляют три определенные предустановленные метки. Это низкая, высокая и равная метки. Хотя они устанавливают контроль различными способами для каждой политики, вы можете быть уверены, что низкая метка задаст минимальные установки, равная метка означает отмену или недействительность, а высокая метка установит максимально возможные настройки в политиках Biba и MLS.
+
+При применении в файловой системе одиночной метки, только одна метка может быть использована для объектов. Это вызовет установку одних и тех же прав доступа для всей системы, и во многих случаях это все, что необходимо. Тем не менее, существует несколько ситуаций, в которых на объекты и субъекты файловой системы могут быть установлены множественные метки. В этих ситуациях необходимо с помощью man:tunefs[8] установить параметр `multilabel`.
+
+В случае Biba и MLS может быть установлена числовая метка для указания точного уровня иерархического контроля. Этот числовой уровень используется для разделения или сортировки информации по различным группам классификации, разрешающей доступ только к этой группе или группе с более высоким уровнем.
+
+В большинстве случаев системный администратор использует только одну метку на всю файловую систему.
+
+_Постойте, но это же похоже на DAC! Я думал, что MAC дает контроль только администратору._ Это утверждение все еще верно, только `root` контролирует и настраивает политики, так что пользователи помещаются в соответствующие категории/уровни доступа. Многие политики могут ограничить также и пользователя `root`. Базовый контроль над объектами затем передается группе, но пользователь `root` может отменить или изменить эти настройки в любое время. Данная иерархическая модель соответствует таким политикам как Biba и MLS.
+
+=== Настройка меток
+
+Практически все действия по настройке политики с метками могут быть выполнены с использованием утилит базовой системы. Эти команды обеспечивают простой интерфейс для настройки объектов или субъектов, или для изменения и проверки настроек.
+
+Все настройки могут быть выполнены с использованием утилит man:setfmac[8] и man:setpmac[8]. Команда `setfmac` используется для установки меток MAC на системные объекты, а команда `setpmac` используется для установки меток на системные субъекты. Выполните:
+
+[source,bash]
+....
+# setfmac biba/high test
+....
+
+Если не произойдет ошибок, будет возвращено приглашение командной строки, как и после команд man:chmod[1] и man:chown[8]. В некоторых случаях может появиться ошибка `Permission denied`, и она обычно появляется при установке или изменении метки на объект с ограничениями. Системный администратор для обхода этой проблемы может использовать следующие команды:
+
+[source,bash]
+....
+# setfmac biba/high test
+Permission denied
+# setpmac biba/low setfmac biba/high test
+# getfmac test
+test: biba/high
+....
+
+Как видно из примера выше, команда `setpmac` может быть использована для изменения установок политики путем присвоения иной метки вызывающему процессу. Утилита `getpmac` обычно используется с существующим на данный момент процессом, таким как sendmail, хотя она принимает PID вместо команды, ее действие аналогично. Если пользователи попытаются манипулировать файлами, к которым у них нет доступа в соответствии с правилами загруженных политик, функцией `mac_set_link` будет выдано сообщение об ошибке `Operation not permitted`.
+
+==== Пользователи и установки меток
+
+Пользователям необходимо иметь метки, чтобы их файлы и процессы могли правильно взаимодействовать с определенной в системе политикой безопасности. Это настраивается через файл [.filename]#login.conf# путем использования классов. Каждая политика, использующая метки, реализует установку класса пользователя.
+
+Пример записи, содержащей все политики, приведенные ниже:
+
+[.programlisting]
+....
+default:\
+ :copyright=/etc/COPYRIGHT:\
+ :welcome=/etc/motd:\
+ :setenv=MAIL=/var/mail/$,BLOCKSIZE=K:\
+ :path=~/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:\
+ :manpath=/usr/shared/man /usr/local/man:\
+ :nologin=/usr/sbin/nologin:\
+ :cputime=1h30m:\
+ :datasize=8M:\
+ :vmemoryuse=100M:\
+ :stacksize=2M:\
+ :memorylocked=4M:\
+ :memoryuse=8M:\
+ :filesize=8M:\
+ :coredumpsize=8M:\
+ :openfiles=24:\
+ :maxproc=32:\
+ :priority=0:\
+ :requirehome:\
+ :passwordtime=91d:\
+ :umask=022:\
+ :ignoretime@:\
+ :label=partition/13,mls/5,biba/10(5-15),lomac10[2]:
+....
+
+Параметр `label` используется для установки метки MAC по умолчанию для класса пользователя. Пользователи не смогут изменять это значение, поэтому его можно признать не опциональным. В реальной ситуации администратору никогда не потребуется включать каждую политику. Рекомендуется прочесть главу полностью перед реализацией любой из этих настроек.
+
+[NOTE]
+====
+Пользователи могут изменить свою метку после входа; однако политика накладывает ограничение на это изменение. В примере выше политике Biba указано, что минимальная целостность процесса 5, максимальная 15, а эффективная целостность по умолчанию 10. Процесс будет работать на уровне 10, пока метка не будет изменена, например если пользователь использует команду setpmac, которую Biba ограничит диапазоном, установленным при входе.
+====
+
+Во всех случаях после изменения [.filename]#login.conf#, база данных "login class capability" должна быть пересобрана с использованием команды `cap_mkdb` и это будет отражено в каждом последующем примере главы.
+
+Полезно отметить, что количество пользователей, которым требуются различные классы, во многих сетях может быть велико. Необходимо тщательное планирование, поскольку управление такой сетью может серьезно усложниться.
+
+В будущих версиях FreeBSD появится новый способ связывания пользователей с метками; однако, он будет доступен только через некоторое время после выхода FreeBSD 5.3.
+
+==== Сетевые интерфейсы и установка меток
+
+Метки также могут быть установлены на сетевые интерфейсы, для контроля потока данных в сети. Во всех случаях они функционируют аналогично тому, как политики по отношению к объектам. Пользователи с высокими установками, например, `biba`, не смогут получить доступ к сетевым интерфейсам с низкими установками.
+
+Для установки MAC меток на сетевых интерфейсах параметр `maclabel` может быть передан `ifconfig`. Например:
+
+[source,bash]
+....
+# ifconfig bge0 maclabel biba/equal
+....
+
+установит MAC метку `biba/equal` на интерфейс man:bge[4]. При использовании метки, подобной `biba/high(low-high)` вся метка должна быть взята в кавычки, иначе будет выдано сообщение об ошибке.
+
+Каждая политика, использующая метки, снабжена переменной `sysctl`, которая может быть использована для отключения MAC меток на сетевых интерфейсах. Установка метки в `equal` будет иметь подобный эффект. Просмотрите вывод команды `sysctl`, страницы справочника для политик, или дальнейшую информацию из этой главы по этим переменным.
+
+=== Одиночные или множественные метки?
+
+По умолчанию система будет использовать параметр `singlelabel`. Но что это означает для администратора? Существуют несколько различий между политиками, каждая из которых правильна сама по себе, но имеет свои доводы за и против относительно гибкости модели безопасности системы.
+
+`singlelabel` (одиночная метка) разрешает использование только одной метки, например `biba/high`, для каждого объекта или субъекта. Ее преимущество в меньшей нагрузке на системного администратора, а недостаток в малой гибкости политик, поддерживающих метки. Многие администраторы в своих политиках безопасности могут предпочесть использование параметра `multilabel`.
+
+С параметром `multilabel` каждый субъект или объект может иметь собственную метку MAC, в то время как со стандартным параметром `singlelabel` возможна только одна метка на весь раздел. Параметры `multilabel` и `singlelabel` требуются только для политик, реализующих метки, включая Biba, Lomac, MLS и SEBSD.
+
+Во многих случаях `multilabel` может вообще не потребоваться. Предположим следующую ситуацию и модель безопасности:
+
+* FreeBSD веб-сервер, использующий инфраструктуру MAC и набор различных политик.
+* Этому компьютеру потребуется лишь одна метка, `biba/high`, для всей системы. Файловой системе не нужен параметр `multilabel`, поскольку по умолчанию работает одиночная метка.
+* Но поскольку этот компьютер будет веб сервером, процесс веб сервера должен быть запущен с `biba/low` для предотвращения записи. Политика Biba и то, как она работает, будет обсуждаться позже, поэтому предыдущий комментарий сложно интерпретировать; просто продолжайте чтение. Сервер может использовать дисковый раздел с установленной меткой `biba/low` для большинства, если не для всех своих операций. В этом примере отсутствуют многие детали, такие как ограничения на данные, конфигурация системы и установки пользователей; однако, это лишь предварительный пример.
+
+Если используется любая из политик, не поддерживающих метки, параметр `multilabel` не требуется. Сюда включаются политики `seeotheruids`, `portacl` и `partition`.
+
+Необходимо также отметить, что использование параметра `multilabel` на разделе и установление модели безопасности, основанной на функциональности `multilabel`, может повлечь за собой множество дополнительной административной работы, поскольку всему в файловой системе должны быть присвоены метки. Это включает каталоги, файлы, и даже файлы устройств.
+
+Следующая команда установит параметр `multilabel` на файловых системах. Это может быть сделано только в однопользовательском режиме:
+
+[source,bash]
+....
+# tunefs -l enable /
+....
+
+Это не требуется для файловой системы подкачки.
+
+[NOTE]
+====
+Некоторые пользователи сталкиваются с проблемами при установке флага `multilabel` на корневой раздел. В данном случае обратитесь к <<mac-troubleshoot>>.
+====
+
+=== Настройка MAC переменными sysctl
+
+Независимо от загрузки модулей, существует несколько частей MAC, которые могут быть настроены с использованием интерфейса `sysctl`. Эти переменные описаны ниже и во всех случаях значение 1 означает включение, а 0 - отключение:
+
+* `security.mac.enforce_fs` по умолчанию установлена в 1 и включает политики MAC на файловых системах.
+* `security.mac.enforce_kld` по умолчанию 1 и включает линкование политик MAC в ядре (см. man:kld[4]).
+* `security.mac.enforce_network` по умолчанию 1 и включает сетевые политики MAC.
+* `security.mac.enforce_pipe` по умолчанию 1 и включает политики MAC для каналов (pipe).
+* `security.mac.enforce_process` по умолчанию 1 и включает политики MAC для процессов, использующих средства межпроцессного взаимодействия.
+* `security.mac.enforce_socket` по умолчанию 1 и включает политики MAC на сокетах (см. страницу справочника man:socket[2]).
+* `security.mac.enforce_system` по умолчанию 1 и включает политики MAC для действий системы, таких как учет (accounting) и перезагрузка.
+* `security.mac.enforce_vm` по умолчанию 1 и включает политики MAC для системы виртуальной памяти.
+
+[NOTE]
+====
+Каждая политика MAC поддерживает переменные `sysctl`. Они обычно попадают в дерево `security.mac.<policyname>`. Для просмотра всех переменных MAC, используйте следующую команду:
+
+[source,bash]
+....
+# sysctl -da | grep mac
+....
+
+====
+
+Это должно быть интерпретировано так, что все основные политики MAC включены по умолчанию. Если модули встроены в ядро, система будет заблокирована, и скорее всего не сможет связаться с локальной сетью или с интернет, и т.д. Поэтому встраивание модулей в ядро не рекомендуется. Не потому, что это ограничит возможность отключения командой `sysctl`, а потому, что включение политик в виде модулей позволит администратору переключать политики системы без необходимости пересборки и переустановки новой системы.
+
+[[mac-modules]]
+== Настройка модулей
+
+Каждый модуль, включенный в инфраструктуру MAC, может быть или встроен в ядро, как упоминалось выше, или загружен в виде модуля ядра. Рекомендуется добавление имени модуля в файл [.filename]#/boot/loader.conf#, этот модуль будет активирован в самом начале загрузки.
+
+В последующих разделах будут обсуждаться различные модули MAC и их возможности. Реализация этих возможностей в определенных ситуациях также будет обсуждаться в этой главе. Некоторые модули поддерживают использование меток, которые контролируют доступ путем применения правил вида "это разрешено, а это нет". Настройка меток может контролировать доступ к файлам, сетевым коммуникациям и т.д. В предыдущем разделе было показано как флаг `multilabel` может быть установлен на файловые системы для включения контроля доступа по файлам или по разделам.
+
+Конфигурация с одной меткой не допускает применение нескольких меток в системе, поэтому параметр `tunefs` называется `multilabel`.
+
+[[mac-seeotheruids]]
+=== Модуль MAC seeotheruids
+
+Имя модуля: [.filename]#mac_seeotheruids.ko#
+
+Строка в конфигурации ядра: `options MAC_SEEOTHERUIDS`
+
+Параметр загрузки: `mac_seeotheruids_load="YES"`
+
+Модуль man:mac_seeotheruids[4] копирует и расширяет переменные `sysctl security.bsd.see_other_uids` и `security.bsd.see_other_gids`. Он не требует установки меток и может прозрачно работать с другими модулями.
+
+После загрузки модуля, для управления им могут быть использованы следующие переменные `sysctl`:
+
+* `security.mac.seeotheruids.enabled` включит модуль с настройками по умолчанию. Эти настройки запрещают пользователям просмотр процессов и сокетов, принадлежащих другим пользователям.
+* `security.mac.seeotheruids.specificgid_enabled` позволит исключить определенные группы из этой политики. Для исключения определенной группы, используйте переменную `sysctl security.mac.seeotheruids.specificgid=_XXX_`. В примере выше необходимо заменить _XXX_ на числовой ID группы.
+* `security.mac.seeotheruids.primarygroup_enabled` используется для исключения определенной основной группы из этой политики. При использовании этой переменной `security.mac.seeotheruids.specificgid_enabled` может быть не установлена.
+
+Необходимо отметить, что пользователь `root` не является исключением из этой политики. Это одно из самых существенных различий между MAC версией и обычными переменными, существующими по умолчанию: `security.bsd.seeotheruids`.
+
+[[mac-bsdextended]]
+== Модуль MAC bsdextended
+
+Имя модуля: [.filename]#mac_bsdextended.ko#
+
+Строка конфигурации ядра: `options MAC_BSDEXTENDED`
+
+Параметр загрузки: `mac_bsdextended_load="YES"`
+
+Модуль man:mac_bsdextended[4] включает брандмауэр файловой системы. Политика этого модуля является расширением стандартной модели разрешений файловой системы, позволяя администратору создавать набор правил для защиты файлов, утилит и каталогов иерархии файловой системы в стиле брандмауэра.
+
+Политика может быть создана с помощью утилиты, man:ugidfw[8], синтаксис которой похож на синтаксис man:ipfw[8]. Другие инструменты могут быть написаны с использованием функций библиотеки man:libugidfw[3].
+
+При работе с этим модулем необходимо соблюдать особую осторожность; некорректное его использование может заблокировать доступ к отдельным частям файловой системы.
+
+=== Примеры
+
+После загрузки модуля man:mac_bsdextended[4] для просмотра текущей настройки правил может быть использована следующая команда:
+
+[source,bash]
+....
+# ugidfw list
+0 slots, 0 rules
+....
+
+Как и можно было ожидать, правила не определены. Это означает, что доступ полностью открыт. Для создания правила, которое заблокирует доступ всех пользователей, но не повлияет на `root`, просто запустите следующую команду:
+
+[source,bash]
+....
+# ugidfw add subject not uid root new object not uid root mode n
+....
+
+[NOTE]
+====
+В релизах FreeBSD до 5.3, параметр [parameter]#add# не существует. Вместо него необходимо использовать [parameter]#set#. Пример дан ниже.
+====
+
+Это очень плохая идея, поскольку такое правило запретит пользователям использовать даже самые простые команды, такие как `ls`. Более патриотический список правил может быть таким:
+
+[source,bash]
+....
+# ugidfw set 2 subject uid user1 object uid user2 mode n
+# ugidfw set 3 subject uid user1 object gid user2 mode n
+....
+
+Эти команды запретят весь и любой доступ пользователя `user1`, включая просмотр подкаталогов, к домашнему каталогу пользователя `_user2_`.
+
+Вместо `user1` может быть задано `not uid _user2_`. Это включит те ограничения, о которых говорилось выше, для всех пользователей кроме одного.
+
+[NOTE]
+====
+На пользователя `root` эти изменения не повлияют.
+====
+
+Материал выше должен дать общую идею как модуль man:mac_bsdextended[4] может быть использован в качестве средства защиты файловой системы. За дальнейшей информацией обращайтесь к страницам справочника man:mac_bsdextended[4] и man:ugidfw[8].
+
+[[mac-ifoff]]
+== Модуль MAC ifoff
+
+Имя модуля: [.filename]#mac_ifoff.ko#
+
+Строка конфигурации ядра: `options MAC_IFOFF`
+
+Параметр загрузки: `mac_ifoff_load="YES"`
+
+Модуль man:mac_ifoff[4] существует только для отключения сетевых интерфейсов в работающей системе и удержания их от отправки пакетов во время начальной загрузки. Это не требует установления в системе каких-либо меток, нет и зависимости от других модулей MAC.
+
+Большая часть управления может быть выполнена через переменные `sysctl`.
+
+* `security.mac.ifoff.lo_enabled` включает/выключает весь трафик на loopback (man:lo[4]) интерфейсе.
+* `security.mac.ifoff.bpfrecv_enabled` включает/выключает весь трафик на интерфейсе Berkeley Packet Filter (man:bpf[4]).
+* `security.mac.ifoff.other_enabled` включает/выключает весь трафик на всех других интерфейсах.
+
+Одно из наиболее частых использований man:mac_ifoff[4] это сетевой мониторинг в среде, где сетевой трафик не должен быть разрешен во время загрузки. Другое предлагаемое применение это написание скрипта, использующего package:security/aide[] для автоматического блокирования сетевого трафика, если будут обнаружены новые или измененные файлы в защищаемых каталогах.
+
+[[mac-portacl]]
+== Модуль MAC portacl
+
+Имя модуля: [.filename]#mac_portacl.ko#
+
+Строка конфигурации ядра: `MAC_PORTACL`
+
+Параметр загрузки: `mac_portacl_load="YES"`
+
+Модуль man:mac_portacl[4] используется для ограничения привязки (binding) к локальным портам TCP и UDP, используя различные переменные `sysctl`. По сути man:mac_portacl[4] делает возможной привязку к привилегированным портам, т.е. к портам с номерами меньше 1024 для не-`root` пользователей.
+
+После загрузки этот модуль включит политику MAC на всех сокетах. Доступны следующие переменные `sysctl`:
+
+* `security.mac.portacl.enabled` включает/отключает политику целиком.
+* `security.mac.portacl.port_high` установит наибольший номер порта, для которого man:mac_portacl[4] включает защиту.
+* `security.mac.portacl.suser_exempt`, если установлена в ненулевое значение, исключает пользователя `root` из этой политики.
+* `security.mac.portacl.rules` задает действующую политику mac_portacl: см. ниже.
+
+Действующая политика `mac_portacl`, указанная в `security.mac.portacl.rules`, это текстовая строка в форме `rule[,rule,...]` с таким количеством правил, которое требуется. Каждое правило задается в формате: `idtype:id:protocol:port`. Параметр [parameter]#idtype# может принимать значения `uid` или `gid` и используется для интерпретации параметра [parameter]#id#, в качестве id пользователя или группы соответственно. Параметр [parameter]#protocol# используется для определения применимости этого правила к протоколу TCP или UDP, он может принимать значения `tcp` или `udp`. Последний параметр, [parameter]#port#, задает номер порта, к которому разрешается привязка указанного пользователя или группы.
+
+[NOTE]
+====
+Поскольку набор правил интерпретируется непосредственно ядром, для ID пользователя, группы и номера порта могут быть использованы только числовые значения. Т.е. имена пользователей, групп и сервисов портов не могут быть использованы.
+====
+
+По умолчанию в UNIX(R)-подобных системах порты с номерами менее чем 1024 могут быть использованы только привилегированными процессами, т.е. теми, что запущены от `root`. С man:mac_portacl[4] для разрешения привязки непривилегированных процессов к портам с номерами ниже 1024 эти стандартные ограничения UNIX(R) должны быть отменены. Это может быть выполнено путем установки переменных man:sysctl[8] `net.inet.ip.portrange.reservedlow` и `net.inet.ip.portrange.reservedhigh` в ноль.
+
+Обратитесь к примерам ниже или к странице справочника man:mac_portacl[4] за дальнейшей информацией.
+
+=== Примеры
+
+Следующие примеры должны осветить обсуждение выше чуть лучше:
+
+[source,bash]
+....
+# sysctl security.mac.portacl.port_high=1023
+# sysctl net.inet.ip.portrange.reservedlow=0 net.inet.ip.portrange.reservedhigh=0
+....
+
+Сначала мы настраиваем man:mac_portacl[4] для работы со стандартными привилегированными портами и отмены обычных ограничений UNIX(R) на привязку.
+
+[source,bash]
+....
+# sysctl security.mac.portacl.suser_exempt=1
+....
+
+Пользователь `root` должен быть исключен из этой политики, для этого переменная `security.mac.portacl.suser_exempt` установлена в ненулевое значение. Модуль man:mac_portacl[4] теперь настроен на то поведение UNIX(R)-подобных систем по умолчанию.
+
+[source,bash]
+....
+# sysctl security.mac.portacl.rules=uid:80:tcp:80
+....
+
+Разрешает пользователю с UID 80 (обычно это пользователь `www`) привязку к порту 80. Теперь пользователь `www` сможет запустить веб сервер даже без привилегии `root`.
+
+[source,bash]
+....
+# sysctl security.mac.portacl.rules=uid:1001:tcp:110,uid:1001:tcp:995
+....
+
+Разрешит пользователю с UID 1001 привязку к TCP портам 110 ("pop3") и 995 ("pop3s"). Это позволит данному пользователю запустить сервер, принимающий соединения на портах 110 и 995.
+
+[[mac-labelingpolicies]]
+== Политики MAC, использующие метки
+
+В следующих нескольких разделах будут обсуждаться политики MAC, использующие метки.
+
+С этого момента обсуждение будет сфокусировано на возможностях man:mac_biba[4], man:mac_lomac[4], man:mac_partition[4], и man:mac_mls[4].
+
+[NOTE]
+====
+Это лишь примерные настройки, они не должны использоваться непосредственно в реальных задачах. Цель изложения в том, чтобы документировать и показать синтаксис, а также примеры реализации и тестирования.
+====
+
+Для правильной работы этих политик необходимо выполнить некоторые приготовления.
+
+[[mac-prep]]
+=== Приготовления к использованию политик с метками
+
+В файл [.filename]#login.conf# необходимо внести следующие изменения:
+
+* Должен быть добавлен класс `insecure`, или другой подобный класс. Наличие класса `insecure` не обязательно, он приводится здесь в качестве примера; другие конфигурации могут использовать другое имя класса.
+* Класс `insecure` должен использовать приведенные ниже настройки и определения. Некоторые из них могут быть изменены, но строка, определяющая метку по умолчанию, необходима и должна быть оставлена.
++
+[.programlisting]
+....
+insecure:\
+ :copyright=/etc/COPYRIGHT:\
+ :welcome=/etc/motd:\
+ :setenv=MAIL=/var/mail/$,BLOCKSIZE=K:\
+ :path=~/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:\
+ :manpath=/usr/shared/man /usr/local/man:\
+ :nologin=/usr/sbin/nologin:\
+ :cputime=1h30m:\
+ :datasize=8M:\
+ :vmemoryuse=100M:\
+ :stacksize=2M:\
+ :memorylocked=4M:\
+ :memoryuse=8M:\
+ :filesize=8M:\
+ :coredumpsize=8M:\
+ :openfiles=24:\
+ :maxproc=32:\
+ :priority=0:\
+ :requirehome:\
+ :passwordtime=91d:\
+ :umask=022:\
+ :ignoretime@:\
+ :label=partition/13,mls/5,biba/low:
+....
+
++
+Перед тем, как переключать пользователей на новый класс, необходимо запустить команду man:cap.mkdb[1] на man:login.conf[5].
++
+Пользователю `root` также необходимо присвоить класс; иначе, почти любой команде, выполняемой от `root`, потребуется использование `setpmac`.
++
+* Убедитесь, что все разделы, на которых будут установлены метки MAC, поддерживают параметр `multilabel`. Нам необходимо сделать это, поскольку многие из примеров здесь содержат различные метки в целях тестирования. Просмотрите вывод команды `mount` в качестве необходимой предосторожности.
+* Переключите всех пользователей, которые будут использовать новые механизмы безопасности, на этот класс. Информация по этой процедуре находится в man:pw[8] или man:vipw[8].
+
+[[mac-partition]]
+== Модуль MAC partition
+
+Имя модуля: [.filename]#mac_partition.ko#
+
+Строка настройки ядра: `options MAC_PARTITION`
+
+Параметр загрузки: `mac_partition_load="YES"`
+
+Политика man:mac_partition[4] распределяет процессы по "разделам" на основе их MAC меток. Это может быть представлено как особый тип man:jail[8], хотя такое сравнение едва ли подходит.
+
+Этот модуль должен быть добавлен в man:loader.conf[5], чтобы политика была загружена и включена при загрузке системы.
+
+Большая часть настройки этой политики выполняется с помощью утилиты man:setpmac[8], которая будет описана ниже. Для данной политики имеется также следующая переменная `sysctl`:
+
+* `security.mac.partition.enabled` включит MAC разделение процессов.
+
+Когда эта политика включена, пользователям разрешено просматривать только собственные процессы, но не разрешено пользоваться определенными утилитами. Например, пользователю из класса `insecure` выше не будет разрешено использование команды `top`, а также многих других команд, которые должны порождать процесс.
+
+Для присвоения утилитам меток partition используйте утилиту `setpmac`:
+
+[source,bash]
+....
+# setpmac partition/13 top
+....
+
+Команда `top` будет добавлена к метке, установленной для пользователей класса `insecure`. Обратите внимание, что все процессы, порожденные пользователями класса `insecure`, останутся с меткой `partition/13`.
+
+=== Примеры
+
+Следующая команда покажет вашу метку раздела и список процессов:
+
+[source,bash]
+....
+# ps Zax
+....
+
+Следующей командой можно просмотреть метку раздела процессов других пользователей и их запущенные процессы:
+
+[source,bash]
+....
+# ps -ZU trhodes
+....
+
+[NOTE]
+====
+Пользователи могут могут увидеть процессы `root`, если не загружена политика man:mac_seeotheruids[4].
+====
+
+Действительно "продвинутая" реализация должна отключать все сервисы через [.filename]#/etc/rc.conf# и запускать их через скрипт, который установит правильный набор меток.
+
+[NOTE]
+====
+Следующие политики поддерживают целочисленные установки вместо трех меток по умолчанию. Эти опции, включая их ограничения, описываются более подробно в страницах справочника модулей.
+====
+
+[[mac-mls]]
+== Модуль многоуровневой безопасности MAC (MLS)
+
+Имя модуля: [.filename]#mac_mls.ko#
+
+Строка конфигурации ядра: `options MAC_MLS`
+
+Параметр загрузки: `mac_mls_load="YES"`
+
+Политика man:mac_mls[4] контролирует взаимодействие субъектов и объектов системы путем применения строгой политики к потоку информации.
+
+В среде MLS, для каждого субъекта или объекта внутри отдела (compartment) устанавливается "уровень допуска". Поскольку количество уровней допуска может превышать шесть тысяч, для любого системного администратора задача настройки каждого субъекта или объекта может быть слишком сложной. К счастью, существуют "постоянные" метки, которые уже включены в эту политику.
+
+Эти метки `mls/low`, `mls/equal` и `mls/high`. Поскольку эти метки подробно описываются в справочнике, здесь мы дадим только краткое описание:
+
+* Метка `mls/low` содержит минимальную настройку, что позволяет доминирование над ней всех других объектов. Все, что помечено с `mls/low`, находится на низком уровне доступа и доступ к более высоким уровням будет запрещен. Кроме того, эта метка предотвратит запись или передачу информации объектам с более высоким уровнем доступа.
+* Метка `mls/equal` должна быть помещена на объекты, являющиеся исключением из политики.
+* Метка `mls/high` это наибольший возможный уровень доступа. Объекты с этой меткой будут доминировать над всеми другими объектами системы; однако, утечка информации от них к объектам более низкого класса невозможна.
+
+MLS представляет собой:
+
+* Иерархические уровни безопасности с набором не иерархических категорий;
+* Фиксированные правила: нет чтения сверху, нет записи вниз (субъект может иметь доступ на чтение объектов собственного уровня или ниже, но не выше. Аналогично, субъект может иметь доступ на запись в объекты своего уровня или выше, но не наоборот.);
+* Секретность (предотвращение неавторизованного раскрытия данных);
+* Основа для разработки систем, одновременно работающих с данными на нескольких уровнях секретности (без утечки информации).
+
+Для настройки специальных сервисов и интерфейсов доступны следующие переменные `sysctl`:
+
+* `security.mac.mls.enabled` используется для включения/отключения политики MLS.
+* `security.mac.mls.ptys_equal` пометит все устройства man:pty[4] как `mls/equal` во время создания.
+* `security.mac.mls.revocation_enabled` используется для запрета доступа к объектам после того, как их метка изменится в меньшую сторону.
+* `security.mac.mls.max_compartments` используется для установки максимального количества уровней отделов на объекты; обычно это максимальное количество отделов, разрешенных в системе.
+
+Для управления метками MLS существует команда man:setfmac[8]. Для присвоения метки объекту, выполните следующую команду:
+
+[source,bash]
+....
+# setfmac mls/5 test
+....
+
+Для получения метки MLS файла [.filename]#test#, выполните следующую команду:
+
+[source,bash]
+....
+# getfmac test
+....
+
+Выше представлен краткий обзор возможностей политики MLS. Существует метод, связанный с созданием основного файла политики в каталоге [.filename]#/etc#, где будет определена необходимая для политики MLS информация, которая будет передана команде `setfmac`. Этот метод будет описан после рассмотрения всех политик.
+
+Итоги: объект с низким уровнем доступа не может прочесть данные объекта с высоким уровнем доступа. Базовая политика должна устанавливать `mls/high` на всем, что не должно быть прочитано, даже если туда необходимо записывать. На всем, куда нельзя писать, должна быть установлена метка `mls/low`, даже если это необходимо читать. Наконец, на всем остальном установите `mls/equal`. Все пользователи, помеченные как `insecure`, должны иметь метку `mls/low`.
+
+[[mac-biba]]
+== Модуль MAC Biba
+
+Имя модуля: [.filename]#mac_biba.ko#
+
+Строка конфигурации ядра: `options MAC_BIBA`
+
+Параметр загрузки: `mac_biba_load="YES"`
+
+Модуль man:mac_biba[4] загружает MAC политику Biba. Эта политика работает в основном так же, как и MLS, за исключением того, что правила потока информации изменены на противоположные. Они предназначены для предотвращения передачи потока секретной информации вверх, в то время как политика MLS предотвращает передачу потока секретной информации вниз; таким образом, большая часть этого раздела применима к обеим политикам.
+
+В среде Biba, каждому субъекту или объекту присваивается метка "целостности". Эти метки состоят из иерархических уровней и не-иерархических компонентов. При возрастании уровня объекта или субъекта это повышает его целостность.
+
+Поддерживаемые метки `biba/low`, `biba/equal`, и `biba/high`; описаны ниже:
+
+* Метка `biba/low` обеспечивает наименьшую целостность объекта или субъекта. Установка ее на объект или субъект заблокирует их доступ к объектам или субъектам, имеющим более высокую метку. Тем не менее, у них остается доступ на чтение.
+* Метка `biba/equal` должна помещаться только на объекты, исключающиеся из политики.
+* Метка `biba/high` разрешит запись в объекты с более низкой меткой, но не разрешит чтение из этих объектов. Рекомендуется помещать такую метку на объекты, влияющие на целостность всей системы.
+
+Biba представляет собой:
+
+* Иерархические уровни целостности с набором не иерархических категорий;
+* Фиксированные правила: нет записи наверх, нет чтения снизу (обратно MLS). Субъект может иметь доступ на запись к объектам своего уровня или ниже, но не выше. Аналогично, субъект может иметь доступ на чтение к объектам своего уровня или выше, но не ниже;
+* Целостность (предотвращение неавторизованного изменения данных);
+* Уровни целостности (вместо уровней секретности MLS).
+
+Для управления политикой Biba могут быть использованы следующие переменные `sysctl`:
+
+* `security.mac.biba.enabled` может использоваться для включения/выключения политики Biba.
+* `security.mac.biba.ptys_equal` может использоваться для отключения политики Biba на устройствах man:pty[4].
+* `security.mac.biba.revocation_enabled` включит отмену доступа к объектам, если метка изменена на более высокую, чем у субъекта.
+
+Для выполнения настроек политики Biba на системных объектах, применяются команды `setfmac` и `getfmac`:
+
+[source,bash]
+....
+# setfmac biba/low test
+# getfmac test
+test: biba/low
+....
+
+Итоги: субъект с низким уровнем целостности не может писать в субъект с высоким уровнем целостности; субъект с высоким уровнем целостности не может читать из субъекта с низким уровнем целостности.
+
+[[mac-lomac]]
+== Модуль MAC LOMAC
+
+Имя модуля: [.filename]#mac_lomac.ko#
+
+Строка конфигурации ядра: `options MAC_LOMAC`
+
+Параметр загрузки: `mac_lomac_load="YES"`
+
+В отличие от политики MAC Biba, политика man:mac_lomac[4] разрешает доступ к объектам с более низким уровнем целостности только после уменьшения уровня целостности, чтобы не нарушать каких-либо правил целостности.
+
+MAC версия политики целостности Low-watermark, чтобы не пересекаться со старой реализацией man:lomac[4], работает почти так же, как и Biba, за исключением использования плавающих меток для поддержки понижения метки субъекта через отдел для вспомогательной градации (auxiliary grade compartment). Этот вспомогательный отдел принимает вид `[auxgrade]`. При включении политики lomac с вспомогательной градацией метка должна выглядеть приблизительно так: `lomac/10[2]`, где номер 2 это вспомогательная градация.
+
+Политика MAC LOMAC основана на тотальной пометке всех системных объектов метками целостности, разрешая субъектам читать из объектов с более низкой степенью целостности и с уменьшением метки субъекта для предотвращения последующей записи в объекты с более высокой степенью целостности. Параметр `[auxgrade]` обсуждался выше, таким образом политика может быть более совместимой и требовать меньшей первоначальной настройки, чем Biba.
+
+=== Примеры
+
+Как и для политик Biba и MLS, для установки меток на системные объекты и субъекты могут быть использованы утилиты `setfmac` и `setpmac`:
+
+[source,bash]
+....
+# setfmac /usr/home/trhodes lomac/high[low]
+# getfmac /usr/home/trhodes lomac/high[low]
+....
+
+Обратите внимание, что вспомогательная градация здесь `low`, эта возможность предоставляется только политикой MAC LOMAC policy.
+
+[[mac-implementing]]
+== Реализация защищенной среды с MAC
+
+Нижеследующая демонстрация реализует защищенную среду с использованием различных MAC модулей с соответственно настроенными политиками. Используйте этот пример только для тестирования, он не предназначен для удовлетворения всех требований к защите. Реализация этих политик без понимания принципа их работы неприменима в реальных задачах.
+
+Перед началом процесса настройки, на каждую файловую систему необходимо установить параметр `multilabel`, который упоминался в начале этой главы. Невыполнение этого требования приведет к ошибкам.
+
+=== Создание insecure класса пользователя
+
+Начните процедуру добавлением следующего класса пользователя к файлу [.filename]#/etc/login.conf#:
+
+[.programlisting]
+....
+insecure:\
+:copyright=/etc/COPYRIGHT:\
+:welcome=/etc/motd:\
+:setenv=MAIL=/var/mail/$,BLOCKSIZE=K:\
+:path=~/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
+:manpath=/usr/shared/man /usr/local/man:\
+:nologin=/usr/sbin/nologin:\
+:cputime=1h30m:\
+:datasize=8M:\
+:vmemoryuse=100M:\
+:stacksize=2M:\
+:memorylocked=4M:\
+:memoryuse=8M:\
+:filesize=8M:\
+:coredumpsize=8M:\
+:openfiles=24:\
+:maxproc=32:\
+:priority=0:\
+:requirehome:\
+:passwordtime=91d:\
+:umask=022:\
+:ignoretime@:\
+:label=partition/13,mls/5:
+....
+
+и добавлением следующей строки к default классу пользователя:
+
+[.programlisting]
+....
+:label=mls/equal,biba/equal,partition/equal:
+....
+
+После завершения этих действий, для пересборки базы данных должна быть выполнена следующая команда:
+
+[source,bash]
+....
+# cap_mkdb /etc/login.conf
+....
+
+=== Загрузка с необходимыми модулями
+
+Добавьте к [.filename]#/boot/loader.conf# следующие строки, чтобы необходимые модули были загружены при старте системы:
+
+[.programlisting]
+....
+mac_biba_load="YES"
+mac_mls_load="YES"
+mac_seeotheruids_load="YES"
+mac_partition_load="YES"
+....
+
+=== Установка всех пользователей в insecure
+
+Всем учетным записям, кроме `root` или системных пользователей теперь потребуется присвоить класс (login class). При отсутствии класса пользователи не смогут получить доступа к обычным командам, таким как man:vi[1]. Следующий скрипт `sh` сделает все необходимое:
+
+[source,bash]
+....
+# for x in `awk -F: '($3 >= 1001) && ($3 != 65534) { print $1 }' \
+ /etc/passwd`; do pw usermod $x -L insecure; done;
+....
+
+После этого изменения необходимо запустить команду `cap_mkdb` на файле [.filename]#/etc/master.passwd#.
+
+=== Завершение настройки
+
+Должен быть создан файл контекста; следующий пример взят из примера политики от Robert Watson, он может быть помещен в [.filename]#/etc/policy.contexts#:
+
+[.programlisting]
+....
+# This is the default BIBA/MLS policy for this system.
+
+.* biba/high,mls/high
+/sbin/dhclient biba/high(low),mls/high(low)
+/dev(/.*)? biba/equal,mls/equal
+# This is not an exhaustive list of all "privileged" devices.
+/dev/mdctl biba/high,mls/high
+/dev/pci biba/high,mls/high
+/dev/k?mem biba/high,mls/high
+/dev/io biba/high,mls/high
+/dev/agp.* biba/high,mls/high
+(/var)?/tmp(/.*)? biba/equal,mls/equal
+/tmp/\.X11-unix biba/high(equal),mls/high(equal)
+/tmp/\.X11-unix/.* biba/equal,mls/equal
+/proc(/.*)? biba/equal,mls/equal
+/mnt.* biba/low,mls/low
+(/usr)?/home biba/high(low),mls/high(low)
+(/usr)?/home/.* biba/low,mls/low
+/var/mail(/.*)? biba/low,mls/low
+/var/spool/mqueue(/.*)? biba/low,mls/low
+(/mnt)?/cdrom(/.*)? biba/high,mls/high
+(/usr)?/home/(ftp|samba)(/.*)? biba/high,mls/high
+/var/log/sendmail\.st biba/low,mls/low
+/var/run/utmp biba/equal,mls/equal
+/var/log/(lastlog|wtmp) biba/equal,mls/equal
+....
+
+Эта политика обеспечит безопасность путем применения ограничений на нисходящий и восходящий потоки информации в применении к каталогам и утилитам, приведенным в левой части файла.
+
+Он может быть внесен в систему следующими командами:
+
+[source,bash]
+....
+# setfsmac -ef /etc/policy.contexts /
+# setfsmac -ef /etc/policy.contexts /usr
+....
+
+[NOTE]
+====
+Раскладка вышеприведенной файловой системы может быть различной для разных систем.
+====
+
+Файл [.filename]#/etc/mac.conf# требует следующих изменений в основном разделе:
+
+[.programlisting]
+....
+default_labels file ?biba,?mls
+default_labels ifnet ?biba,?mls
+default_labels process ?biba,?mls,?partition
+default_labels socket ?biba,?mls
+....
+
+=== Тестирование настройки
+
+Добавьте пользователя с помощью команды `adduser` и поместите его в класс `insecure` для этих тестов.
+
+В примерах ниже тестирование `root` и обычных пользователей будет смешиваться; форма приглашения поможет различить этих пользователей.
+
+==== Основное тестирование меток
+
+[source,bash]
+....
+% getpmac
+biba/15(15-15),mls/15(15-15),partition/15
+# setpmac partition/15,mls/equal top
+....
+
+[NOTE]
+====
+Процесс top будет уничтожен перед тем, как мы запустим другой процесс top.
+====
+
+==== Тестирование MAC seeotheruids
+
+[source,bash]
+....
+% ps Zax
+biba/15(15-15),mls/15(15-15),partition/15 1096 #C: S 0:00.03 -su (bash)
+biba/15(15-15),mls/15(15-15),partition/15 1101 #C: R+ 0:00.01 ps Zax
+....
+
+Просмотр процессов всех других пользователей должен быть запрещен.
+
+==== Тестирование MAC partition
+
+Отключите политику MAC `seeotheruids` для остальных тестов:
+
+[source,bash]
+....
+# sysctl security.mac.seeotheruids.enabled=0
+% ps Zax
+LABEL PID TT STAT TIME COMMAND
+ biba/equal(low-high),mls/equal(low-high),partition/15 1122 #C: S+ 0:00.02 top
+ biba/15(15-15),mls/15(15-15),partition/15 1096 #C: S 0:00.05 -su (bash)
+ biba/15(15-15),mls/15(15-15),partition/15 1123 #C: R+ 0:00.01 ps Zax
+....
+
+Все пользователи должны видеть каждый процесс в своем разделе (partition).
+
+==== Тестирование меток Biba и MLS
+
+[source,bash]
+....
+# setpmac partition/15,mls/equal,biba/high\(high-high\) top
+% ps Zax
+LABEL PID TT STAT TIME COMMAND
+ biba/high(high-high),mls/equal(low-high),partition/15 1251 #C: S+ 0:00.02 top
+ biba/15(15-15),mls/15(15-15),partition/15 1096 #C: S 0:00.06 -su (bash)
+ biba/15(15-15),mls/15(15-15),partition/15 1157 #C: R+ 0:00.00 ps Zax
+....
+
+Политика Biba позволяет чтение объектов с более высокими метками.
+
+[source,bash]
+....
+# setpmac partition/15,mls/equal,biba/low top
+% ps Zax
+LABEL PID TT STAT TIME COMMAND
+ biba/15(15-15),mls/15(15-15),partition/15 1096 #C: S 0:00.07 -su (bash)
+ biba/15(15-15),mls/15(15-15),partition/15 1226 #C: R+ 0:00.01 ps Zax
+....
+
+Политика Biba не позволяет чтение объектов с более низкими метками; тем не менее, MLS разрешает это.
+
+[source,bash]
+....
+% ifconfig bge0 | grep maclabel
+maclabel biba/low(low-low),mls/low(low-low)
+% ping -c 1 192.0.34.166
+PING 192.0.34.166 (192.0.34.166): 56 data bytes
+ping: sendto: Permission denied
+....
+
+Пользователи не могут выполнить ping на `example.com`, или на любой домен по этой причине.
+
+Для устранения этой ошибки, запустите следующую команду:
+
+[source,bash]
+....
+# sysctl security.mac.biba.trust_all_interfaces=1
+....
+
+Она устанавливает метку интерфейса по умолчанию в незащищенный режим, так что политика Biba по умолчанию не будет применена.
+
+[source,bash]
+....
+# ifconfig bge0 maclabel biba/equal\(low-high\),mls/equal\(low-high\)
+% ping -c 1 192.0.34.166
+PING 192.0.34.166 (192.0.34.166): 56 data bytes
+64 bytes from 192.0.34.166: icmp_seq=0 ttl=50 time=204.455 ms
+--- 192.0.34.166 ping statistics ---
+1 packets transmitted, 1 packets received, 0% packet loss
+round-trip min/avg/max/stddev = 204.455/204.455/204.455/0.000 ms
+....
+
+Установив более корректную метку, мы можем использовать `ping`.
+
+Теперь создадим файлы для процедуры тестирования чтения и записи:
+
+[source,bash]
+....
+# touch test1 test2 test3 test4 test5
+# getfmac test1
+test1: biba/equal,mls/equal
+# setfmac biba/low test1 test2; setfmac biba/high test4 test5; \
+ setfmac mls/low test1 test3; setfmac mls/high test2 test4
+# setfmac mls/equal,biba/equal test3 && getfmac test?
+test1: biba/low,mls/low
+test2: biba/low,mls/high
+test3: biba/equal,mls/equal
+test4: biba/high,mls/high
+test5: biba/high,mls/equal
+# chown testuser:testuser test?
+....
+
+Все эти файлы должны принадлежать пользователю `testuser`. Тесты на чтение:
+
+[source,bash]
+....
+% ls
+test1 test2 test3 test4 test5
+% ls test?
+ls: test1: Permission denied
+ls: test2: Permission denied
+ls: test4: Permission denied
+test3 test5
+....
+
+Доступ на чтение не должен быть разрешен для пар: `(biba/low,mls/low)`, `(biba/low,mls/high)` и `(biba/high,mls/high)`. Теперь несколько тестов на запись:
+
+[source,bash]
+....
+% for i in `echo test*`; do echo 1 > $i; done
+-su: test1: Permission denied
+-su: test4: Permission denied
+-su: test5: Permission denied
+....
+
+Подобно тестам на чтение, доступ на запись должен быть запрещен для пар: `(biba/low,mls/high)` и `(biba/equal,mls/equal)`.
+
+[source,bash]
+....
+% cat test?
+cat: test1: Permission denied
+cat: test2: Permission denied
+1
+cat: test4: Permission denied
+....
+
+А теперь от `root`:
+
+[source,bash]
+....
+# cat test2
+1
+....
+
+[[MAC-examplehttpd]]
+== Другой пример: Использование MAC для защиты веб сервера
+
+Будет создано отдельное хранилище для веб данных, к которому пользователи должны иметь доступ. Это позволит `biba/high` управлять доступом к веб данным.
+
+Начните с создания каталога для хранения веб данных:
+
+[source,bash]
+....
+# mkdir /usr/home/cvs
+....
+
+Теперь инициализируйте его командой `cvs`:
+
+[source,bash]
+....
+# cvs -d /usr/home/cvs init
+....
+
+Для начала необходимо включить политику `biba`, добавив `mac_biba_enable="YES"` в [.filename]#/boot/loader.conf#. Предполагается, что ядро скомпилировано с поддержкой MAC.
+
+Далее установите метку `biba/high` для всей системы по умолчанию.
+
+В файл [.filename]#login.conf#, класс default, необходимо внести следующие изменения:
+
+[.programlisting]
+....
+:ignoretime@:\
+ :umask=022:\
+ :label=biba/high:
+....
+
+Каждого пользователя необходимо поместить в класс по умолчанию; такая команда:
+
+[source,bash]
+....
+# for x in `awk -F: '($3 >= 1001) && ($3 != 65534) { print $1 }' \
+ /etc/passwd`; do pw usermod $x -L default; done;
+....
+
+быстро решит эту задачу.
+
+Теперь создадим другой класс, web, копию класса default с меткой, установленной в `biba/low`.
+
+Создайте пользователя для работы с основными веб данными, хранящимися в репозитории cvs. Этого пользователя необходимо поместить в новый класс, `web`.
+
+Поскольку метка по умолчанию `biba/high`, на репозитории она будет той же. Веб данные должны иметь ту же метку, чтобы у пользователей был доступ к ним на чтение/запись. Веб сервер должен иметь доступ к тем же данным, к которым есть доступ у пользователей с меткой `biba/high`, для этого необходимо понизить метку данных.
+
+Все, что потребуется, это следующий man:sh[1] скрипт, который может быть запущен из man:cron[8]:
+
+[.programlisting]
+....
+PATH=/bin:/usr/bin:/usr/local/bin; export PATH;
+CVSROOT=/home/repo; export CVSROOT;
+cd /home/web;
+cvs -qR checkout -P htdocs;
+exit;
+....
+
+[NOTE]
+====
+Во многих случаях в веб файлы `cvs` необходимо поместить теги Id.
+====
+
+Этот скрипт теперь может быть помещен в домашний каталог каталог пользователя `web`, необходимо также добавить следующую запись man:crontab[1]:
+
+[.programlisting]
+....
+# Выполнять checkout web данных под меткой biba/low каждые 12 часов:
+0 */12 * * * web /home/web/checkout.sh
+....
+
+Эта запись будет извлекать HTML страницы каждые двенадцать часов.
+
+Метод запуска веб сервера по умолчанию также должен быть изменен для запуска процесса с меткой `biba/low`. Это может быть сделано путем следующего изменения в скрипте [.filename]#/usr/local/etc/rc.d/apache.sh#:
+
+[.programlisting]
+....
+command="setpmac biba/low /usr/local/sbin/httpd"
+....
+
+Настройки Apache должны быть изменены для работы с политикой `biba/low`. В этом случае необходимо указать для хранения лог файлов каталог с меткой `biba/low`, иначе будут возвращены ошибки `access denied`.
+
+[NOTE]
+====
+В этом примере необходимо указать в директиве `docroot` каталог [.filename]#/home/web/htdocs#; или, Apache не сможет найти каталог с документами.
+====
+
+Необходимо также изменить другие параметры конфигурации, включая PID файл, `Scoreboardfile`, `DocumentRoot`, или любые другие настройки для каталогов, где необходим доступ на запись. При использовании `biba` будет запрещен доступ на запись во все каталоги сервера, на которых нет метки `biba/low`.
+
+[[mac-troubleshoot]]
+== Решение проблем с инфраструктурой MAC
+
+На стадии разработки несколько пользователей сообщали о проблемах при обычных настройках. Некоторые из этих проблем приведены ниже:
+
+=== Параметр `multilabel` не может быть включен на [.filename]#/#
+
+Параметр `multilabel` не включается на моем корневом ([.filename]#/#) разделе!
+
+Похоже, что каждый пятидесятый пользователь сталкивается с этой проблемой; на самом деле, и у нас была эта проблема в первых настройках. Дальнейшие наблюдения за этой так называемой "ошибкой" привели меня к мнению, что это результат или некорректной документации, или неправильной интерпретации этой документации. Независимо от того, почему это случилось, для решения этой проблемы могут быть предприняты следующие шаги:
+
+[.procedure]
+====
+. Отредактируйте [.filename]#/etc/fstab# и установите для корневого раздела параметр только для чтения (`ro`).
+. Перегрузитесь в однопользовательский режим.
+. Запустите команду `tunefs -l enable` на [.filename]#/#.
+. Перегрузите систему в нормальный режим.
+. Запустите `mount -urw`[.filename]#/# и измените параметр `ro` обратно на `rw` в [.filename]#/etc/fstab#; перегрузите систему опять.
+. Дважды проверьте вывод `mount`, чтобы убедиться, что параметр `multilabel` был установлен на корневой файловой системе.
+====
+
+=== Не могу запустить XFree86(TM) после MAC
+
+После настройки системы безопасности MAC, я больше не могу запускать XFree86(TM)!
+
+Это может быть вызвано политикой MAC `partition` или путем неправильной установки меток одной из политик MAC. Для отладки попробуйте следующее:
+
+[.procedure]
+====
+. Просмотрите сообщение об ошибке; если пользователь находится в классе `insecure`, проблема может быть в политике `partition`. Попробуйте установить класс пользователя обратно в `default` и пересобрать базу данных командой `cap_mkdb`. Если это не решит проблемы, попробуйте шаг два.
+. Дважды проверьте политики с метками. Убедитесь, что политики настроены правильно для рассматриваемого пользователя, приложения XFree86(TM), и устройств в [.filename]#/dev#.
+. Если проблема не решена, отправьте сообщение об ошибке и описание вашей системы в список рассылки TrustedBSD, находящийся на веб сайте http://www.TrustedBSD.org[TrustedBSD] или в {freebsd-questions}.
+====
+
+=== Error: man:_secure_path[3] cannot stat [.filename]#.login_conf#
+
+При попытке переключения от `root` на другого пользователя системы, появляется сообщение об ошибке `_secure_path: unable to state .login_conf`.
+
+Это сообщение обычно показывается, когда у пользователя более высокая метка, чем у пользователя, которым он пытается стать. Например, у пользователя системы `joe` метка по умолчанию `biba/low`. Пользователь `root`, метка которого `biba/high`, не может просматривать домашний каталог пользователя `joe`. Это не зависит от того, использует ли пользователь `root` команду `su joe` или нет. В этом сценарии модель целостности Biba не позволит `root` просматривать объекты с низким уровнем целостности.
+
+=== Пользователя `root` нет!
+
+В нормальном или даже однопользовательском режиме `root` не обнаруживается. Команда `whoami` возвращает 0 (нуль) и `su` возвращает `who are you?`. Что можно сделать?
+
+Это может произойти, если политика с метками была отключена, или через man:sysctl[8], или путем выгрузки модуля политики. Если политика была постоянно или временно отключена, базу данных login необходимо перенастроить. Дважды проверьте [.filename]#login.conf#, чтобы убедиться, что все параметры `label` были удалены и пересоберите базу данных командой `cap_mkdb`.
diff --git a/documentation/content/ru/books/handbook/mail/_index.adoc b/documentation/content/ru/books/handbook/mail/_index.adoc
new file mode 100644
index 0000000000..224398adf1
--- /dev/null
+++ b/documentation/content/ru/books/handbook/mail/_index.adoc
@@ -0,0 +1,1047 @@
+---
+title: Глава 24. Электронная почта
+part: Часть IV. Сетевые коммуникации
+prev: books/handbook/ppp-and-slip
+next: books/handbook/network-servers
+---
+
+[[mail]]
+= Электронная почта
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 24
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../../images/books/handbook/mail/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/mail/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/mail/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[mail-synopsis]]
+== Краткий обзор
+
+"Электронная почта" называемая также email, является на сегодняшний день одним из самых популярных средств связи. Эта глава описывает основы работы с почтовым сервером в FreeBSD, а также введение в процесс отправки и получения почты в FreeBSD; однако, это не полноценный справочник и фактически в главу не вошло много важной информации. Более подробно эта тема рассмотрена во множестве прекрасных книг, список которых приведен в crossref:bibliography[bibliography,Библиография].
+
+После прочтения этой главы вы узнаете:
+
+* Какие программные компоненты задействованы в отправке и получении электронной почты.
+* Какие основные файлы настройки sendmail имеются в FreeBSD.
+* Разницу между удаленными и локальными почтовыми ящиками.
+* Как запретить спамерам использовать ваш почтовый сервер для пересылки почты.
+* Как установить и настроить альтернативный агент передачи почты (Mail Transfer Agent, MTA), заменив им sendmail.
+* Как разрешить наиболее часто встречающиеся проблемы с почтовым сервером.
+* Как настроить систему только для отправки почты.
+* Как использовать почту с коммутируемым подключением к сети.
+* Как настроить SMTP аутентификацию для дополнительной защиты.
+* Как установить и настроить почтовый агент пользователя (Mail User Agent, MUA), например mutt, для отправки и получения почты.
+* Как загрузить почту с удаленного POP или IMAP сервера.
+* Как автоматически применять фильтры и правила к входящей почте.
+
+Перед прочтением этой главы вам потребуется:
+
+* Правильно настроить сетевое подключение (crossref:advanced-networking[advanced-networking, Сложные вопросы работы в сети]).
+* Правильно настроить DNS для почтового сервера (crossref:network-servers[network-servers, Сетевые серверы]).
+* Знать как устанавливать дополнительное программное обеспечение сторонних разработчиков (crossref:ports[ports, Установка приложений. порты и пакеты]).
+
+[[mail-using]]
+== Использование электронной почты
+
+В работе почтовой системы задействованы пять основных частей: <<mail-mua,пользовательский почтовый клиент>> (Mail User Agent, MUA), <<mail-mta,почтовый сервис (даемон)>> (Mail Transfer Agent, MTA), <<mail-dns,сервер DNS>>, <<mail-receive,удаленный или локальный почтовый ящик>>, и конечно сам <<mail-host,почтовый сервер>>.
+
+[[mail-mua]]
+=== Пользовательский почтовый клиент
+
+Обычно, это программа типа mutt, alpine, elm, mail, а также программы с графическим интерфейсом, такие, как balsa или xfmail, или интегрированные приложения (например, какой-либо WWW браузер типа Netscape). Все эти программы общаются с локальным <<mail-host,почтовым сервером>>, вызывая какой-либо даемон, или напрямую по протоколу TCP.
+
+[[mail-mta]]
+=== Почтовый даемон
+
+FreeBSD по умолчанию поставляется с sendmail, но помимо того поддерживает множество других даемонов почтового сервера, вот лишь некоторые из них:
+
+* exim;
+* postfix;
+* qmail.
+
+Почтовый даемон выполняет только две функции: он отвечает за прием входящей почты и отправку исходящей. Он _не_ отвечает за выдачу почты по протоколам POP или IMAP, и не обеспечивает подключения к локальным почтовым ящикам [.filename]#mbox# или Maildir. Для этих целей вам может потребоваться дополнительный <<mail-receive,даемон>>.
+
+[WARNING]
+====
+
+Старые версии sendmail содержат некоторые серьезные ошибки безопасности, которые могут привести к получению атакующим локального и/или удаленного доступа к вашему компьютеру. Убедитесь, что вы работаете с современной версией, свободной от таких ошибок. Или установите альтернативный MTA из crossref:ports[ports,Коллекции Портов FreeBSD].
+====
+
+[[mail-dns]]
+=== Email и DNS
+
+Служба имен доменов (Domain Name System, DNS) и соответствующий ей даемон `named` играют важную роль в доставке почты. Для доставки почты с вашего сайта другому, даемон почтового сервера обратится к DNS для определения удаленного хоста, отвечающего за доставку почты по назначению. Тот же процесс происходит при доставке почты с удаленного хоста на ваш почтовый сервер.
+
+DNS отвечает за сопоставления имен хостов IP адресам, как и за хранение информации, предназначенной для доставки почты, известной как MX записи. Запись MX (Mail eXchanger) определяет хост или хосты, которые будут получать почту для определенного домена. Если для вашего имени хоста или домена нет записи MX, почта будет доставлена непосредственно на ваш хост, IP адрес которого определен в записи A.
+
+Вы можете просмотреть MX записи для любого домена с помощью команды man:host[1], как показано в примере ниже:
+
+[source,bash]
+....
+% host -t mx FreeBSD.org
+FreeBSD.org mail is handled (pri=10) by mx1.FreeBSD.org
+....
+
+[[mail-receive]]
+=== Получение почты
+
+Получение почты для вашего домена выполняет почтовый сервер. Он сохраняет отправленную в ваш домен почту в формате либо [.filename]#mbox# (это метод по умолчанию), либо Maildir, в зависимости от настроек. После сохранения почты ее можно либо прочитать локально, используя такие приложения как man:mail[1], mutt, или удаленно, по таким протоколам как POP или IMAP. Это означает, что для локального чтения почты вам не потребуется устанавливать сервер POP или IMAP.
+
+[[pop-and-imap]]
+==== Доступ к удаленным почтовым ящикам по протоколам POP и IMAP
+
+Для удаленного доступа к почтовым ящикам вам потребуется доступ к POP или IMAP серверу. Хотя удаленный доступ обеспечивают оба протокола POP и IMAP, последний предоставляет множество дополнительных возможностей, вот некоторые из них:
+
+* IMAP может как хранить сообщения на удаленном сервере, так и забирать их.
+* IMAP поддерживает одновременные обновления.
+* IMAP может быть очень полезен для низкоскоростных соединений, поскольку позволяет пользователям получить структуру сообщений без их загрузки; он также может использоваться для выполнения таких задач как поиск на сервере, для минимизации объема передаваемых между клиентом и сервером данных.
+
+Для установки POP или IMAP сервера необходимо выполнить следующие действия:
+
+[.procedure]
+====
+. Выберите IMAP или POP сервер, который подходит вам наилучшим образом. Следующие POP и IMAP серверы хорошо известны и могут быть приведены в качестве примера:
+
+** qpopper;
+** teapop;
+** imap-uw;
+** courier-imap;
+** dovecot;
+
+. Установите POP или IMAP даемон, выбранный из Коллекции Портов.
+. Если потребуется, настройте [.filename]#/etc/inetd.conf# для запуска POP или IMAP сервера.
+====
+
+[WARNING]
+====
+
+Необходимо отметить, что и POP и IMAP серверы передают информацию, включая имя пользователя и пароль, в незашифрованном виде. Это означает, что если вы хотите защитить передачу информации по этим протоколам, потребуется использовать туннелирование сессий через man:ssh[1] или при помощи SSL. Туннелирование соединений описано в crossref:security[security-ssh-tunneling,Туннелирование SSH], а SSL - в crossref:security[openssl,OpenSSL].
+====
+
+[[local]]
+==== Доступ к локальным почтовым ящикам
+
+Доступ к почтовым ящикам может быть осуществлен непосредственно путем использования MUA на сервере, где эти ящики расположены. Это можно сделать используя приложения вроде mutt или man:mail[1].
+
+[[mail-host]]
+=== Почтовый хост
+
+Почтовый хост это сервер, который отвечает за отправку и получение почты для вашего компьютера, и возможно, для всей вашей сети.
+
+[[sendmail]]
+== Настройка sendmail
+
+В FreeBSD по умолчанию программой передачи почты (Mail Transfer Agent, MTA) является man:sendmail[8]. Работа sendmail заключается в приеме почты от почтовых программ пользователей (Mail User Agents, MUA) и отправке ее на соответствующий адрес, в соответствии с имеющимися настройками. sendmail может также принимать входящие соединения по сети и доставлять почту в локальные почтовые ящики или перенаправлять их другой программе.
+
+sendmail использует следующие файлы настройки:
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Имя файла
+| Назначение
+
+|[.filename]#/etc/mail/access#
+|Файл базы данных доступа sendmail
+
+|[.filename]#/etc/mail/aliases#
+|Синонимы почтовых ящиков
+
+|[.filename]#/etc/mail/local-host-names#
+|Список хостов, для которых sendmail принимает почту
+
+|[.filename]#/etc/mail/mailer.conf#
+|Настройки почтовой программы
+
+|[.filename]#/etc/mail/mailertable#
+|Таблица доставки почтовой программы
+
+|[.filename]#/etc/mail/sendmail.cf#
+|Основной файл настройки sendmail
+
+|[.filename]#/etc/mail/virtusertable#
+|Таблицы виртуальных пользователей и доменов
+|===
+
+=== [.filename]#/etc/mail/access#
+
+База данных доступа определяет список хостов или IP адресов, имеющих доступ к локальному почтовому серверу, а также тип предоставляемого доступа. Хосты могут быть перечислены как `OK`, `REJECT`, `RELAY` или просто переданы процедуре обработки ошибок sendmail с заданным сообщением об ошибке. Хостам, перечисленным с параметром по умолчанию `OK`, разрешено отправлять почты на этот хост, если адрес назначения почты принадлежит локальной машине. Все почтовые соединения от хостов, перечисленных с параметром `REJECT`, отбрасываются. Для хостов, перечисленных с параметром `RELAY`, разрешена передача через этот сервер почты с любым адресом назначения.
+
+.Настройка базы данных доступа sendmail
+[example]
+====
+[.programlisting]
+....
+cyberspammer.com 550 We do not accept mail from spammers
+FREE.STEALTH.MAILER@ 550 We do not accept mail from spammers
+another.source.of.spam REJECT
+okay.cyberspammer.com OK
+128.32 RELAY
+....
+
+====
+
+В этом примере приведены пять записей. К отправителям, чей адрес соответствует записи в левой части таблицы, применяется правило записанное в правой части таблицы. В первых двух примерах код ошибки будет передан процедуре обработке ошибок sendmail. В этом случае на удаленном хосте будет получено соответствующее сообщение. В следующем примере почта отбрасывается почта от определенного хоста, `another.source.of.spam`. В четвертом примере разрешается прием почты от хоста `okay.cyberspammer.com`, имя которого более точно совпадает с этой записью, чем с `cyberspammer.com` в примере выше. При более точном совпадении правила перезаписываются. В последнем примере разрешается пересылка почты от хостов с IP адресами, начинающимися с `128.32`. Эти хосты смогут отправлять почту через этот почтовый сервер для других почтовых серверов.
+
+После изменения этого файла для обновления базы данных вам потребуется запустить `make` в каталоге [.filename]#/etc/mail/#.
+
+=== [.filename]#/etc/mail/aliases#
+
+База данных синонимов содержит список виртуальных почтовых ящиков, принадлежащих другим пользователям, файлам, программам, или другим синонимам. Вот несколько примеров, которые могут быть использованы для [.filename]#/etc/mail/aliases#:
+
+.Mail Aliases
+[example]
+====
+[.programlisting]
+....
+root: localuser
+ftp-bugs: joe,eric,paul
+bit.bucket: /dev/null
+procmail: "|/usr/local/bin/procmail"
+....
+
+====
+
+Формат файла прост; имя почтового ящика слева от двоеточия сопоставляется назначению(ям) справа. В первом примере производится сопоставление почтового ящика `root` почтовому ящику `localuser`, для которого затем опять будет произведен поиск в базе данных синонимов. Если совпадений не обнаружится, сообщение будет доставлено локальному пользователю `localuser`. В следующем примере приведен список рассылки. Почта на адрес `ftp-bugs` рассылается на три локальных почтовых ящика: `joe`, `eric` и `paul`. Обратите внимание, что удалённый почтовый ящик может быть задан в виде mailto:user@example.com[user@example.com]. В следующем примере показана запись почты в файл, в данном случае [.filename]#/dev/null#. И в последнем примере показано отправление почты программе, в данном случае почтовое сообщение переправляется через канал UNIX(R) на стандартный вход [.filename]#/usr/local/bin/procmail#.
+
+После обновления этого файла вам потребуется запустить `make` в каталоге [.filename]#/etc/mail/# для обновления базы данных.
+
+=== [.filename]#/etc/mail/local-host-names#
+
+В этом файле находится список имен хостов, принимаемых программой man:sendmail[8] в качестве локальных. Поместите в этот файл любые домены или хосты, для которых sendmail должен принимать почту. Например, если этот почтовый сервер должен принимать почту для домена `example.com` и хоста `mail.example.com`, его файл [.filename]#local-host-names# может выглядеть примерно так:
+
+[.programlisting]
+....
+example.com
+mail.example.com
+....
+
+После обновления этого файла необходимо перезапустить man:sendmail[8], чтобы он смог перечитать изменения.
+
+=== [.filename]#/etc/mail/sendmail.cf#
+
+Основной файл настройки sendmail, [.filename]#sendmail.cf# управляет общим поведением sendmail, включая все, от перезаписи почтовых адресов до отправки удаленным серверам сообщений об отказе от пересылки почты. Конечно, файл настройки с таким многообразием возможностей очень сложен и подробное его описание выходит за рамки данного раздела. К счастью, для стандартных почтовых серверов изменять этот файл придется не часто.
+
+Основной файл настройки sendmail может быть собран из макроса man:m4[1], определяющего возможности и поведение sendmail. Подробнее этот процесс описан в файле [.filename]#/usr/src/contrib/sendmail/cf/README#.
+
+Для применения изменений после правки файла необходимо перезапустить sendmail.
+
+=== [.filename]#/etc/mail/virtusertable#
+
+Файл [.filename]#virtusertable# сопоставляет виртуальные почтовые домены и почтовые ящики реальным почтовым ящикам. Эти почтовые ящики могут быть локальными, удаленными, синонимами, определенными в [.filename]#/etc/mail/aliases#, или файлами.
+
+.Пример таблицы виртуального домена
+[example]
+====
+[.programlisting]
+....
+root@example.com root
+postmaster@example.com postmaster@noc.example.net
+@example.com joe
+....
+
+====
+
+В примере выше мы видим сопоставление адресов для домена `example.com`. Почта обрабатывается по первому совпадению с записью в этом файле. Первая запись сопоставляет адрес mailto:root@example.com[root@example.com] локальному почтовому ящику `root`. Вторая запись сопоставляет mailto:postmaster@example.com[postmaster@example.com] локальному почтовому ящику `postmaster` на хосте `noc.example.net`. Наконец, до этого момента адрес в домене `example.com` не совпал ни с одним из предыдущих, будет применено последнее сопоставление, в которому соответствует всякое другое почтовое сообщение, отправленное на любой адрес в `example.com`. Это сообщение будет доставлено в локальный почтовый ящик `joe`.
+
+[[mail-changingmta]]
+== Установка другой почтовой программы
+
+Как уже упоминалось, FreeBSD поставляется с MTA (Mail Transfer Agent) sendmail. Следовательно, по умолчанию именно эта программа отвечает за вашу исходящую и входящую почту.
+
+Однако, по различным причинам некоторые системные администраторы заменяют системный MTA. Эти причины варьируются от простого желания попробовать другой MTA до потребности в определенных возможностях пакета, основанного на другой почтовой программе. К счастью, вне зависимости от причины, в FreeBSD такая замена выполняется просто.
+
+=== Установка нового MTA
+
+Вам предоставлен широкий выбор MTA. Начните с поиска в crossref:ports[ports,Коллекции Портов FreeBSD], где их немало. Конечно, вы можете использовать любой MTA по желанию, взятый откуда угодно, если только сможете запустить его под FreeBSD.
+
+Начните с установки нового MTA. После установки у вас будет возможность решить, действительно ли он подходит вашем нуждам, а также настроить новое программное обеспечение перед тем, как заменить им sendmail. При установке новой программы убедитесь, что она не пытается перезаписать системные файлы, такие как [.filename]#/usr/bin/sendmail#. Иначе ваша новая почтовая программа фактически начнет работать до того, как вы ее настроите.
+
+Обратитесь к документации на выбранный MTA за информацией по его настройке.
+
+[[mail-disable-sendmail]]
+=== Отключение sendmail
+
+[WARNING]
+====
+
+Если вы отключите сервис исходящей почты sendmail, необходимо заменить его альтернативной системой доставки почты. Если вы не сделаете этого, системные программы, такие как man:periodic[8], не смогут отправлять сообщения по электронной почте как обычно. Многие программы в вашей системе могут требовать наличия функционирующей sendmail-совместимой системы. Если приложения будут продолжать использовать программу sendmail для отправки почты после того, как вы её отключили, почта может попасть в неактивную очередь sendmail и никогда не будет доставлена.
+====
+
+Для полного отключения sendmail, включая сервис исходящей почты, используйте
+
+[.programlisting]
+....
+sendmail_enable="NO"
+sendmail_submit_enable="NO"
+sendmail_outbound_enable="NO"
+sendmail_msp_queue_enable="NO"
+....
+
+в [.filename]#/etc/rc.conf#.
+
+Если вы хотите отключить только сервис входящей почты sendmail, установите
+
+[.programlisting]
+....
+sendmail_enable="NO"
+....
+
+в [.filename]#/etc/rc.conf#. Дополнительная информация о параметрах запуска sendmail доступна на странице справочника man:rc.sendmail[8].
+
+=== Запуск нового MTA при загрузке
+
+Новый МТА можно запускать автоматически при загрузке системы добавив соответствующую строку в [.filename]#/etc/rc.conf#. Ниже приведен пример для postfix:
+
+[source,bash]
+....
+# echo 'postfix_enable=<<YES>>' >> /etc/rc.conf
+....
+
+С этого момента МТА будет запускаться автоматически во время загрузки системы.
+
+=== Замещение sendmail как почтовой программы по умолчанию
+
+Программа sendmail настолько распространена в качестве стандартной программы для систем UNIX(R), что многие программы считают, что она уже установлена и настроена. По этой причине многие альтернативные MTA предоставляют собственные совместимые реализации интерфейса командной строки sendmail; это облегчает их использование в качестве "прозрачной" замены sendmail.
+
+Поэтому если вы используете альтернативную почтовую программу, потребуется убедиться, что когда программное обеспечение пытается выполнить стандартные исполняемые файлы sendmail, такие как [.filename]#/usr/bin/sendmail#, на самом деле выполняются программы вновь установленной почтовой системы. К счастью, FreeBSD предоставляет систему, называемую man:mailwrapper[8], которая выполняет эту работу за вас.
+
+Когда установлен sendmail, файл [.filename]#/etc/mail/mailer.conf# выглядит примерно так:
+
+[.programlisting]
+....
+sendmail /usr/libexec/sendmail/sendmail
+send-mail /usr/libexec/sendmail/sendmail
+mailq /usr/libexec/sendmail/sendmail
+newaliases /usr/libexec/sendmail/sendmail
+hoststat /usr/libexec/sendmail/sendmail
+purgestat /usr/libexec/sendmail/sendmail
+....
+
+Это означает, что когда выполняется какая-то из этих стандартных программ (например сам [.filename]#sendmail#), система на самом деле вызывает копию mailwrapper, называемую [.filename]#sendmail#, которая обращается к [.filename]#mailer.conf# и выполняет вместо этого [.filename]#/usr/libexec/sendmail/sendmail#. Такая схема делает простой замену программ, которые на самом деле выполняются, когда вызываются стандартные функции [.filename]#sendmail#.
+
+Поэтому если вы хотите выполнять [.filename]#/usr/local/supermailer/bin/sendmail-compat# вместо sendmail, отредактируйте [.filename]#/etc/mail/mailer.conf# так:
+
+[.programlisting]
+....
+sendmail /usr/local/supermailer/bin/sendmail-compat
+send-mail /usr/local/supermailer/bin/sendmail-compat
+mailq /usr/local/supermailer/bin/mailq-compat
+newaliases /usr/local/supermailer/bin/newaliases-compat
+hoststat /usr/local/supermailer/bin/hoststat-compat
+purgestat /usr/local/supermailer/bin/purgestat-compat
+....
+
+=== Запуск новой почтовой программы
+
+Как только вы все настроили, потребуется или уничтожить процесс sendmail, который уже не нужен и запустить новую почтовую программу, или просто перегрузить систему. Перезагрузка также даст вам возможность проверить, правильно ли настроена система для автоматического запуска MTA при загрузке.
+
+[[mail-trouble]]
+== Поиск и устранение неисправностей
+
+=== Почему я должен использовать FQDN для хостов вне моей подсети?
+
+Вы, видимо, обнаружили, что хост, к которому вы обратились, оказался на самом деле в другом домене; например, если вы находитесь в домене `foo.bar.edu` и хотите обратиться к хосту `mumble` в домене `bar.edu`, то должны указать его полное доменное имя, `mumble.bar.edu`, а не просто `mumble`.
+
+Традиционно, программа разрешения имен BSD BIND позволяла это делать. Однако, текущая версия BIND, поставляемая с FreeBSD, больше не добавляет имена доменов, отличающихся от того, в котором вы находитесь, для не полностью указанных имен хостов. То есть, имя `mumble` будет опознан как `mumble.foo.bar.edu` или будет искаться в корневом домене.
+
+Это отличается от предыдущего поведения, при котором поиск продолжался в доменах `mumble.bar.edu` и `mumble.edu`. Если вам интересны причины объявления такого поведения плохой практикой и даже ошибкой в безопасности, обратитесь к RFC 1535.
+
+Хорошим решением будет поместить строку
+
+[.programlisting]
+....
+search foo.bar.edu bar.edu
+....
+
+вместо ранее используемой:
+
+[.programlisting]
+....
+domain foo.bar.edu
+....
+
+в файл [.filename]#/etc/resolv.conf#. Однако удостоверьтесь, что порядок поиска не нарушает "границ полномочий между локальным и внешним администрированием", в терминологии RFC 1535.
+
+=== sendmail выдает ошибку mail loops back to myself
+
+В FAQ по sendmail дан следующий ответ:
+
+[.programlisting]
+....
+Я получаю такие сообщения об ошибке:
+
+553 MX list for domain.net points back to relay.domain.net
+554 <user@domain.net>... Local configuration error
+
+Как можно решить эту проблему?
+
+Согласно записям MX, почта для домена domain.net перенаправляется на хост
+relay.domain.net, однако последний не распознается как
+domain.net. Добавьте domain.net в файл
+/etc/mail/local-host-names
+[известный как /etc/sendmail.cw до версии 8.10]
+(если вы используете
+FETURE(use_cw_file)) или добавьте Cw domain.net в файл
+/etc/mail/sendmail.cf.
+....
+
+FAQ по sendmail можно найти на http://www.sendmail.org/faq/[http://www.sendmail.org/faq/] и рекомендуется прочесть его при желании произвести некоторые "усовершенствования" настроек почтовой системы.
+
+=== Как организовать работу почтового сервера при коммутируемом соединении с Интернет?
+
+Вы хотите подключить к интернет компьютер с FreeBSD, работающий в локальной сети. Компьютер с FreeBSD будет почтовым шлюзом для локальной сети. PPP соединение не выделенное.
+
+Существует как минимум два пути, чтобы сделать это. Один способ это использование UUCP.
+
+Другой способ это использование постоянно работающего интернет сервера для обеспечения вторичного MX сервиса вашего домена. Например, домен вашей компании `example.com`, и провайдер интернет настроил `example.net` для обеспечения вторичного MX сервиса:
+
+[.programlisting]
+....
+example.com. MX 10 example.com.
+ MX 20 example.net.
+....
+
+Только один хост должен быть указан в качестве последнего получателя (добавьте запись `Cw example.com` в файл [.filename]#/etc/mail/sendmail.cf# на машине `example.com`).
+
+Когда программа `sendmail` (со стороны отправителя) "захочет" доставить почту, она попытается соединиться с вашим хостом (`example.com`) через модемное подключение. Скорее всего, ей это не удастся (вы, вероятнее всего, не будете подключены к интернет). Программа sendmail автоматически перейдет ко вторичному MX серверу, т.е. вашему провайдеру (`example.net`). Вторичный MX сервер будет периодически пытаться соединиться с вашим хостом и доставить почту на основной сервер MX (`example.com`).
+
+Вы можете воспользоваться следующим сценарием, чтобы забирать почту каждый раз, когда вы входите в систему:
+
+[.programlisting]
+....
+#!/bin/sh
+# Put me in /usr/local/bin/pppmyisp
+( sleep 60 ; /usr/sbin/sendmail -q ) &
+/usr/sbin/ppp -direct pppmyisp
+....
+
+Если же вы хотите написать отдельный пользовательский скрипт, лучше воспользоваться командой `sendmail -qRexample.com` вместо вышеприведенного сценария, так как в этом случае вся почта в очереди для хоста `example.com` будет обработана немедленно.
+
+Рассмотрим эту ситуацию подробнее:
+
+Вот пример сообщения из link:{freebsd-isp-url}[freebsd-isp].
+
+[.programlisting]
+....
+> Мы предоставляем вторичный MX для наших клиентов. Вы соединяетесь
+> с нашим сервером несколько раз в день, чтобы забрать почту для вашего
+> первичного (главного) MX (мы не соединяемся с ним каждый раз, когда
+> приходит новая почта для его доменов). Далее, sendmail отправляет
+> почту, находящуюся в очереди каждые 30 минут, и клиент должен быть
+> подключен к Интернет в течении 30 минут, чтобы удостовериться, что
+> вся почта ушла на основной MX-сервер.
+>
+> Может быть, есть какая-либо команда, которая заставит sendmail
+> немедленно отправить все почту, находящуюся в очереди? Естественно,
+> пользователи не обладают какими-либо повышенными привилегиями на
+> нашем сервере.
+
+В разделе privacy flags файла
+sendmail.cf, определяется опция
+Opgoaway,restrictqrun
+
+Уберите restrictqrun, чтобы разрешить рядовым
+пользователям инициировать работу с очередью. Вам также может понадобиться
+изменить порядок MX-серверов. Так, если вы предоставляете первый (основной)
+MX-сервер для ваши пользователей, мы указываем:
+
+# If we are the best MX for a host, try directly instead of generating
+# local config error.
+OwTrue
+
+Таким образом, удаленный хост будет доставлять почту непосредственно к вам,
+не пытаясь установить соединение с клиентом. Затем уже вы, в свою очередь,
+отсылаете ее клиенту. Удостоверьтесь, что в DNS есть записи про
+customer.com и hostname.customer.com. Просто
+добавьте запись A в DNS для customer.com.
+....
+
+=== Почему я продолжаю получать ошибки Relaying Denied при отправки почты через другие хосты?
+
+В установке FreeBSD по умолчанию, sendmail настроен для отправки почты только от хоста, на котором он работает. Например, если доступен POP сервер, пользователи смогут проверять почту из школы, с работы или других удаленных точек, но не смогут отправлять письма. Обычно, через некоторое время после попытки будет отправлено письмо от MAILER-DAEMON с сообщением об ошибке `5.7 Relaying Denied`.
+
+Есть несколько путей разрешения этой ситуации. Самый прямой путь это использование адреса вашего провайдера в файле relay-domains, расположенном в [.filename]#/etc/mail/relay-domains#. Быстрый способ сделать это:
+
+[source,bash]
+....
+# echo "your.isp.example.com" > /etc/mail/relay-domains
+....
+
+После создания или редактирования этого файла вы должны перезапустить sendmail. Это отлично работает, если вы администратор сервера и не хотите отправлять почту локально, или хотите воспользоваться почтовым клиентом/системой на другом компьютере или даже через другого провайдера. Это также очень полезно, если у вас настроены одна или две почтовые записи. Если необходимо добавить несколько адресов, вы можете просто открыть этот файл в текстовом редакторе и добавить домены, по одному на строку:
+
+[.programlisting]
+....
+your.isp.example.com
+other.isp.example.net
+users-isp.example.org
+www.example.org
+....
+
+Теперь будет отправляться любая почта, посылаемая через вашу систему любым хостом из этого списка (предоставляемого пользователем, имеющим учетную запись в вашей системе). Это отличный способ разрешить пользователям отправлять почту через вашу систему удаленно, одновременно он блокирует отправку спама.
+
+[[mail-advanced]]
+== Расширенное руководство
+
+В следующем разделе рассматриваются более сложные темы, такие как настройка почты и включение почтовой системы для всего домена.
+
+[[mail-config]]
+=== Базовая конфигурация
+
+Изначально, вы можете отправлять почту "во внешний мир" если правильно составлен файл [.filename]#/etc/resolv.conf# или запущен свой сервер имен. Если вы хотите, чтобы почта, предназначенная для хоста в вашем домене, доставлялась MTA (например, sendmail) на вашем хосте FreeBSD, есть два пути:
+
+* Запустите свой собственный сервер DNS, тем самым организовав собственный домен, например, `FreeBSD.org`
+* Получайте почту для вашего хоста непосредственно. Это работает при доставке почты непосредственно на DNS имя вашей машины. Например, `example.FreeBSD.org`.
+
+Независимо от выбранного из предложенных выше вариантов, для доставки почты непосредственно на ваш хост у него должен быть постоянный IP адрес (а не динамический, как у большинства PPP соединений). Если вы находитесь за брандмауэром, то последний должен пропускать SMTP-пакеты. Если вы хотите, чтобы почта приходила непосредственно на ваш хост, необходимо убедиться в одном из двух:
+
+* Убедитесь, что запись (с наименьшим номером) MX в DNS соответствует IP адресу вашего хоста.
+* Убедитесь, что в DNS для вашего хоста вообще отсутствует MX-запись.
+
+Выполнение любого из перечисленных условий обеспечит доставку почты для вашего хоста.
+
+Попробуйте это:
+
+[source,bash]
+....
+# hostname
+example.FreeBSD.org
+# host example.FreeBSD.org
+example.FreeBSD.org has address 204.216.27.XX
+....
+
+Если вы это видите, то можно без проблем посылать почту на fmailto:yourlogin@example.FreeBSD.org[yourlogin@example.FreeBSD.org] (предполагается, что sendmail на `example.FreeBSD.org` работает правильно).
+
+Однако, если вы видите это:
+
+[source,bash]
+....
+# host example.FreeBSD.org
+example.FreeBSD.org has address 204.216.27.XX
+example.FreeBSD.org mail is handled (pri=10) by hub.FreeBSD.org
+....
+
+то вся почта, посланная на `example.FreeBSD.org` будет собираться на `hub` (для того же пользователя), вместо того, чтобы быть отосланной непосредственно на ваш хост.
+
+Эта информация обрабатывается вашим DNS сервером. Соответствующая запись DNS, указывающая, через какой хост будет проходить ваша почта, называется MX (__M__ail e__X__changer). Если для хоста отсутствует такая запись, почта будет приходить прямо на этот хост.
+
+Допустим, что запись MX для хоста `freefall.FreeBSD.org` в какой-то момент выглядела так:
+
+[.programlisting]
+....
+freefall MX 30 mail.crl.net
+freefall MX 40 agora.rdrop.com
+freefall MX 10 freefall.FreeBSD.org
+freefall MX 20 who.cdrom.com
+....
+
+Вы видите, что для хоста `freefall` существуют несколько MX-записей. Запись с наименьшим номером соответствует хосту, получающему почту непосредственно, если он доступен; если он недоступен по каким-то причинам, другие сервера (иногда называемые ("резервными MX") временно получают почту, и хранят ее пока не станут доступны хосты с меньшими номерами, в конечном итоге отправляя почту на эти хосты.
+
+Чтобы альтернативные MX-хосты использовались наиболее эффективно, они должны быть независимо подключены к Интернет. Ваш провайдер (или дружественный сайт) скорее всего без проблем сможет оказать подобные услуги.
+
+[[mail-domain]]
+=== Почта для вашего домена
+
+Для настройки "почтового хоста" (почтовый сервер) вам потребуется, чтобы почта, направляемая различным рабочим станциям, пересылалась этому хосту. Обычно вам необходима доставка всей почты для любого хоста вашего домена (в данном случае `*.FreeBSD.org`) на почтовый сервер, чтобы пользователи могли получать свою почту на с этого сервера.
+
+Чтобы облегчить себе (и другим) жизнь, создайте на обеих машинах учетные записи с одинаковыми именами пользователей, например, с помощью команды man:adduser[8].
+
+Сервер, который вы будете использовать в качестве почтового, должен быть объявлен таковым для каждой машины в домене. Вот фрагмент примерной конфигурации:
+
+[.programlisting]
+....
+example.FreeBSD.org A 204.216.27.XX ; Рабочая станция
+ MX 10 hub.FreeBSD.org ; Почтовый шлюз
+....
+
+Таким образом, вся корреспонденция, адресованная рабочей станции, будет обрабатываться вашим почтовым сервером, независимо от того, что указано в A-записи.
+
+Все это можно реализовать только в том случае, если вы используете сервер DNS. Если вы по каким-либо причинам не имеете возможности установить свой собственный сервер имен, необходимо договориться с провайдером или теми, кто поддерживает ваш DNS.
+
+Если вы хотите поддерживать несколько виртуальных почтовых серверов, может пригодиться следующая информация. Допустим, что ваш клиент зарезервировал домен, например, `customer1.org`, и вам требуется, чтобы почта, предназначенная для `customer1.org` приходила на ваш хост, например, `mail.myhost.com`. В таком случае, DNS должен выглядеть так:
+
+[.programlisting]
+....
+customer1.org MX 10 mail.myhost.com
+....
+
+Заметьте, что если вам требуется только получать почту для домена, соответствующая A-запись _не_ нужна.
+
+[NOTE]
+====
+Помните, что если вы попытаетесь каким-либо образом обратиться к хосту `customer1.org`, у вас вряд ли что-либо получится, если нет A-записи для этого хоста.
+====
+
+Последнее, что вы должны сделать - это сказать программе sendmail, для каких доменов и/или хостов она должна принимать почту. Это можно сделать несколькими способами:
+
+* Добавьте названия этих хостов в файл [.filename]#/etc/mail/local-host-names#, если вы используете `FEATURE(use_cw_file)`. Если у вас sendmail версии ниже 8.10, необходимо отредактировать файл [.filename]#/etc/sendmail.cw#.
+* Добавьте строку `Cwyour.host.com` в файл [.filename]#/etc/sendmail.cf# или [.filename]#/etc/mail/sendmail.cf# (если у вас sendmail версии 8.10 или более поздней).
+
+[[outgoing-only]]
+== Настройка почты только для отправки
+
+Существует множество случаев, когда может потребоваться только отправка почты через почтовый сервер. Вот отдельные примеры:
+
+* У вас настольный компьютер, но вы хотите использовать такие программы как man:send-pr[1]. Для пересылки почты вам потребуется использовать почтовый сервер провайдера.
+* Ваш компьютер является сервером, где почта не хранится локально, необходима только переправка всей почты через внешний почтовый сервер.
+
+Практически любой MTA способен работать и в этих условиях. К сожалению, может быть очень сложно правильно настроить полноценный MTA для работы только с исходящей почтой. Такие программы, как sendmail и postfix слишком избыточны для этих целей.
+
+К тому же, если вы используете обычные средства доступа в интернет, условий для запуска "почтового сервера" может быть недостаточно.
+
+Простейшим способом удовлетворить имеющиеся потребности может быть установка порта package:mail/ssmtp[]. Выполните под `root` следующие команды:
+
+[source,bash]
+....
+# cd /usr/ports/mail/ssmtp
+# make install replace clean
+....
+
+После установки потребуется настроить package:mail/ssmtp[] с помощью файла из четырех строк, расположенного в [.filename]#/usr/local/etc/ssmtp/ssmtp.conf#:
+
+[.programlisting]
+....
+root=yourrealemail@example.com
+mailhub=mail.example.com
+rewriteDomain=example.com
+hostname=_HOSTNAME_
+....
+
+Убедитесь, что используете существующий почтовый адрес для `root`. Введите сервер вашего провайдера для пересылки исходящей почты вместо `mail.example.com` (некоторые провайдеры называют его "сервером исходящей почты" или "SMTP сервером").
+
+Убедитесь, что вы выключили sendmail, включая сервис исходящей почты. За подробностями обращайтесь к <<mail-disable-sendmail>>.
+
+У пакета package:mail/ssmtp[] имеются и другие параметры. Обратитесь к файлу с примером настройки в [.filename]#/usr/local/etc/ssmtp# или к странице справочника ssmtp за примерами и дополнительной информацией.
+
+Установка ssmtp таким способом позволит правильно работать любым программам на вашем компьютере, которым требуется отправка почты, но не нарушит политику вашего провайдера и не позволит вашему компьютеру быть использованным спамерами.
+
+[[SMTP-dialup]]
+== Использование почты с коммутируемым соединением
+
+Если у вас есть статический IP, настройки по умолчанию менять не потребуется. Установите имя хоста в соответствии с присвоенным именем интернет и sendmail будет делать свою работу.
+
+Если у вас динамический IP адрес и используется коммутируемое PPP соединение с интернет, у вас возможно уже есть почтовый ящик на сервере провайдера. Предположим, что домен провайдера называется `example.net`, и что ваше имя пользователя `user`, ваш компьютер называется `bsd.home`, и провайдер сообщил вам, что возможно использование `relay.example.net` в качестве сервера для пересылки почты.
+
+Для получения почты из почтового ящика необходима установка соответствующей программы. Хорошим выбором является утилита fetchmail, она поддерживает множество различных протоколов. Эта программа доступна в виде пакета или из Коллекции Портов (package:mail/fetchmail[]). Обычно провайдер предоставляет доступ по протоколу POP. Если вы работаете с пользовательским PPP, то можете автоматически забирать почту после установления соединения с интернет с помощью следующей записи в [.filename]#/etc/ppp/ppp.linkup#:
+
+[.programlisting]
+....
+MYADDR:
+!bg su user -c fetchmail
+....
+
+Если вы используете sendmail (как показано ниже) для доставки почты к не-локальным учетным записям, вам возможно потребуется обработка почтовой очереди sendmail сразу после установки соединения с интернет. Для выполнения этой работы поместите в [.filename]#/etc/ppp/ppp.linkup# следующую команду сразу после `fetchmail`:
+
+[.programlisting]
+....
+ !bg su user -c "sendmail -q"
+....
+
+Предполагается, что учетная запись для `user` существует на `bsd.home`. В домашнем каталоге `user` на `bsd.home`, создайте файл [.filename]#.fetchmailrc#:
+
+[.programlisting]
+....
+poll example.net protocol pop3 fetchall pass MySecret
+....
+
+Этот файл не должен быть доступен на чтение никому, кроме `user`, поскольку в нем находится пароль `MySecret`.
+
+Для отправки почты с правильным заголовком `from:`, вам потребуется сообщить sendmail использовать mailto:user@example.net[user@example.net] вместо mailto:user@bsd.home[user@bsd.home]. Вы можете также указать sendmail отправлять почту через `relay.example.net`, для более быстрой пересылки почты.
+
+Должен подойти следующий файл [.filename]#.mc#:
+
+[.programlisting]
+....
+VERSIONID(`bsd.home.mc version 1.0')
+OSTYPE(bsd4.4)dnl
+FEATURE(nouucp)dnl
+MAILER(local)dnl
+MAILER(smtp)dnl
+Cwlocalhost
+Cwbsd.home
+MASQUERADE_AS(`example.net')dnl
+FEATURE(allmasquerade)dnl
+FEATURE(masquerade_envelope)dnl
+FEATURE(nocanonify)dnl
+FEATURE(nodns)dnl
+define(`SMART_HOST', `relay.example.net')
+Dmbsd.home
+define(`confDOMAIN_NAME',`bsd.home')dnl
+define(`confDELIVERY_MODE',`deferred')dnl
+....
+
+Обратитесь к предыдущему разделу за информацией о том, как преобразовать этот файл [.filename]#.mc# в файл [.filename]#sendmail.cf#. Не забудьте также перезапустить sendmail после обновления [.filename]#sendmail.cf#.
+
+[[SMTP-Auth]]
+== SMTP аутентификация
+
+Наличие SMTP аутентификации на почтовом сервере дает множество преимуществ. SMTP аутентификация может добавить дополнительный уровень безопасности к sendmail, и позволяет мобильным пользователям, подключающимся к разным хостам, возможность использовать тот же почтовый сервер без необходимости перенастройки почтового клиента при каждом подключении.
+
+[.procedure]
+====
+
+. Установите package:security/cyrus-sasl2[] из портов. Вы можете найти этот порт в package:security/cyrus-sasl2[]. В пакете package:security/cyrus-sasl2[] есть множество параметров компиляции. Для используемого здесь метода SMTP аутентификации убедитесь, что параметр `LOGIN` не отключен.
+. После установки package:security/cyrus-sasl2[], отредактируйте [.filename]#/usr/local/lib/sasl2/Sendmail.conf# (или создайте его если он не существует) и добавьте следующую строку:
++
+[.programlisting]
+....
+pwcheck_method: saslauthd
+....
++
+. Затем установите package:security/cyrus-sasl2-saslauthd[] и добавьте в [.filename]#/etc/rc.conf# следующую строку:
++
+[.programlisting]
+....
+saslauthd_enable="YES"
+....
++
+а затем запустите saslauthd:
++
+[source,bash]
+....
+# service saslauthd start
+....
++
+Этот даемон является посредником для аутентификации sendmail через базу данных [.filename]#passwd# FreeBSD. Это позволяет избежать проблем, связанных с созданием нового набора имен пользователей и паролей для каждого пользователя, которому необходима SMTP аутентификация, пароль для входа в систему и для отправки почты будет одним и тем же.
+. Теперь отредактируйте [.filename]#/etc/make.conf# и добавьте следующие строки:
++
+[.programlisting]
+....
+SENDMAIL_CFLAGS=-I/usr/local/include/sasl -DSASL
+SENDMAIL_LDFLAGS=-L/usr/local/lib
+SENDMAIL_LDADD=-lsasl2
+....
++
+Эти параметры необходимы sendmail для подключения package:cyrus-sasl2[] во время компиляции. Убедитесь, что package:cyrus-sasl2[] был установлен до перекомпиляции sendmail.
+. Перекомпилируйте sendmail, выполнив следующие команды:
++
+[source,bash]
+....
+# cd /usr/src/lib/libsmutil
+# make cleandir && make obj && make
+# cd /usr/src/lib/libsm
+# make cleandir && make obj && make
+# cd /usr/src/usr.sbin/sendmail
+# make cleandir && make obj && make && make install
+....
++
+Компиляция sendmail должна пройти без проблем, если [.filename]#/usr/src# не был сильно изменен и доступны необходимые разделяемые библиотеки.
+. После компилирования и переустановки sendmail, отредактируйте файл [.filename]#/etc/mail/freebsd.mc# (или тот файл, который используется в качестве [.filename]#.mc#; многие администраторы используют в качестве имени этого файла вывод man:hostname[1] для обеспечения уникальности). Добавьте к нему следующие строки:
++
+[.programlisting]
+....
+dnl set SASL options
+TRUST_AUTH_MECH(`GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN')dnl
+define(`confAUTH_MECHANISMS', `GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN')dnl
+....
++
+Эти параметры настраивают различные методы, доступные sendmail для аутентификации пользователей. Если вы хотите использовать вместо pwcheck другой метод, обратитесь к прилагаемой документации.
+. Наконец, запустите man:make[1] в каталоге [.filename]#/etc/mail#. Из файла [.filename]#.mc# будет создан файл [.filename]#.cf#, называющийся [.filename]#freebsd.cf# (или с тем именем, которое было использовано для файла [.filename]#.mc#). Затем используйте команду `make install restart`, которая скопирует файл в [.filename]#sendmail.cf#, и правильно перезапустит sendmail. Дополнительная информация об этом процессе находится в [.filename]#/etc/mail/Makefile#.
+====
+
+Если все шаги пройдены успешно, введите информацию для аутентификации в настройки почтового клиента и отправьте тестовое сообщение. Для определения причин возможных ошибок установите параметр sendmail `LogLevel` в 13 и просмотрите [.filename]#/var/log/maillog#.
+
+За дальнейшей информацией обратитесь к странице sendmail, посвященной http://www.sendmail.org/~ca/email/auth.html[ SMTP аутентификации].
+
+[[mail-agents]]
+== Почтовые программы пользователей
+
+Почтовая программа пользователя (Mail User Agent, MUA) это приложение, используемое для отправки и получения почты. Кроме того, поскольку почта "эволюционирует" и становится более сложной, MUA совершенствуют свои функции по обработке почты, становятся более удобны в использовании. FreeBSD поддерживает множество различных пользовательских почтовых программ, каждая из которых может быть легко установлена из crossref:ports[ports,Коллекции Портов FreeBSD]. Пользователи могут выбирать между графическими почтовыми клиентами, такими как evolution или balsa, консольными клиентами, такими как mutt, alpine или `mail`, или Web-интерфейсами, используемыми в некоторых больших организациях.
+
+[[mail-command]]
+=== mail
+
+В FreeBSD в качестве MUA по умолчанию используется man:mail[1]. Это консольный MUA, предоставляющий все основные функции, необходимые для отправки и получения текстовых сообщений, хотя его возможности по работе с вложениями ограничены и он может работать только с локальными почтовыми ящиками.
+
+Хотя `mail` не поддерживает работу с серверами POP или IMAP, эти почтовые ящики могут быть загружены в локальный файл [.filename]#mbox# с помощью fetchmail, который будет обсуждаться далее в этой главе (<<mail-fetchmail>>).
+
+Для отправки и получения почты выполните `mail`:
+
+[source,bash]
+....
+% mail
+....
+
+Содержимое почтового ящика в каталоге [.filename]#/var/mail# будет автоматически прочитано утилитой `mail`. Если почтовый ящик пуст, утилита завершит работу с сообщением о том, что почта не была обнаружена. После чтения почтового ящика запустится интерфейс программы и будет отображен список сообщений. Сообщения нумеруются автоматически и будут выглядеть как в этом примере:
+
+[source,bash]
+....
+Mail version 8.1 6/6/93. Type ? for help.
+"/var/mail/marcs": 3 messages 3 new
+>N 1 root@localhost Mon Mar 8 14:05 14/510 "test"
+ N 2 root@localhost Mon Mar 8 14:05 14/509 "user account"
+ N 3 root@localhost Mon Mar 8 14:05 14/509 "sample"
+....
+
+Теперь сообщения могут быть прочитаны с помощью команды kbd:[t], завершаемой номером сообщения, которое должно быть отображено. В этом примере мы прочтем первое сообщение:
+
+[source,bash]
+....
+& t 1
+Message 1:
+From root@localhost Mon Mar 8 14:05:52 2004
+X-Original-To: marcs@localhost
+Delivered-To: marcs@localhost
+To: marcs@localhost
+Subject: test
+Date: Mon, 8 Mar 2004 14:05:52 +0200 (SAST)
+From: root@localhost (Charlie Root)
+
+This is a test message, please reply if you receive it.
+....
+
+Как видно в примере выше, клавиша kbd:[t] выводит сообщение со всеми заголовками. Для повторного вывода списка сообщений необходимо использовать клавишу kbd:[h].
+
+Если требуется ответить на сообщение, используйте для ответа `mail`, нажав клавишу kbd:[R] или kbd:[r]. Клавиша kbd:[R] используется в `mail` для ответа только отправителю, а kbd:[r] для ответа и отправителю, и другим получателям сообщения. Вы можете также завершить эти команды номером письма, на которое хотите составить ответ. После этого необходимо ввести ответ, конец сообщения должен быть завершен символом kbd:[.] на новой строке. Пример можно увидеть ниже:
+
+[source,bash]
+....
+& R 1
+To: root@localhost
+Subject: Re: test
+
+Thank you, I did get your email.
+.
+EOT
+....
+
+Для отправки нового сообщения используйте клавишу kbd:[m] и введите адрес получателя. Несколько получателей могут быть указаны через запятую. Введите тему сообщения и его содержимое. Конец сообщения отмечается помещением символа kbd:[.] на новой строке.
+
+[source,bash]
+....
+& mail root@localhost
+Subject: I mastered mail
+
+Now I can send and receive email using mail ... :)
+.
+EOT
+....
+
+В утилите `mail` для вызова справки в любой момент может быть использована команда kbd:[?], для получения помощи по `mail` необходимо также обратиться к странице справочника man:mail[1].
+
+[NOTE]
+====
+Как упоминалось выше, команда man:mail[1] не была первоначально предназначена для работы с вложениями, и поэтому их поддержка довольно слабая. Современные MUA, такие как mutt, работают с вложениями гораздо более уверенно. Но если вы все же предпочитаете использовать `mail`, установите порт package:converters/mpack[].
+====
+
+[[mutt-command]]
+=== mutt
+
+mutt это небольшая но очень мощная почтовая программа с отличными возможностями, в числе которых:
+
+* Возможность сортировки сообщений по дискуссиям;
+* Поддержка PGP для подписи и шифрования сообщений;
+* Поддержка MIME;
+* Поддержка Maildir;
+* Широкие возможности настройки.
+
+Все эти возможности делают mutt одним из самых лучших почтовых клиентов. Обратитесь к http://www.mutt.org[http://www.mutt.org] за дополнительной информацией по mutt.
+
+Стабильная версия mutt может быть установлена из порта package:mail/mutt[]. После установки порта, mutt может быть запущен следующей командой:
+
+[source,bash]
+....
+% mutt
+....
+
+mutt автоматически прочтет содержимое пользовательского почтового ящика в каталоге [.filename]#/var/mail# и отобразит почту, если она имеется в наличии. Если почты в ящике пользователя нет, mutt будет ожидать команд от пользователя. В примере ниже показан mutt со списком сообщений:
+
+image::mutt1.png[]
+
+Для чтения почты выберите сообщение с помощью клавиш навигации и нажмите kbd:[Enter]. Пример mutt, отображающего сообщение, показан ниже:
+
+image::mutt2.png[]
+
+Как и команда man:mail[1], mutt позволяет пользователям отвечать как только отправителю, так и всем получателям. Для ответа только отправителю почты, используйте клавишу kbd:[r]. Для группового ответа и отправителю сообщения и всем получателям используйте клавишу kbd:[g].
+
+[NOTE]
+====
+mutt использует man:vi[1] в качестве редактора для создания писем и ответа на них. Редактор можно заменить путем создания или редактирования собственного [.filename]#.muttrc# в своем домашнем каталоге и установки переменной `editor`, или установкой переменной окружения `EDITOR`. Обратитесь к http://www.mutt.org/[http://www.mutt.org/] за более подробной информацией о настройке mutt.
+====
+
+Для создания нового почтового сообщения нажмите kbd:[m]. После введения темы mutt запустит man:vi[1] для создания письма. Как только письмо будет завершено, сохраните его и закройте `vi`, mutt продолжит работу, отобразив окно с сообщением, которое должно быть отправлено. Для отправки сообщения нажмите kbd:[y]. Пример окна с сообщением показан ниже:
+
+image::mutt3.png[]
+
+mutt также содержит исчерпывающий справочник, к которому можно обратиться из большинства меню, нажав клавишу kbd:[?]. Верхняя строка также показывает клавиатурные сокращения, которые могут быть использованы.
+
+[[alpine-command]]
+=== alpine
+
+alpine предназначен для начинающих пользователей, но включает некоторые дополнительные возможности.
+
+[WARNING]
+====
+
+В программе alpine ранее были обнаружены некоторые уязвимости, позволяющие удаленному взломщику выполнять произвольный код с правами пользователя локальной системы путем отправки специально подготовленного письма. Все эти _известные_ проблемы были исправлены, но код alpine написан в очень небезопасном стиле и офицеры безопасности FreeBSD считают, что возможно наличие других не обнаруженных уязвимостей. Имейте это ввиду при установке alpine.
+====
+
+Текущая версия alpine может быть установлена из порта package:mail/alpine[]. Как только порт установлен, alpine можно запустить командой:
+
+[source,bash]
+....
+% alpine
+....
+
+При первом запуске alpine отображает страницу приветствия с кратким введением, а также просьбу команды разработчиков alpine отправить анонимное почтовое сообщение, позволяющее им определить количество пользователей, работающих с их почтовым клиентом. Для отправки анонимного сообщения нажмите kbd:[Enter], или kbd:[E] для выхода из приветствия без отправки анонимного сообщения. Пример приветствия показан ниже:
+
+image::pine1.png[]
+
+Затем отображается главное меню, перемещение по которому осуществляется с помощью клавиш навигации. В главном меню находятся ссылки для составления новых писем, просмотра почтовых каталогов, и даже управления адресной книгой. Ниже главного меню показаны клавиатурные сокращения, выполняющие соответствующие задачи.
+
+По умолчанию alpine открывает каталог [.filename]#inbox#. Для просмотра списка сообщений нажмите kbd:[I], или выберите [.guimenuitem]#MESSAGE INDEX#, как показано ниже:
+
+image::pine2.png[]
+
+В списке показаны сообщения в текущем каталоге, они могут быть просмотрены с помощью клавиш навигации. Подсвеченные сообщения можно прочесть нажав kbd:[Enter].
+
+image::pine3.png[]
+
+На снимке экрана ниже показан пример письма, отображаемого alpine. Внизу экрана даны клавиатурные сокращения. Например, kbd:[r] используется для указания MUA ответить на отображаемое в данный момент сообщение.
+
+image::pine4.png[]
+
+Ответ на письмо в alpine осуществляется с помощью редактора pico, который устанавливается по умолчанию вместе с alpine. pico упрощает навигацию в сообщении гораздо проще для новых пользователей, чем man:vi[1] или man:mail[1]. Как только ответ будет готов, сообщение можно отправить нажав kbd:[Ctrl+X]. alpine запросит подтверждение.
+
+image::pine5.png[]
+
+Программа alpine может быть настроена через пункт [.guimenuitem]#SETUP# главного меню. Обратитесь к странице http://www.washington.edu/alpine/[http://www.washington.edu/alpine/] за дальнейшей информацией.
+
+[[mail-fetchmail]]
+== Использование fetchmail
+
+fetchmail это полноценный IMAP и POP клиент, позволяющий пользователям автоматически загружать почту с удаленных серверов IMAP и POP в локальные почтовые ящики; так доступ к почтовым ящикам упрощается. fetchmail может быть установлен из порта package:mail/fetchmail[] и предоставляет различные возможности, в том числе:
+
+* Поддержка протоколов POP3, APOP, KPOP, IMAP, ETRN и ODMR.
+* Возможность пересылки почты через SMTP, что позволяет использовать функции фильтрации, перенаправления и синонимов.
+* Может быт запущен в режиме даемона для периодической проверки поступающих сообщений.
+* Может забирать почту с нескольких почтовых ящиков и рассылать ее различным локальным пользователям в зависимости от настроек.
+
+Описание всех возможностей fetchmail выходит за пределы этой главы, за дополнительной информацией обратитесь к документации по fetchmail. Утилита fetchmail требует наличия файла настройки [.filename]#.fetchmailrc#. Этот файл включает информацию о сервере, а также информацию для аутентификации. Поскольку этот файл содержит важную информацию, правильно будет сделать его доступным для чтения только владельцем с помощью следующей команды:
+
+[source,bash]
+....
+% chmod 600 .fetchmailrc
+....
+
+В следующем примере файл [.filename]#.fetchmailrc# предназначен для загрузки одного почтового ящика по протоколу POP. Этот файл указывает fetchmail соединиться с `example.com` с именем пользователя `joesoap` и паролем `XXX`. В примере подразумевается, что пользователь `joesoap` существует также и в локальной системе.
+
+[.programlisting]
+....
+poll example.com protocol pop3 username "joesoap" password "XXX"
+....
+
+В следующем примере производится подключение к нескольким POP и IMAP серверам, при необходимости почта перенаправляется другим локальным пользователям:
+
+[.programlisting]
+....
+poll example.com proto pop3:
+user "joesoap", with password "XXX", is "jsoap" here;
+user "andrea", with password "XXXX";
+poll example2.net proto imap:
+user "john", with password "XXXXX", is "myth" here;
+....
+
+Утилита fetchmail может работать в режиме даемона с флагом `-d`, заданным с интервалом (в секундах), через который fetchmail должен опрашивать серверы, перечисленные в [.filename]#.fetchmailrc#. В следующем примере fetchmail будет забирать почту каждые 600 секунд:
+
+[source,bash]
+....
+% fetchmail -d 600
+....
+
+Дополнительную информацию о fetchmail можно найти на сайте http://fetchmail.berlios.de/[http://fetchmail.berlios.de/].
+
+[[mail-procmail]]
+== Использование procmail
+
+Утилита procmail это невероятно мощное приложение, используемое для фильтрации входящей почты. Она позволяет пользователям определять "правила", которые могут быть сопоставлены входящим письмам для выполнения определенных действий или для перенаправления почты в альтернативные почтовые ящики и/или на почтовые адреса. procmail может быть установлен с помощью порта package:mail/procmail[]. После установки он может быть непосредственно интегрирован в большинство MTA; сверьтесь с документацией на ваш MTA. Другой способ интеграции procmail - добавление в файл [.filename]#.forward#, находящийся в домашнем каталоге пользователя, следующей строки:
+
+[.programlisting]
+....
+"|exec /usr/local/bin/procmail || exit 75"
+....
+
+В этом разделе будут показаны основы настройки правил procmail, а также краткое описание их действия. Эти и другие правила должны быть помещены в файл [.filename]#.procmailrc#, который должен находиться в домашнем каталоге пользователя.
+
+Большую часть этих правил также можно найти на странице справочника man:procmailex[5].
+
+Перенаправление всей почты от mailto:user@example.com[user@example.com] на внешний адрес mailto:goodmail@example2.com[goodmail@example2.com]:
+
+[.programlisting]
+....
+:0
+* ^From.*user@example.com
+! goodmail@example2.com
+....
+
+Перенаправление всей почты объемом меньше 1000 байт на внешний адрес mailto:goodmail@example2.com[goodmail@example2.com]:
+
+[.programlisting]
+....
+:0
+* < 1000
+! goodmail@example2.com
+....
+
+Перенаправление всей почты, отправляемой на mailto:alternate@example.com[alternate@example.com], в почтовый ящик [.filename]#alternate#:
+
+[.programlisting]
+....
+:0
+* ^TOalternate@example.com
+alternate
+....
+
+Перенаправление всей почты с "Spam" в [.filename]#/dev/null#:
+
+[.programlisting]
+....
+:0
+^Subject:.*Spam
+/dev/null
+....
+
+Полезный пример, обрабатывающий входящую почту со списков рассылки `FreeBSD.org` и помещающий каждый список в отдельный почтовый ящик.
+
+[.programlisting]
+....
+:0
+* ^Sender:.owner-freebsd-\/[^@]+@FreeBSD.ORG
+{
+ LISTNAME=${MATCH}
+ :0
+ * LISTNAME??^\/[^@]+
+ FreeBSD-${MATCH}
+}
+....
diff --git a/documentation/content/ru/books/handbook/mirrors/_index.adoc b/documentation/content/ru/books/handbook/mirrors/_index.adoc
new file mode 100644
index 0000000000..f4a8f366b3
--- /dev/null
+++ b/documentation/content/ru/books/handbook/mirrors/_index.adoc
@@ -0,0 +1,721 @@
+---
+title: Приложение A. Получение FreeBSD
+part: Часть V. Приложения
+prev: books/handbook/partv
+next: books/handbook/bibliography
+---
+
+[appendix]
+[[mirrors]]
+= Получение FreeBSD
+:doctype: book
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: A
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+[[mirrors-cdrom]]
+== Наборы CD и DVD
+
+Наборы FreeBSD CD и DVD доступны у нескольких онлайн поставщиков:
+
+* FreeBSD Mall, Inc. +
+2420 Sand Creek Rd C-1 #347 +
+Brentwood, CA +
+94513 +
+США +
+Телефон: +1 925 240-6652 +
+Факс: +1 925 674-0821 +
+Email: <info@freebsdmall.com> +
+WWW: http://www.freebsdmall.com/
+
+* Getlinux +
+78 Rue de la Croix Rochopt +
+'Epinay-sous-S'enart +
+91860 +
+Франция +
+Email: <contact@getlinux.fr> +
+WWW: http://www.getlinux.fr/
+
+* Dr. Hinner EDV +
+Kochelseestr. 11 +
+D-81371 M"unchen +
+Германия +
+Телефон: (0177) 428 419 0 +
+Email: <infow@hinner.de> +
+WWW: http://www.hinner.de/linux/freebsd.html
+
+* Linux Center +
+ул. Галерная, 55 +
+Санкт-Петербург +
+190000 +
+Россия +
+Телефон: +7-812-3125208 +
+Email: <info@linuxcenter.ru> +
+WWW: http://linuxcenter.ru/shop/freebsd
+
+[[mirrors-ftp]]
+== FTP сайты
+
+Официальные исходные тексты FreeBSD доступны через анонимные FTP зеркала по всему миру. Сайт link:ftp://ftp.FreeBSD.org/pub/FreeBSD/[ftp://ftp.FreeBSD.org/pub/FreeBSD/] имеет хорошее подключение и поддерживает большое количество одновременных соединений, но для вас возможно потребуется найти "ближайшее" зеркало (особенно если вы решили настроить у себя какой-то из видов зеркал).
+
+Кроме того, FreeBSD доступна через анонимный FTP со следующих зеркал. Если вы выбрали получение FreeBSD через анонимный FTP, пожалуйста, выберите ближайший к вам сайт. Зеркала из списка "Основных зеркал" обычно содержат полный архив FreeBSD (все доступные на данный момент версии для каждой архитектуры), но скорость загрузки возможно будет больше с зеркала, расположенного в вашей стране или регионе. Сайты каждой страны содержат последнюю версию для наиболее популярных архитектур, но на них может не быть полного архива FreeBSD. Все сайты предоставляют доступ через анонимный FTP, а некоторые предоставляют доступ и другими методами. Для каждого сайта приведен список методов доступа в скобках после имени хоста.
+
+<<central, {central}>>, <<primary, {mirrors-primary}>>, <<armenia, {mirrors-armenia}>>, <<australia, {mirrors-australia}>>, <<austria, {mirrors-austria}>>, <<brazil, {mirrors-brazil}>>, <<czech-republic, {mirrors-czech}>>, <<denmark, {mirrors-denmark}>>, <<estonia, {mirrors-estonia}>>, <<finland, {mirrors-finland}>>, <<france, {mirrors-france}>>, <<germany, {mirrors-germany}>>, <<greece, {mirrors-greece}>>, <<hong-kong, {mirrors-hongkong}>>, <<ireland, {mirrors-ireland}>>, <<japan, {mirrors-japan}>>, <<korea, {mirrors-korea}>>, <<latvia, {mirrors-latvia}>>, <<lithuania, {mirrors-lithuania}>>, <<netherlands, {mirrors-netherlands}>>, <<new-zealand, {mirrors-new-zealand}>>, <<norway, {mirrors-norway}>>, <<poland, {mirrors-poland}>>, <<russia, {mirrors-russia}>>, <<saudi-arabia, {mirrors-saudi-arabia}>>, <<slovenia, {mirrors-slovenia}>>, <<south-africa, {mirrors-south-africa}>>, <<spain, {mirrors-spain}>>, <<sweden, {mirrors-sweden}>>, <<switzerland, {mirrors-switzerland}>>, <<taiwan, {mirrors-taiwan}>>, <<ukraine, {mirrors-ukraine}>>, <<uk, {mirrors-uk}>>, <<usa, {mirrors-us}>>.
+
+(as of UTC)
+
+[[central]]
+*{central}*
+
+{central-ftp} (ftp / ftpv6 / {central-http} / {central-httpv6})
+
+[[primary]]
+*{mirrors-primary}*
+
+In case of problems, please contact the hostmaster `<{mirrors-primary-email}>` for this domain.
+
+* {mirrors-primary-ftp1} (ftp)
+* {mirrors-primary-ftp2} (ftp)
+* {mirrors-primary-ftp3} (ftp)
+* {mirrors-primary-ftp4} (ftp / ftpv6 / {mirrors-primary-ftp4-http} / {mirrors-primary-ftp4-httpv6})
+* {mirrors-primary-ftp5} (ftp)
+* {mirrors-primary-ftp6} (ftp)
+* {mirrors-primary-ftp7} (ftp)
+* {mirrors-primary-ftp10} (ftp / ftpv6 / {mirrors-primary-ftp10-http} / {mirrors-primary-ftp10-httpv6})
+* {mirrors-primary-ftp11} (ftp)
+* {mirrors-primary-ftp13} (ftp)
+* {mirrors-primary-ftp14} (ftp / {mirrors-primary-ftp14-http})
+
+[[armenia]]
+*{mirrors-armenia}*
+
+In case of problems, please contact the hostmaster `<{mirrors-armenia-email}>` for this domain.
+
+* {mirrors-armenia-ftp} (ftp / {mirrors-armenia-ftp-http} / rsync)
+
+[[australia]]
+*{mirrors-australia}*
+
+In case of problems, please contact the hostmaster `<{mirrors-australia-email}>` for this domain.
+
+* {mirrors-australia-ftp} (ftp)
+* {mirrors-australia-ftp2} (ftp)
+* {mirrors-australia-ftp3} (ftp)
+
+[[austria]]
+*{mirrors-austria}*
+
+In case of problems, please contact the hostmaster `<{mirrors-austria-email}>` for this domain.
+
+* {mirrors-austria-ftp} (ftp / ftpv6 / {mirrors-austria-ftp-http} / {mirrors-austria-ftp-httpv6})
+
+[[brazil]]
+*{mirrors-brazil}*
+
+In case of problems, please contact the hostmaster `<{mirrors-brazil-email}>` for this domain.
+
+* {mirrors-brazil-ftp2} (ftp / {mirrors-brazil-ftp2-http})
+* {mirrors-brazil-ftp3} (ftp / rsync)
+* {mirrors-brazil-ftp4} (ftp)
+
+[[czech-republic]]
+*{mirrors-czech}*
+
+In case of problems, please contact the hostmaster `<{mirrors-czech-email}>` for this domain.
+
+* {mirrors-czech-ftp} (ftp / {mirrors-czech-ftpv6} / {mirrors-czech-ftp-http} / {mirrors-czech-ftp-httpv6} / rsync / rsyncv6)
+* {mirrors-czech-ftp2} (ftp / {mirrors-czech-ftp2-http})
+
+[[denmark]]
+*{mirrors-denmark}*
+
+In case of problems, please contact the hostmaster `<{mirrors-denmark-email}>` for this domain.
+
+* {mirrors-denmark-ftp} (ftp / ftpv6 / {mirrors-denmark-ftp-http} / {mirrors-denmark-ftp-httpv6})
+
+[[estonia]]
+*{mirrors-estonia}*
+
+In case of problems, please contact the hostmaster `<{mirrors-estonia-email}>` for this domain.
+
+* {mirrors-estonia-ftp} (ftp)
+
+[[finland]]
+*{mirrors-finland}*
+
+In case of problems, please contact the hostmaster `<{mirrors-finland-email}>` for this domain.
+
+* {mirrors-finland-ftp} (ftp)
+
+[[france]]
+*{mirrors-france}*
+
+In case of problems, please contact the hostmaster `<{mirrors-france-email}>` for this domain.
+
+* {mirrors-france-ftp} (ftp)
+* {mirrors-france-ftp1} (ftp / {mirrors-france-ftp1-http} / rsync)
+* {mirrors-france-ftp3} (ftp)
+* {mirrors-france-ftp5} (ftp)
+* {mirrors-france-ftp6} (ftp / rsync)
+* {mirrors-france-ftp7} (ftp)
+* {mirrors-france-ftp8} (ftp)
+
+[[germany]]
+*{mirrors-germany}*
+
+In case of problems, please contact the hostmaster `<{mirrors-germany-email}>` for this domain.
+
+* ftp://ftp.de.FreeBSD.org/pub/FreeBSD/ (ftp)
+* ftp://ftp1.de.FreeBSD.org/freebsd/ (ftp / http://www1.de.FreeBSD.org/freebsd/ / rsync://rsync3.de.FreeBSD.org/freebsd/)
+* ftp://ftp2.de.FreeBSD.org/pub/FreeBSD/ (ftp / http://ftp2.de.FreeBSD.org/pub/FreeBSD/ / rsync)
+* ftp://ftp4.de.FreeBSD.org/FreeBSD/ (ftp / http://ftp4.de.FreeBSD.org/pub/FreeBSD/)
+* ftp://ftp5.de.FreeBSD.org/pub/FreeBSD/ (ftp)
+* ftp://ftp7.de.FreeBSD.org/pub/FreeBSD/ (ftp / http://ftp7.de.FreeBSD.org/pub/FreeBSD/)
+* ftp://ftp8.de.FreeBSD.org/pub/FreeBSD/ (ftp)
+
+[[greece]]
+*{mirrors-greece}*
+
+In case of problems, please contact the hostmaster `<{mirrors-greece-email}>` for this domain.
+
+* {mirrors-greece-ftp} (ftp)
+* {mirrors-greece-ftp2} (ftp)
+
+[[hong-kong]]
+*{mirrors-hongkong}*
+
+{mirrors-hongkong-ftp} (ftp)
+
+[[ireland]]
+*{mirrors-ireland}*
+
+In case of problems, please contact the hostmaster `<{mirrors-ireland-email}>` for this domain.
+
+* {mirrors-ireland-ftp} (ftp / rsync)
+
+[[japan]]
+*{mirrors-japan}*
+
+In case of problems, please contact the hostmaster `<{mirrors-japan-email}>` for this domain.
+
+* {mirrors-japan-ftp} (ftp)
+* {mirrors-japan-ftp2} (ftp)
+* {mirrors-japan-ftp3} (ftp)
+* {mirrors-japan-ftp4} (ftp)
+* {mirrors-japan-ftp5} (ftp)
+* {mirrors-japan-ftp6} (ftp)
+* {mirrors-japan-ftp7} (ftp)
+* {mirrors-japan-ftp8} (ftp)
+* {mirrors-japan-ftp9} (ftp)
+
+[[korea]]
+*{mirrors-korea}*
+
+In case of problems, please contact the hostmaster `<{mirrors-korea-email}>` for this domain.
+
+* {mirrors-korea-ftp} (ftp / rsync)
+* {mirrors-korea-ftp2} (ftp / {mirrors-korea-ftp2-http})
+
+[[latvia]]
+*{mirrors-latvia}*
+
+In case of problems, please contact the hostmaster `<{mirrors-latvia-email}>` for this domain.
+
+* {mirrors-latvia-ftp} (ftp / {mirrors-latvia-ftp-http})
+
+[[lithuania]]
+*{mirrors-lithuania}*
+
+In case of problems, please contact the hostmaster `<{mirrors-lithuania-email}>` for this domain.
+
+* {mirrors-lithuania-ftp} (ftp / {mirrors-lithuania-ftp-http})
+
+[[netherlands]]
+*{mirrors-netherlands}*
+
+In case of problems, please contact the hostmaster `<{mirrors-netherlands-email}>` for this domain.
+
+* {mirrors-netherlands-ftp} (ftp / {mirrors-netherlands-ftp-http} / rsync)
+* {mirrors-netherlands-ftp2} (ftp)
+
+[[new-zealand]]
+*{mirrors-new-zealand}*
+
+* {mirrors-new-zealand-ftp} (ftp / {mirrors-new-zealand-ftp-http})
+
+[[norway]]
+*{mirrors-norway}*
+
+In case of problems, please contact the hostmaster `<{mirrors-norway-email}>` for this domain.
+
+* {mirrors-norway-ftp} (ftp / rsync)
+
+[[poland]]
+*{mirrors-poland}*
+
+In case of problems, please contact the hostmaster `<{mirrors-poland-email}>` for this domain.
+
+* {mirrors-poland-ftp} (ftp)
+* ftp2.pl.FreeBSD.org
+
+[[russia]]
+*{mirrors-russia}*
+
+In case of problems, please contact the hostmaster `<{mirrors-russia-email}>` for this domain.
+
+* {mirrors-russia-ftp} (ftp / {mirrors-russia-ftp-http} / rsync)
+* {mirrors-russia-ftp2} (ftp / {mirrors-russia-ftp2-http} / rsync)
+* {mirrors-russia-ftp4} (ftp)
+* {mirrors-russia-ftp5} (ftp / {mirrors-russia-ftp5-http} / rsync)
+* {mirrors-russia-ftp6} (ftp)
+
+[[saudi-arabia]]
+*{mirrors-saudi-arabia}*
+
+In case of problems, please contact the hostmaster `<{mirrors-saudi-arabia-email}>` for this domain.
+
+* {mirrors-saudi-arabia-ftp} (ftp)
+
+[[slovenia]]
+*{mirrors-slovenia}*
+
+In case of problems, please contact the hostmaster `<{mirrors-slovenia-email}>` for this domain.
+
+* {mirrors-slovenia-ftp} (ftp)
+
+[[south-africa]]
+*{mirrors-south-africa}*
+
+In case of problems, please contact the hostmaster `<{mirrors-south-africa-email}>` for this domain.
+
+* {mirrors-south-africa-ftp} (ftp)
+* {mirrors-south-africa-ftp2} (ftp)
+* {mirrors-south-africa-ftp4} (ftp)
+
+[[spain]]
+*{mirrors-spain}*
+
+In case of problems, please contact the hostmaster `<{mirrors-spain-email}>` for this domain.
+
+* {mirrors-spain-ftp} (ftp / {mirrors-spain-ftp-http})
+* {mirrors-spain-ftp3} (ftp)
+
+[[sweden]]
+*{mirrors-sweden}*
+
+In case of problems, please contact the hostmaster `<{mirrors-sweden-email}>` for this domain.
+
+* {mirrors-sweden-ftp} (ftp)
+* {mirrors-sweden-ftp2} (ftp / {mirrors-sweden-ftp2-rsync})
+* {mirrors-sweden-ftp3} (ftp)
+* {mirrors-sweden-ftp4} (ftp / {mirrors-sweden-ftp4v6} / {mirrors-sweden-ftp4-http} / {mirrors-sweden-ftp4-httpv6} / {mirrors-sweden-ftp4-rsync} / {mirrors-sweden-ftp4-rsyncv6})
+* {mirrors-sweden-ftp6} (ftp / {mirrors-sweden-ftp6-http})
+
+[[switzerland]]
+*{mirrors-switzerland}*
+
+In case of problems, please contact the hostmaster `<{mirrors-switzerland-email}>` for this domain.
+
+* {mirrors-switzerland-ftp} (ftp / {mirrors-switzerland-ftp-http})
+
+[[taiwan]]
+*{mirrors-taiwan}*
+
+In case of problems, please contact the hostmaster `<{mirrors-taiwan-email}>` for this domain.
+
+* {mirrors-taiwan-ftp} (ftp / {mirrors-taiwan-ftpv6} / rsync / rsyncv6)
+* {mirrors-taiwan-ftp2} (ftp / {mirrors-taiwan-ftp2v6} / {mirrors-taiwan-ftp2-http} / {mirrors-taiwan-ftp2-httpv6} / rsync / rsyncv6)
+* {mirrors-taiwan-ftp4} (ftp)
+* {mirrors-taiwan-ftp5} (ftp)
+* {mirrors-taiwan-ftp6} (ftp / {mirrors-taiwan-ftp6v6} / rsync)
+* {mirrors-taiwan-ftp7} (ftp)
+* {mirrors-taiwan-ftp8} (ftp)
+* {mirrors-taiwan-ftp11} (ftp / {mirrors-taiwan-ftp11-http})
+* {mirrors-taiwan-ftp12} (ftp)
+* {mirrors-taiwan-ftp13} (ftp)
+* {mirrors-taiwan-ftp14} (ftp)
+* {mirrors-taiwan-ftp15} (ftp)
+
+[[ukraine]]
+*{mirrors-ukraine}*
+
+* {mirrors-ukraine-ftp} (ftp / {mirrors-ukraine-ftp-http})
+* {mirrors-ukraine-ftp6} (ftp / {mirrors-ukraine-ftp6-http} / {mirrors-ukraine-ftp6-rsync})
+* {mirrors-ukraine-ftp7} (ftp)
+
+[[uk]]
+*{mirrors-uk}*
+
+In case of problems, please contact the hostmaster `<{mirrors-uk-email}>` for this domain.
+
+* {mirrors-uk-ftp} (ftp)
+* {mirrors-uk-ftp2} (ftp / {mirrors-uk-ftp2-rsync})
+* {mirrors-uk-ftp3} (ftp)
+* {mirrors-uk-ftp4} (ftp)
+* {mirrors-uk-ftp5} (ftp)
+
+[[usa]]
+*{mirrors-us}*
+
+In case of problems, please contact the hostmaster `<{mirrors-us-email}>` for this domain.
+
+* {mirrors-us-ftp} (ftp)
+* {mirrors-us-ftp2} (ftp)
+* {mirrors-us-ftp3} (ftp)
+* {mirrors-us-ftp4} (ftp / ftpv6 / {mirrors-us-ftp4-http} / {mirrors-us-ftp4-httpv6})
+* {mirrors-us-ftp5} (ftp)
+* {mirrors-us-ftp6} (ftp)
+* {mirrors-us-ftp8} (ftp)
+* {mirrors-us-ftp10} (ftp)
+* {mirrors-us-ftp11} (ftp)
+* {mirrors-us-ftp13} (ftp / {mirrors-us-ftp13-http} / rsync)
+* {mirrors-us-ftp14} (ftp / {mirrors-us-ftp14-http})
+* {mirrors-us-ftp15} (ftp)
+
+[[ctm]]
+== Использование CTM
+
+CTM это метод синхронизации удаленного дерева каталогов с центральным. Он встроен во FreeBSD и может использоваться для синхронизации системы с репозиториями исходных текстов FreeBSD. Он поддерживает синхронизацию всего репозитория или только заданного набора ветвей.
+
+CTM создан специально для использования в условиях некачественного соединения по TCP/IP или его отсутствия и предоставляет возможность автоматической отправки изменений по электронной почте. Пользователю требуется загружать до трех изменений в день для наиболее активных ветвей. Размеры обновлений всегда поддерживаются настолько малыми, насколько это возможно, и обычно составляют меньше 5 Кб. Примерно на каждое десятое приходится по 10-50 Кб, и иногда случаются обновления больше 100 Кб.
+
+При использовании CTM для отслеживания процесса разработки FreeBSD требуется учитывать особенности в работе напрямую с исходных текстов, находящихся в разработке, по сравнению с использованием готовых релизов. Эти вопросы рассматриваются в разделе <<current-stable,Использование ветви разработки>>.
+
+Cуществует немного документации по процессу создания дельта-файлов (delta, разница между имеющимися и актуальными исходными текстами) или использованию CTM в других целях. Обратитесь в список рассылки link:{ctm-users-url}[ctm-users-desc] для получения ответов на вопросы по использованию CTM.
+
+[[mirrors-ctm]]
+=== Получение дельта-файлов
+
+"Дельта-файлы" для использования в CTM можно получить двумя способами: через анонимный FTP или по электронной почте.
+
+Дельта-файлы по FTP можно получить со следующих сайтов зеркал. При использовании анонимного FTP для получения дельта-файлов CTM выберите географически ближайшее зеркало. По случаю возникновения проблем сообщайте в список рассылки link:{ctm-users-url}[ctm-users-desc].
+
+США, Калифорния, Bay Area, официальный источник::
+
+** link:ftp://ftp.FreeBSD.org/pub/FreeBSD/development/CTM/[ftp://ftp.FreeBSD.org/pub/FreeBSD/development/CTM/]
+** link:ftp://ftp.FreeBSD.org/pub/FreeBSD/CTM/[ftp://ftp.FreeBSD.org/pub/FreeBSD/CTM/]
+
+Южная Африка, запасной сервер для старых дельт::
+
+** link:ftp://ftp.za.FreeBSD.org/pub/FreeBSD/CTM/[ftp://ftp.za.FreeBSD.org/pub/FreeBSD/CTM/]
+
+Тайвань/R.O.C.::
+
+** link:ftp://ctm.tw.FreeBSD.org/pub/FreeBSD/development/CTM/[ftp://ctm.tw.FreeBSD.org/pub/FreeBSD/development/CTM/]
+** link:ftp://ctm2.tw.FreeBSD.org/pub/FreeBSD/development/CTM/[ftp://ctm2.tw.FreeBSD.org/pub/FreeBSD/development/CTM/]
+** link:ftp://ctm3.tw.FreeBSD.org/pub/FreeBSD/development/CTM/[ftp://ctm3.tw.FreeBSD.org/pub/FreeBSD/development/CTM/]
+
+Для получения дельта-файлов по почте подпишитесь на один из списков распространения `ctm-src`, доступных на http://lists.freebsd.org/mailman/listinfo[http://lists.freebsd.org/mailman/listinfo]. Например, link:{ctm-src-cur-url}[ctm-src-cur-desc] поддерживает главную ветвь разработки, а link:{ctm-src-9-url}[ctm-src-9-desc] поддерживает ветвь выпуска релизов 9.X.
+
+Как только вы получаете обновления CTM по почте, используйте программу `ctm_rmail` для их распаковки и применения. Эта программа может выполняться непосредственно из записи в [.filename]#/etc/aliases# для автоматизации процесса. Обращайтесь к странице справочника man:ctm_rmail[1] для получения дополнительной информации.
+
+[NOTE]
+====
+Вне зависимости от способа получения дельта-файлов, пользователям CTM следует подписаться на список рассылки link:{ctm-announce-url}[ctm-announce-desc], поскольку это единственный механизм публикации объявлений CTM.
+====
+
+=== Использование CTM
+
+Перед началом использования дельта-файлов CTM потребуется определить исходную точку для последующего их применения.
+
+Один из способов состоит в применении "стартового" дельта-файла к пустому каталогу. В имени такого файла присутствует `Xempty`, например, [.filename]#src-cur.3210XEmpty.gz#. Обозначение перед `X` соответствует происхождению первоначального источника. [.filename]#Empty# означает пустой каталог. Как правило, файл с `Empty` создается через каждые 100 дельта-файлов. Обратите внимание, что стартовые дельта-файлы имеют большой размер, и от 70 до 80 мегабайт сжатых в `gzip` данных для [.filename]#XEmpty# является обычным делом.
+
+Другой способ заключается в получении первоначального источника с -RELEASE CD. Это может существенно снизить объём передаваемых данных по сети.
+
+Когда основной дельта-файл создан, примените все дельта-файлы с последующими номерами. Чтобы применить дельта-файлы:
+
+[source,bash]
+....
+# cd /directory/to/store/the/stuff
+# ctm -v -v /directory/which/stores/the/deltas/src-xxx.*
+....
+
+Можно применять несколько дельт одной командой, по мере их последовательной обработки уже применённые дельты игнорируются. CTM работает с дельта-файлами, сжатыми с помощью `gzip`, что позволяет сэкономить на используемом дисковом пространстве.
+
+Для проверки дельта-файла без его применения используйте параметр командной строки `-c`. CTM не будет модифицировать локальное дерево, а только проверит целостность дельта-файла на предмет его применимости без ошибок. Обращайтесь к man:ctm[1] для получения дополнительной информации по имеющимся параметрам и понимания процесса применения дельт, который используется в CTM.
+
+Для поддержания исходных текстов в актуальном состоянии каждый раз, когда становится доступна новая дельта, применяйте её с использованием CTM.
+
+Рекомендуется не удалять дельты после применения, если их сложно загрузить повторно. В этом случае будет доступна локальная копия, которая может понадобиться при восстановлении после сбоя.
+
+=== Сохранение локальных изменений
+
+Разработчики часто экспериментируют и изменяют файлы в локальном дереве исходных текстов. CTM имеет ограниченную поддержку локальных изменений: перед проверкой наличия файла сначала проверяется файл тем же именем и расширением [.filename]#.ctm#. Если такой файл присутствует, CTM будет работать с ним вместо исходного файла.
+
+Такое поведение обеспечивает простой путь поддержки локальных изменений. Перед изменением файла скопируйте его с расширением [.filename]#.ctm#. Вносите любые изменения в исходный файл, зная что CTM будет применять обновления только к файлу с расширением [.filename]#.ctm#.
+
+=== Другие возможности CTM
+
+Определение файлов, которые будут затронуты обновлением::
+Для определения списка изменений, которые CTM внесет в локальный репозиторий исходных текстов, используйте параметр `-l`. Этот параметр используется для записи лога изменений или выполнения предварительной или последующей обработки какого-либо подмножества изменяемых файлов.
+
+Создание резервных копий перед обновлением::
+Для создания резервной копии всех файлов, которые будут изменены обновлением CTM, укажите параметр `-B _backup-file_`. С этим параметром CTM выполняет сохранение в [.filename]#backup-file# всех файлов, которые затрагиваются применяемыми дельтами CTM.
+
+Ограничение обновлений для определенных файлов::
+Для ограничения набора файлов, обновляемых CTM, или для извлечения лишь нескольких файлов из последовательности дельт можно указать фильтрующие регулярные выражения с использованием `-e`, который указывает, какие файлы обрабатывать, или `-x`, который указывает, какие файлы игнорировать.
++
+Пример извлечения свежей копии [.filename]#lib/libc/Makefile# из коллекции сохраненных дельт CTM:
++
+[source,bash]
+....
+# cd /directory/to/extract/to/
+# ctm -e '^lib/libc/Makefile' /directory/which/stores/the/deltas/src-xxx.*
+....
++
+Для каждого файла, указанного в CTM дельте, параметры `-e` и `-x` применяются в порядке их задания в командной строке. Файл обрабатывается CTM, только если он помечается как подходящий после обработки всех параметров `-e` и `-x`.
+
+[[svn]]
+== Использование Subversion
+
+[[svn-intro]]
+=== Введение
+
+По состоянию на июль 2012 года FreeBSD использует Subversion в качестве основной системы контроля версий для хранения всего исходного кода FreeBSD, документации и Коллекции Портов.
+
+[NOTE]
+====
+Subversion в основном является инструментом разработчика. Большинству пользователей следует использовать `freebsd-update` (crossref:cutting-edge[updating-upgrading-freebsdupdate,Обновление FreeBSD]) для обновления основной системы FreeBSD и `portsnap` (crossref:ports[ports-using,Использование Коллекции Портов]) для обновления Коллекции Портов FreeBSD.
+====
+
+В этом разделе демонстрируется, как устанавливать Subversion в системе FreeBSD и затем использовать его для создания локальной копии репозитория FreeBSD. Здесь приводится список доступных зеркал Subversion для FreeBSD, а также ссылки на дополнительную информацию по использованию Subversion.
+
+[[svn-install]]
+=== Установка
+
+Subversion должен быть установлен до его использования для получения содержимого любого из репозиториев. Если уже имеется копия дерева портов, Subversion можно установить следующим образом:
+
+[source,bash]
+....
+# cd /usr/ports/devel/subversion
+# make install clean
+....
+
+Если дерево портов недоступно, Subversion можно установить из пакета:
+
+[source,bash]
+....
+# pkg_add -r subversion
+....
+
+Если для управления пакетов используется pkgng, то Subversion можно установить с его помощью:
+
+[source,bash]
+....
+# pkg install devel/subversion
+....
+
+[[svn-usage]]
+=== Работа с Subversion
+
+Команда `svn` используется для извлечения чистой копии исходных кодов в локальный каталог. Файлы в этом каталоге называются _локальной рабочей копией_.
+
+[WARNING]
+====
+
+Если локальный каталог уже существует, но не был создан с помощью `svn`, переименуйте его или удалите перед загрузкой. Загрузка в существующий не-`svn` каталог может вызвать конфликты между существующими файлами и получаемыми из репозитория.
+====
+
+Subversion для обозначения репозитория использует URL, которые имеют вид _протокол://имя/путь_. Зеркала могут поддерживать различные протоколы как указано ниже. Первый компонент пути обозначает используемый репозиторий. Существует три различных репозитория: `base` для исходного кода основной системы FreeBSD, `ports` для Коллекции Портов и `doc` для документации. Например, URL `svn://svn0.us-east.FreeBSD.org/ports/head/` указывает на главную ветвь репозитория портов на зеркале `svn0.us-east.FreeBSD.org` с использованием протокола `svn`.
+
+Загрузка из данного репозитория выполняется следующей командой:
+
+[source,bash]
+....
+# svn checkout svn-mirror/repository/branch lwcdir
+....
+
+где:
+
+* _svn-mirror_ - URL для одного из <<svn-mirrors,сайтов зеркала Subversion>>.
+* _repository_ - один из репозиториев проекта, т.е. `base`, `ports` или `doc`.
+* _branch_ зависит от используемого репозитория. `ports` и `doc` в основном обновляются в ветви `head`, в то время как `base` содержит последнюю версию -CURRENT в `head` и соответственно последние версии ветви -STABLE в `stable/8` (для 8._x_), `stable/9` (9._x_) и `stable/10` (10._x_).
+* _lwcdir_ - каталог для размещения содержимого указанной ветви. Обычно это [.filename]#/usr/ports# для `ports`, [.filename]#/usr/src# для `base` и [.filename]#/usr/doc# для `doc`.
+
+В этом примере загружается Коллекция Портов с западного репозитория США с использованием протокола HTTPS и размещением локальной рабочей копии в [.filename]#/usr/ports#. Если [.filename]#/usr/ports# уже присутствует, но не был создан с помощью `svn`, не забудьте его переименовать или удалить перед загрузкой.
+
+[source,bash]
+....
+# svn checkout https://svn0.us-west.FreeBSD.org/ports/head /usr/ports
+....
+
+Поскольку на первоначальном этапе с удалённого репозитория загружается вся ветвь целиком, на это может уйти некоторое время. Пожалуйста, будьте терпеливы.
+
+После первоначальной загрузки локальную рабочую копию можно обновить:
+
+[source,bash]
+....
+# svn update lwcdir
+....
+
+Для обновления [.filename]#/usr/ports#, созданного в вышеприведённом примере, используйте:
+
+[source,bash]
+....
+# svn update /usr/ports
+....
+
+Обновление намного быстрее загрузки, т.к. передаются только файлы с изменениями.
+
+Альтернативный способ обновления локальной рабочей копии после загрузки обеспечивается в [.filename]#Makefile# в каталогах [.filename]#/usr/ports#, [.filename]#/usr/src# и [.filename]#/usr/doc#. Используйте цель `update` с заданной переменной `SVN_UPDATE`. Пример для обновления [.filename]#/usr/src#:
+
+[source,bash]
+....
+# cd /usr/src
+# make update SVN_UPDATE=yes
+....
+
+[[svn-mirrors]]
+=== Сайты зеркала Subversion
+
+Все зеркала покрывают все репозитории.
+
+Главный сервер Subversion FreeBSD `svn.FreeBSD.org` является общедоступным для чтения. Это может измениться в будущем, поэтому пользователям рекомендуется использовать одно из официальных зеркал. Для просмотра репозиториев Subversion FreeBSD через браузер используйте http://svnweb.FreeBSD.org/[http://svnweb.FreeBSD.org/].
+
+[NOTE]
+====
+Сеть зеркал Subversion FreeBSD находится на раннем этапе развития и скорее всего будет меняться. Не полагайтесь на неизменность этого списка. В частности, серверные сертификаты SSL скорее всего изменятся.
+====
+
+[.informaltable]
+[cols="1,1,1,1", options="header"]
+|===
+| Название
+| Протоколы
+| Местоположение
+| SSL Fingerprint
+
+|`svn0.us-west.FreeBSD.org`
+|`svn`, http://svn0.us-west.FreeBSD.org/[http], https://svn0.us-west.FreeBSD.org/[https]
+|США, Калифорния
+|SHA1 `1C:BD:85:95:11:9F:EB:75:A5:4B:C8:A3:FE:08:E4:02:73:06:1E:61`
+
+|`svn0.us-east.FreeBSD.org`
+|`svn`, http://svn0.us-east.FreeBSD.org/[http], https://svn0.us-east.FreeBSD.org/[https], `rsync`
+|Сша, Нью Джерси
+|SHA1 `1C:BD:85:95:11:9F:EB:75:A5:4B:C8:A3:FE:08:E4:02:73:06:1E:61`
+
+|`svn0.eu.FreeBSD.org`
+|`svn`, http://svn0.eu.FreeBSD.org/[http], https://svn0.eu.FreeBSD.org/[https], `rsync`
+|Великобритания
+|SHA1 `39:B0:53:35:CE:60:C7:BB:00:54:96:96:71:10:94:BB:CE:1C:07:A7`
+
+|`svn0.ru.FreeBSD.org`
+|`svn`, http://svn0.ru.FreeBSD.org/[http], https://svn0.ru.FreeBSD.org/[https], `rsync`
+|Россия, Москва
+|SHA1 `F6:44:AA:B9:03:89:0E:3E:8C:4D:4D:14:F0:27:E6:C7:C1:8B:17:C5`
+|===
+
+Предпочтительным протоколом является HTTPS, который обеспечивает защиту от других компьютеров, маскирующихся под зеркало FreeBSD (известно как атака "человек посредине"), и прочих, пытающихся послать плохое содержимое конечному пользователю.
+
+При первом соединении с зеркалом по HTTPS пользователю будет предложено проверить _fingerprint_ (отпечаток) сервера:
+
+[source,bash]
+....
+Error validating server certificate for 'https://svn0.us-west.freebsd.org:443':
+ - The certificate is not issued by a trusted authority. Use the
+ fingerprint to validate the certificate manually!
+ - The certificate hostname does not match.
+Certificate information:
+ - Hostname: svnmir.ysv.FreeBSD.org
+ - Valid: from Jul 29 22:01:21 2013 GMT until Dec 13 22:01:21 2040 GMT
+ - Issuer: clusteradm, FreeBSD.org, (null), CA, US (clusteradm@FreeBSD.org)
+ - Fingerprint: 1C:BD:85:95:11:9F:EB:75:A5:4B:C8:A3:FE:08:E4:02:73:06:1E:61
+(R)eject, accept (t)emporarily or accept (p)ermanently?
+....
+
+Сравните отпечаток с вышеуказанными в таблице. Если отпечаток совпадает, сертификат безопасности сервера можно принять на временной или постоянной основе. Временный сертификат действует до конца сессии с сервером, и при следующем соединении этап верификации будет повторён. Постоянное принятие сертификата сохраняет параметры аутентификации в [.filename]#~/.subversion/auth/#, и пользователю не придётся проверять отпечаток снова до истечения сертификата.
+
+Если `https` не получается использовать из-за фаервола или иных проблем, `svn` - следующий выбор с чуть более быстрой передачей. Если ни один из них не может быть использован, используйте `http`.
+
+=== Дополнительная информация
+
+Для получения другой информации по использованию Subversion смотрите "книгу Subversion" по названию http://svnbook.red-bean.com/[Version Control with Subversion] или http://subversion.apache.org/docs/[Документацию Subversion].
+
+[[mirrors-rsync]]
+== Использование rsync
+
+Следующие сайты организуют доступ к FreeBSD через протокол rsync. Утилита rsync работает в основном таким же способом, что и команда man:rcp[1], но поддерживает больше параметров и использует протокол удаленного обновления rsync, который передает только разницу между двумя наборами файлов, что значительно повышает скорость синхронизации по сети. Это особенно полезно, если вы поддерживаете зеркало сервера FreeBSD FTP или репозитория CVS. Пакет rsync доступен для многих операционных систем; в FreeBSD смотрите порт package:net/rsync[] или используйте пакет.
+
+Чешская республика::
+rsync://ftp.cz.FreeBSD.org/
++
+Доступные коллекции:
+
+** ftp: Частичное зеркало FreeBSD FTP сервера.
+** FreeBSD: Полное зеркало FreeBSD FTP сервера.
+
+Нидерланды::
+rsync://ftp.nl.FreeBSD.org/
++
+Доступные коллекции:
+
+** FreeBSD: Полное зеркало FreeBSD FTP сервера.
+
+Россия::
+rsync://ftp.mtu.ru/
++
+Доступные коллекции:
+
+** FreeBSD: Полное зеркало FreeBSD FTP сервера.
+** FreeBSD-gnats: База данных системы отслеживания ошибок GNATS.
+** FreeBSD-Archive: Зеркало FreeBSD архивного FTP сервера.
+
+Швеция::
+rsync://ftp4.se.freebsd.org/
++
+Доступные коллекции:
+
+** FreeBSD: Полное зеркало FreeBSD FTP сервера.
+
+Тайвань::
+rsync://ftp.tw.FreeBSD.org/
++
+rsync://ftp2.tw.FreeBSD.org/
++
+rsync://ftp6.tw.FreeBSD.org/
++
+Доступные коллекции:
+
+** FreeBSD: Полное зеркало FreeBSD FTP сервера.
+
+Великобритания::
+rsync://rsync.mirrorservice.org/
++
+Доступные коллекции:
+
+** ftp.freebsd.org: Полное зеркало FreeBSD FTP сервера.
+
+Соединенные Штаты Америки::
+rsync://ftp-master.FreeBSD.org/
++
+Этот сервер может использоваться только основными зеркалами FreeBSD.
++
+Доступные коллекции:
+
+** FreeBSD: Основной архив FreeBSD FTP сервера.
+** acl: Основной ACL список FreeBSD.
++
+rsync://ftp13.FreeBSD.org/
++
+Доступные коллекции:
+
+** FreeBSD: Полное зеркало FreeBSD FTP сервера.
diff --git a/documentation/content/ru/books/handbook/multimedia/_index.adoc b/documentation/content/ru/books/handbook/multimedia/_index.adoc
new file mode 100644
index 0000000000..0ed466b63f
--- /dev/null
+++ b/documentation/content/ru/books/handbook/multimedia/_index.adoc
@@ -0,0 +1,1052 @@
+---
+title: Глава 8. Мультимедиа
+part: Часть II. Общие задачи
+prev: books/handbook/desktop
+next: books/handbook/kernelconfig
+---
+
+[[multimedia]]
+= Мультимедиа
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 8
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/multimedia/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/multimedia/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/multimedia/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[multimedia-synopsis]]
+== Краткий обзор
+
+FreeBSD поддерживает большое количество различных звуковых карт, что позволяет вам насладится высококачественным звуком. Это также дает возможность записывать и воспроизводить звуковые файлы в формате MPEG Audio Layer 3 (MP3), WAV, Ogg Vorbis, а также во множестве других форматов. Коллекция Портов FreeBSD также содержит ряд приложений, позволяющих редактировать записанные звуковые файлы, добавлять звуковые эффекты, управлять подключенными MIDI устройствами.
+
+FreeBSD может поддерживать воспроизведение видеофайлов и DVD. Количество приложений, позволяющих кодировать, преобразовывать и воспроизводить различные форматы видео, существенно меньше количества приложений для работы со звуком. Например, на время написания этого документа в Коллекции Портов FreeBSD не существовало хорошего приложения для преобразования видео, которое могло бы быть использовано для преобразований между разными форматами, как, например, package:audio/sox[]. Впрочем, ситуация в этой области меняется быстро.
+
+Эта глава описывает необходимые шаги для настройки вашей звуковой карты. Настройка и установка X11 (crossref:x11[x11, X Window System]) уже охватывает вопросы, связанные с аппаратными установками вашей видеокарты, хотя могут быть возможности дополнительной настройки для улучшения воспроизведения.
+
+После прочтения этой главы вы будете знать:
+
+* Как настроить систему так, чтобы звуковая карта была опознана.
+* Методы проверки работы звуковой карты при помощи тестовых приложений.
+* Как исправить проблемы, возникающие при работе со звуковыми картами.
+* Как прослушать и создать MP3 и другие форматы.
+* Как X сервер поддерживает видео.
+* Некоторые проигрыватели и кодировщики видео, которые показывают хорошие результаты.
+* Как воспроизвести DVD, [.filename]#.mpg# и [.filename]#.avi# файлы.
+* Как скопировать информацию с CD и DVD в файлы.
+* Как настроить ТВ тюнер.
+* Как настроить сканер.
+
+Перед чтением этой главы вам потребуется:
+
+* Узнать, как конфигурировать и устанавливать новое ядро (crossref:kernelconfig[kernelconfig, Настройка ядра FreeBSD]).
+
+[WARNING]
+====
+
+Попытка смонтировать аудио CD при помощи команды man:mount[8] как минимум, сообщит об ошибке и, как максимум, может привести к _панике ядра_. Эти носители имеют специальные форматы, которые отличны от обычной файловой системы ISO.
+====
+
+[[sound-setup]]
+== Настройка звуковой карты
+
+[[sound-device]]
+=== Настройка системы
+
+Перед тем как начать, определите модель вашей карты, процессор, который она использует, и интерфейс карты: PCI или ISA. FreeBSD поддерживает множество разных PCI и ISA карт. Сверьтесь со списком поддерживаемых аудио устройств в link:{u-rel120-hardware}[Информации об оборудовании], чтобы проверить, поддерживается ли ваша карта. Этот документ также содержит информацию о том, какой драйвер поддерживает вашу карту.
+
+Для того, чтобы использовать звуковую карту, вы должный загрузить соответствующий драйвер устройства. Этого можно достигнуть двумя путями. Простейший способ - это просто загрузить соответствующий вашей карте модуль ядра используя man:kldload[8], что можно сделать или из командной строки:
+
+[source,bash]
+....
+# kldload snd_emu10k1
+....
+
+или добавлением соответствующей строки к файлу [.filename]#/boot/loader.conf#:
+
+[.programlisting]
+....
+snd_emu10k1_load="YES"
+....
+
+Эти примеры приведены для звуковой карты Creative SoundBlaster(R) Live!. Другие имеющиеся модули драйверов звуковых карты приведены в [.filename]#/boot/defaults/loader.conf# Если вы не уверены, какой драйвер использовать, попробуйте загрузить [.filename]#snd_driver#:
+
+[source,bash]
+....
+# kldload snd_driver
+....
+
+Это мета-драйвер, загружающий сразу все наиболее распространенные драйверы сразу. Это повышает скорость поиска правильного драйвера. Возможна также загрузка всех звуковых драйверов через [.filename]#/boot/loader.conf#.
+
+Для того чтобы узнать, какой именно драйвер требуется для вашей звуковой карты, вы можете проверить содержимое файла [.filename]#/dev/sndstat# при помощи команды `cat /dev/sndstat`.
+
+Другой способ заключается в добавлении статического драйвера в ядро. В разделе ниже дана более подробная информация о том, что вам нужно сделать для добавления поддержки оборудования. Более подробно о конфигурация ядра описана в crossref:kernelconfig[kernelconfig, Настройка ядра FreeBSD].
+
+==== Настройка собственного ядра с поддержкой звука
+
+Первое, что необходимо сделать, это добавить в ядро общий звуковой драйвер man:sound[4]. Добавьте в файл конфигурации ядра следующую строку:
+
+[.programlisting]
+....
+device sound
+....
+
+Затем необходимо добавить поддержку имеющейся звуковой карты. Следовательно, нужно знать какой драйвер поддерживает карту. Для этого сверьтесь со списком поддерживаемых устройств из link:{u-rel120-hardware}[Информации об оборудовании]. Например, звуковая карта Creative SoundBlaster(R) Live! поддерживается драйвером man:snd_emu10k1[4]. Для добавления поддержки этой карты, используйте:
+
+[.programlisting]
+....
+device snd_emu10k1
+....
+
+Прочтите страницу справочника драйвера, чтобы узнать, какой синтаксис использовать. Информация, относящаяся к синтаксису включения звуковых драйверов в файл конфигурации ядра, может быть также найдена в файле [.filename]#/usr/src/sys/conf/NOTES#.
+
+Не-PnP ISA карты могут потребовать включения в ядро информации о настройках звуковой карты (IRQ, I/O port, и т.д.). Эта информация добавляется редактированием файла [.filename]#/boot/device.hints#. Во время загрузки системы man:loader[8] прочтет этот файл и передаст настройки ядру. Например, старая ISA не-PnP карта Creative SoundBlaster(R) 16 использует драйвер man:snd_sbc[4] совместно с snd_sb16(4). Для этой карты к файлу настройки ядра необходимо добавить следующие строки:
+
+[.programlisting]
+....
+device snd_sbc
+device snd_sb16
+....
+
+и со следующей информацией в [.filename]#/boot/device.hints#:
+
+[.programlisting]
+....
+hint.sbc.0.at="isa"
+hint.sbc.0.port="0x220"
+hint.sbc.0.irq="5"
+hint.sbc.0.drq="1"
+hint.sbc.0.flags="0x15"
+....
+
+В данном случае, карта использует порт ввода-вывода `0x220` и IRQ `5`.
+
+Синтаксис, используемый в файле [.filename]#/boot/device.hints#, описан в справочной странице драйвера.
+
+Установки, приведенные выше, используются по умолчанию. В некоторых случаях вам может потребоваться изменить IRQ или другие настройки в соответствии с настройками карты. За более подробной информацией обратитесь к странице справочника man:snd_sbc[4].
+
+[[sound-testing]]
+=== Тестирование звуковой карты
+
+После перезагрузки модифицированного ядра, или после загрузки необходимого модуля, звуковая карта должна появиться в буфере системных сообщений (man:dmesg[8]) примерно так:
+
+[source,bash]
+....
+pcm0: <Intel ICH3 (82801CA)> port 0xdc80-0xdcbf,0xd800-0xd8ff irq 5 at device 31.5 on pci0
+pcm0: [GIANT-LOCKED]
+pcm0: <Cirrus Logic CS4205 AC97 Codec>
+....
+
+Статус звуковой карты может быт проверен через файл [.filename]#/dev/sndstat#:
+
+[source,bash]
+....
+# cat /dev/sndstat
+FreeBSD Audio Driver (newpcm)
+Installed devices:
+pcm0: <Intel ICH3 (82801CA)> at io 0xd800, 0xdc80 irq 5 bufsz 16384
+kld snd_ich (1p/2r/0v channels duplex default)
+....
+
+Вывод этой команды для вашей системы может отличаться. Если устройства [.filename]#pcm# не появились, вернитесь назад и проверьте выполненные действия. Проверьте файл настройки ядра еще раз и убедитесь, что выбрано подходящее устройство. Часто встречающиеся проблемы приведены в <<troubleshooting>>.
+
+Если всё пройдет удачно, звуковая карта заработает. Если CD-ROM или DVD-ROM привод правильно подключён к звуковой карте, вы можете вставить CD в привод и воспроизвести его при помощи man:cdcontrol[1].
+
+[source,bash]
+....
+% cdcontrol -f /dev/acd0 play 1
+....
+
+Различные приложения, например package:audio/workman[] могут предоставить более дружественный пользователю интерфейс. Вы можете также установить приложения для прослушивания звуковых файлов MP3, как например package:audio/mpg123[]. Быстрым способом тестирования звуковой карты является отправка данных в файл [.filename]#/dev/dsp#, как показано здесь:
+
+[source,bash]
+....
+% cat filename > /dev/dsp
+....
+
+где _filename_ может быть любым файлом. Результатом выполнения этой команды станет шум, который означает, что звуковая карта на самом деле работает.
+
+Уровни громкости звука могут быть изменены командой man:mixer[8]. Более подробная информация находится на странице справочной системы man:mixer[8].
+
+[[troubleshooting]]
+==== Часто встречающиеся проблемы
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Ошибка
+| Решение
+
+|`unsupported subdevice XX`
+|
+
+Одно или более устройств не были правильно созданы. Повторите приведенные выше шаги.
+
+|`sb_dspwr(XX) timed out`
+|
+
+Порт ввода-вывода указан неправильно.
+
+|`bad irq XX`
+|
+
+IRQ установлен неправильно. Убедитесь, что настройки в системе и на карте одинаковы.
+
+|`xxx: gus pcm not attached, out of memory`
+|
+
+Для использования устройства недостаточно памяти.
+
+|`xxx: can't open /dev/dsp!`
+|
+
+Проверьте с помощью `fstat \| grep dsp`, не занято ли устройство другим приложением. Создать проблемы могут esound и поддержка звука в KDE.
+|===
+
+[[sound-multiple-sources]]
+=== Использование нескольких источников звука
+
+Достаточно часто встречается необходимость иметь несколько источников звука, которые должны воспроизводить одновременно, например когда esound или artsd не поддерживают совместное использование звукового устройства с некоторым приложением.
+
+FreeBSD позволяет делать это при помощи _виртуальных звуковых каналов_, которые могут быть настроены с помощью man:sysctl[8]. Виртуальные каналы позволяют вам мультиплексировать каналы воспроизведения звуковой карты, смешивая звук в ядре.
+
+Для установки количества виртуальных каналов вы можете использовать две переменные sysctl, которые, если вы пользователь `root`, могут быть установлены таким образом:
+
+[source,bash]
+....
+# sysctl hw.snd.pcm0.vchans=4
+# sysctl hw.snd.maxautovchans=4
+....
+
+В этом примере выделяются четыре виртуальных канала, чего вполне достаточно для повседневного использования. `hw.snd.pcm0.vchans` это количество виртуальных каналов устройства [.filename]#pcm0#, оно может быть установлено сразу же, как только устройство было подключено. `hw.snd.maxautovchans` это количество виртуальных каналов, которые выделяются новому аудио устройству, когда оно подключается при помощи man:kldload[8]. Так как модуль [.filename]#pcm# может быть загружен независимо от аппаратных драйверов, `hw.snd.maxautovchans` может указывать количество виртуальных каналов для любых устройств, которые будут подключены позже.
+
+[NOTE]
+====
+Количество виртуальных каналов не может быть изменено, если аудио устройство занято. Вам потребуется предварительно закрыть все программы, работающие со звуком, такие как медиа-проигрыватели или звуковые даемоны.
+====
+
+Если вы не используете man:devfs[5], необходимо будет указать приложениям [.filename]#/dev/dsp0#._x_, где _x_ это число от 0 до 3, если `hw.snd.pcm0.vchans` установлено в значение 4. Для системы, использующей man:devfs[5], вышеуказанные настройки будут сделаны автоматически прозрачно для пользователя.
+
+=== Установка значений по умолчанию для каналов mixer
+
+Значения по умолчанию для различных каналов mixer жестко прописаны в исходных текстах драйвера man:pcm[4]. Существует множество различных приложений и даемонов, которые позволяют устанавливать значения для mixer, которые они запоминают и выставляют каждый раз при запуске, но это не совсем правильное решение, нам нужны значения по умолчанию на уровне драйвера. Они могут быть установлены путем указания в [.filename]#/boot/device.hints#. Например:
+
+[.programlisting]
+....
+hint.pcm.0.vol="100"
+....
+
+Установит значение для канала volume в значение по умолчанию 100, как только будет загружен модуль man:pcm[4].
+
+[[sound-mp3]]
+== Звук MP3
+
+MP3 (MPEG Layer 3 Audio) достигает качества звука, близкого к CD, и нет причин не воспользоваться им на вашей рабочей станции.
+
+[[mp3-players]]
+=== Проигрыватели MP3
+
+На данный момент наиболее популярным MP3-проигрывателем для X11 является XMMS (X Multimedia System). Скины приложения WinAMP могут быть использованы для XMMS так как графический интерфейс пользователя практически идентичен интерфейсу программы WinAMP от Nullsoft. XMMS поддерживает также собственные расширения.
+
+XMMS может быть установлен из порта или пакета package:multimedia/xmms[].
+
+Интерфейс XMMS интуитивно понятен и включает в себя список песен, графический эквалайзер и многое другое. Те, кто знаком с WinAMP, найдут XMMS очень простым в использовании.
+
+Порт package:audio/mpg123[] является альтернативой, это MP3-проигрыватель для командной строки.
+
+mpg123 может быть запущен с указанием звукового устройства и файла MP3 в командной строке как показано ниже:
+
+[source,bash]
+....
+# mpg123 -a /dev/dsp1.0 Foobar-GreatestHits.mp3
+High Performance MPEG 1.0/2.0/2.5 Audio Player for Layer 1, 2 and 3.
+Version 0.59r (1999/Jun/15). Written and copyrights by Michael Hipp.
+Uses code from various people. See 'README' for more!
+THIS SOFTWARE COMES WITH ABSOLUTELY NO WARRANTY! USE AT YOUR OWN RISK!
+
+Playing MPEG stream from Foobar-GreatestHits.mp3 ...
+MPEG 1.0 layer III, 128 kbit/s, 44100 Hz joint-stereo
+....
+
+`/dev/dsp1.0` должно быть заменено соответствующим устройством [.filename]#dsp# для вашей системы.
+
+[[rip-cd]]
+=== Копирование аудио дорожек с CD
+
+Перед тем как преобразовывать CD или дорожку CD в MP3, аудио данные на CD должны быть скопированы на жёсткий диск. Это можно сделать путём копирования данных CDDA (CD Digital Audio) в файл WAV.
+
+Утилита `cdda2wav`, которая является частью пакета package:sysutils/cdrtools[], может быть использована для копирования аудио информации с CD, а также различной связанной информации.
+
+Когда музыкальный CD находится в приводе, следующая команда может быть выполнена под `root` для того, чтобы скопировать весь CD в отдельные (один на каждую дорожку) WAV файлы:
+
+[source,bash]
+....
+# cdda2wav -D 0,1,0 -B
+....
+
+cdda2wav поддерживает ATAPI (IDE) приводы CDROM. Для копирования с IDE привода, укажите имя устройства вместо номеров SCSI. Например, для того, чтобы скопировать 7-ую аудио дорожку с IDE-привода:
+
+[source,bash]
+....
+# cdda2wav -D /dev/acd0 -t 7
+....
+
+Параметр `-D _0,1,0_` указывает устройство SCSI [.filename]#0,1,0#, соответственно результату работы `cdrecord -scanbus`.
+
+Для того, чтобы копировать отдельные дорожки, используйте параметр `-t` как показано ниже:
+
+[source,bash]
+....
+# cdda2wav -D 0,1,0 -t 7
+....
+
+Этот пример показывает как скопировать 7-ю дорожку музыкального CD. Для того чтобы скопировать набор дорожек, например, с первой по седьмую, укажите диапазон:
+
+[source,bash]
+....
+# cdda2wav -D 0,1,0 -t 1+7
+....
+
+Утилита man:dd[1] также может быть использована для копирования аудио дорожек на приводах ATAPI, для того, чтобы узнать больше об этом, прочитайте crossref:disks[duplicating-audiocds,Копирование аудио CD].
+
+[[mp3-encoding]]
+=== Создание файлов MP3
+
+На сегодняшний день наилучшим выбором программы для создания mp3 является lame. Lame находится в дереве портов в подкаталоге package:audio/lame[].
+
+Используя скопированные файлы WAV, следующая команда преобразует [.filename]#audio01.wav# в [.filename]#audio01.mp3#:
+
+[source,bash]
+....
+# lame -h -b 128 \
+--tt "Foo Song Title" \
+--ta "FooBar Artist" \
+--tl "FooBar Album" \
+--ty "2001" \
+--tc "Ripped and encoded by Foo" \
+--tg "Genre" \
+audio01.wav audio01.mp3
+....
+
+Частота 128 килобит является стандартом "де факто" для MP3. Многие, однако, используют более высокие частоты для получения лучшего качества, 160 или 192 килобита. Чем выше частота, тем больше дискового пространства будет занимать получаемый MP3, но качество будет выше. Параметр `-h` включает режим "лучшее качество, но меньше скорость". Параметры, начинающиеся с `--t` указывают теги ID3, которые обычно содержат информацию о песне, включаемую в файл MP3. О дополнительных настройках преобразования можно узнать, прочитав страницу руководства lame.
+
+[[mp3-decoding]]
+=== Декодирование MP3
+
+Для того, чтобы записать музыкальный CD из файлов MP3, они должны быть преобразованы в несжатый формат WAV. Как XMMS, так и mpg123 поддерживают вывод MP3 в распакованный формат файлов.
+
+Запись на диск в XMMS:
+
+[.procedure]
+====
+. Запустите XMMS:
+. Нажмите правой кнопкой мыши в главном окне XMMS для того, чтобы показать меню.
+. Выберите `Preferences` (либо `Свойства`, если у вас локализованная версия XMMS) в `Options`.
+. Измените расширение вывода на "Disk Writer Plugin" (или "Расширение записи на диск", если у вас локализованная версия XMMS).
+. Нажмите `Configure` (или "Настройка", если у вас локализованная версия XMMS).
+. Введите (или выберите при помощи обзора) каталог, в который следует сохранять распакованные файлы.
+. Загрузите файл MP3 в XMMS как вы это делаете обычно. Установите громкость на 100% и отключите эквалайзер.
+. Нажмите `Воспроизвести` - XMMS будет выглядеть так же как и при обычном воспроизведении MP3, но самой музыки слышно не будет. На самом деле MP3 воспроизводится в файл.
+. Убедитесь, что вы установили расширение вывода таким, как оно было до этого, для того, чтобы снова слушать MP3.
+====
+
+Запись в stdout в mpg123:
+
+[.procedure]
+====
+. Запустите `mpg123 -s _audio01.mp3_ > audio01.pcm`
+====
+
+XMMS записывает файл в формате WAV, в то время как mpg123 преобразовывает MP3 в простые аудио данные PCM. Оба формата могут быть использованы cdrecord для создания музыкальных CD. Для использования man:burncd[8] вам потребуются простые аудио данные PCM. Если же вы будете использовать файлы в формате WAV, то заметите небольшой щелчок в начале каждой аудио дорожки, этот щелчок - заголовок файла в формате WAV. Вы очень просто можете избавиться от него путём удаления заголовка WAV при помощи утилиты SoX (она может быть установлена из порта package:audio/sox[] или соответствующего пакета:
+
+[source,bash]
+....
+% sox -t wav -r 44100 -s -w -c 2 track.wav track.raw
+....
+
+Прочтите crossref:disks[creating-cds,Запись и использование оптических носителей (CD)] для того, чтобы узнать больше о записи CD в FreeBSD.
+
+[[video-playback]]
+== Воспроизведение видео
+
+Воспроизведение видео является очень новой и быстро развивающейся областью применения. Будьте терпеливы. Не всё будет работать так беспроблемно, как это было со звуком.
+
+Прежде, чем вы начнёте, определите модель видеокарты и чипсет, который она использует. Хотя Xorg и XFree86(TM) поддерживают множество различных видеокарт, только их малая часть показывает хорошую скорость воспроизведения видео. Для того, чтобы получить список расширений, поддерживаемых X-сервером, который используется вашей видеокартой, используйте команду man:xdpyinfo[1] во время работы X11.
+
+Неплохо также иметь небольшой файл MPEG, который бы использовался как тестовый файл для проверки различных проигрывателей и настроек. Так как некоторые проигрыватели DVD будут искать носитель DVD как [.filename]#/dev/dvd# по умолчанию или быть жёстко настроены на него, возможно будет полезно сделать символические ссылки на правильные устройства:
+
+[source,bash]
+....
+# ln -sf /dev/acd0 /dev/dvd
+# ln -sf /dev/acd0 /dev/rdvd
+....
+
+Обратите внимание, природа man:devfs[5] такова, что такие созданные вручную ссылки не сохраняются при перезагрузке системы. Для автоматического создания символических ссылок при каждой загрузке системы добавьте в [.filename]#/etc/devfs.conf# следующие строки:
+
+[.programlisting]
+....
+link acd0 dvd
+link acd0 rdvd
+....
+
+Кроме того, декодирование DVD требует доступа к специальным функциям DVD-ROM, поэтому должен быть доступ на запись для устройств DVD.
+
+Для того, чтобы улучшить работу разделяемой памяти X11, рекомендуется увеличить значения некоторых переменных man:sysctl[8]:
+
+[.programlisting]
+....
+kern.ipc.shmmax=67108864
+kern.ipc.shmall=32768
+....
+
+[[video-interface]]
+=== Определение возможностей видео
+
+Существует несколько возможных путей отображения видео под X11. Что именно будет действительно работать, во многом зависит от аппаратного обеспечения. Каждый из описанных методов будет работать с различным качеством на разном аппаратном обеспечении. Во-вторых, воспроизведение видео в X11, это тема, которой уделяется достаточно много внимания последнее время, и с каждой новой версией Xorg или XFree86(TM) могут наблюдаться значительные улучшения.
+
+Список наиболее часто используемых видеоинтерфейсов:
+
+. X11: обычный вывод X11 с использованием разделяемой памяти.
+. XVideo: расширение интерфейса X11, которое поддерживает видео в любом объекте X11.
+. SDL: the Simple Directmedia Layer.
+. DGA: the Direct Graphics Access - прямой доступ для графики.
+. SVGAlib: низкоуровневый доступ к графике на консоли.
+
+[[video-interface-xvideo]]
+==== XVideo
+
+Xorg и XFree86(TM) 4.X включают в себя расширение, называющееся _XVideo_ (также известное как Xvideo, Xv и xv), которое позволяет отображать видео прямо на объектах при помощи специального ускорения. Это расширение предоставляет очень хорошее качество воспроизведения даже на low-end машинах.
+
+Для того чтобы проверить, работает ли это расширение, используйте команду `xvinfo`:
+
+[source,bash]
+....
+% xvinfo
+....
+
+XVideo поддерживается вашей видеокартой, если результат выглядит приблизительно так:
+
+[source,bash]
+....
+X-Video Extension version 2.2
+screen #0
+ Adaptor #0: "Savage Streams Engine"
+ number of ports: 1
+ port base: 43
+ operations supported: PutImage
+ supported visuals:
+ depth 16, visualID 0x22
+ depth 16, visualID 0x23
+ number of attributes: 5
+ "XV_COLORKEY" (range 0 to 16777215)
+ client settable attribute
+ client gettable attribute (current value is 2110)
+ "XV_BRIGHTNESS" (range -128 to 127)
+ client settable attribute
+ client gettable attribute (current value is 0)
+ "XV_CONTRAST" (range 0 to 255)
+ client settable attribute
+ client gettable attribute (current value is 128)
+ "XV_SATURATION" (range 0 to 255)
+ client settable attribute
+ client gettable attribute (current value is 128)
+ "XV_HUE" (range -180 to 180)
+ client settable attribute
+ client gettable attribute (current value is 0)
+ maximum XvImage size: 1024 x 1024
+ Number of image formats: 7
+ id: 0x32595559 (YUY2)
+ guid: 59555932-0000-0010-8000-00aa00389b71
+ bits per pixel: 16
+ number of planes: 1
+ type: YUV (packed)
+ id: 0x32315659 (YV12)
+ guid: 59563132-0000-0010-8000-00aa00389b71
+ bits per pixel: 12
+ number of planes: 3
+ type: YUV (planar)
+ id: 0x30323449 (I420)
+ guid: 49343230-0000-0010-8000-00aa00389b71
+ bits per pixel: 12
+ number of planes: 3
+ type: YUV (planar)
+ id: 0x36315652 (RV16)
+ guid: 52563135-0000-0000-0000-000000000000
+ bits per pixel: 16
+ number of planes: 1
+ type: RGB (packed)
+ depth: 0
+ red, green, blue masks: 0x1f, 0x3e0, 0x7c00
+ id: 0x35315652 (RV15)
+ guid: 52563136-0000-0000-0000-000000000000
+ bits per pixel: 16
+ number of planes: 1
+ type: RGB (packed)
+ depth: 0
+ red, green, blue masks: 0x1f, 0x7e0, 0xf800
+ id: 0x31313259 (Y211)
+ guid: 59323131-0000-0010-8000-00aa00389b71
+ bits per pixel: 6
+ number of planes: 3
+ type: YUV (packed)
+ id: 0x0
+ guid: 00000000-0000-0000-0000-000000000000
+ bits per pixel: 0
+ number of planes: 0
+ type: RGB (packed)
+ depth: 1
+ red, green, blue masks: 0x0, 0x0, 0x0
+....
+
+Следует заметить, что перечисленные форматы (YUV2, YUV12 и т.п.) не присутствуют в каждой реализации XVideo и их отсутствие может быть помехой для некоторых проигрывателей.
+
+Если результат выглядит так:
+
+[source,bash]
+....
+X-Video Extension version 2.2
+screen #0
+no adaptors present
+....
+
+то, возможно, XVideo не поддерживается для вашей видеокарты.
+
+Если XVideo не поддерживается вашей видеокартой, то это всего лишь означает, что будет сложнее получить приемлемые для воспроизведения видео вычислительные мощности. В зависимости от вашей видеокарты и процессора, возможно, вы сможете получить удовлетворительный результат. Возможно, вы должны будете прочитать о путях улучшения производительности в <<video-further-reading>>.
+
+[[video-interface-SDL]]
+==== Simple Directmedia Layer
+
+SDL был задуман как уровень абстракции для разработки кросплатформенных приложений под Microsoft(R) Windows(R), BeOS и UNIX(R), позволяя им эффективно использовать звук и графику. SDL предоставляет низкоуровневые абстракции для аппаратного обеспечения, и может быть более эффективным чем интерфейс X11.
+
+SDL есть в Коллекции портов FreeBSD: package:devel/sdl12[].
+
+[[video-interface-DGA]]
+==== Прямой доступ для графики (DGA)
+
+DGA это расширение X11, которое позволяет программам напрямую изменять кадровый буфер (framebuffer) без участия X-сервера. Поскольку DGA основывается на низкоуровневом доступе к памяти, программы, которые используют его должны исполняться от пользователя `root`.
+
+Расширение DGA может быть протестировано при помощи man:dga[1]. Когда `dga` запущена, она изменяет цвета на экране при каждом нажатии клавиш. Для того, чтобы выйти из неё, используйте kbd:[q].
+
+[[video-ports]]
+=== Порты и пакеты для работы с видео
+
+Этот раздел обсуждает программное обеспечение для работы с видео из Коллекции Портов FreeBSD. Воспроизведение видео является очень активной сферой разработок программного обеспечения и возможности различных приложений могут несколько отличаться от описанных здесь.
+
+Во-первых, важно помнить, что многие приложения для работы с видео, которые работают на FreeBSD, были разработаны как приложения Linux. Многие из этих приложений все еще бета-качества. Вот некоторые проблемы, которые могут встретиться в работе видео пакетов на FreeBSD:
+
+. Приложение не может воспроизвести файл, который создало другое приложение.
+. Приложение не может воспроизвести файл, который создало само.
+. Одно и то же приложение на разных машинах, скомпилированное на каждой машине специально для неё, воспроизводит один и тот же файл различно.
+. Кажущийся тривиальным фильтр, например фильтр изменения размеров изображения, приводит к очень плохим "артефактам" из-за неправильной функции изменения размера.
+. Приложение часто не работает (оставляет core-файл).
+. Документация не устанавливается вместе с портом и может быть найдена лишь на сайте или в каталоге порта [.filename]#work#.
+
+Многие из этих приложений могут также проявлять "линуксизмы". Так, это могут быть некоторые проблемы, связанные со способом реализации некоторых стандартных библиотек в дистрибутивах Linux, или некоторыми дополнительными возможностями ядра Linux, которые авторы приложений посчитали существующими везде. Эти проблемы не всегда могут быть обнаружены людьми, поддерживающими порт (порты), вследствие чего могут возникнуть проблемы, сходные с нижеперечисленными:
+
+. Использование [.filename]#/proc/cpuinfo# для того, чтобы определить характеристики процессора.
+. Неправильное использование нитей (threads), которое может привести к зависанию программы при завершении вместо нормального выхода.
+. Программного обеспечения, которое обычно используется совместно с данным приложением, ещё нет в Коллекции Портов FreeBSD.
+
+Таким образом, разработчики этих приложений должны сотрудничать с людьми, поддерживающими порты, для того, чтобы минимизировать количество обходных путей, необходимых для портирования.
+
+[[video-mplayer]]
+==== MPlayer
+
+MPlayer это недавно разработанный и быстро развивающийся проигрыватель видео. Задачами команды разработчиков MPlayer являются скорость и гибкость при работе на Linux и других Unix-системах. Проект был начат, когда его основатель стал сыт по горло плохой производительностью и качеством проигрывателей того времени. Некоторые могут сказать, что графический интерфейс был принесён в жертву рационализированному дизайну. Однако, как только вы привыкнете к опциям командной строки MPlayer и его управлению с клавиатуры, всё будет хорошо.
+
+[[video-mplayer-building]]
+===== Компиляция MPlayer
+
+MPlayer находится в package:multimedia/mplayer[]. MPlayer производит различные тесты аппаратного обеспечения во время процесса компиляции, в результате чего полученные исполняемые модули не могут быть перенесены с одной системы на другую. Поэтому важно собирать его из портов, а не использовать бинарный пакет. Также, при сборке вы можете указать различные установки при помощи параметров командной строки `make`, как описывается в [.filename]#Makefile# в начале сборки:
+
+[source,bash]
+....
+# cd /usr/ports/multimedia/mplayer
+# make
+N - O - T - E
+
+Take a careful look into the Makefile in order
+to learn how to tune mplayer towards you personal preferences!
+For example,
+make WITH_GTK1
+builds MPlayer with GTK1-GUI support.
+If you want to use the GUI, you can either install
+/usr/ports/multimedia/mplayer-skins
+or download official skin collections from
+http://www.mplayerhq.hu/homepage/dload.html
+....
+
+Параметры порта по умолчанию должны подходить большинству пользователей. Однако, если вам необходим кодек XviD, необходимо указать в командной строке параметр `WITH_XVID`. Устройство DVD по умолчанию также может быть указано в командной строке параметром `WITH_DVD_DEVICE`, по умолчанию используется [.filename]#/dev/acd0#.
+
+На время написания данного документа порт MPlayer'а собирает и устанавливает свою документацию в формате HTML и два исполняемых файла, `mplayer` и `mencoder`, который является утилитой для перекодировки видео.
+
+Документация к MPlayer очень информативна. Если читатель найдет информацию этой главы о аппаратном обеспечении для поддержки видео и интерфейсах недостаточной, то документация MPlayer будет очень хорошим дополнением. Обязательно уделите время чтению документации MPlayer, если вам нужна информация о поддержке видео под UNIX(R).
+
+[[video-mplayer-using]]
+===== Использование MPlayer
+
+Каждый пользователь MPlayer должен создать подкаталог [.filename]#.mplayer# в своем домашнем каталоге. Для того, чтобы его создать, выполните следующие действия:
+
+[source,bash]
+....
+% cd /usr/ports/multimedia/mplayer
+% make install-user
+....
+
+Параметры для `mplayer` перечислены в страничке руководства mplayer. За более подробной информацией вы можете обратиться к документации в формате HTML. В этом разделе мы опишем несколько самых распространённых случаев использования mplayer.
+
+Для того, чтобы воспроизвести файл, например [.filename]#testfile.avi# через один из многих видеоинтерфейсов, используйте параметр `-vo`:
+
+[source,bash]
+....
+% mplayer -vo xv testfile.avi
+....
+
+[source,bash]
+....
+% mplayer -vo sdl testfile.avi
+....
+
+[source,bash]
+....
+% mplayer -vo x11 testfile.avi
+....
+
+[source,bash]
+....
+# mplayer -vo dga testfile.avi
+....
+
+[source,bash]
+....
+# mplayer -vo 'sdl:dga' testfile.avi
+....
+
+Стоит испробовать все варианты интерфейсов, так как их производительность зависит от множества факторов и будет заметно меняться в зависимости от аппаратного обеспечения.
+
+Для того, чтобы воспроизвести DVD, замените [.filename]#testfile.avi# на `dvd://_N_ -dvd-device _DEVICE_`, где _N_ является номером дорожки, с которой следует начать воспроизведение и [.filename]#DEVICE# файл устройства привода DVD. Например, для того, чтобы воспроизвести дорожку 3 с [.filename]#/dev/dvd#:
+
+[source,bash]
+....
+# mplayer -vo xv dvd://3 -dvd-device /dev/dvd
+....
+
+[NOTE]
+====
+Устройство DVD по умолчанию может быть определено во время сборки порта MPlayer параметром `WITH_DVD_DEVICE`. По умолчанию, это устройство [.filename]#/dev/acd0#. Дополнительную информацию можно найти в [.filename]#Makefile# порта.
+====
+
+Для того, чтобы остановить, приостановить или продолжить воспроизведение, воспользуйтесь привязкой клавиш, информация о которой может быть получена посредством запуска `mplayer -h`, либо на страничке документации.
+
+Дополнительные, достаточно важные параметры воспроизведения: `-fs -zoom`, которые включают полноэкранный режим и `-framedrop`, который улучшает производительность на медленных системах.
+
+Для того, чтобы командная строка запуска mplayer не становилась слишком большой, пользователь может создать файл [.filename]#.mplayer/config# и установить параметры по умолчанию там:
+
+[.programlisting]
+....
+vo=xv
+fs=yes
+zoom=yes
+....
+
+Также `mplayer` может быть использован для копирования дорожек DVD в [.filename]#.vob# файлы. Для того, чтобы скопировать вторую дорожку DVD необходимо выполнить следующую команду:
+
+[source,bash]
+....
+# mplayer -dumpstream -dumpfile out.vob dvd://2 -dvd-device /dev/dvd
+....
+
+Полученный файл, [.filename]#out.vob#, будет представлять собой MPEG, с которым можно производить различные действия при помощи программ, которые будут описаны далее в этом разделе.
+
+[[video-mencoder]]
+===== mencoder
+
+Перед использованием `mencoder`, было бы неплохо ближе ознакомится с его параметрами, используя документацию в формате HTML. Также существует страничка справочника mplayer, но она не очень полезна без HTML документации. Существует бесчисленное множество способов улучшения качества, снижения битрейта и изменения формата; и некоторые из этих приёмов могут влиять на производительность. Ниже приведено несколько примеров использования `mencoder`. Во-первых, простое копирование:
+
+[source,bash]
+....
+% mencoder input.avi -oac copy -ovc copy -o output.avi
+....
+
+Неправильная комбинация параметров командной строки может привести к появлению файлов, которые невозможно будет воспроизвести даже `mplayer`. Поэтому, если вы хотите скопировать изображение в файл, лучше использовать только параметр `mplayer -dumpfile`.
+
+Для того, чтобы преобразовать [.filename]#input.avi# в MPEG4 со звуком в формате MPEG Audio Layer 3 (MP3) (требуется package:audio/lame[]):
+
+[source,bash]
+....
+% mencoder input.avi -oac mp3lame -lameopts br=192 \
+ -ovc lavc -lavcopts vcodec=mpeg4:vhq -o output.avi
+....
+
+Эта команда создаст файл, воспроизводимый `mplayer` и `xine`.
+
+[.filename]#input.avi# может быть заменён на `dvd://1 -dvd-device /dev/dvd` и `mplayer`, запущенный от пользователя `root`, будет преобразовывать дорожку DVD напрямую. Так как первый раз, скорее всего, вы будете недовольны полученными результатами, всё же рекомендуется копировать дорожку в файл и работать затем с файлом.
+
+[[video-xine]]
+==== Проигрыватель хine
+
+xine - это большой проект, в задачи которого входит не только создание решения для видео все-в-одном, но и создание базовой библиотеки с возможностью расширения путем использования плагинов. Поставляется он как в виде порта, так и в виде пакета, package:multimedia/xine[].
+
+xine все еще несовершенен, но все-таки это хорошее начало. На практике xine требует либо быстрого процессора с быстрой видеокартой или поддержки расширения XVideo. Графический интерфейс можно использовать, но он все еще немного неуклюж.
+
+На время написания этого документа в поставке xine не существовало модуля ввода, который бы мог воспроизводить DVD, закодированные по алгоритму CSS. Существуют сборки, в которых есть такой модуль, но ни одна из них не входит в Коллекцию Портов FreeBSD.
+
+По сравнению с MPlayer, xine является более дружелюбным к пользователю, но, в то же время, скрывает более тонкие настройки и управление от пользователя. Также xine лучше работает на XVideo интерфейсах.
+
+По умолчанию, xine запускается с графическим интерфейсом. Для открытия файлов используются меню.
+
+[source,bash]
+....
+% xine
+....
+
+В качестве альтернативы можно использовать его для запуска файла непосредственно, без GUI, следующей командой:
+
+[source,bash]
+....
+% xine -g -p mymovie.avi
+....
+
+[[video-ports-transcode]]
+==== Утилиты transcode
+
+Приложение transcode не является проигрывателем. Это набор инструментов для преобразования видео и звуковых файлов. При помощи transcode можно объединять видеофайлы, исправлять поврежденные файлы, использовать инструменты командной строки для работы с потоками ввода/вывода [.filename]#stdin/stdout#.
+
+Большое количество опций может быть указано во время сборки порта package:multimedia/transcode[]. Для сборки transcode мы рекомендуем использовать следующую командную строку:
+
+[source,bash]
+....
+# make WITH_OPTIMIZED_CFLAGS=yes WITH_LIBA52=yes WITH_LAME=yes WITH_OGG=yes \
+WITH_MJPEG=yes -DWITH_XVID=yes
+....
+
+Предложенных установок должно быть достаточно для большинства пользователей.
+
+Для иллюстрации возможностей `transcode` приводится пример, показывающий как сконвертировать файл DivX формата в PAL MPEG-1 файл (PAL VCD):
+
+[source,bash]
+....
+% transcode -i input.avi -V --export_prof vcd-pal -o output_vcd
+% mplex -f 1 -o output_vcd.mpg output_vcd.m1v output_vcd.mpa
+....
+
+Итоговый MPEG файл [.filename]#output_vcd.mpg# может быть проигран с помощью MPlayer. Вы можете даже записать файл на CD-R носитель для создания Video CD. В этом случае, вам нужно будет установить и использовать программы package:multimedia/vcdimager[] и package:sysutils/cdrdao[].
+
+Существует страничка справочника для `transcode`, но вы также должны проконсультироваться с http://www.transcoding.org/cgi-bin/transcode[transcode wiki] для получения более детальной информации и примеров.
+
+[[video-further-reading]]
+=== Дальнейшее чтение
+
+Различные пакеты видео программ для FreeBSD интенсивно разрабатываются. Очень возможно, что в ближайшем будущем многие обсуждаемые здесь проблемы разрешатся. Это займет время, и те, кто желает получить максимум от аудио/видео возможностей FreeBSD, должны будут собирать необходимые знания из нескольких списков часто задаваемых вопросов и обучающих статей, а также использовать различные приложения. Этот раздел существует для того, чтобы читатель мог получить указания на несколько источников дополнительной информации.
+
+http://www.mplayerhq.hu/DOCS/[Документация MPlayer] очень содержательна в техническом плане. Возможно, эти документы должны использоваться любым человеком, желающим получить высокий уровень знаний о видео на UNIX(R) системах. Список рассылки MPlayer враждебен для любого, кто не потрудился прочитать документацию, так что, если у вас есть желание сообщать о найденных ошибках, прочитайте вначале документацию.
+
+http://dvd.sourceforge.net/xine-howto/en_GB/html/howto.html[xine HOWTO] содержит главу об улучшении производительности, которая применима к любому проигрывателю.
+
+Наконец, существует несколько многообещающих приложений, которые читатель может испробовать:
+
+* http://avifile.sourceforge.net/[Avifile], для которого также существует порт package:multimedia/avifile[].
+* http://www.dtek.chalmers.se/groups/dvd/[Ogle], для которого также существует порт package:multimedia/ogle[].
+* http://xtheater.sourceforge.net/[Xtheater]
+* package:multimedia/dvdauthor[], пакет с открытыми текстами для распространения DVD контента.
+
+[[tvcard]]
+== Настройка ТВ тюнеров
+
+=== Введение
+
+ТВ тюнеры предназначены для просмотра широковещательного или кабельного телевидения на компьютере. Большинство тюнеров поддерживают композитный видео вход RCA или S-video, а некоторые из них поставляются с FM радио тюнером.
+
+FreeBSD поддерживает PCI ТВ тюнеры, использующие Brooktree Bt848/849/878/879 или Conexant CN-878/Fusion 878a Video Capture Chip через драйвер man:bktr[4]. Вы должны также убедиться, что тюнер поддерживается; обратитесь к странице справочника man:bktr[4] за списком поддерживаемых тюнеров.
+
+=== Добавление драйвера
+
+Для использования карты потребуется загрузить драйвер man:bktr[4], что можно сделать, добавив в [.filename]#/boot/loader.conf# следующую строку:
+
+[.programlisting]
+....
+bktr_load="YES"
+....
+
+В качестве альтернативы, вы можете статически скомпилировать ядро с поддержкой ТВ тюнера; добавьте следующие строки в файл конфигурации ядра:
+
+[.programlisting]
+....
+device bktr
+device iicbus
+device iicbb
+device smbus
+....
+
+Эти дополнительные драйвера устройств необходимы, поскольку компоненты карты соединены через шину I2C. Затем соберите и установите новое ядро.
+
+Как только поддержка тюнера будет добавлена в систему, перегрузите компьютер. Во время загрузки TV карта должна отобразить примерно такие строки:
+
+[.programlisting]
+....
+bktr0: <BrookTree 848A> mem 0xd7000000-0xd7000fff irq 10 at device 10.0 on pci0
+iicbb0: <I2C bit-banging driver> on bti2c0
+iicbus0: <Philips I2C bus> on iicbb0 master-only
+iicbus1: <Philips I2C bus> on iicbb0 master-only
+smbus0: <System Management Bus> on bti2c0
+bktr0: Pinnacle/Miro TV, Philips SECAM tuner.
+....
+
+Конечно, эти сообщения будут различаться на разном оборудовании. Тем не менее, проверьте, что тюнер определяется правильно; возможна перезапись параметров, определенных ядром, с помощью man:sysctl[8] MIB и параметров в файле настройки ядра. Например, если вы хотите указать, что это Philips SECAM тюнер, добавьте следующую строку к файлу настройки ядра:
+
+[.programlisting]
+....
+options OVERRIDE_TUNER=6
+....
+
+или прямо задайте переменную man:sysctl[8]:
+
+[source,bash]
+....
+# sysctl hw.bt848.tuner=6
+....
+
+Обратитесь к странице man:bktr[4] и файлу [.filename]#/usr/src/sys/conf/NOTES# за более детальной информацией о доступных параметрах.
+
+=== Полезные приложения
+
+Для использования ТВ тюнера вам потребуется установить одно из следующих приложений:
+
+* package:multimedia/fxtv[] предоставляет возможности ТВ-в-окне и захвата изображений/аудио/видео.
+* package:multimedia/xawtv[] это также приложение для ТВ тюнера, с теми же, что и у fxtv возможностями.
+* package:misc/alevt[] раскодирует и отображает видеотекст/телетекст.
+* package:audio/xmradio[], приложение для использования с FM радио тюнером, поставляемым с некоторыми ТВ тюнерами.
+* package:audio/wmtune[], это удобное приложение для радио тюнеров.
+
+В коллекции портов FreeBSD можно найти и другие приложения.
+
+=== Решение проблем
+
+Если вы столкнулись с какой-либо проблемой, связанной с ТВ тюнером, проверьте в первую очередь поддержку микросхемы захвата видео и тюнера драйвером man:bktr[4], а также правильность установки параметров. За дальнейшей поддержкой и с вопросами о ТВ тюнере вы можете обращаться в {freebsd-multimedia} и использовать его архивы.
+
+[[scanners]]
+== Сканеры
+
+=== Введение
+
+В FreeBSD доступ к сканерам обеспечивается программой SANE (Scanner Access Now Easy), обеспечивающей универсальный интерфейс (API) и доступной в коллекции портов FreeBSD. Для общения со сканерами SANE использует некоторые драйвера устройств FreeBSD.
+
+FreeBSD поддерживает сканеры с интерфейсом как SCSI, так и USB. Убедитесь, что ваш сканер поддерживается SANE перед тем, как приступить к конфигурации. Для SANE существует http://www.sane-project.org/sane-supported-devices.html[список поддерживаемых устройств] где находится информация о поддержке сканера и статусе этой поддержки. Кроме того, страница справочника man:uscanner[4] также перечисляет поддерживаемые устройства.
+
+=== Конфигурация ядра
+
+Как уже отмечалось, поддерживаются как SCSI, так и USB сканеры. В зависимости от интерфейса вашего сканера требуется поддержка разных драйверов устройств.
+
+[[scanners-kernel-usb]]
+==== USB
+
+Стандартное ядро [.filename]#GENERIC# включает в себя драйвера, необходимые для поддержки USB сканеров. Если вы компилируете собственное ядро, убедитесь, что в его конфигурации присутствуют строки
+
+[.programlisting]
+....
+device usb
+device uhci
+device ohci
+device uscanner
+....
+
+В зависимости от чипсета USB, встроенного в вашу материнскую плату, потребуется лишь один из драйверов `device uhci` или `device ohci`, однако, наличие обеих строк в конфигурации ядра никому не повредит.
+
+Если вы не хотите перестраивать ядро, и при этом ваше ядро не является стандартным ([.filename]#GENERIC#), вы можете загрузить модуль драйвера поддержки сканеров man:uscanner[4] при помощи команды man:kldload[8]:
+
+[source,bash]
+....
+# kldload uscanner
+....
+
+Для автоматической загрузки модуля при старте системы добавьте в файл [.filename]#/boot/loader.conf# строку
+
+[.programlisting]
+....
+uscanner_load="YES"
+....
+
+После перезагрузки с новым ядром или загрузки модуля подключите ваш USB сканер. В буфере системных сообщений (man:dmesg[8]) должна появиться строка об обнаружении сканера:
+
+[source,bash]
+....
+uscanner0: EPSON EPSON Scanner, rev 1.10/3.02, addr 2
+....
+
+В данном случае сканер будет использовать устройство [.filename]#/dev/uscanner0#.
+
+==== SCSI
+
+Если ваш сканер имеет интерфейс SCSI, важно знать, к какому контроллеру он подключен. В зависимости от контроллера потребуются различные драйвера в файле конфигурации ядра. Стандартное ядро [.filename]#GENERIC# поддерживает большинство распространенных SCSI-контроллеров. Внимательно прочитайте файл [.filename]#NOTES# и добавьте необходимые строки в файл конфигурации вашего ядра. Помимо строки для драйвера адаптера, вам потребуются следующие строки:
+
+[.programlisting]
+....
+device scbus
+device pass
+....
+
+После установки и загрузки нового ядра, в буфере системных сообщений должны появиться строки о вашем сканере, например:
+
+[source,bash]
+....
+pass2 at aic0 bus 0 target 2 lun 0
+pass2: <AGFA SNAPSCAN 600 1.10> Fixed Scanner SCSI-2 device
+pass2: 3.300MB/s transfers
+....
+
+Если сканер не был включен в момент загрузки, его можно принудительно опознать, выполнив сканирование SCSI шины при помощи команды man:camcontrol[8]:
+
+[source,bash]
+....
+# camcontrol rescan all
+Re-scan of bus 0 was successful
+Re-scan of bus 1 was successful
+Re-scan of bus 2 was successful
+Re-scan of bus 3 was successful
+....
+
+После этого сканер должен появиться в списке устройств:
+
+[source,bash]
+....
+# camcontrol devlist
+<IBM DDRS-34560 S97B> at scbus0 target 5 lun 0 (pass0,da0)
+<IBM DDRS-34560 S97B> at scbus0 target 6 lun 0 (pass1,da1)
+<AGFA SNAPSCAN 600 1.10> at scbus1 target 2 lun 0 (pass3)
+<PHILIPS CDD3610 CD-R/RW 1.00> at scbus2 target 0 lun 0 (pass2,cd0)
+....
+
+Более подробная информация о устройствах SCSI доступна на страницах справочника man:scsi[4] и man:camcontrol[8].
+
+=== Конфигурация SANE
+
+Система SANE состоит из двух частей: аппаратной поддержки (backend, package:graphics/sane-backends[]) и программной поддержки (frontend, package:graphics/sane-frontends[]). Первая часть обеспечивает собственно доступ к сканеру. http://www.sane-project.org/sane-supported-devices.html[Список поддерживаемых устройств]SANE содержит информацию о необходимом вам аппаратном модуле. Вторая часть обеспечивает графический интерфейс для сканирования (xscanimage).
+
+В первую очередь следует установить порт или пакет package:graphics/sane-backends[], после чего при помощи команды `sane-find-scanner` проверить поддержку сканера системой SANE:
+
+[source,bash]
+....
+# sane-find-scanner -q
+found SCSI scanner "AGFA SNAPSCAN 600 1.10" at /dev/pass3
+....
+
+В выводе должны присутствовать интерфейс сканера и имя используемого устройства. Производитель и модель сканера могут отсутствовать: это нормально.
+
+[NOTE]
+====
+Некоторым USB сканерам может потребоваться загрузка прошивки. Подробности смотрите в страницах справочника драйвера сканера, man:sane-find-scanner[1] и man:linprocfs[7].
+====
+
+Теперь необходимо убедиться, что сканер опознан программой графического интерфейса. В состав системы SANE входит утилита man:sane[1], позволяющая работать со сканером из командной строки. Опция `-L` используется для показа информации о сканере:
+
+[source,bash]
+....
+# scanimage -L
+device `snapscan:/dev/pass3' is a AGFA SNAPSCAN 600 flatbed scanner
+....
+
+Отсутствие сообщений или сообщение об отсутствии устройств означает, что утилита man:sane[1] не смогла идентифицировать сканер. В этом случае вам потребуется отредактировать файл конфигурации аппаратного модуля и указать устройство, используемое сканером. Все файлы настройки находятся в каталоге [.filename]#/usr/local/etc/sane.d/#. Такие проблемы присущи некоторым моделям USB сканеров.
+
+Например, в случае USB сканера, описанного в <<scanners-kernel-usb>>, утилита `sane-find-scanner` выдаст следующую информацию:
+
+[source,bash]
+....
+# sane-find-scanner -q
+found USB scanner (UNKNOWN vendor and product) at device /dev/uscanner0
+....
+
+Сканер обнаружен корректно, он использует интерфейс USB и доступен через устройство [.filename]#/dev/uscanner0#. Теперь попробуем идентифицировать его:
+
+[source,bash]
+....
+# scanimage -L
+
+No scanners were identified. If you were expecting something different,
+check that the scanner is plugged in, turned on and detected by the
+sane-find-scanner tool (if appropriate). Please read the documentation
+which came with this software (README, FAQ, manpages).
+....
+
+Поскольку сканер не идентифицирован, нам потребуется изменить файл конфигурации [.filename]#/usr/local/etc/sane.d/epson.conf#. В нашем примере использован сканер EPSON Perfection(R) 1650, так что мы знаем, что будет использоваться драйвер `epson`. Не забудьте прочитать комментарии в файле конфигурации. Требуемые изменения весьма просты: закомментируйте все строки, описывающие интерфейсы, не соответствующие интерфейсу вашего сканера (в нашем случае, все строки, начинающиеся со `scsi`: наш сканер использует интерфейс USB), и добавьте в конец файла строку, содержащую интерфейс и имя использованного устройства. Мы добавим строку
+
+[.programlisting]
+....
+usb /dev/uscanner0
+....
+
+Пожалуйста, прочтите комментарии в файле конфигурации, а также страницы справочника для более полной информации. Теперь мы можем проверить, что наш сканер опознан:
+
+[source,bash]
+....
+# scanimage -L
+device `epson:/dev/uscanner0' is a Epson GT-8200 flatbed scanner
+....
+
+Наш USB сканер опознан. Не столь важно, что имя и номер модели не совпадают, главное, что используются правильные имя устройства и драйвер: `epson:/dev/uscanner0`.
+
+После того как команда `scanimage -L` опознала сканер, конфигурация завершена. Все готово к сканированию.
+
+Хотя утилита man:sane[1] позволяет производить сканирование из командной строки, как правило, для сканирования предпочтительнее использовать графический интерфейс. Для этого в состав SANE входит простая, но эффективная утилита xscanimage (package:graphics/sane-frontends[]).
+
+Другой популярной программой графического интерфейса к сканеру является Xsane (package:graphics/xsane[]). Эта программа поддерживает такие расширенные возможности, как разные режимы сканирования (фотокопия, факс и т.п.), цветокоррекцию, потоковое сканирование и другие. Оба приложения пригодны для использования в качестве плагинов сканирования для GIMP.
+
+=== Доступ к сканеру для других пользователей
+
+Все описанные операции выполнялись нами с привилегиями суперпользователя (`root`). Вам может потребоваться дать доступ к сканеру другим пользователям. Для этого необходимо разрешить доступ на чтение и запись к файлу устройства, обслуживающему сканер. В нашем примере USB сканер использует устройство [.filename]#/dev/uscanner0#, принадлежащее группе `operator`. Добавление пользователя `joe` в группу `operator` разрешит ему использовать сканер:
+
+[source,bash]
+....
+# pw groupmod operator -m joe
+....
+
+За подробностями обращайтесь к странице справочника man:pw[8]. Вам также потребуется установить нужные права доступа (0660 или 0664) к устройству [.filename]#/dev/uscanner0#, поскольку по умолчанию группа `operator` может лишь читать из него. Это достигается добавлением следующей строки в файл [.filename]#/etc/devfs.rules#:
+
+[.programlisting]
+....
+[system=5]
+add path uscanner0 mode 660
+....
+
+Затем добавьте в файл конфигурации системы [.filename]#/etc/rc.conf# такую строку (после чего перезагрузите систему):
+
+[.programlisting]
+....
+devfs_system_ruleset="system"
+....
+
+Подробную информацию о правах на файлы устройств вы найдете на странице справочника man:devfs[8].
+
+[NOTE]
+====
+Разумеется, по соображениям безопасности, вы должны как следует подумать, прежде чем добавлять пользователя в другие группы, в особенности в группу `operator`.
+====
diff --git a/documentation/content/ru/books/handbook/network-servers/_index.adoc b/documentation/content/ru/books/handbook/network-servers/_index.adoc
new file mode 100644
index 0000000000..a64705f278
--- /dev/null
+++ b/documentation/content/ru/books/handbook/network-servers/_index.adoc
@@ -0,0 +1,2659 @@
+---
+title: Глава 25. Сетевые серверы
+part: Часть IV. Сетевые коммуникации
+prev: books/handbook/mail
+next: books/handbook/firewalls
+---
+
+[[network-servers]]
+= Сетевые серверы
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 25
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/network-servers/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/network-servers/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/network-servers/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[network-servers-synopsis]]
+== Краткий обзор
+
+Эта глава посвящена некоторым наиболее часто используемым сетевым службам систем UNIX(R). Мы опишем, как установить, настроить, протестировать и поддерживать многие различные типы сетевых сервисов. Для облегчения вашей работы в главу включены примеры конфигурационных файлов.
+
+После чтения этой главы вы будете знать:
+
+* Как управлять даемоном inetd.
+* Как настроить сетевую файловую систему.
+* Как настроить сетевой сервер информации для совместного использования учётных записей пользователей.
+* Как настроить автоматическое конфигурирование сетевых параметров при помощи DHCP.
+* Как настроить сервер имён.
+* Как настроить Apache HTTP сервер.
+* Как настроить файловый и сервер печати для Windows(R) клиентов с использованием Samba.
+* Как синхронизировать дату и время, а также настроить сервер времени с протоколом NTP.
+* Как настроить стандартный демон протоколирования, `syslogd`, принимать сообщения от удалённых хостов.
+
+Перед чтением этой главы вы должны:
+
+* Понимать основы работы скриптов [.filename]#/etc/rc#.
+* Свободно владеть основными сетевыми терминами.
+* Знать как устанавливать дополнительные программы сторонних разработчиков (crossref:ports[ports, Установка приложений. порты и пакеты]).
+
+[[network-inetd]]
+== "Супер-сервер"inetd
+
+[[network-inetd-overview]]
+=== Обзор
+
+man:inetd[8] иногда называют также "супер-сервером Интернет", потому что он управляет соединениями к многим сервисам. Когда inetd принимает соединение, он определяет, для какой программы предназначено соединение, запускает соответствующий процесс и предоставляет ему сокет, ссылка на который передается процессу в качестве стандартных устройств ввода, вывода и сообщения об ошибках. Для не слишком нагруженных серверов запуск через inetd может уменьшить общую нагрузку на систему по сравнению с запуском каждого даемона индивидуально в выделенном режиме.
+
+В первую очередь inetd используется для вызова других даемонов, но несколько простых протоколов, таких, как chargen, auth и daytime, обслуживаются непосредственно.
+
+Этот раздел посвящен основам настройки inetd посредством его параметров командной строки и его конфигурационного файла, [.filename]#/etc/inetd.conf#.
+
+[[network-inetd-settings]]
+=== Настройки
+
+inetd инициализируется посредством системы man:rc[8]. Параметр `inetd_enable` по умолчанию установлен в `NO`, однако может быть включен утилитой sysinstall в процессе установки. Указание
+
+[.programlisting]
+....
+inetd_enable="YES"
+....
+
+или
+
+[.programlisting]
+....
+inetd_enable="NO"
+....
+
+в файле [.filename]#/etc/rc.conf# разрешит или запретит запуск inetd во время загрузки. Команда
+
+[.programlisting]
+....
+/etc/rc.d/inetd rcvar
+....
+
+покажет текущие установки переменных, относящихся к inetd.
+
+Кроме того, через `inetd_flags` даемону inetd могут быть переданы различные параметры командной строки.
+
+[[network-inetd-cmdline]]
+=== Параметры командной строки
+
+Как и большинство даемонов, для inetd существует большое количество разнообразных опций, изменяющих его поведение. Полный из список таков:
+
+`inetd [-d] [-l] [-w] [-W] [-c maximum] [-C rate] [-a address | hostname] [-p filename] [-R rate] [-s maximum] [configuration file]`
+
+Опции могут передаваться inetd при помощи переменной `inetd_flags` файла [.filename]#/etc/rc.conf#. По умолчанию переменная `inetd_flags` установлена в `-wW -C 60`, то есть включает обработку TCP wrapping и запрещает обращаться с одного IP-адреса к сервису более чем 60 раз в минуту.
+
+Несмотря на то, что ниже по тексту мы упоминаем опции ограничения частоты обращения к службам (rate-limiting), в большинстве случаев начинающим пользователям нет необходимости менять эти параметры. Эти опции могут стать полезными в том случае, если вы обнаружите, что ваша система принимает чрезмерное количество соединений. Полный список опций можно найти на странице справочника man:inetd[8].
+
+-c maximum::
+Определение максимального числа одновременных запусков каждой службы; по умолчание не ограничено. Может быть переопределено индивидуально для каждой службы при помощи параметра `max-child`.
+
+-C rate::
+Определение по умолчанию максимального количества раз, которое служба может быть вызвана с одного IP-адреса в минуту; по умолчанию не ограничено. Может быть переопределено для каждой службы параметром `max-connections-per-ip-per-minute`.
+
+-R rate::
+Определяет максимальное количество раз, которое служба может быть вызвана в минуту; по умолчанию 256. Частота, равная 0, не ограничивает число вызовов.
+
+-s maximum::
+Задает максимальное количество процессов, одновременно обслуживающих один сервис для одного IP-адреса; по умолчанию не ограничено. Может переопределяться для каждой службы параметром `max-child-per-ip`.
+
+[[network-inetd-conf]]
+=== [.filename]#inetd.conf#
+
+Настройка inetd производится через файл [.filename]#/etc/inetd.conf#.
+
+Если в файле [.filename]#/etc/inetd.conf# делались изменения, то inetd можно заставить считать его конфигурационный файл повторно посредством команды
+
+[[network-inetd-reread]]
+.Перезагрузка конфигурационного файла inetd
+[example]
+====
+
+[source,bash]
+....
+# /etc/rc.d/inetd reload
+....
+
+====
+
+В каждой строке конфигурационного файла описывается отдельный даемон. Комментариям в файле предшествует знак "#". Строки в файле [.filename]##/etc/inetd.conf## имеют такой формат:
+
+[.programlisting]
+....
+service-name
+socket-type
+protocol
+{wait|nowait}[/max-child[/max-connections-per-ip-per-minute[/max-child-per-ip]]]
+user[:group][/login-class]
+server-program
+server-program-arguments
+....
+
+Пример записи для даемона man:ftpd[8], использующего IPv4:
+
+[.programlisting]
+....
+ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l
+....
+
+service-name::
+Это имя сервиса, предоставляемого конкретным даемоном. Оно должно соответствовать сервису, указанному в файле [.filename]#/etc/services#. Здесь определяется, какой порт должен обслуживать inetd. При создании нового сервиса он должен помещаться сначала в файл [.filename]#/etc/services#.
+
+socket-type::
+`stream`, `dgram`, `raw` либо `seqpacket`. `stream` должен использоваться для ориентированных на соединение даемонов TCP, когда как `dgram` используется для даемонов, использующих транспортный протокол UDP.
+
+protocol::
+Одно из следующих:
++
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Протокол
+| Описание
+
+|tcp, tcp4
+|TCP IPv4
+
+|udp, udp4
+|UDP IPv4
+
+|tcp6
+|TCP IPv6
+
+|udp6
+|UDP IPv6
+
+|tcp46
+|TCP как для IPv4, так и для v6
+
+|udp46
+|UDP как для IPv4, так и для v6
+|===
+{wait|nowait}[/max-child[/max-connections-per-ip-per-minute[/max-child-per-ip]]]::
+`wait|nowait` определяет, может ли даемон, вызванный из inetd, работать с собственным сокетом, или нет. Сокеты типа `dgram` должны использовать параметр `wait`, когда как даемоны с потоковыми сокетами, которые обычно многопоточны, должны использовать `nowait`. `wait` обычно передает много сокетов одному даемону, когда как `nowait` порождает даемон для каждого нового сокета.
++
+Максимальное число порожденных даемонов, которых может создать inetd, может быть задано параметром `max-child`. Если нужно ограничение в десять экземпляров некоторого даемона, то после параметра `nowait` нужно задать `/10`. При задании `/0` ограничения на количество экземпляров снимаются.
++
+Кроме `max-child`, могут быть задействованы два других параметра, ограничивающих максимальное число соединений от одного источника. `max-connections-per-ip-per-minute` ограничивает количество соединений от одного IP-адреса в течение минуты, так что значение, равное десяти, будет ограничивать любой заданный IP-адрес на выполнение десяти попыток подключения к некоторому сервису в минуту. Параметр `max-child-per-ip` ограничивает количество дочерних процессов, которые могут быть одновременно задействованы на обслуживание одного IP-адреса. Эти опции полезны для предотвращения намеренного или ненамеренного расходования ресурсов и атак типа Denial of Service (DoS) на машину.
++
+В этом поле одно из значений `wait` или `nowait` обязательны. `max-child`, `max-connections-per-ip-per-minute` и `max-child-per-ip` опциональны.
++
+Многопоточный даемон типа stream без ограничений `max-child`, `max-connections-per-ip-per-minute` или `max-child-per-ip` будет определен просто как `nowait`.
++
+Тот же самый даемон с ограничением в максимум десять даемонов будет определен так: `nowait/10`.
++
+Та же конфигурация с ограничением в двадцать соединений на IP-адрес в минуту и общим ограничением в максимум десять порожденных даемонов выглядит так: `nowait/10/20`.
++
+Эти параметры, используемые все со значениями по умолчанию даемоном man:fingerd[8], имеют такой вид:
++
+[.programlisting]
+....
+finger stream tcp nowait/3/10 nobody /usr/libexec/fingerd fingerd -s
+....
++
+Наконец, пример, описывающий ограничение на 100 даемонов в целом, при этом не более чем по 5 на один IP-адрес, будет выглядеть так: `nowait/100/0/5`.
+
+user::
+Это имя пользователя, под которым должен работать соответствующий даемон. Чаще всего даемоны работают как пользователь `root`. Для обеспечения безопасности некоторые серверы запускаются как пользователь `daemon` или как пользователь с минимальными правами `nobody`.
+
+server-program::
+Полный маршрут к даемону, который будет выполняться при установлении соединения. Если даемон является сервисом, предоставляемым самим inetd, то нужно задать ключевое слово `internal`.
+
+server-program-arguments::
+Этот параметр работает вместе с параметром `server-program`, задавая параметры, начиная с `argv[0]`, передаваемые даемону при запуске. Если в командной строке задано `mydaemon -d`, то `mydaemon -d` будет являться значением для `server-program-arguments`. И снова, если даемон является внутренней службой, то здесь нужно использовать `internal`.
+
+[[network-inetd-security]]
+=== Безопасность
+
+В зависимости от выбранных при установке параметров, многие из служб inetd могут оказаться по умолчанию включенными. Если нет особой нужды в некотором даемоне, подумайте, не стоит ли его выключить? Поместите знак "#" перед ненужным даемоном в [.filename]##/etc/inetd.conf## и <<network-inetd-reread,пошлите сигнал для inetd>>. Некоторые даемоны, такие, как fingerd, вообще нежелательны, потому что они дают информацию, которая может оказаться полезной атакующему.
+
+Некоторые даемоны не заботятся о безопасности и имеют большие тайм-ауты для соединений или вообще их не имеют. Это позволяет атакующему неспешно устанавливать соединения к конкретному даемону, истощая имеющиеся ресурсы. Может оказаться полезным задать для некоторых даемонов ограничения `max-connections-per-ip-per-minute`, `max-child` и `max-child-per-ip`, особенно если вы обнаружите слишком большое число соединений.
+
+По умолчанию механизм TCP wrapping включен. Обратитесь к справочной странице по man:hosts_access[5] для получения более подробной информации о задании ограничений TCP для различных даемонов, запускаемых посредством inetd.
+
+[[network-inetd-misc]]
+=== Разное
+
+daytime, time, echo, discard, chargen и auth все являются услугами, предоставляемыми самим inetd.
+
+Сервис auth предоставляет идентификационные сетевые услуги и поддается настройке; прочие сервисы ненастраиваемы.
+
+Обратитесь к справочной странице по man:inetd[8] для получения более подробной информации.
+
+[[network-nfs]]
+== Network File System (NFS)
+
+Кроме поддержки многих прочих типов файловых систем, во FreeBSD встроена поддержка сетевой файловой системы (Network File System), известной как NFS. NFS позволяет системе использовать каталоги и файлы совместно с другими машинами, посредством сети. Посредством NFS пользователи и программы могут получать доступ к файлам на удалённых системах точно так же, как если бы это были файлы на собственных дисках.
+
+Вот некоторые из наиболее заметных преимуществ, которые даёт использование NFS:
+
+* Отдельно взятые рабочие станции используют меньше собственного дискового пространства, так как совместно используемые данные могут храниться на одной отдельной машине и быть доступными для других машин в сети.
+* Пользователям не нужно иметь домашние каталоги, отдельные для каждой машины в вашей сети. Домашние каталоги могут располагаться на сервере NFS и их можно сделать доступными отовсюду в сети.
+* Устройства хранения информации, такие, как дискеты, приводы CD-ROM и устройства Zip(R), могут использоваться другими машинами в сети. Это может привести к уменьшению переносимых устройств хранения информации в сети.
+
+=== Как работает NFS
+
+NFS строится по крайней мере из двух основных частей: сервера и одного или большего количества клиентов. Клиент обращается к данным, находящимся на сервере, в режиме удалённого доступа. Для того, чтобы это нормально функционировало, нужно настроить и запустить несколько процессов.
+
+На сервере работают следующие даемоны:
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Даемон
+| Описание
+
+|nfsd
+|Даемон NFS, обслуживающий запросы от клиентов NFS.
+
+|mountd
+|Даемон монтирования NFS, который выполняет запросы, передаваемые ему от man:nfsd[8].
+
+|rpcbind
+|Этот даемон позволяет клиентам NFS определить порт, используемый сервером NFS.
+|===
+
+Клиент может запустить также даемон, называемый nfsiod. nfsiod обслуживает запросы, поступающие от сервера от сервера NFS. Он необязателен, увеличивает производительность, однако для нормальной и правильной работы не требуется. Для получения дополнительной информации обратитесь к разделу справочной системы о man:nfsiod[8].
+
+[[network-configuring-nfs]]
+=== Настройка NFS
+
+Настройка NFS является достаточно незамысловатым процессом. Все процессы, которые должны быть запущены, могут быть запущены во время загрузки посредством нескольких модификаций в вашем файле [.filename]#/etc/rc.conf#.
+
+Проверьте, что на NFS-сервере в файле [.filename]#/etc/rc.conf# имеются такие строки:
+
+[.programlisting]
+....
+rpcbind_enable="YES"
+nfs_server_enable="YES"
+nfs_server_flags="-u -t -n 4"
+mountd_flags="-r"
+....
+
+mountd запускается автоматически, если включена функция сервера NFS.
+
+На клиенте убедитесь, что в файле [.filename]#/etc/rc.conf# присутствует такой параметр:
+
+[.programlisting]
+....
+nfs_client_enable="YES"
+....
+
+Файл [.filename]#/etc/exports# определяет, какие файловые системы на вашем сервере NFS будут экспортироваться (иногда их называют "совместно используемыми"). Каждая строка в [.filename]#/etc/exports# задаёт файловую систему, которая будет экспортироваться и какие машины будут иметь к ней доступ. Кроме машин, имеющих доступ, могут задаваться другие параметры, влияющие на характеристики доступа. Имеется полный набор параметров, которые можно использовать, но здесь пойдёт речь лишь о некоторых из них. Описания остальных параметров можно найти на страницах справочной системы по man:exports[5].
+
+Вот несколько примерных строк из файла [.filename]#/etc/exports#:
+
+В следующих примерах даётся общая идея того, как экспортировать файловые системы, хотя конкретные параметры могут отличаться в зависимости от ваших условий и конфигурации сети. К примеру, чтобы экспортировать каталог [.filename]#/cdrom# для трёх машин, находящихся в том же самом домене, что и сервер (поэтому отсутствует доменное имя для каждой машины) или для которых имеются записи в файле [.filename]#/etc/hosts#. Флаг `-ro` указывает на использование экспортируемой файловой системы в режиме только чтения. С этим флагом удалённая система не сможет никоим образом изменить экспортируемую файловую систему.
+
+[.programlisting]
+....
+/cdrom -ro host1 host2 host3
+....
+
+В следующей строке экспортируется файловая система [.filename]#/home#, которая становится доступной трем хостам, указанным по их IP-адресам. Это полезно, если у вас есть собственная сеть без настроенного сервера DNS. Как вариант, файл [.filename]#/etc/hosts# может содержать внутренние имена хостов; пожалуйста, обратитесь к справочную систему по man:hosts[5] для получения дополнительной информации. Флаг `-alldirs` позволяет рассматривать подкаталоги в качестве точек монтирования. Другими словами, это не монтирование подкаталогов, но разрешение клиентам монтировать только каталоги, которые им требуются или нужны.
+
+[.programlisting]
+....
+/home -alldirs 10.0.0.2 10.0.0.3 10.0.0.4
+....
+
+В строке, приведённой ниже, файловая система [.filename]#/a# экспортируется таким образом, что она доступна двум клиентам из других доменов. Параметр `-maproot=root` позволяет пользователю `root` удалённой системы осуществлять запись на экспортируемую файловую систему как пользователь `root`. Если параметр `-maproot=root` не задан, то даже если пользователь имеет права доступа `root` на удалённой системе, он не сможет модифицировать файлы на экспортированной файловой системе.
+
+[.programlisting]
+....
+/a -maproot=root host.example.com box.example.org
+....
+
+Для того, чтобы клиент смог обратиться к экспортированной файловой системе, он должен иметь права сделать это. Проверьте, что клиент указан в вашем файле [.filename]#/etc/exports#.
+
+В файле [.filename]#/etc/exports# каждая строка содержит информацию об экспортировании для отдельной файловой системы для отдельно взятого хоста. Удалённый хост может быть задан только один раз для каждой файловой системы, и может иметь только одну запись, используемую по умолчанию, для каждой локальной файловой системы. К примеру, предположим, что [.filename]#/usr# является отдельной файловой системой. Следующий [.filename]#/etc/exports# будет некорректен:
+
+[.programlisting]
+....
+# Invalid when /usr is one file system
+/usr/src client
+/usr/ports client
+....
+
+Одна файловая система, [.filename]#/usr#, имеет две строки, задающие экспортирование для одного и того же хоста, `client`. Правильный формат в этом случае таков:
+
+[.programlisting]
+....
+/usr/src /usr/ports client
+....
+
+Свойства отдельной файловой системы, экспортируемой некоторому хосту, должны задаваться в одной строке. Строки без указания клиента воспринимаются как отдельный хост. Это ограничивает то, как вы можете экспортировать файловые системы, но для большинства это не проблема.
+
+Ниже приведён пример правильного списка экспортирования, где [.filename]#/usr# и [.filename]#/exports# являются локальными файловыми системами:
+
+[.programlisting]
+....
+# Экспортируем src и ports для client01 и client02, но
+# только client01 имеет права пользователя root на них
+/usr/src /usr/ports -maproot=root client01
+/usr/src /usr/ports client02
+# Клиентские машины имеют пользователя root и могут монтировать всё в
+# каталоге /exports. Кто угодно может монтировать /exports/obj в режиме чтения
+/exports -alldirs -maproot=root client01 client02
+/exports/obj -ro
+....
+
+Даемон mountd должен быть проинформирован об изменении файла [.filename]#/etc/exports#, чтобы изменения вступили в силу. Это может быть достигнуто посылкой сигнала HUP процессу `mountd`:
+
+[source,bash]
+....
+# kill -HUP `cat /var/run/mountd.pid`
+....
+
+или вызовом скрипта `mountd` подсистемы man:rc[8] с соответствующим параметром:
+
+[source,bash]
+....
+# /etc/rc.d/mountd onereload
+....
+
+За подробной информацией о работе скриптов rc.d обращайтесь к crossref:config[configtuning-rcd,Использование rc во FreeBSD 5.X и последующих версиях].
+
+Как вариант, при перезагрузке FreeBSD всё настроится правильно. Хотя выполнять перезагрузку вовсе не обязательно. Выполнение следующих команд пользователем `root` запустит всё, что нужно.
+
+На сервере NFS:
+
+[source,bash]
+....
+# rpcbind
+# nfsd -u -t -n 4
+# mountd -r
+....
+
+На клиенте NFS:
+
+[source,bash]
+....
+# nfsiod -n 4
+....
+
+Теперь всё должно быть готово к реальному монтированию удалённой файловой системы. В приводимых примерах сервер будет носить имя `server`, а клиент будет носить имя `client`. Если вы только хотите временно смонтировать удалённую файловую систему, или всего лишь протестировать ваши настройки, то просто запустите команды, подобные приводимым здесь, работая как пользователь `root` на клиентской машине:
+
+[source,bash]
+....
+# mount server:/home /mnt
+....
+
+По этой команде файловая система [.filename]#/home# на сервере будет смонтирована в каталог [.filename]#/mnt# на клиенте. Если всё настроено правильно, вы сможете войти в каталог [.filename]#/mnt# на клиенте и увидеть файлы, находящиеся на сервере.
+
+Если вы хотите автоматически монтировать удалённую файловую систему при каждой загрузке компьютера, добавьте файловую систему в [.filename]#/etc/fstab#. Вот пример:
+
+[.programlisting]
+....
+server:/home /mnt nfs rw 0 0
+....
+
+На страницах справочной системы по man:fstab[5] перечислены все доступные параметры.
+
+=== Блокировка файлов
+
+Некоторым приложениям (например, mutt) для корректной работы необходима возможность блокировки файлов (file locking). При работе по NFS блокировка файлов может осуществляться при помощи демона rpc.lockd. Чтобы его активировать, добавьте следующие записи в файл [.filename]#/etc/rc.conf# как на клиенте, так и на сервере NFS (предполагается, что и клиент, и сервер уже сконфигурированы):
+
+[.programlisting]
+....
+rpc_lockd_enable="YES"
+rpc_statd_enable="YES"
+....
+
+Запустите демоны, выполнив следующие команды:
+
+[source,bash]
+....
+# /etc/rc.d/lockd start
+# /etc/rc.d/statd start
+....
+
+Если нет необходимости в настоящей блокировке файлов между сервером NFS и клиентами, то клиент NFS может быть настроен так, чтобы выполнять блокировки файлов локально, для чего необходимо передать опцию `-L` команде man:mount_nfs[8]. За подробностями обратитесь к странице справочника man:mount_nfs[8].
+
+=== Практическое использование
+
+У NFS есть много вариантов практического применения. Ниже приводится несколько наиболее широко распространённых способов её использования:
+
+* Настройка несколько машин для совместного использования CDROM или других носителей. Это более дешёвый и зачастую более удобный способ установки программного обеспечения на несколько машин.
+* В больших сетях может оказаться более удобным настроить центральный сервер NFS, на котором размещаются все домашние каталоги пользователей. Эти домашние каталоги могут затем экспортироваться в сеть так, что пользователи всегда будут иметь один и тот же домашний каталог вне зависимости от того, на какой рабочей станции они работают.
+* Несколько машин могут иметь общий каталог [.filename]#/usr/ports/distfiles#. Таким образом, когда вам нужно будет установить порт на несколько машин, вы сможете быстро получить доступ к исходным текстам без их загрузки на каждой машине.
+
+[[network-amd]]
+=== Автоматическое монтирование с amd
+
+man:amd[8] (даемон автоматического монтирования) автоматически монтирует удалённую файловую систему, как только происходит обращение к файлу или каталогу в этой файловой системе. Кроме того, файловые системы, которые были неактивны некоторое время, будут автоматически размонтированы даемоном amd. Использование amd является простой альтернативой статическому монтированию, так как в последнем случае обычно всё должно быть описано в файле [.filename]#/etc/fstab#.
+
+amd работает, сам выступая как сервер NFS для каталогов [.filename]#/host# и [.filename]#/net#. Когда происходит обращение к файлу в одном из этих каталогов, amd ищет соответствующий удаленный ресурс для монтирования и автоматически его монтирует. [.filename]#/net# используется для монтирования экспортируемой файловой системы по адресу IP, когда как каталог [.filename]#/host# используется для монтирования ресурса по удаленному имени хоста.
+
+Обращение к файлу в каталоге [.filename]#/host/foobar/usr# укажет amd на выполнение попытки монтирования ресурса [.filename]#/usr#, который находится на хосте `foobar`.
+
+.Монтирование ресурса при помощи amd
+[example]
+====
+Вы можете посмотреть доступные для монтирования ресурсы отдалённого хоста командой `showmount`. К примеру, чтобы посмотреть ресурсы хоста с именем `foobar`, вы можете использовать:
+
+[source,bash]
+....
+% showmount -e foobar
+Exports list on foobar:
+/usr 10.10.10.0
+/a 10.10.10.0
+% cd /host/foobar/usr
+....
+
+====
+
+Как видно из примера, `showmount` показывает [.filename]#/usr# как экспортируемый ресурс. При переходе в каталог [.filename]#/host/foobar/usr# даемон amd пытается разрешить имя хоста `foobar` и автоматически смонтировать требуемый ресурс.
+
+amd может быть запущен из скриптов начальной загрузки, если поместить такую строку в файл [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+amd_enable="YES"
+....
+
+Кроме того, даемону amd могут быть переданы настроечные флаги через параметр `amd_flags`. По умолчанию `amd_flags` настроен следующим образом:
+
+[.programlisting]
+....
+amd_flags="-a /.amd_mnt -l syslog /host /etc/amd.map /net /etc/amd.map"
+....
+
+Файл [.filename]#/etc/amd.map# задает опции, используемые по умолчанию при монтировании экспортируемых ресурсов. В файле [.filename]#/etc/amd.conf# заданы настройки некоторых более сложных возможностей amd.
+
+Обратитесь к справочным страницам по man:amd[8] и man:amd.conf[8] для получения более полной информации.
+
+[[network-nfs-integration]]
+=== Проблемы взаимодействия с другими системами
+
+Некоторые сетевые адаптеры для систем PC с шиной ISA имеют ограничения, которые могут привести к серьезным проблемам в сети, в частности, с NFS. Эти проблемы не специфичны для FreeBSD, однако эту систему они затрагивают.
+
+Проблема, которая возникает практически всегда при работе по сети систем PC (FreeBSD) с высокопроизводительными рабочими станциями, выпущенными такими производителями, как Silicon Graphics, Inc. и Sun Microsystems, Inc. Монтирование по протоколу NFS будет работать нормально, и некоторые операции также будут выполняться успешно, но неожиданно сервер окажется недоступным для клиент, хотя запросы к и от других систем будут продолжаться обрабатываться. Такое встречается с клиентскими системами, не зависимо от того, является ли клиент машиной с FreeBSD или рабочей станцией. Во многих системах при возникновении этой проблемы нет способа корректно завершить работу клиента. Единственным выходом зачастую является холодная перезагрузка клиента, потому что ситуация с NFS не может быть разрешена.
+
+Хотя "правильным" решением является установка более производительного и скоростного сетевого адаптера на систему FreeBSD, имеется простое решение, приводящее к удовлетворительным результатам. Если система FreeBSD является _сервером_, укажите параметр `-w=1024` на клиенте при монтировании. Если система FreeBSD является _клиентом_, то смонтируйте файловую систему NFS с параметром `-r=1024`. Эти параметры могут быть заданы в четвертом поле записи в файле [.filename]#fstab# клиента при автоматическом монтировании, или при помощи параметра `-o` в команде man:mount[8] при монтировании вручную.
+
+Нужно отметить, что имеется также другая проблема, ошибочно принимаемая за приведенную выше, когда серверы и клиенты NFS находятся в разных сетях. Если это тот самый случай, _проверьте_, что ваши маршрутизаторы пропускают нужную информацию UDP, в противном случае вы ничего не получите, что бы вы ни предпринимали.
+
+В следующих примерах `fastws` является именем хоста (интерфейса) высокопроизводительной рабочей станции, а `freebox` является именем хоста (интерфейса) системы FreeBSD со слабым сетевым адаптером. Кроме того, [.filename]#/sharedfs# будет являться экспортируемой через NFS файловой системой (обратитесь к страницам справочной системы по команде man:exports[5]), а [.filename]#/project# будет точкой монтирования экспортируемой файловой системы на клиенте. В любом случае, отметьте, что для вашего приложения могут понадобиться дополнительные параметры, такие, как `hard`, `soft` или `bg`.
+
+Пример системы FreeBSD (`freebox`) как клиента в файле [.filename]#/etc/fstab# на машине `freebox`:
+
+[.programlisting]
+....
+fastws:/sharedfs /project nfs rw,-r=1024 0 0
+....
+
+Команда, выдаваемая вручную на машине `freebox`:
+
+[source,bash]
+....
+# mount -t nfs -o -r=1024 fastws:/sharedfs /project
+....
+
+Пример системы FreeBSD в качестве сервера в файле [.filename]#/etc/fstab# на машине `fastws`:
+
+[.programlisting]
+....
+freebox:/sharedfs /project nfs rw,-w=1024 0 0
+....
+
+Команда, выдаваемая вручную на машине `fastws`:
+
+[source,bash]
+....
+# mount -t nfs -o -w=1024 freebox:/sharedfs /project
+....
+
+Практически все 16-разрядные сетевые адаптеры позволят работать без указанных выше ограничений на размер блоков при чтении и записи.
+
+Для тех, кто интересуется, ниже описывается, что же происходит в при появлении этой ошибки, и объясняется, почему ее невозможно устранить. Как правило, NFS работает с "блоками" размером 8 килобайт (хотя отдельные фрагменты могут иметь меньшие размеры). Так, пакет Ethernet имеет максимальный размер около 1500 байт, то "блок" NFS разбивается на несколько пакетов Ethernet, хотя на более высоком уровне это все тот же единый блок, который должен быть принят, собран и _подтвержден_ как один блок. Высокопроизводительные рабочие станции могут посылать пакеты, которые соответствуют одному блоку NFS, сразу друг за другом, насколько это позволяет делать стандарт. На слабых, низкопроизводительных адаптерах пакеты, пришедшие позже, накладываются поверх ранее пришедших пакетов того же самого блока до того, как они могут быть переданы хосту и блок как единое целое не может быть собран или подтвержден. В результате рабочая станция входит в ситуацию тайм-аута и пытается повторить передачу, но уже с полным блоком в 8 КБ, и процесс будет повторяться снова, до бесконечности.
+
+Задав размер блока меньше размера пакета Ethernet, мы достигаем того, что любой полностью полученный пакет Ethernet может быть подтвержден индивидуально, и избежим тупиковую ситуацию.
+
+Наложение пакетов может все еще проявляться, когда высокопроизводительные рабочие станции сбрасывают данные на PC-систему, однако повторение этой ситуации не обязательно с более скоростными адаптерами с "блоками" NFS. Когда происходит наложение, затронутые блоки будут переданы снова, и скорее всего, они будут получены, собраны и подтверждены.
+
+[[network-nis]]
+== Network Information System (NIS/YP)
+
+=== Что это такое?
+
+NIS, что является сокращением от Network Information Services (Сетевые Информационные Службы), которые были разработаны компанией Sun Microsystems для централизованного администрирования систем UNIX(R) (изначально SunOS(TM)). В настоящее время эти службы практически стали промышленным стандартом; все основные UNIX(R)-подобные системы (Solaris(TM), HP-UX, AIX(R), Linux, NetBSD, OpenBSD, FreeBSD и так далее) поддерживают NIS.
+
+NIS первоначально назывались Yellow Pages (или yp), но из-за проблем с торговым знаком Sun изменила это название. Старое название (и yp) всё ещё часто употребляется.
+
+Это система клиент/сервер на основе вызовов RPC, которая позволяет группе машин в одном домене NIS совместно использовать общий набор конфигурационных файлов. Системный администратор может настроить клиентскую систему NIS только с минимальной настроечной информацией, а затем добавлять, удалять и модифицировать настроечную информацию из одного места.
+
+Это похоже на систему доменов Windows NT(R); хотя их внутренние реализации не так уж и похожи, основные функции сравнимы.
+
+=== Термины/программы, о которых вы должны знать
+
+Существует несколько терминов и некоторое количество пользовательских программ, которые будут нужны, когда вы будете пытаться сделать NIS во FreeBSD, и в случае создания сервера, и в случае работы в качестве клиента NIS:
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Термин
+| Описание
+
+|Имя домена NIS
+|Главный сервер NIS и все его клиенты (включая вторичные серверы), имеют доменное имя NIS. Как и в случае с именем домена Windows NT(R), имя домена NIS не имеет ничего общего с DNS.
+
+|rpcbind
+|Для обеспечения работы RPC (Remote Procedure Call, Удалённого Вызова Процедур, сетевого протокола, используемого NIS), должен быть запущен даемон rpcbind. Если даемон rpcbind не запущен, невозможно будет запустить сервер NIS, или работать как NIS-клиент.
+
+|ypbind
+|"Связывает" NIS-клиента с его NIS-сервером. Он определяет имя NIS-домена системы, и при помощи RPC подключается к серверу. ypbind является основой клиент-серверного взаимодействия в среде NIS; если на клиентской машине программа ypbind перестанет работать, то эта машина не сможет получить доступ к серверу NIS.
+
+|ypserv
+|Программа `ypserv`, которая должна запускаться только на серверах NIS: это и есть сервер NIS. Если man:ypserv[8] перестанет работать, то сервер не сможет отвечать на запросы NIS (к счастью, на этот случай предусмотрен вторичный сервер). Есть несколько реализаций NIS (к FreeBSD это не относится), в которых не производится попыток подключиться к другому серверу, если ранее используемый сервер перестал работать. Зачастую единственным средством, помогающим в этой ситуации, является перезапуск серверного процесса (или сервера полностью) или процесса ypbind на клиентской машине.
+
+|rpc.yppasswdd
+|Программа `rpc.yppasswdd`, другой процесс, который запускается только на главных NIS-серверах: это даемон, позволяющий клиентам NIS изменять свои пароли NIS. Если этот даемон не запущен, то пользователи должны будут входить на основной сервер NIS и там менять свои пароли.
+|===
+
+=== Как это работает?
+
+В системе NIS существует три типа хостов: основные (master) серверы, вторичные (slave) серверы и клиентские машины. Серверы выполняют роль централизованного хранилища информации о конфигурации хостов. Основные серверы хранят оригиналы этой информации, когда как вторичные серверы хранят ее копию для обеспечения избыточности. Клиенты связываются с серверами, чтобы предоставить им эту информацию.
+
+Информация во многих файлах может совместно использоваться следующим образом. Файлы [.filename]#master.passwd#, [.filename]#group# и [.filename]#hosts# используются совместно через NIS. Когда процессу, работающему на клиентской машине, требуется информация, как правило, находящаяся в этих файлах локально, то он делает запрос к серверу NIS, с которым связан.
+
+==== Типы машин
+
+* _Основной сервер NIS_. Такой сервер, по аналогии с первичным контроллером домена Windows NT(R), хранит файлы, используемые всеми клиентами NIS. Файлы [.filename]#passwd#, [.filename]#group# и различные другие файлы, используемые клиентами NIS, находятся на основном сервере.
++
+[NOTE]
+====
+Возможно использование одной машины в качестве сервера для более чем одного домена NIS. Однако, в этом введении такая ситуация не рассматривается, и предполагается менее масштабное использование NIS.
+====
+
+* _Вторичные серверы NIS_. Похожие на вторичные контроллеры доменов Windows NT(R), вторичные серверы NIS содержат копии оригинальных файлов данных NIS. Вторичные серверы NIS обеспечивают избыточность, что нужно в критичных приложениях. Они также помогают распределять нагрузку на основной сервер: клиенты NIS всегда подключаются к тому серверу NIS, который ответил первым, в том числе и к вторичным серверам.
+* _Клиенты NIS_. Клиенты NIS, как и большинство рабочих станций Windows NT(R), аутентифицируются на сервере NIS (или на контроллере домена Windows NT(R) для рабочих станций Windows NT(R)) во время входа в систему.
+
+=== Использование NIS/YP
+
+В этом разделе приводится пример настройки NIS.
+
+==== Планирование
+
+Давайте предположим, что вы являетесь администратором в маленькой университетской лаборатории. В настоящий момент в этой лаборатории с 15 машинами отсутствует единая точка администрирования; на каждой машине имеются собственные файлы [.filename]#/etc/passwd# и [.filename]#/etc/master.passwd#. Эти файлы синхронизируются друг с другом только вручную; сейчас, когда вы добавляете пользователя в лаборатории, вы должны выполнить команду `adduser` на всех 15 машинах. Понятно, что такое положение вещей нужно исправлять, так что вы решили перевести сеть на использование NIS, используя две машины в качестве серверов.
+
+Итак, конфигурация лаборатории сейчас выглядит примерно так:
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Имя машины
+| IP-адрес
+| Роль машины
+
+|`ellington`
+|`10.0.0.2`
+|Основной сервер NIS
+
+|`coltrane`
+|`10.0.0.3`
+|Вторичный сервер NIS
+
+|`basie`
+|`10.0.0.4`
+|Факультетская рабочая станция
+
+|`bird`
+|`10.0.0.5`
+|Клиентская машина
+
+|`cli[1-11]`
+|`10.0.0.[6-17]`
+|Другие клиентские машины
+|===
+
+Если вы определяете схему NIS первый раз, ее нужно хорошо обдумать. Вне зависимости от размеров вашей сети, есть несколько ключевых моментов, которые требуют принятия решений.
+
+===== Выбор имени домена NIS
+
+Это имя не должно быть "именем домена", которое вы использовали. Более точно это имя называется "именем домена NIS". Когда клиент рассылает запросы на получение информации, он включает в них имя домена NIS, частью которого является. Таким способом многие сервера в сети могут указать, какой сервер на какой запрос должен отвечать. Думайте о домене NIS как об имени группы хостов, которые каким-то образом связаны.
+
+Некоторые организации в качестве имени домена NIS используют свой домен Интернет. Это не рекомендуется, так как может вызвать проблемы в процессе решения сетевых проблем. Имя домена NIS должно быть уникальным в пределах вашей сети и хорошо, если оно будет описывать группу машин, которые представляет. Например, художественный отдел в компании Acme Inc. может находиться в домене NIS с именем "acme-art". В нашем примере положим, что мы выбрали имя `test-domain`.
+
+Несмотря на это, некоторые операционные системы (в частности, SunOS(TM)) используют свое имя домена NIS в качестве имени домена Интернет. Если одна или более машин в вашей сети имеют такие ограничения, вы _обязаны_ использовать имя домена Интернет в качестве имени домена NIS.
+
+===== Требования к серверу
+
+Есть несколько вещей, которые нужно иметь в виду при выборе машины для использования в качестве сервера NIS. Одной из обескураживающей вещью, касающейся NIS, является уровень зависимости клиентов от серверов. Если клиент не может подключиться к серверу своего домена NIS, зачастую машину просто становится нельзя использовать. Отсутствие информации о пользователях и группах приводит к временной остановке работы большинства систем. Зная это, вы должны выбрать машину, которая не должна подвергаться частым перезагрузкам и не используется для разработки. Сервер NIS в идеале должен быть отдельно стоящей машиной, единственным целью в жизни которой является быть сервером NIS. Если вы работаете в сети, которая не так уж сильно загружена, то можно поместить сервер NIS на машине, на которой запущены и другие сервисы, просто имейте в виду, что если сервер NIS становится недоступным, то это негативно отражается на _всех_ клиентах NIS.
+
+==== Серверы NIS
+
+Оригинальные копии всей информации NIS хранится на единственной машине, которая называется главным сервером NIS. Базы данных, которые используются для хранения информации, называются картами NIS. Во FreeBSD эти карты хранятся в [.filename]#/var/yp/[domainname]#, где [.filename]#[domainname]# является именем обслуживаемого домена NIS. Один сервер NIS может поддерживать одновременно несколько доменов, так что есть возможность иметь несколько таких каталогов, по одному на каждый обслуживаемый домен. Каждый домен будет иметь свой собственный независимый от других набор карт.
+
+Основной и вторичный серверы обслуживают все запросы NIS с помощью даемона `ypserv`. `ypserv` отвечает за получение входящих запросов от клиентов NIS, распознавание запрашиваемого домена и отображение имени в путь к соответствующему файлы базы данных, а также передаче информации из базы данных обратно клиенту.
+
+===== Настройка основного сервера NIS
+
+Настройка основного сервера NIS может оказаться сравнительно простой, в зависимости от ваших потребностей. В поставку FreeBSD сразу включена поддержка NIS. Все, что вам нужно, это добавить следующие строки в файл [.filename]#/etc/rc.conf#, а FreeBSD сделает за вас всё остальное..
+
+[.procedure]
+====
+[.programlisting]
+....
+nisdomainname="test-domain"
+....
+. В этой строке задается имя домена NIS, которое будет `test-domain`, еще до настройки сети (например, после перезагрузки).
++
+[.programlisting]
+....
+nis_server_enable="YES"
+....
+. Здесь указывается FreeBSD на запуск процессов серверов NIS, когда дело доходит до сетевых настроек.
++
+[.programlisting]
+....
+nis_yppasswdd_enable="YES"
+....
+. Здесь указывается на запуск даемона `rpc.yppasswdd`, который, как это отмечено выше, позволит пользователям менять свой пароль NIS с клиентской машины.
+====
+
+[NOTE]
+====
+В зависимости от ваших настроек NIS, вам могут понадобиться дополнительные строки. Обратитесь к <<network-nis-server-is-client,"разделу о серверах NIS, которые являются и клиентами NIS">> ниже для получения подробной информации.
+====
+
+После добавления вышеприведенных строк, запустите команду `/etc/netstart`, работая как администратор. По ней произойдет настройка всего, при этом будут использоваться значения, заданные в файле [.filename]#/etc/rc.conf#. И наконец, перед инициализацией карт NIS, запустите вручную демон ypserv:
+
+[source,bash]
+....
+# /etc/rc.d/ypserv start
+....
+
+===== Инициализация карт NIS
+
+_Карты NIS_ являются файлами баз данных, которые хранятся в каталоге [.filename]#/var/yp#. Они генерируются из конфигурационных файлов, находящихся в каталоге [.filename]#/etc# основного сервера NIS, за одним исключением: файл [.filename]#/etc/master.passwd#. На это есть весомая причина, вам не нужно распространять пароли пользователя `root` и других административных пользователей на все серверы в домене NIS. По этой причине, прежде чем инициализировать карты NIS, вы должны сделать вот что:
+
+[source,bash]
+....
+# cp /etc/master.passwd /var/yp/master.passwd
+# cd /var/yp
+# vi master.passwd
+....
+
+Вы должны удалить все записи, касающиеся системных пользователей (`bin`, `tty`, `kmem`, `games` и так далее), а также записи, которые вы не хотите распространять клиентам NIS (например, `root` и другие пользователи с UID, равным 0 (администраторы)).
+
+[NOTE]
+====
+Проверьте, чтобы файл [.filename]#/var/yp/master.passwd# был недоступен для записи ни для группы, ни для остальных пользователей (режим доступа 600)! Воспользуйтесь командой `chmod`, если это нужно.
+====
+
+Когда с этим будет покончено, самое время инициализировать карты NIS! В поставку FreeBSD включен скрипт с именем `ypinit`, который делает это (обратитесь к его справочной странице за дополнительной информацией). Отметьте, что этот скрипт имеется в большинстве операционных систем UNIX(R), но не во всех. В системе Digital Unix/Compaq Tru64 UNIX он называется `ypsetup`. Так как мы генерируем карты для главного сервера NIS, то при вызове программы `ypinit` мы передаем ей параметр `-m`. Для генерации карт NIS в предположении, что вы уже сделали шаги, описанные выше, выполните следующее:
+
+[source,bash]
+....
+ellington# ypinit -m test-domain
+Server Type: MASTER Domain: test-domain
+Creating an YP server will require that you answer a few questions.
+Questions will all be asked at the beginning of the procedure.
+Do you want this procedure to quit on non-fatal errors? [y/n: n] n
+Ok, please remember to go back and redo manually whatever fails.
+If you don't, something might not work.
+At this point, we have to construct a list of this domains YP servers.
+rod.darktech.org is already known as master server.
+Please continue to add any slave servers, one per line. When you are
+done with the list, type a <control D>.
+master server : ellington
+next host to add: coltrane
+next host to add: ^D
+The current list of NIS servers looks like this:
+ellington
+coltrane
+Is this correct? [y/n: y] y
+
+[..вывод при генерации карт..]
+
+NIS Map update completed.
+ellington has been setup as an YP master server without any errors.
+....
+
+Программа `ypinit` должна была создать файл [.filename]#/var/yp/Makefile# из [.filename]#/var/yp/Makefile.dist#. При создании этого файла предполагается, что вы работаете в окружении с единственным сервером NIS и только с машинами FreeBSD. Так как в домене `test-domain` имеется также и вторичный сервер, то вы должны отредактировать файл [.filename]#/var/yp/Makefile#:
+
+[source,bash]
+....
+ellington# vi /var/yp/Makefile
+....
+
+Вы должны закомментировать строку, в которой указано
+
+[.programlisting]
+....
+NOPUSH = "True"
+....
+
+(она уже не раскомментирована).
+
+===== Настройка вторичного сервера NIS
+
+Настройка вторичного сервера NIS осуществляется ещё проще, чем настройка главного сервера. Войдите на вторичный сервер и отредактируйте файл [.filename]#/etc/rc.conf# точно также, как вы делали это ранее. Единственным отличием является то, что при запуске программы `ypinit` мы теперь должны использовать опцию `-s`. Применение опции `-s` требует также указание имени главного сервера NIS, так что наша команда должна выглядеть так:
+
+[source,bash]
+....
+coltrane# ypinit -s ellington test-domain
+
+Server Type: SLAVE Domain: test-domain Master: ellington
+
+Creating an YP server will require that you answer a few questions.
+Questions will all be asked at the beginning of the procedure.
+
+Do you want this procedure to quit on non-fatal errors? [y/n: n] n
+
+Ok, please remember to go back and redo manually whatever fails.
+If you don't, something might not work.
+There will be no further questions. The remainder of the procedure
+should take a few minutes, to copy the databases from ellington.
+Transferring netgroup...
+ypxfr: Exiting: Map successfully transferred
+Transferring netgroup.byuser...
+ypxfr: Exiting: Map successfully transferred
+Transferring netgroup.byhost...
+ypxfr: Exiting: Map successfully transferred
+Transferring master.passwd.byuid...
+ypxfr: Exiting: Map successfully transferred
+Transferring passwd.byuid...
+ypxfr: Exiting: Map successfully transferred
+Transferring passwd.byname...
+ypxfr: Exiting: Map successfully transferred
+Transferring group.bygid...
+ypxfr: Exiting: Map successfully transferred
+Transferring group.byname...
+ypxfr: Exiting: Map successfully transferred
+Transferring services.byname...
+ypxfr: Exiting: Map successfully transferred
+Transferring rpc.bynumber...
+ypxfr: Exiting: Map successfully transferred
+Transferring rpc.byname...
+ypxfr: Exiting: Map successfully transferred
+Transferring protocols.byname...
+ypxfr: Exiting: Map successfully transferred
+Transferring master.passwd.byname...
+ypxfr: Exiting: Map successfully transferred
+Transferring networks.byname...
+ypxfr: Exiting: Map successfully transferred
+Transferring networks.byaddr...
+ypxfr: Exiting: Map successfully transferred
+Transferring netid.byname...
+ypxfr: Exiting: Map successfully transferred
+Transferring hosts.byaddr...
+ypxfr: Exiting: Map successfully transferred
+Transferring protocols.bynumber...
+ypxfr: Exiting: Map successfully transferred
+Transferring ypservers...
+ypxfr: Exiting: Map successfully transferred
+Transferring hosts.byname...
+ypxfr: Exiting: Map successfully transferred
+
+coltrane has been setup as an YP slave server without any errors.
+Don't forget to update map ypservers on ellington.
+....
+
+Теперь у вас должен быть каталог с именем [.filename]#/var/yp/test-domain#. Копии карт главного сервера NIS должны быть в этом каталоге. Вы должны удостовериться, что этот каталог обновляется. Следующие строки в [.filename]#/etc/crontab# вашего вторичного сервера должны это делать:
+
+[.programlisting]
+....
+20 * * * * root /usr/libexec/ypxfr passwd.byname
+21 * * * * root /usr/libexec/ypxfr passwd.byuid
+....
+
+Эти две строки заставляют вторичный сервер синхронизировать свои карты с картами главного сервера. Эти строки не являются обязательными, так как главный сервер автоматически пытается передать вторичным серверам все изменения в своих картах NIS. Однако, учитывая важность информации о паролях для клиентов, зависящих от вторичного сервера, рекомендуется выполнять частые обновления карт с паролями. Это особенно важно в загруженных сетях, в которых обновления карт могут не всегда завершаться успешно.
+
+А теперь точно также запустите команду `/etc/netstart` на вторичном сервере, по которой снова выполнится запуск сервера NIS.
+
+==== Клиенты NIS
+
+Клиент NIS выполняет так называемую привязку к конкретному серверу NIS при помощи даемона `ypbind`. `ypbind` определяет домен, используемый в системе по умолчанию (тот, который устанавливается по команде `domainname`), и начинает широковещательную рассылку запросов RPC в локальной сети. В этих запросах указано имя домена, к серверу которого `ypbind` пытается осуществить привязку. Если сервер, который был настроен для обслуживания запрашиваемого домена, получит широковещательный запрос, он ответит `ypbind`, который, в свою очередь запомнит адрес сервера. Если имеется несколько серверов (например, главный и несколько вторичных), то `ypbind` будет использовать адрес первого ответившего. С этого момента клиентская система будет направлять все свои запросы NIS на этот сервер. Время от времени `ypbind` будет "пинать" сервер для проверки его работоспособности. Если на один из тестовых пакетов не удастся получить ответа за разумное время, то `ypbind` пометит этот домен как домен, с которым связка разорвана, и снова начнет процесс посылки широковещательных запросов в надежде найти другой сервер.
+
+===== Настройка клиента NIS
+
+Настройка машины с FreeBSD в качестве клиента NIS достаточно проста.
+
+[.procedure]
+====
+
+. Отредактируйте файл [.filename]#/etc/rc.conf#, добавив туда следующие строки для того, чтобы задать имя домена NIS и запустить `ypbind` во время запуска сетевых служб:
++
+[.programlisting]
+....
+nisdomainname="test-domain"
+nis_client_enable="YES"
+....
++
+. Для импортирования всех возможных учётных записей от сервера NIS, удалите все записи пользователей из вашего файла [.filename]#/etc/master.passwd# и воспользуйтесь командой `vipw` для добавления следующей строки в конец файла:
++
+[.programlisting]
+....
++:::::::::
+....
++
+[NOTE]
+======
+Эта строчка даст всем пользователям с корректной учетной записью в картах учетных баз пользователей доступ к этой системе. Есть множество способов настроить ваш клиент NIS, изменив эту строку. Посмотрите ниже текст, касающийся <<network-netgroups,сетевых групп>>, чтобы получить более подробную информацию. Дополнительная информация для изучения находится в книге издательства O'Reilly под названием `Managing NFS and NIS`.
+======
++
+[NOTE]
+======
+Вы должны оставить хотя бы одну локальную запись (то есть не импортировать ее через NIS) в вашем [.filename]#/etc/master.passwd# и эта запись должна быть также членом группы `wheel`. Если с NIS что-то случится, эта запись может использоваться для удаленного входа в систему, перехода в режим администратора и исправления неисправностей.
+======
++
+. Для импортирования всех возможных записей о группах с сервера NIS, добавьте в ваш файл [.filename]#/etc/group# такую строчку:
++
+[.programlisting]
+....
++:*::
+....
+====
+
+Для немедленного запуска клиента NIS выполните следующую команду с правами пользователя `root`:
+
+[source,bash]
+....
+# /etc/netstart
+# /etc/rc.d/ypbind start
+....
+
+После завершения выполнения этих шагов у вас должно получиться запустить команду `ypcat passwd` и увидеть карту учетных записей сервера NIS.
+
+=== Безопасность NIS
+
+В общем-то любой пользователь, зная имя вашего домена, может выполнить запрос RPC к man:ypserv[8] и получить содержимое ваших карт NIS. Для предотвращения такого неавторизованного обмена man:ypserv[8] поддерживает так называемую систему "securenets", которая может использоваться для ограничения доступа к некоторой группе хостов. При запуске man:ypserv[8] будет пытаться загрузить информацию, касающуюся securenets, из файла [.filename]#/var/yp/securenets#.
+
+[NOTE]
+====
+Имя каталога зависит от параметра, указанного вместе с опцией `-p`. Этот файл содержит записи, состоящие из указания сети и сетевой маски, разделенных пробелом. Строчки, начинающиеся со знака "#", считаются комментариями. Примерный файл securenets может иметь примерно такой вид:
+====
+
+[.programlisting]
+....
+# allow connections from local host -- mandatory
+127.0.0.1 255.255.255.255
+# allow connections from any host
+# on the 192.168.128.0 network
+192.168.128.0 255.255.255.0
+# allow connections from any host
+# between 10.0.0.0 to 10.0.15.255
+# this includes the machines in the testlab
+10.0.0.0 255.255.240.0
+....
+
+Если man:ypserv[8] получает запрос от адреса, который соответствует одному из этих правил, он будет отрабатывать запрос обычным образом. Если же адрес не подпадает ни под одно правило, запрос будет проигнорирован и в журнал будет записано предупреждающее сообщение. Если файл [.filename]#/var/yp/securenets# не существует, `ypserv` будет обслуживать соединения от любого хоста.
+
+Программа `ypserv` также поддерживает пакет программ TCP Wrapper от Wietse Venema. Это позволяет администратору для ограничения доступа вместо [.filename]#/var/yp/securenets# использовать конфигурационные файлы TCP Wrapper.
+
+[NOTE]
+====
+Хотя оба этих метода управления доступом обеспечивают некоторую безопасность, они, как основанные на проверке привилегированного порта, оба подвержены атакам типа "IP spoofing". Весь сетевой трафик, связанный с работой NIS, должен блокироваться вашим брандмауэром.
+
+Серверы, использующие файл [.filename]#/var/yp/securenets#, могут быть не в состоянии обслуживать старых клиентов NIS с древней реализацией протокола TCP/IP. Некоторые из этих реализаций при рассылке широковещательных запросов устанавливают все биты машинной части адреса в ноль и/или не в состоянии определить маску подсети при вычислении адреса широковещательной рассылки. Хотя некоторые из этих проблем могут быть решены изменением конфигурации клиента, другие могут привести к отказу от использования [.filename]#/var/yp/securenets#.
+
+Использование [.filename]#/var/yp/securenets# на сервере с такой архаичной реализацией TCP/IP является весьма плохой идеей, и приведёт к потере работоспособности NIS в большой части вашей сети.
+
+Использование пакета TCP Wrapper увеличит время отклика вашего сервера NIS. Дополнительной задержки может оказаться достаточно для возникновения тайм-аутов в клиентских программах, особенно в загруженных сетях или с медленными серверами NIS. Если одна или более ваших клиентских систем страдают от таких проблем, вы должны преобразовать такие клиентские системы во вторичные серверы NIS и сделать принудительную их привязку к самим себе.
+====
+
+=== Запрет входа некоторых пользователей
+
+В нашей лаборатории есть машина `basie`, о которой предполагается, что она является исключительно факультетской рабочей станцией. Мы не хотим исключать эту машину из домена NIS, однако файл [.filename]#passwd# на главном сервере NIS содержит учетные записи как для работников факультета, так и студентов. Что мы можем сделать?
+
+Есть способ ограничить вход некоторых пользователей на этой машине, даже если они присутствуют в базе данных NIS. Чтобы это сделать, вам достаточно добавить `-_username_` в конец файла [.filename]#/etc/master.passwd# на клиентской машине, где _username_ является именем пользователя, которому вы хотите запретить вход. Рекомендуется сделать это с помощью утилиты `vipw`, так как `vipw` проверит ваши изменения в [.filename]#/etc/master.passwd#, а также автоматически перестроит базу данных паролей по окончании редактирования. Например, если мы хотим запретить пользователю `bill` осуществлять вход на машине `basie`, то мы сделаем следующее:
+
+[source,bash]
+....
+basie# vipw
+[add -bill to the end, exit]
+vipw: rebuilding the database...
+vipw: done
+
+basie# cat /etc/master.passwd
+
+root:[password]:0:0::0:0:The super-user:/root:/bin/csh
+toor:[password]:0:0::0:0:The other super-user:/root:/bin/sh
+daemon:*:1:1::0:0:Owner of many system processes:/root:/sbin/nologin
+operator:*:2:5::0:0:System &:/:/sbin/nologin
+bin:*:3:7::0:0:Binaries Commands and Source,,,:/:/sbin/nologin
+tty:*:4:65533::0:0:Tty Sandbox:/:/sbin/nologin
+kmem:*:5:65533::0:0:KMem Sandbox:/:/sbin/nologin
+games:*:7:13::0:0:Games pseudo-user:/usr/games:/sbin/nologin
+news:*:8:8::0:0:News Subsystem:/:/sbin/nologin
+man:*:9:9::0:0:Mister Man Pages:/usr/shared/man:/sbin/nologin
+bind:*:53:53::0:0:Bind Sandbox:/:/sbin/nologin
+uucp:*:66:66::0:0:UUCP pseudo-user:/var/spool/uucppublic:/usr/libexec/uucp/uucico
+xten:*:67:67::0:0:X-10 daemon:/usr/local/xten:/sbin/nologin
+pop:*:68:6::0:0:Post Office Owner:/nonexistent:/sbin/nologin
+nobody:*:65534:65534::0:0:Unprivileged user:/nonexistent:/sbin/nologin
++:::::::::
+-bill
+
+basie#
+....
+
+[[network-netgroups]]
+=== Использование сетевых групп
+
+Способ, описанный в предыдущем разделе, работает достаточно хорошо, если вам нужны особые правила для очень малой группы пользователей или машин. В более крупных сетях вы _забудете_ о запрете входа определенных пользователей на важные машины или даже будете настраивать каждую машину по отдельности, теряя таким образом главное преимущество использования NIS: _централизованное_ администрирование.
+
+Ответом разработчиков NIS на эту проблему являются _сетевые группы_. Их назначение и смысл можно сравнить с обычными группами, используемыми в файловых системах UNIX(R). Главное отличие заключается в отсутствии числового идентификатора и возможности задать сетевую группу включением как пользователей, так и других сетевых групп.
+
+Сетевые группы были разработаны для работы с большими, сложными сетями с сотнями пользователей и машин. С одной стороны, хорошо, если вам приходится с такой ситуацией. С другой стороны, эта сложность делает невозможным описание сетевых групп с помощью простых примеров. Пример, используемый в дальнейшем, демонстрирует эту проблему.
+
+Давайте предположим, что успешное внедрение системы NIS в вашей лаборатории заинтересовало ваше руководство. Вашим следующим заданием стало расширение домена NIS для включения в него некоторых других машин студенческого городка. В двух таблицах перечислены имена новых машин и пользователей, а также их краткое описание.
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Имена пользователей
+| Описание
+
+|`alpha`, `beta`
+|Обычные служащие IT-департамента
+
+|`charlie`, `delta`
+|Практиканты IT-департамента
+
+|`echo`, `foxtrott`, `golf`, ...
+|Обычные сотрудники
+
+|`able`, `baker`, ...
+|Проходящие интернатуру
+|===
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Имена машин
+| Описание
+
+|`war`, `death`, `famine`, `pollution`
+|Ваши самые важные серверы. Только служащим IT позволяется входить на эти машины.
+
+|`pride`, `greed`, `envy`, `wrath`, `lust`, `sloth`
+|Менее важные серверы. Все сотрудники департамента IT могут входить на эти машины.
+
+|`one`, `two`, `three`, `four`, ...
+|Обычные рабочие станции. Только _реально нанятым_ служащим позволяется использовать эти машины.
+
+|`trashcan`
+|Очень старая машина без каких-либо критичных данных. Даже проходящим интернатуру разрешено ее использовать.
+|===
+
+Если вы попытаетесь реализовать эти требования, ограничивая каждого пользователя по отдельности, то вам придется добавить на каждой машине в файл [.filename]#passwd# по одной строчке `-_user_` для каждого пользователя, которому запрещено входить на эту систему. Если вы забудете даже одну строчку, у вас могут начаться проблемы. Гораздо проще делать это правильно во время начальной установки, однако вы постепенно _будете забывать_ добавлять строчки для новых пользователей во время повседневной работы. В конце концов, Мерфи был оптимистом.
+
+Использование в этой ситуации сетевых групп дает несколько преимуществ. Нет необходимости описывать по отдельности каждого пользователя; вы ставите в соответствие пользователю одну или несколько сетевых групп и разрешаете или запрещаете вход всем членам сетевой группы. Если вы добавляете новую машину, вам достаточно определить ограничения на вход для сетевых групп. Если добавляется новый пользователь, вам достаточно добавить его к одной или большему числу сетевых групп. Эти изменения независимы друг от друга: нет больше комбинаций "для каждого пользователя и машины". Если настройка вашей системы NIS тщательно спланирована, то для разрешения или запрещения доступа к машинам вам нужно будет модифицировать единственный конфигурационный файл.
+
+Первым шагом является инициализация карты NIS по имени netgroup. Программа man:ypinit[8] во FreeBSD по умолчанию этой карты не создаёт, хотя реализация NIS будет её поддерживает, как только она будет создана. Чтобы создать пустую карту, просто наберите
+
+[source,bash]
+....
+ellington# vi /var/yp/netgroup
+....
+
+и начните добавлять содержимое. Например, нам нужно по крайней мере четыре сетевых группы: сотрудники IT, практиканты IT, обычные сотрудники и интернатура.
+
+[.programlisting]
+....
+IT_EMP (,alpha,test-domain) (,beta,test-domain)
+IT_APP (,charlie,test-domain) (,delta,test-domain)
+USERS (,echo,test-domain) (,foxtrott,test-domain) \
+ (,golf,test-domain)
+INTERNS (,able,test-domain) (,baker,test-domain)
+....
+
+`IT_EMP`, `IT_APP` и так далее являются именами сетевых групп. Несколько слов в скобках служат для добавления пользователей в группу. Три поля внутри группы обозначают следующее:
+
+. Имя хоста или хостов, к которым применимы последующие записи. Если имя хоста не указано, то запись применяется ко всем хостам. Если же указывается имя хоста, то вы получите мир темноты, ужаса и страшной путаницы.
+. Имя учетной записи, которая принадлежит этой сетевой группе.
+. Домен NIS для учетной записи. Вы можете импортировать в вашу сетевую группу учетные записи из других доменов NIS, если вы один из тех несчастных, имеющих более одного домена NIS.
+
+Каждое из этих полей может содержать шаблоны, подробности даны в странице справочника по man:netgroup[5].
+
+[NOTE]
+====
+Не нужно использовать имена сетевых групп длиннее 8 символов, особенно если в вашем домене NIS имеются машины, работающие под управлением других операционных систем. Имена чувствительны к регистру; использование заглавных букв для имен сетевых групп облегчает распознавание пользователей, имен машин и сетевых групп.
+
+Некоторые клиенты NIS (отличные от FreeBSD) не могут работать с сетевыми группами, включающими большое количество записей. Например, в некоторых старых версиях SunOS(TM) возникают проблемы, если сетевая группа содержит более 15 _записей_. Вы можете обойти это ограничение, создав несколько подгрупп с 15 или меньшим количеством пользователей и настоящую сетевую группу, состоящую из подгрупп:
+
+[.programlisting]
+....
+BIGGRP1 (,joe1,domain) (,joe2,domain) (,joe3,domain) [...]
+BIGGRP2 (,joe16,domain) (,joe17,domain) [...]
+BIGGRP3 (,joe31,domain) (,joe32,domain)
+BIGGROUP BIGGRP1 BIGGRP2 BIGGRP3
+....
+
+Вы можете повторить этот процесс, если вам нужно иметь более 225 пользователей в одной сетевой группе.
+====
+
+Активация и распространение вашей карты NIS проста:
+
+[source,bash]
+....
+ellington# cd /var/yp
+ellington# make
+....
+
+Это приведет к созданию трех карт NIS [.filename]#netgroup#, [.filename]#netgroup.byhost# и [.filename]#netgroup.byuser#. Воспользуйтесь утилитой man:ypcat[1] для проверки доступности ваших новых карт NIS:
+
+[source,bash]
+....
+ellington% ypcat -k netgroup
+ellington% ypcat -k netgroup.byhost
+ellington% ypcat -k netgroup.byuser
+....
+
+Вывод первой команды должен соответствовать содержимому файла [.filename]#/var/yp/netgroup#. Вторая команда не выведет ничего, если вы не зададите сетевые группы, специфичные для хоста. Третья команда может использоваться пользователем для получения списка сетевых групп.
+
+Настройка клиента достаточно проста. Чтобы настроить сервер `war`, вам достаточно запустить man:vipw[8] и заменить строку
+
+[.programlisting]
+....
++:::::::::
+....
+
+на
+
+[.programlisting]
+....
++@IT_EMP:::::::::
+....
+
+Теперь только данные, касающиеся пользователей, определенных в сетевой группе `IT_EMP`, импортируются в базу паролей машины `war` и только этим пользователям будет разрешен вход.
+
+К сожалению, это ограничение также касается и функции `~` командного процессора и всех подпрограмм, выполняющих преобразование между именами пользователей и их числовыми ID. Другими словами, команда `cd ~_user_` работать не будет, команда `ls -l` будет выдавать числовые идентификаторы вместо имён пользователей, а `find . -user joe -print` работать откажется, выдавая сообщение `No such user`. Чтобы это исправить, вам нужно будет выполнить импорт всех записей о пользователях _без разрешения на вход на ваши серверы_.
+
+Это можно сделать, добавив еще одну строку в файл [.filename]#/etc/master.passwd#. Эта строка должна содержать:
+
+`+:::::::::/sbin/nologin`, что означает "Произвести импортирование всех записей с заменой командного процессора на [.filename]#/sbin/nologin# в импортируемых записях". Вы можете заменить любое поле в строке с паролем, указав значение по умолчанию в вашем [.filename]#/etc/master.passwd#.
+
+[WARNING]
+====
+
+Проверьте, что строка `+:::::::::/sbin/nologin` помещена после `+@IT_EMP:::::::::`. В противном случае все пользовательские записи, импортированные из NIS, будут иметь [.filename]#/sbin/nologin# в качестве оболочки.
+====
+
+После этого изменения при появлении нового сотрудника IT вам будет достаточно изменять только одну карту NIS. Вы можете применить подобный метод для менее важных серверов, заменяя старую строку `+:::::::::` в их файлах [.filename]#/etc/master.passwd# на нечто, подобное следующему:
+
+[.programlisting]
+....
++@IT_EMP:::::::::
++@IT_APP:::::::::
++:::::::::/sbin/nologin
+....
+
+Соответствующие строки для обычных рабочих станций могут иметь такой вид:
+
+[.programlisting]
+....
++@IT_EMP:::::::::
++@USERS:::::::::
++:::::::::/sbin/nologin
+....
+
+И все было прекрасно до того момента, когда через несколько недель изменилась политика: Департамент IT начал нанимать интернатуру. Интернатуре в IT позволили использовать обычные рабочие станции и менее важные серверы; практикантам позволили входить на главные серверы. Вы создали новую сетевую группу `IT_INTERN`, добавили в нее новую интернатуру и начали изменять настройки на всех и каждой машине... Как говорит старая мудрость: "Ошибки в централизованном планировании приводят к глобальному хаосу".
+
+Возможность в NIS создавать сетевые группы из других сетевых групп может использоваться для предотвращения подобных ситуаций. Одним из вариантов является создание сетевых групп на основе ролей. Например, вы можете создать сетевую группу с именем `BIGSRV` для задания ограничений на вход на важные серверы, другую сетевую группу с именем `SMALLSRV` для менее важных серверов и третью сетевую группу под названием `USERBOX` для обычных рабочих станций. Каждая из этих сетевых групп содержит сетевые группы, которым позволено входить на эти машины. Новые записи для вашей карты NIS сетевой группы должны выглядеть таким образом:
+
+[.programlisting]
+....
+BIGSRV IT_EMP IT_APP
+SMALLSRV IT_EMP IT_APP ITINTERN
+USERBOX IT_EMP ITINTERN USERS
+....
+
+Этот метод задания ограничений на вход работает весьма хорошо, если вы можете выделить группы машин с одинаковыми ограничениями. К сожалению, такая ситуация может быть исключением, но не правилом. В большинстве случаев вам нужна возможность определять ограничения на вход индивидуально для каждой машины.
+
+Задание сетевых групп в зависимости от машин является другой возможностью, которой можно воспользоваться при изменении политики, описанной выше. При таком развитии событий файл [.filename]#/etc/master.passwd# на каждой машине содержит две строки, начинающиеся с "+". Первая из них добавляет сетевую группу с учётными записями, которым разрешено входить на эту машину, а вторая добавляет все оставшиеся учетные записи с [.filename]#/sbin/nologin# в качестве командного процессора. Хорошей идеей является использование "ИМЕНИ МАШИНЫ" заглавными буквами для имени сетевой группы. Другими словами, строки должны иметь такой вид:
+
+[.programlisting]
+....
++@BOXNAME:::::::::
++:::::::::/sbin/nologin
+....
+
+Как только вы завершите эту работу для всех ваших машин, вам не нужно будет снова модифицировать локальные версии [.filename]#/etc/master.passwd#. Все будущие изменения могут быть выполнены изменением карты NIS. Вот пример возможной карты сетевой группы для этого случая с некоторыми полезными дополнениями:
+
+[.programlisting]
+....
+# Сначала определяем группы пользователей
+IT_EMP (,alpha,test-domain) (,beta,test-domain)
+IT_APP (,charlie,test-domain) (,delta,test-domain)
+DEPT1 (,echo,test-domain) (,foxtrott,test-domain)
+DEPT2 (,golf,test-domain) (,hotel,test-domain)
+DEPT3 (,india,test-domain) (,juliet,test-domain)
+ITINTERN (,kilo,test-domain) (,lima,test-domain)
+D_INTERNS (,able,test-domain) (,baker,test-domain)
+#
+# Теперь задаем несколько групп на основе ролей
+USERS DEPT1 DEPT2 DEPT3
+BIGSRV IT_EMP IT_APP
+SMALLSRV IT_EMP IT_APP ITINTERN
+USERBOX IT_EMP ITINTERN USERS
+#
+# И группы для специальных задач
+# Открыть пользователям echo и golf доступ к антивирусной машине
+SECURITY IT_EMP (,echo,test-domain) (,golf,test-domain)
+#
+# Сетевые группы, специфичные для машин
+# Наши главные серверы
+WAR BIGSRV
+FAMINE BIGSRV
+# Пользователю india необходим доступ к этому серверу
+POLLUTION BIGSRV (,india,test-domain)
+#
+# Этот очень важен и ему требуются большие ограничения доступа
+DEATH IT_EMP
+#
+# Антивирусная машина, упомянутая выше
+ONE SECURITY
+#
+# Ограничить машину единственным пользователем
+TWO (,hotel,test-domain)
+# [...далее следуют другие группы]
+....
+
+Если вы используете какие-либо базы данных для управления учетными записями ваших пользователей, вы должны смочь создать первую часть карты с помощью инструментов построения отчетов вашей базы данных. В таком случае новые пользователи автоматически получат доступ к машинам.
+
+И последнее замечание: Не всегда бывает разумно использовать сетевые группы на основе машин. Если в студенческих лабораториях вы используете несколько десятков или даже сотен одинаковых машин, то вам нужно использовать сетевые группы на основе ролей, а не основе машин, для того, чтобы размеры карты NIS оставались в разумных пределах.
+
+=== Важные замечания
+
+Есть некоторые действия, которые нужно будет выполнять по-другому, если вы работаете с NIS.
+
+* Каждый раз, когда вы собираетесь добавить пользователя в лаборатории, вы должны добавить его _только_ на главном сервере NIS и _обязательно перестроить карты NIS_. Если вы забудете сделать это, то новый пользователь не сможет нигде войти, кроме как на главном сервере NIS. Например, если в лаборатории нам нужно добавить нового пользователя `jsmith`, мы делаем вот что:
++
+
+[source,bash]
+....
+# pw useradd jsmith
+# cd /var/yp
+# make test-domain
+....
+
++
+Вместо `pw useradd jsmith` вы можете также запустить команду `adduser jsmith`.
+* _Не помещайте административные учетные записи в карты NIS_. Вам не нужно распространять административных пользователей и их пароли на машины, которые не должны иметь доступ к таким учётным записям.
+* _Сделайте главный и вторичные серверы NIS безопасными и минимизируйте их время простоя_. Если кто-то либо взломает, либо просто отключит эти машины, то люди без права входа в лабораторию с легкостью получат доступ.
++
+Это основное уязвимое место в любой централизованно администрируемой системе. Если вы не защищаете ваши серверы NIS, вы будете иметь дело с толпой разозлённых пользователей!
+
+=== Совместимость с NIS v1
+
+ypserv из поставки FreeBSD имеет встроенную поддержку для обслуживания клиентов NIS v1. Реализация NIS во FreeBSD использует только протокол NIS v2, хотя другие реализации имеют поддержку протокола v1 для совместимости со старыми системами. Даемоны ypbind, поставляемые с такими системами, будут пытаться осуществить привязку к серверу NIS v1, даже если это им не нужно (и они будут постоянно рассылать широковещательные запросы в поиске такого сервера даже после получения ответа от сервера v2). Отметьте, что хотя имеется поддержка обычных клиентских вызовов, эта версия ypserv не отрабатывает запросы на передачу карт v1; следовательно, она не может использоваться в качестве главного или вторичного серверов вместе с другими серверами NIS, поддерживающими только протокол v1. К счастью, скорее всего, в настоящий момент такие серверы практически не используются.
+
+[[network-nis-server-is-client]]
+=== Серверы NIS, которые также являются клиентами NIS
+
+Особое внимание следует уделить использованию ypserv в домене со многими серверами, когда серверные машины являются также клиентами NIS. Неплохо бы заставить серверы осуществить привязку к самим себе, запретив рассылку запросов на привязку и возможно, перекрестную привязку друг к другу. Если один сервер выйдет из строя, а другие будут зависеть от него, то в результате могут возникнуть странные ситуации. Постепенно все клиенты попадут в тайм-аут и попытаются привязаться к другим серверам, но полученная задержка может быть значительной, а странности останутся, так как серверы снова могут привязаться друг к другу.
+
+Вы можете заставить хост выполнить привязку к конкретному серверу, запустив команду `ypbind` с флагом `-S`. Если вы не хотите делать это вручную каждый раз при перезагрузке вашего сервера NIS, то можете добавить в файл [.filename]#/etc/rc.conf# такие строки:
+
+[.programlisting]
+....
+nis_client_enable="YES" # run client stuff as well
+nis_client_flags="-S NIS domain,server"
+....
+
+Дополнительную информацию можно найти на странице справки по man:ypbind[8].
+
+=== Форматы паролей
+
+Одним из общих вопросов, которые возникают в начале работы с NIS, является вопрос совместимости форматов паролей. Если ваш сервер NIS использует пароли, зашифрованные алгоритмом DES, то он будет поддерживать только тех клиентов, что также используют DES. К примеру, если в вашей сети имеются клиенты NIS, использующие Solaris(TM), то вам, скорее всего, необходимо использовать пароли с шифрованием по алгоритму DES.
+
+Чтобы понять, какой формат используют ваши серверы и клиенты, загляните в файл [.filename]#/etc/login.conf#. Если хост настроен на использование паролей, зашифрованных по алгоритму DES, то класс `default` будет содержать запись вроде следующей:
+
+[.programlisting]
+....
+default:\
+ :passwd_format=des:\
+ :copyright=/etc/COPYRIGHT:\
+ [Последующие строки опущены]
+....
+
+Другими возможными значениями для `passwd_format` являются `blf` и `md5` (для паролей, шифруемых по стандартам Blowfish и MD5 соответственно).
+
+Если вы внесли изменения в файл [.filename]#/etc/login.conf#, то вам также нужно перестроить базу данных параметров входа в систему, что достигается запуском следующей команды пользователем `root`:
+
+[source,bash]
+....
+# cap_mkdb /etc/login.conf
+....
+
+[NOTE]
+====
+Формат паролей, которые уже находятся в файле [.filename]#/etc/master.passwd#, не будет изменён до тех пор, пока пользователь не сменит свой пароль _после_ перестроения базы данных параметров входа в систему.
+====
+
+После этого, чтобы удостовериться в том, что пароли зашифрованы в том формате, который выбран вами, нужно проверить, что строка `crypt_default` в [.filename]#/etc/auth.conf# указывает предпочтение выбранного вами формата паролей. Для этого поместите выбранный формат первым в списке. Например, при использовании DES-шифрования паролей строка будет выглядеть так:
+
+[.programlisting]
+....
+crypt_default = des blf md5
+....
+
+Выполнив вышеперечисленные шаги на каждом из серверов и клиентов NIS, работающих на FreeBSD, вы можете обеспечить их согласованность относительно используемого в вашей сети формата паролей. Если у вас возникли проблемы с аутентификацией клиента NIS, начать её решать определённо стоит отсюда. Запомните: если вы хотите использовать сервер NIS в гетерогенной сети, вам, наверное, нужно будет использовать DES на всех системах в силу того, что это минимальный общий стандарт.
+
+[[network-dhcp]]
+== Автоматическая настройка сети (DHCP)
+
+=== Что такое DHCP?
+
+DHCP, или Dynamic Host Configuration Protocol (Протокол Динамической Конфигурации Хостов), описывает порядок, по которому система может подключиться к сети и получить необходимую информацию для работы в ней. Во FreeBSD используется `dhclient`, импортированный из OpenBSD 3.7. Вся информация здесь, относительно `dhclient` относится либо к ISC, либо к DHCP клиентам. DHCP сервер включён в ISC дистрибутив.
+
+=== Что описывается в этом разделе
+
+В этом разделе описываются, как компоненты клиентской части ISC или OpenBSD DHCP клиента, так и компоненты ISC DHCP системы со стороны сервера. Программа, работающая на клиентской стороне, `dhclient`, интегрирована в поставку FreeBSD, а серверная часть доступна в виде порта package:net/isc-dhcp42-server[]. Кроме ссылок ниже, много полезной информации находится на страницах справочной системы, описывающих man:dhclient[8], man:dhcp-options[5] и man:dhclient.conf[5].
+
+=== Как это работает
+
+Когда на клиентской машине выполняется программа `dhclient`, являющаяся клиентом DHCP, она начинает широковещательную рассылку запросов на получение настроечной информации. По умолчанию эти запросы делаются на 68 порт UDP. Сервер отвечает на UDP 67, выдавая клиенту адрес IP и другую необходимую информацию, такую, как сетевую маску, маршрутизатор и серверы DNS. Вся эта информация даётся в форме "аренды" DHCP и верна только определенное время (что настраивается администратором сервера DHCP). При таком подходе устаревшие адреса IP тех клиентов, которые больше не подключены к сети, могут автоматически использоваться повторно.
+
+Клиенты DHCP могут получить от сервера очень много информации. Подробный список находится в странице Справочника man:dhcp-options[5].
+
+=== Интеграция с FreeBSD
+
+DHCP клиент от OpenBSD, `dhclient`, полностью интегрирован во FreeBSD. Поддержка клиента DHCP есть как в программе установки, так и в самой системе, что исключает необходимость в знании подробностей конфигурации сети в любой сети, имеющей сервер DHCP.
+
+DHCP поддерживается утилитой sysinstall. При настройке сетевого интерфейса из программы sysinstall второй вопрос, который вам задается: "Do you want to try DHCP configuration of the interface?" ("Хотите ли вы попробовать настроить этот интерфейс через DHCP?"). Утвердительный ответ приведёт к запуску программы `dhclient`, и при удачном его выполнении к автоматическому заданию информации для настройки интерфейса.
+
+Есть две вещи, которые вы должны сделать для того, чтобы ваша система использовала DHCP при загрузке:
+
+* Убедитесь, что устройство [.filename]#bpf# включено в компиляцию вашего ядра. Чтобы это сделать, добавьте строчку `device bpf` в конфигурационный файл ядра и перестройте ядро. Более подробная информация о построении ядер имеется в crossref:kernelconfig[kernelconfig, Настройка ядра FreeBSD].
++
+Устройство [.filename]#bpf# уже является частью ядра [.filename]#GENERIC#, которое поставляется вместе с FreeBSD, так что, если вы не используете другое ядро, то вам и не нужно его делать для того, чтобы работал DHCP.
++
+[NOTE]
+====
+Те, кто беспокоится о безопасности, должны иметь в виду, что устройство [.filename]#bpf# является также тем самым устройством, которое позволяет работать программам-снифферам пакетов (хотя для этого они должны быть запущены пользователем `root`). Наличие устройства [.filename]#bpf#_необходимо_ для использования DHCP, но если вы чересчур беспокоитесь о безопасности, то вам нельзя добавлять устройство [.filename]#bpf# в ядро только для того, чтобы в неопределённом будущем использовать DHCP.
+====
+
+* По умолчанию, конфигурирование FreeBSD по протоколу DHCP выполняется фоновым процессом, или _асинхронно_. Остальные стартовые скрипты продолжают работу не ожидая завершения процесса конфигурирования, тем самым ускоряя загрузку системы.
++
+Фоновое конфигурирование не создает проблем в случае, если сервер DHCP быстро отвечает на запросы, и процесс конфигурирования происходит быстро. Однако, в некоторых случаях настройка по DHCP может длиться значительное время. При этом запуск сетевых сервисов может потерпеть неудачу, если будет произведен ранее завершения конфигурирования по DHCP. Запуск DHCP в _синхронном_ режиме предотвращает проблему, откладывая выполнение остальных стартовых скриптов до момента завершения конфигурирования по DHCP.
++
+Для осуществления фонового конфигурирования по DHCP (асинхронный режим), используйте значение "`DHCP`" в [.filename]#/etc/rc.conf#:
++
+[.programlisting]
+....
+ifconfig_fxp0="DHCP"
+....
+
++
+Для откладывания запуска стартовых скриптов до завершения конфигурирования по DHCP (синхронный режим), укажите значение "`SYNCDHCP`":
++
+[.programlisting]
+....
+ifconfig_fxp0="SYNCDHCP"
+....
+
++
+[NOTE]
+====
+Замените используемое в этих примерах имя _fxp0_ на имя интерфейса, который необходимо сконфигурировать динамически, как это описано в crossref:config[config-network-setup,Настройка карт сетевых интерфейсов].
+====
+
++
+Если `dhclient` в вашей системе находится в другом месте или если вы хотите задать дополнительные параметры для `dhclient`, то также укажите следующее (изменив так, как вам нужно):
++
+[.programlisting]
+....
+dhclient_program="/sbin/dhclient"
+dhclient_flags=""
+....
+
+Сервер DHCP, dhcpd, включён как часть порта package:net/isc-dhcp42-server[] в коллекцию портов. Этот порт содержит DHCP-сервер от ISC и документацию.
+
+=== Файлы
+
+* [.filename]#/etc/dhclient.conf#
++
+`dhclient` требует наличия конфигурационного файла, [.filename]#/etc/dhclient.conf#. Как правило, файл содержит только комментарии, а настройки по умолчанию достаточно хороши. Этот настроечный файл описан на страницах справочной системы по man:dhclient.conf[5].
+* [.filename]#/sbin/dhclient#
++
+`dhclient` скомпонован статически и находится в каталоге [.filename]#/sbin#. На страница Справочника man:dhclient[8] дается более подробная информация о `dhclient`.
+* [.filename]#/sbin/dhclient-script#
++
+`dhclient-script` является специфичным для FreeBSD скриптом настройки клиента DHCP. Он описан в man:dhclient-script[8], но для нормального функционирования никаких модификаций со стороны пользователя не требуется.
+* [.filename]#/var/db/dhclient.leases#
++
+В этом файле клиент DHCP хранит базу данных выданных к использованию адресов в виде журнала. На странице man:dhclient.leases[5] дается гораздо более подробное описание.
+
+=== Дополнительная литература
+
+Полное описание протокола DHCP дается в http://www.freesoft.org/CIE/RFC/2131/[RFC 2131]. Кроме того, дополнительная информация есть на сервере http://www.dhcp.org/[http://www.dhcp.org/].
+
+[[network-dhcp-server]]
+=== Установка и настройка сервера DHCP
+
+==== Чему посвящён этот раздел
+
+Этот раздел даёт информацию о том, как настроить систему FreeBSD для работы в качестве сервера DHCP на основе реализации пакета DHCP от ISC (Internet Systems Consortium).
+
+Серверная часть пакета не поставляется как часть FreeBSD, так что вам потребуется установить порт package:net/isc-dhcp42-server[] для получения этого сервиса. Обратитесь к crossref:ports[ports, Установка приложений. порты и пакеты] для получения более полной информации об использовании коллекции портов.
+
+==== Установка сервера DHCP
+
+Для того, чтобы настроить систему FreeBSD на работу в качестве сервера DHCP, вам необходимо обеспечить присутствие устройства man:bpf[4], вкомпилированного в ядро. Для этого добавьте строку `device bpf` в файл конфигурации вашего ядра. Для получения более полной информации о построении ядер, обратитесь к crossref:kernelconfig[kernelconfig, Настройка ядра FreeBSD].
+
+Устройство [.filename]#bpf# уже входит в состав ядра [.filename]#GENERIC#, поставляемого с FreeBSD, так что вам не нужно создавать собственное ядро для обеспечения работы DHCP.
+
+[NOTE]
+====
+Те, кто обращает особое внимание на вопросы безопасности, должны заметить, что [.filename]#bpf# является тем устройством, что позволяет нормально работать снифферам пакетов (хотя таким программам требуются привилегированный доступ). Наличие устройства [.filename]#bpf#_обязательно_ для использования DHCP, но если вы очень обеспокоены безопасностью, наверное, вам не нужно включать [.filename]#bpf# в ваше ядро только потому, что в отдалённом будущем вы собираетесь использовать DHCP.
+====
+
+Следующим действием, которое вам нужно выполнить, является редактирование примерного [.filename]#dhcpd.conf#, который устанавливается в составе порта package:net/isc-dhcp42-server[]. По умолчанию это файл [.filename]#/usr/local/etc/dhcpd.conf.sample#, и вы должны скопировать его в файл [.filename]#/usr/local/etc/dhcpd.conf# перед тем, как его редактировать.
+
+==== Настройка сервера DHCP
+
+[.filename]#dhcpd.conf# состоит из деклараций относительно подсетей и хостов, и проще всего описывается на примере:
+
+[.programlisting]
+....
+option domain-name "example.com";<.>
+option domain-name-servers 192.168.4.100;<.>
+option subnet-mask 255.255.255.0;<.>
+
+default-lease-time 3600;<.>
+max-lease-time 86400;<.>
+ddns-update-style none;<.>
+
+subnet 192.168.4.0 netmask 255.255.255.0 {
+ range 192.168.4.129 192.168.4.254;<.>
+ option routers 192.168.4.1;<.>
+}
+
+host mailhost {
+ hardware ethernet 02:03:04:05:06:07;<.>
+ fixed-address mailhost.example.com;<.>
+}
+....
+
+<.> Этот параметр задаёт домен, который будет выдаваться клиентам в качестве домена, используемого по умолчанию при поиске. Обратитесь к страницам справочной системы по man:resolv.conf[5] для получения дополнительной информации о том, что это значит.
+
+<.> Этот параметр задаёт список разделённых запятыми серверов DNS, которые должен использовать клиент.
+
+<.> Маска сети, которая будет выдаваться клиентам.
+
+<.> Клиент может запросить определённое время, которое будет действовать выданная информация. В противном случае сервер выдаст настройки с этим сроком (в секундах).
+
+<.> Это максимальное время, на которое сервер будет выдавать конфигурацию. Если клиент запросит больший срок, он будет подтверждён, но будет действовать только `max-lease-time` секунд.
+
+<.> Этот параметр задаёт, будет ли сервер DHCP пытаться обновить DNS при выдаче или освобождении конфигурационной информации. В реализации ISC этот параметр является _обязательным_.
+
+<.> Это определение того, какие IP-адреса должны использоваться в качестве резерва для выдачи клиентам. IP-адреса между и включая границы, будут выдаваться клиентам.
+
+<.> Объявление маршрутизатора, используемого по умолчанию, который будет выдаваться клиентам.
+
+<.> Аппаратный MAC-адрес хоста (чтобы сервер DHCP мог распознать хост, когда тот делает запрос).
+
+<.> Определение того, что хосту всегда будет выдаваться один и тот же IP-адрес. Заметьте, что указание здесь имени хоста корректно, так как сервер DHCP будет разрешать имя хоста самостоятельно до того, как выдать конфигурационную информацию.
+
+Когда вы закончите составлять свой [.filename]#dhcpd.conf#, нужно разрешить запуск сервера DHCP в файле [.filename]#/etc/rc.conf#, добавив в него строки
+
+[.programlisting]
+....
+dhcpd_enable="YES"
+dhcpd_ifaces="dc0"
+....
+
+Замените `dc0` именем интерфейса (или именами интерфейсов, разделяя их пробелами), на котором(ых) сервер DHCP должен принимать запросы от клиентов.
+
+Затем вы можете стартовать сервер DHCP при помощи команды
+
+[source,bash]
+....
+# /usr/local/etc/rc.d/isc-dhcpd start
+....
+
+Если в будущем вам понадобится сделать изменения в настройке вашего сервера, то важно заметить, что посылка сигнала `SIGHUP` приложению dhcpd_не приведёт_ к перезагрузке настроек, как это бывает для большинства даемонов. Вам нужно послать сигнал `SIGTERM` для остановки процесса, а затем перезапустить его при помощи вышеприведённой команды.
+
+==== Файлы
+
+* [.filename]#/usr/local/sbin/dhcpd#
++
+dhcpd скомпонован статически и расположен в каталоге [.filename]#/usr/local/sbin#. Страницы справочной системы man:dhcpd[8], устанавливаемые портом, содержат более полную информацию о dhcpd.
+* [.filename]#/usr/local/etc/dhcpd.conf#
++
+dhcpd требует наличия конфигурационного файла, [.filename]#/usr/local/etc/dhcpd.conf#, до того, как он будет запущен и начнёт предоставлять сервис клиентам. Необходимо, чтобы этот файл содержал все данные, которая будет выдаваться обслуживаемым клиентам, а также информацию о работе сервера. Этот конфигурационный файл описывается на страницах справочной системы man:dhcpd.conf[5], которые устанавливаются портом.
+* [.filename]#/var/db/dhcpd.leases#
++
+Сервер DHCP ведёт базу данных выданной информации в этом файле, который записывается в виде протокола. Страницы справочной системы man:dhcpd.leases[5], устанавливаемые портом, дают гораздо более подробное описание.
+* [.filename]#/usr/local/sbin/dhcrelay#
++
+dhcrelay используется в сложных ситуациях, когда сервер DHCP пересылает запросы от клиента другому серверу DHCP в отдельной сети. Если вам нужна такая функциональность, то установите порт package:net/isc-dhcp42-relay[]. На страницах справочной системы man:dhcrelay[8], которые устанавливаются портом, даётся более полное описание.
+
+[[network-dns]]
+== Domain Name System (DNS)
+
+=== Обзор
+
+По умолчанию во FreeBSD используется одна из версий программы BIND (Berkeley Internet Name Domain), являющейся самой распространенной реализацией протокола DNS. DNS - это протокол, при помощи которого имена преобразуются в IP-адреса и наоборот. Например, в ответ на запрос о `www.FreeBSD.org` будет получен IP-адрес веб-сервера Проекта FreeBSD, а запрос о `ftp.FreeBSD.org` возвратит IP-адрес соответствующей машины с FTP-сервером. Точно также происходит и обратный процесс. Запрос, содержащий IP-адрес машины, возвратит имя хоста. Для выполнения запросов к DNS вовсе не обязательно иметь в системе работающий сервер имён.
+
+FreeBSD в настоящее время поставляется с сервером DNSBIND9, предоставляющим расширенные настройки безопасности, новую схему расположения файлов конфигурации и автоматические настройки для man:chroot[8].
+
+В сети Интернет DNS управляется через достаточно сложную систему авторизированных корневых серверов имён, серверов доменов первого уровня (Top Level Domain, TLD) и других менее крупных серверов имён, которые содержат и кэшируют информацию о конкретных доменах.
+
+На данный момент пакет BIND поддерживается Internet Systems Consortium https://www.isc.org/[https://www.isc.org/].
+
+=== Используемая терминология
+
+Для понимания этого документа нужно понимать значения некоторых терминов, связанных с работой DNS.
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Термин
+| Определение
+
+|Прямой запрос к DNS (forward DNS)
+|Преобразование имён хостов в адреса IP
+
+|Ориджин (origin)
+|Обозначает домен, покрываемый конкретным файлом зоны
+
+|named, bind
+|Общеупотребительные названия для обозначения пакета BIND, обеспечивающего работу сервера имён во FreeBSD.
+
+|Резолвер
+|Системный процесс, посредством которого машина обращается к серверу имён для получения информации о зоне
+
+|Обратный DNS (reverse DNS)
+|Преобразование адресов IP в имена хостов
+
+|Корневая зона
+|Начало иерархии зон Интернет. Все зоны находятся под корневой зоной, подобно тому, как все файлы располагаются ниже корневого каталога.
+
+|Зона
+|Отдельный домен, поддомен или часть DNS, управляемая одним сервером.
+|===
+
+Примеры зон:
+
+* `.` - так обычно обозначается в документации корневая зона.
+* `org.` - домен верхнего уровня (TLD) в корневой зоне.
+* `example.org.` является зоной в домене верхнего уровня (TLD) `org.`.
+* `1.168.192.in-addr.arpa` является зоной, в которую включены все IP-адреса, формирующие пространство адресов `192.168.1.*`.
+
+Как можно видеть, уточняющая часть имени хоста появляется слева. Например, `example.org.` более точен, чем `org.`, также, как `org.` более точен, чем корневая зона. Расположение каждой части имени хоста сильно похоже на файловую систему: каталог [.filename]#/dev# расположен в корневой файловой системе, и так далее.
+
+=== Причины, по которым вам может понадобиться сервер имён
+
+Сервера имён обычно используются в двух видах: авторитетный сервер имён и кэширующий сервер имён, также называемый распознавателем (resolver).
+
+Авторитетный сервер имён нужен, когда:
+
+* нужно предоставлять информацию о DNS остальному миру, отвечая на запросы авторизированно.
+* зарегистрирован домен, такой, как `example.org` и в этом домене требуется поставить имена машин в соответствие с их адресами IP.
+* блоку адресов IP требуется обратные записи DNS (IP в имена хостов).
+* резервный (slave) сервер имён должен отвечать на запросы.
+
+Кэширующий сервер имён нужен, когда:
+
+* локальный сервер DNS может кэшировать информацию и отвечать на запросы быстрее, чем это происходит при прямом опросе внешнего сервера имён.
+
+Например, когда кто-нибудь запрашивает информацию о `www.FreeBSD.org`, то обычно резолвер обращается к серверу имён вашего провайдера, посылает запрос и ожидает ответа. С локальным кэширующим сервером DNS запрос во внешний мир будет делаться всего один раз. Последующие запросы не будут посылаться за пределы локальной сети, потому что информация уже имеется в кэше.
+
+=== Как это работает
+
+Во FreeBSD даемон BIND называется named.
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Файл
+| Описание
+
+|man:named[8]
+|Даемон BIND
+
+|man:rndc[8]
+|Программа управления даемоном сервера имён
+
+|[.filename]#/etc/namedb#
+|Каталог, в котором располагается вся информация о зонах BIND
+
+|[.filename]#/etc/namedb/named.conf#
+|Конфигурационный файл для даемона
+|===
+
+Файлы зон обычно располагаются в каталоге [.filename]#/etc/namedb# и содержат информацию о зоне DNS, за которую отвечает сервер имён.
+
+В зависимости от способа конфигурации зоны на сервере файлы зон могут располагаться в подкаталогах [.filename]#master#, [.filename]#slave# или [.filename]#dynamic# иерархии [.filename]#/etc/namedb#. Эти файлы содержат DNS информацию, которую и будет сообщать в ответ на запросы сервер имен.
+
+=== Запуск BIND
+
+Так как сервер имён BIND устанавливается по умолчанию, его настройка сравнительно проста.
+
+Стандартная конфигурация named запускает простой кэширующий сервер в ограниченной среде man:chroot[8], который прослушивает запросы на интерфейсе обратной связи (loopback) с адресом (127.0.0.1). Для одноразового запуска даемона в этой конфигурации используйте команду
+
+[source,bash]
+....
+# /etc/rc.d/named onestart
+....
+
+Чтобы даемон named запускался во время загрузки, поместите в [.filename]#/etc/rc.conf# следующую строку:
+
+[.programlisting]
+....
+named_enable="YES"
+....
+
+Разумеется, существует множество различных конфигураций [.filename]#/etc/namedb/named.conf#, лежащих за рамками данного документа. Разнообразные опции запуска named во FreeBSD описаны в переменных `named__*_` файла [.filename]#/etc/defaults/rc.conf# и странице справочника man:rc.conf[5]. Кроме того, полезной может оказаться crossref:config[configtuning-rcd,Использование rc во FreeBSD 5.X и последующих версиях].
+
+=== Конфигурационные файлы
+
+Файлы конфигурации даемона named расположены в каталоге [.filename]#/etc/namedb# и, за исключением случая, когда вам требуется просто резолвер, требуют модификации.
+
+==== [.filename]#/etc/namedb/named.conf#
+
+[.programlisting]
+....
+// $FreeBSD$
+//
+// If you are going to set up an authoritative server, make sure you
+// understand the hairy details of how DNS works. Even with
+// simple mistakes, you can break connectivity for affected parties,
+// or cause huge amounts of useless Internet traffic.
+
+options {
+ // All file and path names are relative to the chroot directory,
+ // if any, and should be fully qualified.
+ directory "/etc/namedb/working";
+ pid-file "/var/run/named/pid";
+ dump-file "/var/dump/named_dump.db";
+ statistics-file "/var/stats/named.stats";
+
+// If named is being used only as a local resolver, this is a safe default.
+// For named to be accessible to the network, comment this option, specify
+// the proper IP address, or delete this option.
+ listen-on { 127.0.0.1; };
+
+// If you have IPv6 enabled on this system, uncomment this option for
+// use as a local resolver. To give access to the network, specify
+// an IPv6 address, or the keyword "any".
+// listen-on-v6 { ::1; };
+
+// These zones are already covered by the empty zones listed below.
+// If you remove the related empty zones below, comment these lines out.
+ disable-empty-zone "255.255.255.255.IN-ADDR.ARPA";
+ disable-empty-zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA";
+ disable-empty-zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA";
+
+// If you've got a DNS server around at your upstream provider, enter
+// its IP address here, and enable the line below. This will make you
+// benefit from its cache, thus reduce overall DNS traffic in the Internet.
+/*
+ forwarders {
+ 127.0.0.1;
+ };
+*/
+
+// If the 'forwarders' clause is not empty the default is to 'forward first'
+// which will fall back to sending a query from your local server if the name
+// servers in 'forwarders' do not have the answer. Alternatively you can
+// force your name server to never initiate queries of its own by enabling the
+// following line:
+// forward only;
+
+// If you wish to have forwarding configured automatically based on
+// the entries in /etc/resolv.conf, uncomment the following line and
+// set named_auto_forward=yes in /etc/rc.conf. You can also enable
+// named_auto_forward_only (the effect of which is described above).
+// include "/etc/namedb/auto_forward.conf";
+....
+
+Как и говорится в комментариях, если вы хотите получить эффект от использования кэша провайдера, то можно включить раздел `forwarders`. В обычном случае сервер имён будет рекурсивно опрашивать определённые серверы имён Интернет до тех пор, пока не получит ответ на свой запрос. При включении этого раздела он будет автоматически опрашивать сервер имён вашего провайдера (или тот, который здесь указан), используя преимущества его кэша. наличия нужной информации. Если соответствующий сервер имён провайдера работает быстро и имеет хороший канал связи, то в результате такой настройки вы можете получить хороший результат.
+
+[WARNING]
+====
+
+`127.0.0.1` здесь работать _не будет_. Измените его на IP-адрес сервера имён провайдера.
+====
+
+[.programlisting]
+....
+/*
+ Modern versions of BIND use a random UDP port for each outgoing
+ query by default in order to dramatically reduce the possibility
+ of cache poisoning. All users are strongly encouraged to utilize
+ this feature, and to configure their firewalls to accommodate it.
+
+ AS A LAST RESORT in order to get around a restrictive firewall
+ policy you can try enabling the option below. Use of this option
+ will significantly reduce your ability to withstand cache poisoning
+ attacks, and should be avoided if at all possible.
+
+ Replace NNNNN in the example with a number between 49160 and 65530.
+ */
+ // query-source address * port NNNNN;
+};
+
+// If you enable a local name server, don't forget to enter 127.0.0.1
+// first in your /etc/resolv.conf so this server will be queried.
+// Also, make sure to enable it in /etc/rc.conf.
+
+// The traditional root hints mechanism. Use this, OR the slave zones below.
+zone "." { type hint; file "/etc/namedb/named.root"; };
+
+/* Slaving the following zones from the root name servers has some
+ significant advantages:
+ 1. Faster local resolution for your users
+ 2. No spurious traffic will be sent from your network to the roots
+ 3. Greater resilience to any potential root server failure/DDoS
+
+ On the other hand, this method requires more monitoring than the
+ hints file to be sure that an unexpected failure mode has not
+ incapacitated your server. Name servers that are serving a lot
+ of clients will benefit more from this approach than individual
+ hosts. Use with caution.
+
+ To use this mechanism, uncomment the entries below, and comment
+ the hint zone above.
+
+ As documented at http://dns.icann.org/services/axfr/ these zones:
+ "." (the root), ARPA, IN-ADDR.ARPA, IP6.ARPA, and ROOT-SERVERS.NET
+ are available for AXFR from these servers on IPv4 and IPv6:
+ xfr.lax.dns.icann.org, xfr.cjr.dns.icann.org
+*/
+/*
+zone "." {
+ type slave;
+ file "/etc/namedb/slave/root.slave";
+ masters {
+ 192.5.5.241; // F.ROOT-SERVERS.NET.
+ };
+ notify no;
+};
+
+zone "arpa" {
+ type slave;
+ file "/etc/namedb/slave/arpa.slave";
+ masters {
+ 192.5.5.241; // F.ROOT-SERVERS.NET.
+ };
+ notify no;
+};
+*/
+
+/* Serving the following zones locally will prevent any queries
+ for these zones leaving your network and going to the root
+ name servers. This has two significant advantages:
+ 1. Faster local resolution for your users
+ 2. No spurious traffic will be sent from your network to the roots
+*/
+// RFCs 1912 and 5735 (and BCP 32 for localhost)
+zone "localhost" { type master; file "/etc/namedb/master/localhost-forward.db"; };
+zone "127.in-addr.arpa" { type master; file "/etc/namedb/master/localhost-reverse.db"; };
+zone "255.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+
+// RFC 1912-style zone for IPv6 localhost address
+zone "0.ip6.arpa" { type master; file "/etc/namedb/master/localhost-reverse.db"; };
+
+// "This" Network (RFCs 1912 and 5735)
+zone "0.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+
+// Private Use Networks (RFCs 1918 and 5735)
+zone "10.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "16.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "17.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "18.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "19.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "20.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "21.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "22.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "23.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "24.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "25.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "26.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "27.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "28.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "29.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "30.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "31.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "168.192.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+
+// Link-local/APIPA (RFCs 3927 and 5735)
+zone "254.169.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+
+// IETF protocol assignments (RFCs 5735 and 5736)
+zone "0.0.192.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+
+// TEST-NET-[1-3] for Documentation (RFCs 5735 and 5737)
+zone "2.0.192.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "100.51.198.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "113.0.203.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+
+// IPv6 Range for Documentation (RFC 3849)
+zone "8.b.d.0.1.0.0.2.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+
+// Domain Names for Documentation and Testing (BCP 32)
+zone "test" { type master; file "/etc/namedb/master/empty.db"; };
+zone "example" { type master; file "/etc/namedb/master/empty.db"; };
+zone "invalid" { type master; file "/etc/namedb/master/empty.db"; };
+zone "example.com" { type master; file "/etc/namedb/master/empty.db"; };
+zone "example.net" { type master; file "/etc/namedb/master/empty.db"; };
+zone "example.org" { type master; file "/etc/namedb/master/empty.db"; };
+
+// Router Benchmark Testing (RFCs 2544 and 5735)
+zone "18.198.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "19.198.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+
+// IANA Reserved - Old Class E Space (RFC 5735)
+zone "240.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "241.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "242.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "243.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "244.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "245.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "246.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "247.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "248.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "249.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "250.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "251.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "252.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "253.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "254.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+
+// IPv6 Unassigned Addresses (RFC 4291)
+zone "1.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "3.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "4.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "5.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "6.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "7.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "8.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "9.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "a.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "b.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "c.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "d.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "e.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "0.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "1.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "2.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "3.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "4.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "5.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "6.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "7.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "8.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "9.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "a.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "b.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "0.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "1.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "2.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "3.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "4.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "5.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "6.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "7.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+
+// IPv6 ULA (RFC 4193)
+zone "c.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "d.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+
+// IPv6 Link Local (RFC 4291)
+zone "8.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "9.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "a.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "b.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+
+// IPv6 Deprecated Site-Local Addresses (RFC 3879)
+zone "c.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "d.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "e.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+zone "f.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
+
+// IP6.INT is Deprecated (RFC 4159)
+zone "ip6.int" { type master; file "/etc/namedb/master/empty.db"; };
+
+// NB: Do not use the IP addresses below, they are faked, and only
+// serve demonstration/documentation purposes!
+//
+// Example slave zone config entries. It can be convenient to become
+// a slave at least for the zone your own domain is in. Ask
+// your network administrator for the IP address of the responsible
+// master name server.
+//
+// Do not forget to include the reverse lookup zone!
+// This is named after the first bytes of the IP address, in reverse
+// order, with ".IN-ADDR.ARPA" appended, or ".IP6.ARPA" for IPv6.
+//
+// Before starting to set up a master zone, make sure you fully
+// understand how DNS and BIND work. There are sometimes
+// non-obvious pitfalls. Setting up a slave zone is usually simpler.
+//
+// NB: Don't blindly enable the examples below. :-) Use actual names
+// and addresses instead.
+
+/* An example dynamic zone
+key "exampleorgkey" {
+ algorithm hmac-md5;
+ secret "sf87HJqjkqh8ac87a02lla==";
+};
+zone "example.org" {
+ type master;
+ allow-update {
+ key "exampleorgkey";
+ };
+ file "dynamic/example.org";
+};
+*/
+
+/* Example of a slave reverse zone
+zone "1.168.192.in-addr.arpa" {
+ type slave;
+ file "/etc/namedb/slave/1.168.192.in-addr.arpa";
+ masters {
+ 192.168.1.1;
+ };
+};
+*/
+....
+
+Это примеры описаний прямой и обратной зон из файла [.filename]#named.conf# для вторичных серверов.
+
+Для каждого новой зоны, которую будет обслуживать сервер имён, в файл [.filename]#named.conf# должна быть добавлена запись.
+
+К примеру, самая простая запись для домена `example.org` может выглядеть вот так:
+
+[.programlisting]
+....
+zone "example.org" {
+ type master;
+ file "master/example.org";
+};
+....
+
+Зона является первичной, что отражается в поле `type`, и информация о зоне хранится в файле [.filename]#/etc/namedb/master/example.org#, что указывается в поле `file`.
+
+[.programlisting]
+....
+zone "example.org" {
+ type slave;
+ file "slave/example.org";
+};
+....
+
+В случае вторичной зоны информация о ней передается с основного сервера имён для заданной зоны и сохраняется в указанном файле. Если и когда основной сервер имён выходит и строя или недосягаем, то скачанная информация о зоне будет находиться на вторичных серверах, и они смогут обслуживать эту зону.
+
+==== Файлы зон
+
+Пример файла зоны `example.org` для основного сервера (располагающийся в файле [.filename]#/etc/namedb/master/example.org#) имеет такой вид:
+
+[.programlisting]
+....
+$TTL 3600 ; 1 hour default TTL
+example.org. IN SOA ns1.example.org. admin.example.org. (
+ 2006051501 ; Serial
+ 10800 ; Refresh
+ 3600 ; Retry
+ 604800 ; Expire
+ 300 ; Negative Response TTL
+ )
+
+; DNS Servers
+ IN NS ns1.example.org.
+ IN NS ns2.example.org.
+
+; MX Records
+ IN MX 10 mx.example.org.
+ IN MX 20 mail.example.org.
+
+ IN A 192.168.1.1
+
+; Machine Names
+localhost IN A 127.0.0.1
+ns1 IN A 192.168.1.2
+ns2 IN A 192.168.1.3
+mx IN A 192.168.1.4
+mail IN A 192.168.1.5
+
+; Aliases
+www IN CNAME example.org.
+....
+
+Заметьте, что все имена хостов, оканчивающиеся на ".", задают полное имя, тогда как все имена без символа "." на конце считаются заданными относительно origin. Например, `ns1` преобразуется в `ns1._example.org._`
+
+Файл зоны имеет следующий формат:
+
+[.programlisting]
+....
+recordname IN recordtype value
+....
+
+Наиболее часто используемые записи DNS:
+
+SOA::
+начало зоны ответственности
+
+NS::
+авторитативный сервер имен
+
+A::
+адрес хоста
+
+CNAME::
+каноническое имя для алиаса
+
+MX::
+обмен почтой
+
+PTR::
+указатель на доменное имя (используется в обратных зонах DNS)
+
+[.programlisting]
+....
+example.org. IN SOA ns1.example.org. admin.example.org. (
+ 2006051501 ; Serial
+ 10800 ; Refresh after 3 hours
+ 3600 ; Retry after 1 hour
+ 604800 ; Expire after 1 week
+ 300 ) ; Negative Response TTL
+....
+
+`example.org.`::
+имя домена, а также ориджин для этого файла зоны.
+
+`ns1.example.org.`::
+основной/авторитативный сервер имён для этой зоны.
+
+`admin.example.org.`::
+человек, отвечающий за эту зону, адрес электронной почты с символом "@" замененным на точку. (mailto:admin@example.org[admin@example.org] становится `admin.example.org`)
+
+`2006051501`::
+последовательный номер файла. При каждом изменении файла зоны это число должно увеличиваться. В настоящее время для нумерации многие администраторы предпочитают формат `ггггммддвв`. `2006051501` будет означать, что файл последний раз изменялся 15.05.2006, а последнее число `01` означает, что это была первая модификация файла за день. Последовательный номер важен, так как он служит для того, чтобы вторичные серверы узнавали об обновлении зоны.
+
+[.programlisting]
+....
+ IN NS ns1.example.org.
+....
+
+Это NS-запись. Такие записи должны иметься для всех серверов имён, которые будут отвечать за зону.
+
+[.programlisting]
+....
+localhost IN A 127.0.0.1
+ns1 IN A 192.168.1.2
+ns2 IN A 192.168.1.3
+mx IN A 192.168.1.4
+mail IN A 192.168.1.5
+....
+
+Записи типа A служат для обозначения имён машин. Как это видно выше, имя `ns1.example.org` будет преобразовано в `192.168.1.2`.
+
+[.programlisting]
+....
+ IN A 192.168.1.1
+....
+
+Эта строка присваивает IP адрес `192.168.1.1` текущему ориджину, в данном случае домену `example.org`.
+
+[.programlisting]
+....
+www IN CNAME @
+....
+
+Записи с каноническими именами обычно используются для присвоения машинам псевдонимов. В этом примере `www` является псевдонимом для "главной" машины, имя которой по воле случая совпало с именем домена `example.org` (`192.168.1.1`). Записи типа CNAME нельзя использовать совместно с другими типами записей для одного и того же имени хоста (recordname).
+
+[.programlisting]
+....
+ IN MX 10 mail.example.org.
+....
+
+MX-запись указывает, какие почтовые серверы отвечают за обработку входящей электронной почты для зоны. `mail.example.org` является именем почтового сервера, а 10 обозначает приоритет этого почтового сервера.
+
+Можно иметь несколько почтовых серверов с приоритетами, например, 10, 20 и так далее. Почтовый сервер, пытающийся доставить почту для `example.org`, сначала попробует связаться с машиной, имеющий MX-запись с самым большим приоритетом (наименьшим числовым значением в поле MX), затем с приоритетом поменьше и так далее, до тех пор, пока почта не будет отправлена.
+
+Для файлов зон in-addr.arpa (обратные записи DNS) используется тот же самый формат, отличающийся только использованием записей PTR вместо A или CNAME.
+
+[.programlisting]
+....
+$TTL 3600
+
+1.168.192.in-addr.arpa. IN SOA ns1.example.org. admin.example.org. (
+ 2006051501 ; Serial
+ 10800 ; Refresh
+ 3600 ; Retry
+ 604800 ; Expire
+ 300 ) ; Negative Response TTL
+
+ IN NS ns1.example.org.
+ IN NS ns2.example.org.
+
+1 IN PTR example.org.
+2 IN PTR ns1.example.org.
+3 IN PTR ns2.example.org.
+4 IN PTR mx.example.org.
+5 IN PTR mail.example.org.
+....
+
+В этом файле дается полное соответствие имён хостов IP-адресам в нашем описанном ранее вымышленном домене.
+
+Следует отметить, что все имена в правой части PTR-записи должны быть полными доменными именами (то есть, заканчиваться точкой ".").
+
+=== Кэширующий сервер имён
+
+Кэширующий сервер имён - это сервер имен, чья главная задача - разрешение рекурсивных запросов. Он просто выполняет запросы от своего имени и сохраняет результаты для последующего использования.
+
+=== * DNSSEC
+
+Этот раздел не переведен.
+
+=== Безопасность
+
+Хотя BIND является самой распространенной реализацией DNS, всегда стоит вопрос об обеспечении безопасности. Время от времени обнаруживаются возможные и реальные бреши в безопасности.
+
+FreeBSD автоматически запускает named в ограниченном окружении (man:chroot[8]); помимо этого, есть еще несколько механизмов, помогающих защититься от возможных атак на сервис DNS.
+
+Весьма полезно прочесть сообщения безопасности http://www.cert.org/[CERT] и подписаться на {freebsd-security-notifications} для того, чтобы быть в курсе текущих проблем с обеспечением безопасности Internet и FreeBSD.
+
+[TIP]
+====
+
+Если возникает проблема, то наличие последних исходных текстов и свежесобранного named может способствовать её решению.
+====
+
+[[dns-read]]
+=== Дополнительная литература
+
+Справочная информация по BIND/named: man:rndc[8], man:named[8], man:named.conf[8], man:nsupdate[8], man:dnssec-signzone[8], man:dnssec-keygen[8]
+
+* https://www.isc.org/software/bind[ Официальная страница ISC BIND]
+* https://www.isc.org/software/guild[ Официальный форум ISC BIND]
+* http://www.oreilly.com/catalog/dns5/[ Книга издательства O'Reilly DNS and BIND 5th Edition]
+* http://www.root-dnssec.org/documentation/[Root DNSSEC]
+* http://data.iana.org/root-anchors/draft-icann-dnssec-trust-anchor.html[DNSSEC Trust Anchor Publication for the Root Zone]
+* http://tools.ietf.org/html/rfc1034[RFC1034 - Domain Names - Concepts and Facilities]
+* http://tools.ietf.org/html/rfc1035[RFC1035 - Domain Names - Implementation and Specification]
+* http://tools.ietf.org/html/rfc4033[RFC4033 - DNS Security Introduction and Requirements]
+* http://tools.ietf.org/html/rfc4034[RFC4034 - Resource Records for the DNS Security Extensions]
+* http://tools.ietf.org/html/rfc4035[RFC4035 - Protocol Modifications for the DNS Security Extensions]
+* http://tools.ietf.org/html/rfc4641[RFC4641 - DNSSEC Operational Practices]
+* http://tools.ietf.org/html/rfc5011[RFC5011 - Automated Updates of DNS Security (DNSSEC Trust Anchors]
+
+[[network-apache]]
+== Apache HTTP сервер
+
+=== Обзор
+
+FreeBSD используется в качестве платформы для многих из самых нагруженных серверов в мире. Большинство серверов в интернет используют Apache HTTP сервер. Пакеты Apache должны быть включены в поставку FreeBSD. Если вы не установили их во вместе с системой, воспользуйтесь портами package:www/apache13[] или package:www/apache22[].
+
+Как только Apache был успешно установлен, его необходимо настроить.
+
+[NOTE]
+====
+В этом разделе рассказывается о версии 1.3.X Apache HTTP сервера, поскольку эта версия наиболее широко используется в FreeBSD. Apache 2.X содержит много новых технологий, но здесь они не обсуждаются. За дополнительной информацией о Apache 2.X, обращайтесь к http://httpd.apache.org/[http://httpd.apache.org/].
+====
+
+=== Настройка
+
+В FreeBSD основной файл настройки Apache HTTP сервера устанавливается в [.filename]#/usr/local/etc/apache/httpd.conf#. Это обычный текстовый UNIX(R) файл настройки с строками комментариев, начинающимися с символа `#`. Исчерпывающее описание всех возможных параметров настройки находится за пределом рассмотрения этой книги, поэтому здесь будут описаны только наиболее часто модифицируемые директивы.
+
+`ServerRoot "/usr/local"`::
+Указывает верхний каталог установки Apache по умолчанию. Бинарные файлы находятся в [.filename]#bin# и [.filename]#sbin#, подкаталоги расположены относительно корневого каталога сервера, файлы настройки находятся в [.filename]#etc/apache#.
+
+`ServerAdmin you@your.address`::
+Адрес, на который должны будут отправляться сообщения о проблемах с сервером. Этот адрес выводится на некоторые генерируемые сервером страницы, например с сообщениями об ошибках.
+
+`ServerName www.example.com`::
+`ServerName` позволяет вам устанавливать имя хоста, которое отправляется обратно клиентам, если оно отличается от того, с которым настроен хост (например, использование `www` вместо реального имени хоста).
+
+`DocumentRoot "/usr/local/www/data"`::
+`DocumentRoot`: Каталог, внутри которого будут храниться документы. По умолчанию, все запросы обрабатываются внутри этого каталога, но символические ссылки и синонимы могут использоваться для указания на другие каталоги.
+
+Хорошей идеей будет сделать резервные копии настроек Apache перед внесением изменений. Как только вы будете удовлетворены первоначальной настройкой, можно запускать Apache.
+
+=== Запуск Apache
+
+Apache не запускается из inetd, как это делают многие другие сетевые серверы. Он настроен для автономного запуска, чтобы обеспечивать большую производительность при обработке HTTP запросов от браузеров клиентов. Для упрощения запуска, остановки и перезапуска сервера существует shell скрипт. Для запуска Apache в первый раз просто выполните:
+
+[source,bash]
+....
+# /usr/local/sbin/apachectl start
+....
+
+Вы можете остановить сервер в любой момент, выполнив:
+
+[source,bash]
+....
+# /usr/local/sbin/apachectl stop
+....
+
+После внесения любых изменений в файл настроек, вам потребуется перезапустить сервер:
+
+[source,bash]
+....
+# /usr/local/sbin/apachectl restart
+....
+
+Для перезапуска Apache без прерывания имеющихся соединений, выполните:
+
+[source,bash]
+....
+# /usr/local/sbin/apachectl graceful
+....
+
+Дополнительная информация находится на странице справочного руководства man:apachectl[8].
+
+Для запуска Apache при старте системы, добавьте в [.filename]#/etc/rc.conf# следующую строку:
+
+[.programlisting]
+....
+apache_enable="YES"
+....
+
+или для Apache 2.2:
+
+[.programlisting]
+....
+apache22_enable="YES"
+....
+
+Если вы хотите передать программе Apache`httpd` дополнительные параметры командной при загрузке системы, они могут быть помещены в дополнительную строку [.filename]#rc.conf#:
+
+[.programlisting]
+....
+apache_flags=""
+....
+
+Теперь, когда веб сервер запущен, вы можете просмотреть свой веб сайт, задав в строке браузера адрес `http://localhost/`. По умолчанию отображается веб страница [.filename]#/usr/local/www/data/index.html#.
+
+=== Виртуальный хостинг
+
+Apache поддерживает два различных типа виртуального хостинга (Virtual Hosting). Первый метод основан на именах (Name-based Virtual Hosting). Он использует полученные от клиента заголовки HTTP/1.1 для определения имени хоста. Это позволяет многим различным доменам использовать один и тот же IP адрес.
+
+Для настройки Apache на использование этого типа хостинга добавьте в [.filename]#httpd.conf# запись подобную следующей:
+
+[.programlisting]
+....
+NameVirtualHost *
+....
+
+Если веб сервер назывался `www.domain.tld` и вы хотите настроить виртуальный домен для `www.someotherdomain.tld`, необходимо добавить в [.filename]#httpd.conf# следующие записи:
+
+[source,bash]
+....
+<VirtualHost *>
+ServerName www.domain.tld
+DocumentRoot /www/domain.tld
+</VirtualHost>
+
+<VirtualHost *>
+ServerName www.someotherdomain.tld
+DocumentRoot /www/someotherdomain.tld
+</VirtualHost>
+....
+
+Замените адреса и пути к документам на те, что вы будете использовать.
+
+За дополнительной информацией по настройке виртуальных хостов обращайтесь к официальной документации Apache: http://httpd.apache.org/docs/vhosts/[http://httpd.apache.org/docs/vhosts/].
+
+=== Модули Apache
+
+Существуют множество различных модулей Apache, которые добавляют функциональность к основному серверу. Коллекция портов FreeBSD предоставляет простой способ установки Apache с некоторыми наиболее популярными дополнительными модулями.
+
+==== mod_ssl
+
+Модуль mod_ssl использует библиотеку OpenSSL для сильной криптографии через протоколы Secure Sockets Layer (SSL v2/v3) и Transport Layer Security (TLS v1). Этот модуль содержит все необходимое для запроса подписанного сертификата из центра сертификации для защищенного веб сервера на FreeBSD.
+
+Если вы еще не установили Apache, версия Apache 1.3.X с mod_ssl может быть установлена через порт package:www/apache13-modssl[]. Поддержка SSL также доступна для Apache 2.X через порт package:www/apache22[], где она включена по умолчанию.
+
+==== Apache и скриптовые языки
+
+Для большинства скриптовых языков созданы модули Apache. На базе таких модулей возможно создание других модулей Apache, написанных полностью на скриптовом языке. Они также часто используются как встроенные в сервер интерпретаторы, что исключает накладные расходы на запуск внешнего интерпретатора и сокращает время построения динамических страниц.
+
+=== Построение динамических сайтов
+
+В последнее десятилетие все большее число компаний обращает внимание на Интернет как площадку для ведения и расширения бизнеса. Среди прочего, этот процесс подчеркивает потребность в интерактивном содержимом сайтов. Некоторые компании, такие как Microsoft(R), представляют свои закрытые решения; сообщество разработчиков открытых программ отвечает на вызов. Среди современных решений для предоставления динамического контента следует отметить Django, Ruby on Rails, mod_perl и mod_php.
+
+==== Django
+
+Django - это распространяемая под лицензией BSD инфраструктура, позволяющая разработчикам быстро создавать элегантные, высокопроизводительные веб-приложения. Она предоставляет в распоряжение разработчика объектно-реляционное отображение (object-relational mapper), таким образом типы данных разрабатываются как объекты Python. Для этих объектов предоставляется богатый интерфейс доступа к базам данных, при этом у разработчика не возникает необходимости написания SQL-запросов. Django также предоставляет расширяемую систему шаблонов, так что логика приложения отделена от его HTML-представления.
+
+Для Django требуются следующие компоненты: mod_python, Apache и одна из нескольких возможных SQL СУБД. Укажите соответствующие опции сборки, и порт установит всё необходимое.
+
+[[network-www-django-install]]
+.Установка Django совместно с Apache2, mod_python3 и PostgreSQL
+[example]
+====
+
+[source,bash]
+....
+# cd /usr/ports/www/py-django; make all install clean -DWITH_MOD_PYTHON3 -DWITH_POSTGRESQL
+....
+
+====
+
+После установки Django и всех необходимых ему компонентов вам потребуется создать каталог для проекта Django. Далее потребуется настроить Apache для определенных URL адресов на вашем сайте выполнять ваше приложение встроенным интерпретатором Python.
+
+[[network-www-django-apache-config]]
+.Конфигурация Apache для Django/mod_python
+[example]
+====
+Чтобы настроить Apache отправлять запросы для определенных URL адресов вашему веб-приложению, вам потребуется внести несколько строк в конфигурационный файл [.filename]#httpd.conf#:
+
+[source,bash]
+....
+<Location "/">
+ SetHandler python-program
+ PythonPath "['/dir/to/your/django/packages/'] + sys.path"
+ PythonHandler django.core.handlers.modpython
+ SetEnv DJANGO_SETTINGS_MODULE mysite.settings
+ PythonAutoReload On
+ PythonDebug On
+</Location>
+....
+
+====
+
+==== Ruby on Rails
+
+Ruby on Rails это еще одна веб инфраструктура с открытым исходным кодом, которая предоставляет полный стек разработки и которая оптимизированa для продуктивного и быстрого создания мощных веб-приложений. Ruby on Rails может быть легко установлена из коллекции портов.
+
+[source,bash]
+....
+# cd /usr/ports/www/rubygem-rails; make all install clean
+....
+
+==== mod_perl
+
+Проект интеграции Apache/Perl объединяет мощь языка программирования Perl и HTTP сервера Apache. С модулем mod_perl возможно написание модулей Apache полностью на Perl. Кроме того, постоянно запущенный встроенный в сервер интерпретатор позволяет не тратить ресурсы на запуск внешнего интерпретатора и время на запуск Perl.
+
+mod_perl можно использовать различными способами. Помните, что mod_perl 1.0 работает только с Apache 1.3, тогда как mod_perl 2.0 совместим только с Apache 2.X. mod_perl 1.0 доступен как порт package:www/mod_perl[], а также в виде статически скомпилированной версии в package:www/apache13-modperl[]. mod_perl 2.0 доступен как package:www/mod_perl2[].
+
+==== mod_php
+
+PHP, также известный как "Препроцессор гипертекста" ("Hypertext Preprocessor"), - это скриптовый язык общего назначения, в основном предназначенный для веб разработки. Этот язык может быть встроен в HTML, его синтаксис заимствован из C, Java(TM) и Perl, и он позволяет веб разработчикам быстро писать динамически генерируемые страницы.
+
+Добавление поддержки PHP5 к веб серверу Apache производится путем установки порта package:lang/mod_php5[].
+
+Если порт package:lang/php5[] устанавливается впервые, то автоматически отобразятся все доступные опции (`OPTIONS`). Если меню не отображается, так как порт package:lang/php5[] устанавливался ранее, всегда можно повторно вызвать диалог меню выполнив следующую команду в каталоге порта:
+
+[source,bash]
+....
+# make config
+....
+
+Выберите в меню опцию `APACHE`, тем самым вы построите загружаемый модуль mod_php5 для веб сервера Apache.
+
+[NOTE]
+====
+Множество сайтов по разным причинам (например, из-за проблем совместимости или из-за наличия уже развёрнутых веб приложений) всё еще используют PHP4. Если требуется mod_php4 вместо mod_php5, то воспользуйтесь портом package:lang/php4[]. Порт package:lang/php4[] поддерживает многие из конфигурационных и установочных опций порта package:lang/php5[].
+====
+
+Этот порт устанавливает и настраивает модули, необходимые для поддержки динамических PHP веб страниц. Убедитесь, что в файл [.filename]#/usr/local/etc/apache/httpd.conf# были добавлены следующие секции:
+
+[.programlisting]
+....
+LoadModule php5_module libexec/apache/libphp5.so
+....
+
+[.programlisting]
+....
+AddModule mod_php5.c
+ <IfModule mod_php5.c>
+ DirectoryIndex index.php index.html
+ </IfModule>
+ <IfModule mod_php5.c>
+ AddType application/x-httpd-php .php
+ AddType application/x-httpd-php-source .phps
+ </IfModule>
+....
+
+Для загрузки модуля PHP после этого просто вызовите команду `apachectl` с параметром graceful:
+
+[source,bash]
+....
+# apachectl graceful
+....
+
+При дальнейших обновлениях PHP команда `make config` больше не потребуется; выбранные опции сохраняются автоматически инфраструктурой портов FreeBSD
+
+Поддержка PHP в FreeBSD построена по модульному принципу, поэтому базовая установка обладает очень ограниченной функциональностью. Дополнительная функциональность может быть легко добавлена при помощи порта package:lang/php5-extensions[], управляющего набором расширений PHP через меню, либо просто путем установки дополнительных портов.
+
+Например, для добавления поддержки MySQL к PHP5, просто установите порт [.filename]#databases/php5-mysql#.
+
+После установки новых расширений сервер Apache должен быть рестартован, чтобы изменения в конфигурации вступили в силу:
+
+[source,bash]
+....
+# apachectl graceful
+....
+
+[[network-samba]]
+== Файл сервер и печать для Microsoft(R) Windows(R) клиентов (Samba)
+
+=== Обзор
+
+Samba это популярный пакет программ с открытыми исходными текстами, которая предоставляет файловые и принт-сервисы Microsoft(R) Windows(R) клиентам. Эти клиенты могут подключаться и использовать файловое пространство FreeBSD, как если бы это был локальный диск, или принтеры FreeBSD, как если бы это были локальные принтеры.
+
+Пакет Samba должен быть включен в поставку FreeBSD. Если вы не установили Samba при первой установке системы, ее можно установить из порта или пакета package:net/samba34[].
+
+=== Настройка
+
+Файл настройки Samba по умолчанию устанавливается в [.filename]#/usr/local/shared/examples/samba34/smb.conf.default#. Этот файл необходимо скопировать в [.filename]#/usr/local/etc/smb.conf# и отредактировать перед использованием Samba.
+
+В файле [.filename]#smb.conf# находится информация, необходимая для работы Samba, например определение принтеров и "общих каталогов", которые будут использоваться совместно с Windows(R) клиентами. В пакет Samba входит программа с веб интерфейсом, называемая swat, которая дает простой способ редактирования файла [.filename]#smb.conf#.
+
+==== Использование Samba Web Administration Tool (SWAT)
+
+Программа веб администрирования Samba (Samba Web Administration Tool, SWAT) запускается как даемон из inetd. Следовательно, в [.filename]#/etc/inetd.conf# необходимо снять комментарий перед тем, как использовать swat для настройки Samba:
+
+[.programlisting]
+....
+swat stream tcp nowait/400 root /usr/local/sbin/swat swat
+....
+
+Как описано в <<network-inetd-reread>>, после изменения настроек inetd необходимо перечитать конфигурацию.
+
+Как только swat был включен [.filename]#inetd.conf#, вы можете использовать браузер для подключения к http://localhost:901[http://localhost:901]. Сначала необходимо зарегистрироваться с системной учетной записью `root`.
+
+После успешного входа на основную страницу настройки Samba, вы можете просмотреть документацию или начать настройку, нажав на кнопку menu:Globals[]. Раздел menu:Globals[] соответствует переменным, установленным в разделе `[global]` файла [.filename]#/usr/local/etc/smb.conf#.
+
+==== Глобальные настройки
+
+Независимо от того, используете ли вы swat, или редактируете [.filename]#/usr/local/etc/smb.conf# непосредственно, первые директивы, которые вы скорее всего встретите при настройке Samba, будут следующими:
+
+`workgroup`::
+Имя домена или рабочей группы NT для компьютеров, которые будут получать доступ к этому серверу.
+
+`netbios name`::
+Устанавливает имя NetBIOS, под которым будет работать Samba сервер. По умолчанию оно устанавливается равным первому компоненту DNS имени хоста.
+
+`server string`::
+Устанавливает строку, которая будет показана командой `net view` и некоторыми другими сетевыми инструментами, которые отображают строку описания сервера.
+
+==== Настройки безопасности
+
+Две из наиболее важных настроек в [.filename]#/usr/local/etc/smb.conf# отвечают за выбор модели безопасности и за формат паролей для клиентов. Эти параметры контролируются следующими директивами:
+
+`security`::
+Два наиболее часто используемых параметра это `security = share` и `security = user`. Если имена пользователей для клиентов совпадают с их именами на компьютере FreeBSD, вы возможно захотите включить безопасность уровня пользователя (user). Это политика безопасности по умолчанию, она требует, чтобы клиент авторизовался перед доступом к совместно используемым ресурсам.
++
+На уровне безопасности share клиенту не требуется входить на сервер перед подключением к ресурсу. Эта модель безопасности использовалась по умолчанию в старых версиях Samba.
+
+`passdb backend`::
+Samba поддерживает несколько различных подсистем аутентификации. Вы можете аутентифицировать клиентов с помощью LDAP, NIS+, базы данных SQL, или через модифицированный файл паролей. Метод аутентификации по умолчанию `smbpasswd`, и здесь рассматривается только он.
+
+Предполагая, что используется подсистема по умолчанию `smbpasswd`, необходимо создать файл [.filename]#/usr/local/etc/samba/smbpasswd#, чтобы Samba могла аутентифицировать клиентов. Если вы хотите разрешить к учетным записям UNIX(R) доступ с Windows(R) клиентов, используйте следующую команду:
+
+[source,bash]
+....
+# smbpasswd -a username
+....
+
+[NOTE]
+====
+Ныне рекомендуемой подсистемой аутентификации является `tdbsam`, поэтому для добавления пользователей используйте следующую команду:
+
+[source,bash]
+....
+# pdbedit -a -u username
+....
+
+====
+
+Пожалуйста, обратитесь к http://www.samba.org/samba/docs/man/Samba-HOWTO-Collection/[Official Samba HOWTO] за дополнительной информацией о параметрах настройки. Основные настройки, рассмотренные здесь, достаточны для первого запуска Samba.
+
+=== Запуск Samba
+
+Порт package:net/samba34[] добавляет новый стартовый сценарий, который может быть использован для контроля Samba. Для того, чтобы им можно было запускать, останавливать или перезапускать сервер Samba, добавьте следующую запись в файл [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+samba_enable="YES"
+....
+
+Или, для более тонкого контроля:
+
+[.programlisting]
+....
+nmbd_enable="YES"
+....
+
+[.programlisting]
+....
+smbd_enable="YES"
+....
+
+[NOTE]
+====
+Внесение этих записей в [.filename]#/etc/rc.conf# также обеспечит автоматический запуск сервера Samba во время старта системы.
+====
+
+Теперь становится возможным запустить сервер Samba, для чего наберите следующую команду:
+
+[source,bash]
+....
+# /usr/local/etc/rc.d/samba start
+Starting SAMBA: removing stale tdbs :
+Starting nmbd.
+Starting smbd.
+....
+
+За дальнейшей информацией об использовании rc скриптов обратитесь к crossref:config[configtuning-rcd,Использование rc во FreeBSD 5.X и последующих версиях].
+
+Samba состоит из трех отдельных даемонов. Вы можете видеть, что nmbd и smbd запускаются скриптом [.filename]#samba#. Если вы включили сервис разрешения имен winbind в [.filename]#smb.conf#, то увидите также запуск даемона winbindd.
+
+Вы можете остановить Samba в любой момент, набрав:
+
+[source,bash]
+....
+# /usr/local/etc/rc.d/samba stop
+....
+
+Samba это сложный программный набор с функциональностью, позволяющей полную интеграцию в сети Microsoft(R) Windows(R). За дальнейшей информацией о функциях, выходящих за рамки описанной здесь базовой установки, обращайтесь к http://www.samba.org[http://www.samba.org].
+
+[[network-ftp]]
+== Протокол передачи файлов (FTP)
+
+=== Обзор
+
+Протокол передачи файлов (File Transfer Protocol, FTP) дает пользователям простой путь передачи файлов на и с FTP сервера. В FreeBSD серверная программа FTP, ftpd, включена в базовую систему. Это упрощает настройку и администрирование FTP сервера в FreeBSD.
+
+=== Настройка
+
+Наиболее важный шаг заключается в определении того, каким учетным записям будет позволено получать доступ к FTP серверу. В обычной системе FreeBSD есть множество системных учетных записей, используемых различными даемонами, но пользователям должно быть запрещен вход с использованием этих учетных записей. В файле [.filename]#/etc/ftpusers# находится список пользователей, которым запрещен доступ по FTP. По умолчанию он включает упомянутые системные учетные записи, но в него можно добавить и определенных пользователей, которым будет запрещен доступ по FTP.
+
+Вам может понадобиться ограничить доступ определенных пользователей без полного запрета использования FTP. Это можно сделать через файл [.filename]#/etc/ftpchroot#. В нем находится список пользователей и групп, к которым применяется ограничение доступа. На странице справочника man:ftpchroot[5] дана подробная информация, и она не будет дублироваться здесь.
+
+Если вы захотите разрешить анонимный FTP доступ на сервер, в системе FreeBSD необходимо создать пользователя `ftp`. Этот пользователь сможет входить на FTP сервер с именем пользователя `ftp` или `anonymous`, с любым паролем (существует соглашение об использовании почтового адреса пользователя в качестве пароля). FTP сервер выполнит man:chroot[2] при входе пользователя anonymous для ограничения доступа только домашним каталогом пользователя `ftp`.
+
+Существуют два текстовых файла, определяющих сообщение, отправляемое FTP клиентам. Содержимое файла [.filename]#/etc/ftpwelcome# будет выведено пользователям перед приглашением на вход. После успешного входа будет выведено содержимое файла [.filename]#/etc/ftpmotd#. Обратите внимание, что путь к этому файлу задается относительно домашнего каталога пользователя, так что анонимным пользователям будет отправляться [.filename]#~ftp/etc/ftpmotd#.
+
+Как только FTP сервер был правильно настроен, он должен быть включен в [.filename]#/etc/inetd.conf#. Все, что необходимо, это удалить символ комментария "#" из начала существующей строки ftpd:
+
+[.programlisting]
+....
+ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l
+....
+
+Как описано в <<network-inetd-reread>>, inetd должен перечитать конфигурацию после того, как этот файл настройки был изменен. Пожалуйста обратитесь к <<network-inetd-settings>> за деталями по запуску inetd на вашей системе.
+
+В качестве альтернативы, демон ftpd может быть запущен как самостоятельный сервер. В этом случае достаточно установить соответствующую переменную в файле [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+ftpd_enable="YES"
+....
+
+Демон будет запущен автоматически при следующей загрузке системы. Также демон можно запустить вручную, для чего выполните следующую команду как пользователь `root`:
+
+[source,bash]
+....
+# /etc/rc.d/ftpd start
+....
+
+Теперь вы можете войти на FTP сервер, введя:
+
+[source,bash]
+....
+% ftp localhost
+....
+
+=== Поддержка
+
+Для протоколирования даемон ftpd использует сообщения man:syslog[3]. По умолчанию, man:syslog[3] поместит сообщения, относящиеся к FTP, в файл [.filename]#/var/log/xferlog#. Местоположение лог файла FTP может быть изменено путем изменения следующей строки в файле [.filename]#/etc/syslog.conf#:
+
+[.programlisting]
+....
+ftp.info /var/log/xferlog
+....
+
+Учитывайте потенциальные проблемы, возникающие с анонимным FTP сервером. В частности, вы должны дважды подумать, прежде чем позволить анонимным пользователям загружать файлы на сервер. Вы можете обнаружить, что FTP сайт стал форумом, на котором происходит обмен нелицензионным коммерческим программным обеспечением или чем-то еще хуже. Если вам необходимо разрешить анонимную выгрузку файлов на FTP, права должны быть настроены таким образом, чтобы эти файлы не могли прочитать другие анонимные пользователи до их рассмотрения администратором.
+
+[[network-ntp]]
+== Синхронизация часов через NTP
+
+=== Обзор
+
+С течением времени часы компьютера имеют тенденцию отставать. Network Time Protocol - Сетевой Протокол Времени (NTP) является одним из способов вести точное время.
+
+Многие сервисы Интернет опираются или сильно зависят от точности часов компьютеров. К примеру, веб-сервер может получать запрос на посылку файла, который был недавно модифицирован. В локальной сети необходимо, чтобы часы компьютеров, совместно использующих файлы, были синхронизированы, чтобы время модификации файлов устанавливалось правильно. Такие службы, как man:cron[8], также зависят от правильности установки системных часов, поскольку запускают команды в определенное время.
+
+FreeBSD поставляется с сервером NTP man:ntpd[8], который можно использовать для опроса других серверов NTP для установки часов на вашей машине или предоставления услуг точного времени.
+
+=== Выбор подходящих серверов NTP
+
+Для синхронизации ваших часов вам нужно найти для использования один или большее количество серверов NTP. Ваш сетевой администратор или провайдер могут иметь сервер NTP для этой цели-обратитесь к ним, так ли это в вашем случае. Существует http://support.ntp.org/bin/view/Servers/WebHome[онлайн список общедоступных серверов NTP], которым можно воспользоваться для поиска ближайшего к вам сервера NTP. Не забудьте выяснить политику выбранного вами сервера и спросить разрешения, если это требуется.
+
+Выбор нескольких несвязанных серверов NTP является хорошей идеей в том случае, если один из используемых вами серверов станет недоступным или его часы неточны. man:ntpd[8] использует ответы, которые он получает от других серверов с умом-он делает предпочтение надежным серверам.
+
+=== Настройка вашей машины
+
+==== Базовая конфигурация
+
+Если вам нужно только синхронизировать ваши часы при загрузке машины, вы можете воспользоваться утилитой man:ntpdate[8]. Это может подойти для некоторых настольных машин, которые часто перезагружаются и только требуют изредка синхронизироваться, но на большинстве машин должен работать man:ntpd[8].
+
+Использование man:ntpdate[8] при загрузке также хорошо для машин, на которых запущен даемон man:ntpd[8]. Программа man:ntpd[8] изменяет время постепенно, тогда как man:ntpdate[8] устанавливает время вне зависимости от того, насколько велика разница между текущим временем машины и точным временем.
+
+Для включения man:ntpdate[8] во время загрузки, добавьте строчку `ntpdate_enable="YES"` в файл [.filename]#/etc/rc.conf#. Вам также потребуется указать все серверы, с которыми вы хотите синхронизироваться, и все параметры, которые передаются в man:ntpdate[8], в `ntpdate_flags`.
+
+==== Общие настройки
+
+NTP настраивается в файле [.filename]#/etc/ntp.conf#, формат которого описан в man:ntp.conf[5]. Вот простой пример:
+
+[.programlisting]
+....
+server ntplocal.example.com prefer
+server timeserver.example.org
+server ntp2a.example.net
+
+driftfile /var/db/ntp.drift
+....
+
+Параметр `server` задает, какие серверы будут использоваться, по одному в каждой строке. Если сервер задан с аргументом `prefer`, как `ntplocal.example.com`, то этому серверу отдается предпочтение перед остальными. Ответ от предпочтительного сервера будет отброшен, если он значительно отличается от ответов других серверов, в противном случае он будет использоваться безотносительно к другим ответам. Аргумент `prefer` обычно используется для серверов NTP, о которых известно, что они очень точны, такими, на которых используется специальное оборудование точного времени.
+
+Параметр `driftfile` задает файл, который используется для хранения смещения частоты системных часов. Программа man:ntpd[8] использует его для автоматической компенсации естественного смещения часов, позволяя ему поддерживать достаточно правильную настройку, даже если он на некоторый период отключается от внешнего источника информации о времени.
+
+Параметр `driftfile` задает, какой файл используется для сохранения информации о предыдущих ответах от серверов NTP, которые вы используете. Этот файл содержит внутреннюю информацию для NTP. Он не должен изменяться никакими другими процессами.
+
+==== Управление доступом к вашему серверу
+
+По умолчанию ваш сервер NTP будет доступен всем хостам в Интернет. Параметр `restrict` в файле [.filename]#/etc/ntp.conf# позволяет вам контролировать, какие машины могут обращаться к вашему серверу.
+
+Если вы хотите запретить всем машинам обращаться к вашему серверу NTP, добавьте следующую строку в файл [.filename]#/etc/ntp.conf#:
+
+[.programlisting]
+....
+restrict default ignore
+....
+
+[NOTE]
+====
+Эта строка конфигурации также предотвратит доступ вашего сервера к другим серверам, перечисленным в вашей локальной конфигурации. Если вам необходимо синхронизировать ваш сервер с внешним сервером NTP, вам необходимо будет изменить настройки относительно этого конкретного сервера. За более детальной информацией обратитесь к странице руководства man:ntp.conf[5].
+====
+
+Если вы хотите разрешить синхронизировать свои часы с вашим сервером только машинам в вашей сети, но запретить им настраивать сервер или быть равноправными участниками синхронизации времени, то вместо указанной добавьте строчку
+
+[.programlisting]
+....
+restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
+....
+
+где `192.168.1.0` является адресом IP вашей сети, а `255.255.255.0` её сетевой маской.
+
+[.filename]#/etc/ntp.conf# может содержать несколько директив `restrict`. Для получения подробной информации обратитесь к подразделу `Access Control Support` (Поддержка Управления Доступом) в man:ntp.conf[5].
+
+=== Запуск сервера NTP
+
+Для того, чтобы сервер NTP запускался при загрузке, добавьте строку `ntpd_enable="YES"` в файл [.filename]#/etc/rc.conf#. Если вы хотите передать дополнительные опции в man:ntpd[8], то отредактируйте параметр `ntpd_flags` в файле [.filename]#/etc/rc.conf#.
+
+Для запуска сервера без перезагрузки вашей машины, выполните команду `ntpd`, не забыв задать дополнительные параметры из переменной `ntpd_flags` в файле [.filename]#/etc/rc.conf#. К примеру:
+
+[source,bash]
+....
+# ntpd -p /var/run/ntpd.pid
+....
+
+=== Использование ntpd с временным подключением к Интернет
+
+Для нормальной работы программе man:ntpd[8] не требуется постоянное подключение к Интернет. Однако если ваше временное подключение к Интернет настроено для дозвона по требованию, хорошо бы запретить трафику NTP вызывать дозвон или поддерживать соединение постоянно. Если вы используете пользовательский PPP, то можете воспользоваться директивами `filter` в файле [.filename]#/etc/ppp/ppp.conf#. К примеру:
+
+[.programlisting]
+....
+ set filter dial 0 deny udp src eq 123
+ # Prevent NTP traffic from initiating dial out
+ set filter dial 1 permit 0 0
+ set filter alive 0 deny udp src eq 123
+ # Prevent incoming NTP traffic from keeping the connection open
+ set filter alive 1 deny udp dst eq 123
+ # Prevent outgoing NTP traffic from keeping the connection open
+ set filter alive 2 permit 0/0 0/0
+....
+
+Более подробную информацию можно найти в разделе `PACKET FILTERING` (ФИЛЬТРАЦИЯ ПАКЕТОВ) в man:ppp[8], а примеры в [.filename]#/usr/shared/examples/ppp/#.
+
+[NOTE]
+====
+Некоторые провайдеры Интернет блокируют трафик по портам с маленькими номерами, что приводит к неработоспособности NTP, так как ответы никогда не достигают вашей машины.
+====
+
+=== Дополнительная литература
+
+Документация по серверу NTP может быть найдена в каталоге [.filename]#/usr/shared/doc/ntp/# в формате HTML.
+
+[[network-syslogd]]
+== * Remote Host Logging with `syslogd`
+
+Этот раздел не переведен.
diff --git a/documentation/content/ru/books/handbook/parti.adoc b/documentation/content/ru/books/handbook/parti.adoc
new file mode 100644
index 0000000000..e3f0b633fb
--- /dev/null
+++ b/documentation/content/ru/books/handbook/parti.adoc
@@ -0,0 +1,20 @@
+---
+title: Часть I. В начале
+prev: books/handbook/preface
+next: books/handbook/introduction
+---
+
+[[getting-started]]
+= В начале
+
+Эта часть Руководства Пользователя FreeBSD предназначена для пользователей и администраторов - новичков в FreeBSD. Эти главы:
+
+* Введут вас в FreeBSD.
+* Проведут вас по процессу установки FreeBSD.
+* Обучат вас некоторым основам UNIX(R).
+* Покажут вам как устанавливать программные пакеты не входящие в стандартную поставку FreeBSD.
+* Введут вас в X Window, оконную систему для UNIX(R), и опишут как настроить графическое окружение и сделать вашу работу более продуктивной.
+
+Мы попытались сократить множество ссылок в тексте до минимума для того, чтоб вы могли прочитать этот раздел Руководства с начала до конца с минимумом перелистываний страниц.
+
+include::content/ru/books/handbook/toc-1.adoc[]
diff --git a/documentation/content/ru/books/handbook/partii.adoc b/documentation/content/ru/books/handbook/partii.adoc
new file mode 100644
index 0000000000..12e5e9e1cc
--- /dev/null
+++ b/documentation/content/ru/books/handbook/partii.adoc
@@ -0,0 +1,20 @@
+---
+title: Часть II. Общие задачи
+prev: books/handbook/x11
+next: books/handbook/desktop
+---
+
+[[common-tasks]]
+= Общие задачи
+
+Теперь, когда основы были пройдены, в данной части Руководства FreeBSD будут обсуждаться некоторые часто используемые возможности FreeBSD. В этих главах:
+
+* Введение в популярные и полезные графические приложения: браузеры, бизнес приложения, программы просмотра документов и т.д.
+* Представлены множество мультимедийных программ, доступных в FreeBSD.
+* Описан процесс создания собственного ядра FreeBSD для включения дополнительных функций системы.
+* Система печати разобрана в деталях, как для непосредственно подключенных принтеров, так и для принтеров, подключенных через сеть.
+* Показано, как запускать приложения Linux в системе FreeBSD.
+
+Перед прочтением некоторых из этих глав необходимо ознакомиться с предварительной информацией, что указано в кратком обзоре в начале каждой главы.
+
+include::content/ru/books/handbook/toc-2.adoc[]
diff --git a/documentation/content/ru/books/handbook/partiii.adoc b/documentation/content/ru/books/handbook/partiii.adoc
new file mode 100644
index 0000000000..fb2f658e28
--- /dev/null
+++ b/documentation/content/ru/books/handbook/partiii.adoc
@@ -0,0 +1,14 @@
+---
+title: Часть III. Системное администрирование
+prev: books/handbook/linuxemu
+next: books/handbook/config
+---
+
+[[system-administration]]
+= Системное администрирование
+
+Оставшиеся главы Руководства охватывают все аспекты администрирования FreeBSD системы. Каждая глава начинается с описания того, что вы сможете изучить в результате прочтения этой главы.
+
+Эти главы спланированы так, что вы можете прочитать их когда вам нужно узнать какую-либо информацию. Вам не нужно читать их в определенном порядке, и не нужно прочитать их все перед тем, как начать пользоваться FreeBSD.
+
+include::content/ru/books/handbook/toc-3.adoc[]
diff --git a/documentation/content/ru/books/handbook/partiv.adoc b/documentation/content/ru/books/handbook/partiv.adoc
new file mode 100644
index 0000000000..32323a2268
--- /dev/null
+++ b/documentation/content/ru/books/handbook/partiv.adoc
@@ -0,0 +1,21 @@
+---
+title: Часть IV. Сетевые коммуникации
+prev: books/handbook/cutting-edge
+next: books/handbook/serialcomms
+---
+
+[[network-communication]]
+= Сетевые коммуникации
+
+FreeBSD это одна из наиболее широко используемых в высокопроизводительных сетевых серверах операционных систем. Главы этой части книги охватывают:
+
+* Последовательные соединения
+* PPP и PPP через Ethernet
+* Электронную почту
+* Запуск сетевых серверов
+* Брандмауэры
+* Другую сетевую тематику повышенной сложности
+
+Эти главы предназначены для получения дополнительной информации. Нет необходимости читать их в определенной последовательности, или читать их все перед тем, как начать использовать FreeBSD в сети.
+
+include::content/ru/books/handbook/toc-4.adoc[]
diff --git a/documentation/content/ru/books/handbook/partv.adoc b/documentation/content/ru/books/handbook/partv.adoc
new file mode 100644
index 0000000000..28dbdc2163
--- /dev/null
+++ b/documentation/content/ru/books/handbook/partv.adoc
@@ -0,0 +1,10 @@
+---
+title: Часть V. Приложения
+prev: books/handbook/advanced-networking
+next: books/handbook/mirrors
+---
+
+[[appendices]]
+= Приложения
+
+include::content/ru/books/handbook/toc-5.adoc[]
diff --git a/documentation/content/ru/books/handbook/pgpkeys/_index.adoc b/documentation/content/ru/books/handbook/pgpkeys/_index.adoc
new file mode 100644
index 0000000000..809e8fb031
--- /dev/null
+++ b/documentation/content/ru/books/handbook/pgpkeys/_index.adoc
@@ -0,0 +1,56 @@
+---
+title: Приложение D. PGP ключи
+part: Часть V. Приложения
+prev: books/handbook/eresources
+next: books/handbook/freebsd-glossary
+---
+
+[appendix]
+[[pgpkeys]]
+= PGP ключи
+:doctype: book
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: D
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+:pgpkeys-path:
+
+В случае, если вам нужно проверить подпись или послать зашифрованное электронное письмо одному из офицеров или разработчиков, то для вашего удобства здесь представлено некоторое количество ключей. Полный список ключей пользователей `FreeBSD.org` доступен для скачивания с http://www.FreeBSD.org/doc/pgpkeyring.txt.
+
+[[pgpkeys-officers]]
+== Офицеры
+
+=== {security-officer-name} `<{security-officer-email}>`
+include::{pgpkeys-path}static/pgpkeys/security-officer.key[]
+
+=== {secteam-secretary-name} `<{secteam-secretary-email}>`
+include::{pgpkeys-path}static/pgpkeys/secteam-secretary.key[]
+
+=== {core-secretary-name} `<{core-secretary-email}>`
+include::{pgpkeys-path}static/pgpkeys/core-secretary.key[]
+
+=== {portmgr-secretary-name} `<{portmgr-secretary-email}>`
+include::{pgpkeys-path}static/pgpkeys/portmgr-secretary.key[]
+
+=== `{doceng-secretary-email}`
+include::{pgpkeys-path}static/pgpkeys/doceng-secretary.key[]
+
+:sectnums:
+:sectnumlevels: 6
diff --git a/documentation/content/ru/books/handbook/ports/_index.adoc b/documentation/content/ru/books/handbook/ports/_index.adoc
new file mode 100644
index 0000000000..d74169877b
--- /dev/null
+++ b/documentation/content/ru/books/handbook/ports/_index.adoc
@@ -0,0 +1,1181 @@
+---
+title: "Глава 5. Установка приложений: порты и пакеты"
+part: Часть I. В начале
+prev: books/handbook/basics
+next: books/handbook/x11
+---
+
+[[ports]]
+= Установка приложений: порты и пакеты
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 5
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/ports/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/ports/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/ports/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[ports-synopsis]]
+== Обзор
+
+Вместе с FreeBSD в составе базового комплекта системы поставляется богатый набор системный утилит. Однако для выполнения какой-то реальной работы очень скоро возникает необходимость в установке дополнительных приложений сторонних разработчиков. FreeBSD дает две взаимодополняющих технологии для установки программного обеспечения сторонних разработчиков: Коллекция Портов FreeBSD (для установки из исходных кодов) и пакеты (для установки из откомпилированных двоичных файлов). Любая из этих систем может быть использована для установки приложений с локальных носителей или прямо из сети.
+
+После чтения этой главы вы будете знать:
+
+* Как устанавливать бинарные пакеты с программным обеспечением сторонних разработчиков.
+* Как собирать из исходных кодов программное обеспечение сторонних разработчиков при помощи Коллекции Портов.
+* Как удалять ранее установленные пакеты или порты.
+* Как переопределить значения, используемые по умолчанию в Коллекции Портов.
+* Как найти необходимое программное обеспечение.
+* Как обновить установленные приложения.
+
+[[ports-overview]]
+== Обзор установки программного обеспечения
+
+Стандартная процедура установки программного обеспечения сторонних разработчиков на UNIX(R)-систему выглядит примерно так:
+
+[.procedure]
+====
+. Загрузка программного обеспечения, которое может распространяться в форме исходных текстов или двоичных файлов.
+. Распаковка программного обеспечения из дистрибутивного формата (обычно tar-архива, сжатого при помощи man:compress[1], man:gzip[1] или man:bzip2[1]).
+. Поиск документации в файлах [.filename]#INSTALL#, [.filename]#README# или в каком-то файле из подкаталога [.filename]#doc/# и её чтение в поиске описания установки программного обеспечения.
+. Если программное обеспечение распространялось в форме исходных текстов, его компиляция. Сюда может быть включено редактирования файла [.filename]#Makefile#, запуск скрипта `configure` и другие работы.
+. Тестирование и установка программного обеспечения.
+====
+
+Если вы устанавливаете программный пакет, который не был специально перенесён на FreeBSD, то вам может даже потребоваться редактировать код для того, чтобы он нормально заработал.
+
+FreeBSD предоставляет две технологии, которые выполняют эту работу за вас. На момент написания таким образом доступно более {numports} сторонних приложений.
+
+Каждый пакет содержит уже откомпилированные копии всех команд приложения, а также все конфигурационные файлы и документацию. С файлом пакета можно работать командами управления пакетами FreeBSD, такими как man:pkg_add[1], man:pkg_delete[1], man:pkg_info[1] и так далее.
+
+Каждый порт FreeBSD является набором файлов, предназначенных для автоматизации процесса компиляции приложения из исходного кода. Файлы, из которых состоит порт, содержат всю необходимую информацию для выполнения автоматической загрузки, извлечения, применения патчей, компиляции и установки приложения.
+
+Также система портов может использоваться для генерации пакетов, которые в последствии становятся объектом работы для команд управления пакетами FreeBSD.
+
+Как пакеты, так и порты принимают во внимание _зависимости_. Если при инсталляции приложения при помощи man:pkg_add[1] или Коллекции Портов будет обнаружено, что необходимая библиотека не была установлена, то первым делом будет выполнена установка библиотеки.
+
+Несмотря на то, что обе технологии весьма похожи, и пакеты, и порты имеют свои преимущества. Выберите технологию, которая соответствует вашим требованиям к установке конкретного приложения.
+
+.Преимущества пакетов
+* Сжатый tar-архив пакета обычно меньше, чем сжатый tar-архив, содержащий исходный код приложения.
+* Пакеты не требуют времени на компиляцию. Для больших приложений, таких как Mozilla, KDE или GNOME, это может быть важно, особенно при работе на медленной системе.
+* Пакеты не требуют понимания процесса компиляции программного обеспечения во FreeBSD.
+
+.Преимущества портов
+* Пакеты обычно компилируются с консервативными параметрами, потому что они должны работать на максимальном количестве систем. При установке из порта становится возможным изменение опций компиляции.
+* Некоторые приложения имеют опции времени компиляции, позволяющие определять необходимые функциональные возможности. К примеру, Apache может быть настроен с широким набором различных опций.
++
+В некоторых случаях для одного и того же приложения будут иметься несколько пакетов с разными предварительными настройками. Например, Ghostscript доступен как пакет [.filename]#ghostscript# и как пакет [.filename]#ghostscript-nox11# - в зависимости от того, установлен ли сервер X11. Создание нескольких пакетов одного приложения быстро становится бессмысленным, если приложение имеет более одного-двух параметров компиляции.
+* Условия лицензирования некоторого программного обеспечения запрещают распространение в двоичном виде. Оно должно распространяться в виде исходного кода и компилироваться конечным пользователем.
+* Некоторые пользователи не доверяют дистрибутивам в двоичном виде или предпочитают прочесть исходный код и попытаться найти потенциальные проблемы.
+* Если у вас есть собственные патчи, вам нужен исходный код для того, чтобы их применять.
+
+Чтобы отслеживать обновления портов, подпишитесь на {freebsd-ports} и {freebsd-ports-bugs}.
+
+[WARNING]
+====
+
+Перед установкой любого приложения необходимо зайти на http://vuxml.freebsd.org/[http://vuxml.freebsd.org/], где находится информация по вопросам безопасности приложений, или установить package:ports-mgmt/portaudit[]. После установки наберите `portaudit -F -a` для проверки всех установленных приложений на наличие известных уязвимостей.
+====
+
+В оставшейся части главы будет рассказано, как использовать пакеты и порты для установки и управления программным обеспечением сторонних разработчиков во FreeBSD.
+
+[[ports-finding-applications]]
+== Поиск программного обеспечения
+
+Список имеющихся для FreeBSD приложений постоянно растет. Существует несколько способов найти то, что нужно:
+
+* На сайте FreeBSD по адресу link:https://www.FreeBSD.org/ports/[http://www.FreeBSD.org/ports/] поддерживается обновляемый список всех имеющихся приложений для FreeBSD, в котором можно выполнять поиск. Поиск порта можно выполнить либо по имени приложения, либо по названию категории.
+* Dan Langille поддерживает сайт http://www.FreshPorts.org/[FreshPorts], на котором есть удобный поиск, а также на нём отслеживаются изменения в приложениях из Коллекции Портов. Зарегистрированным пользователям доступна возможность создавать собственные списки наблюдаемых портов и автоматически получать оповещения об их обновлениях по электронной почте.
+* Если вы не знаете названия нужного вам приложения, попытайтесь воспользоваться сайтом типа Freecode (http://www.freecode.com/[http://www.freecode.com/]) для поиска приложения, а затем возвратитесь на сайт FreeBSD, чтобы проверить, есть ли порт для этого приложения.
+* Если вам необходимо определить, в какой категории находится порт, наберите `whereis _file_`, где _file_ - программа, которую вы хотите установить:
++
+[source,bash]
+....
+# whereis lsof
+lsof: /usr/ports/sysutils/lsof
+....
++
+Как вариант, можно воспользоваться man:echo[1]:
++
+[source,bash]
+....
+# echo /usr/ports/*/*lsof*
+/usr/ports/sysutils/lsof
+....
++
+Учтите, что в выводе также будут присутствовать совпадающие с шаблоном имена файлов, сохраненные в [.filename]#/usr/ports/distfiles#.
+* Ещё одним способом поиска программного обеспечения является использование встроенной возможности поиска в Коллекции Портов. Чтобы ею воспользоваться, зайдите в [.filename]#/usr/ports# и выполните команду `make search name=_program-name_`, где _program-name_ - это название программы, которую вы хотите найти. Например, если вы ищете `lsof`:
++
+[source,bash]
+....
+# cd /usr/ports
+# make search name=lsof
+Port: lsof-4.56.4
+Path: /usr/ports/sysutils/lsof
+Info: Lists information about open files (similar to fstat(1))
+Maint: obrien@FreeBSD.org
+Index: sysutils
+B-deps:
+R-deps:
+....
++
+[TIP]
+====
+
+Команда `make search` выполняет поиск в файле с индексной информацией. Если получено сообщение, что требуется файл [.filename]#INDEX#, запустите `make fetchindex` для загрузки актуального индексного файла. После загрузки файла [.filename]#INDEX# команда `make search` сможет выполнить запрошенный поиск.
+====
++
+Строка "Path:" указывает, где находится порт.
++
+Чтобы получить лаконичный вывод, задайте цель `quicksearch`:
++
+[source,bash]
+....
+# cd /usr/ports
+# make quicksearch name=lsof
+Port: lsof-4.87.a,7
+Path: /usr/ports/sysutils/lsof
+Info: Lists information about open files (similar to fstat(1))
+....
++
+Для выполнения более глубокого поиска используйте `make search key=_string_` или `make quicksearch key=_string_`, где _string_ представляет собой некоторый текст, относящийся к искомому порту. Текст ищется в комментариях, описаниях или зависимостях. Этот способ можно использовать для поиска портов, связанных с некоторой темой, когда название программы неизвестно.
++
+В обоих случаях (`search` и `quicksearch`) строка поиска нечувствительна к регистру. Поиск "LSOF" приводит к тому же самому результату, что и поиск "lsof".
+
+[[packages-using]]
+== Использование бинарных пакетов
+
+Во FreeBSD есть несколько утилит для управления пакетами:
+
+* Для установки, удаления и получения перечня установленных пакетов на работающей системе может быть запущена утилита `sysinstall`. Обратитесь к crossref:install[packages,Установка пакетов (Install Packages)] за более детальной информацией.
+* Утилиты командной строки для управления пакетами, которые являются темой данного раздела.
+
+=== Установка пакета
+
+Для установки бинарного пакета FreeBSD из локального файла или с сервера в сети используйте man:pkg_add[1].
+
+.Загрузка пакета вручную и его локальная установка
+[example]
+====
+
+[source,bash]
+....
+# ftp -a ftp2.FreeBSD.org
+Connected to ftp2.FreeBSD.org.
+220 ftp2.FreeBSD.org FTP server (Version 6.00LS) ready.
+331 Guest login ok, send your email address as password.
+230-
+230- This machine is in Vienna, VA, USA, hosted by Verio.
+230- Questions? E-mail freebsd@vienna.verio.net.
+230-
+230-
+230 Guest login ok, access restrictions apply.
+Remote system type is UNIX.
+Using binary mode to transfer files.
+ftp> cd /pub/FreeBSD/ports/packages/sysutils/
+250 CWD command successful.
+ftp> get lsof-4.56.4.tgz
+local: lsof-4.56.4.tgz remote: lsof-4.56.4.tgz
+200 PORT command successful.
+150 Opening BINARY mode data connection for 'lsof-4.56.4.tgz' (92375 bytes).
+100% |**************************************************| 92375 00:00 ETA
+226 Transfer complete.
+92375 bytes received in 5.60 seconds (16.11 KB/s)
+ftp> exit
+# pkg_add lsof-4.56.4.tgz
+....
+
+====
+
+Если у вас нет источника пакетов, например, такого как набор CD-ROM дисков с FreeBSD, то добавьте опцию `-r` для man:pkg_add[1]. Утилита автоматически определит правильный формат объектных файлов и релиз, а затем загрузит и установит пакет с сервера FTP без какого-либо дополнительного взаимодействия с пользователем.
+
+[source,bash]
+....
+# pkg_add -r lsof
+....
+
+Чтобы задействовать альтернативное зеркало пакетов FreeBSD, укажите его адрес в переменной окружения `PACKAGESITE`. Для загрузки файлов утилита man:pkg_add[1] использует man:fetch[3]. Последняя учитывает значения различных переменных окружения, включая `FTP_PASSIVE_MODE`, `FTP_PROXY` и `FTP_PASSWORD`. Если вы находитесь за сетевым экраном, или для работы с FTP/HTTP вам необходимо использовать прокси, то определите соответствующие переменные. Обратитесь к справочной странице по man:fetch[3] для получения полного списка переменных. Заметьте, что в примере выше вместо `lsof-4.56.4` используется `lsof`. В случае загрузки из сети номер версии в имени пакета должен быть опущен.
+
+[NOTE]
+====
+Если вы используете FreeBSD-CURRENT или FreeBSD-STABLE, то утилита man:pkg_add[1] загрузит последнюю версию устанавливаемой программы. Если же вы используете версию -RELEASE, то man:pkg_add[1] установит версию пакета, который был собран для конкретного релиза. Это поведение возможно изменить переопределив значение `PACKAGESITE`. Например, в системе FreeBSD 8.1-RELEASE man:pkg_add[1] по умолчанию попытается скачать пакеты с `ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-8.1-release/Latest/`. Чтобы обязать man:pkg_add[1] загружать пакеты для FreeBSD 8-STABLE, присвойте `PACKAGESITE` значение `ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-8-stable/Latest/`.
+====
+
+Файлы пакетов распространяются в форматах [.filename]#.tgz# и [.filename]#.tbz#. Пакеты находятся по адресу link:ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/packages[ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/packages] или в каталоге [.filename]#/packages# дистрибутива FreeBSD на DVD. Структура каталогов с пакетами подобна тому, как организовано дерево [.filename]#/usr/ports#. Каждая категория имеет собственный каталог, и каждый пакет помещается в каталог [.filename]#All#.
+
+=== Управление пакетами
+
+Для вывода перечня установленных пакетов и их описаний может быть задействована man:pkg_info[1].
+
+[source,bash]
+....
+# pkg_info
+colordiff-1.0.13 A tool to colorize diff output
+docbook-1.2 Meta-port for the different versions of the DocBook DTD
+...
+....
+
+Утилита man:pkg_version[1] выводит отчёт о версиях всех установленных пакетов и сравнивает их версии с текущими версиями соответствующих приложений, доступных из локального дерева портов.
+
+[source,bash]
+....
+# pkg_version
+colordiff =
+docbook =
+...
+....
+
+Символы во второй колонке указывают сравнительную разницу в возрасте установленной версии и версии, находящейся в локальном дереве портов.
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Символ
+| Значение
+
+|=
+|Версия установленного пакета соответствует версии, находящейся в локальном дереве портов.
+
+|<
+|Версия установленного пакета старее, чем та, что имеется в локальном дереве портов.
+
+|>
+|Версия установленного пакета новее чем та, что есть в дереве портов. Скорее всего, локальное дерево портов устарело.
+
+|?
+|В индексном файле портов установленный пакет не найден. Это может случиться если установленный порт был переименован или удалён из Коллекции Портов.
+
+|*
+|Имеется несколько версий пакета.
+
+|!
+|Установленный пакет есть в индексном файле, но по какой-то причине утилите `pkg_version` не удалось сравнить номер версии установленного пакета и соответствующей записи в файле.
+|===
+
+=== Удаление пакета
+
+Для удаления ранее установленных пакетов с программным обеспечением используйте утилиту man:pkg_delete[1].
+
+[source,bash]
+....
+# pkg_delete xchat-1.7.1
+....
+
+Следует отметить, что для man:pkg_delete[1] требуется полное имя пакета и номер версии; вышеприведенная команда не сработала бы, если б ей было указано _xchat_ вместо _xchat-1.7.1_. Для нахождения версии установленного пакета задействуйте утилиту man:pkg_version[1]. Или же, напечатайте групповой символ (wildcard) вместо номера версии:
+
+[source,bash]
+....
+# pkg_delete xchat\*
+....
+
+в этом случае будут удалены все пакеты, имена которых начинаются на `xchat`.
+
+=== Разное
+
+Вся информация о пакетах, включая перечни файлов и описания каждого установленного пакета, хранится в каталоге [.filename]#/var/db/pkg#.
+
+[[pkgng-intro]]
+== Использование pkgng для управления бинарными пакетами
+
+pkgng - это усовершенствованный инструмент, пришедший на смену традиционным утилитам управления пакетами FreeBSD. Он обладает множеством функциональных возможностей, ускоряющих и облегчающих работу с бинарными пакетами. Первый релиз pkgng состоялся в августе 2012 года.
+
+pkgng не является заменой для утилит управления портами, таких как package:ports-mgmt/portmaster[] или package:ports-mgmt/portupgrade[]. В то время, как package:ports-mgmt/portmaster[] и package:ports-mgmt/portupgrade[] позволяют устанавливать приложения сторонних разработчиков как из бинарных пакетов, так и из Коллекции Портов, утилита pkgng дает возможность устанавливать приложения исключительно из бинарных пакетов.
+
+[[pkgng-initial-setup]]
+=== Начало работы с pkgng
+
+Во FreeBSD 9.1 и более поздние включена программа "самонастройки" ("bootstrap") pkgng. Она скачивает и устанавливает основную утилиту pkgng.
+
+Для запуска самонастройки, выполните:
+
+[source,bash]
+....
+# /usr/sbin/pkg
+....
+
+Для более ранних версий FreeBSD утилиту pkgng необходимо установить из Коллекции Портов или из бинарных пакетов.
+
+Для установки pkgng из порта, запустите следующее:
+
+[source,bash]
+....
+# cd /usr/ports/ports-mgmt/pkg
+# make
+# make install clean
+....
+
+Для установки из бинарного пакета, выполните:
+
+[source,bash]
+....
+# pkg_add -r pkg
+....
+
+Действующие инсталляции FreeBSD требуют преобразования базы данных установленных пакетов утилиты pkg_install к новому формату. Для выполнения конвертирования, запустите:
+
+[source,bash]
+....
+# pkg2ng
+....
+
+Вышеприведенный шаг не требуется для новых инсталляций, в которых не было установлено программ сторонних разработчиков.
+
+[IMPORTANT]
+====
+Этот шаг необратим. После перевода базы данных установленных пакетов к формату pkgng утилитами pkg_install более пользоваться не следует.
+====
+
+[NOTE]
+====
+В процессе конвертирования базы данных установленных пакетов могут возникать сообщения об ошибках. На данном этапе их можно игнорировать, так как перечень программ сторонних разработчиков, информация о которых не была преобразована, будет перечислен по завершении работы `pkg2ng`. Над этим перечнем придется поработать вручную.
+====
+
+Чтобы убедиться, что Коллекция Портов FreeBSD регистрирует новые программы при помощи pkgng, а не pkg_install, для версий FreeBSD, предшествующих 10._X_, в файл [.filename]#/etc/make.conf# необходимо внести следующую запись:
+
+[.programlisting]
+....
+WITH_PKGNG= yes
+....
+
+[[pkgng-pkg-conf]]
+=== Настройка окружения pkgng
+
+Система управления пакетами pkgng при выполнении большинства операций обращается к пакетному репозиторию. Адрес используемого по умолчанию репозитория указан в [.filename]#/usr/local/etc/pkg.conf# или в переменной окружения `PACKAGESITE`. Последняя переопределяет адрес, указанный в конфигурационном файле.
+
+Дополнительные опции конфигурации pkgng описаны в pkg.conf(5).
+
+[[pkgng-basic-usage]]
+=== Основные операции pkgng
+
+Информацию по работе с pkgng можно найти на странице справочника pkg(8), или в выводе утилиты `pkg`, запущенной без аргументов.
+
+Каждый аргумент команды pkgng описан на соответствующей странице справочника. Например, чтобы ознакомиться со страницей справочника для `pkg install`, запустите любую из двух нижеследующих команд:
+
+[source,bash]
+....
+# pkg help install
+....
+
+[source,bash]
+....
+# man pkg-install
+....
+
+[[pkgng-pkg-info]]
+==== Получение информации об установленных пакетах при помощи pkgng
+
+Информация об установленных в системе пакетах может быть отображена при помощи команды `pkg info`. Подобно до man:pkg_info[1], в выводе перечисляются версии и описания всех установленных пакетов.
+
+Если необходима информация о конкретном пакете, выполните:
+
+[source,bash]
+....
+# pkg info packagename
+....
+
+Например, для получения версии pkgng, который установлен в системе, запустите:
+
+[source,bash]
+....
+# pkg info pkg
+pkg-1.0.2 New generation package manager
+....
+
+[[pkgng-installing-deinstalling]]
+==== Установка и удаление пакетов при помощи pkgng
+
+В общем, бинарные пакеты устанавливаются при помощи:
+
+[source,bash]
+....
+# pkg install packagename
+....
+
+Команда `pkg install` обращается к пакетному репозиторию, это упоминалось в <<pkgng-pkg-conf>>. Команда pkg-add(8), напротив, не выполняет обращений к пакетному репозиторию, а также игнорирует переменную `PACKAGESITE`. Как следствие - зависимости не отслеживаются, и необходимые зависимые компоненты не скачиваются с удаленного источника. В этом разделе описана работа с `pkg install`. За подробностями работы с `pkg add` обратитесь к справочной странице по pkg-add(8).
+
+Утилита `pkg install` может устанавливать дополнительные бинарные пакеты. Например, для установки curl, выполните:
+
+[source,bash]
+....
+# pkg install curl
+Updating repository catalogue
+Repository catalogue is up-to-date, no need to fetch fresh copy
+The following packages will be installed:
+
+ Installing ca_root_nss: 3.13.5
+ Installing curl: 7.24.0
+
+The installation will require 4 MB more space
+
+1 MB to be downloaded
+
+Proceed with installing packages [y/N]: y
+ca_root_nss-3.13.5.txz 100% 255KB 255.1KB/s 255.1KB/s 00:00
+curl-7.24.0.txz 100% 1108KB 1.1MB/s 1.1MB/s 00:00
+Checking integrity... done
+Installing ca_root_nss-3.13.5... done
+Installing curl-7.24.0... done
+....
+
+Новый пакет, как и любые дополнительные пакеты, которые были установлены как зависимости, перечисляются в списке установленных пакетов:
+
+[source,bash]
+....
+# pkg info
+ca_root_nss-3.13.5 The root certificate bundle from the Mozilla Project
+curl-7.24.0 Non-interactive tool to get files from FTP, GOPHER, HTTP(S) servers
+pkg-1.0.2 New generation package manager
+....
+
+Пакеты, в которых более нет необходимости, могут быть удалены при помощи `pkg delete`. Например, если выяснится, что curl не нужен:
+
+[source,bash]
+....
+# pkg delete curl
+The following packages will be deleted:
+
+ curl-7.24.0_1
+
+The deletion will free 3 MB
+
+Proceed with deleting packages [y/N]: y
+Deleting curl-7.24.0_1... done
+....
+
+[[pkgng-upgrading]]
+==== Обновление установленных пакетов при помощи pkgng
+
+Пакеты, версии которых устарели, можно найти при помощи команды `pkg version`. Версии установленных пакетов сравниваются с версиями приложений из локального дерева портов, а в случае отсутствия портов pkg-version(8) обращается к удаленному репозиторию пакетов.
+
+При помощи pkgng можно обновлять пакеты до новых версий. Предположим, вышла новая версия curl. Установленный пакет можно обновить к новой версии, выполнив:
+
+[source,bash]
+....
+# pkg upgrade
+Updating repository catalogue
+repo.txz 100% 297KB 296.5KB/s 296.5KB/s 00:00
+The following packages will be upgraded:
+
+ Upgrading curl: 7.24.0 -> 7.24.0_1
+
+1 MB to be downloaded
+
+Proceed with upgrading packages [y/N]: y
+curl-7.24.0_1.txz 100% 1108KB 1.1MB/s 1.1MB/s 00:00
+Checking integrity... done
+Upgrading curl from 7.24.0 to 7.24.0_1... done
+....
+
+[[pkgng-auditing]]
+==== Аудит безопасности пакетов при помощи pkgng
+
+Изредка в приложениях из Коллекции Портов обнаруживаются уязвимости. В pkgng встроена возможность выполнять аудит безопасности, действующая подобно приложению из package:ports-mgmt/portaudit[]. Для выполнения аудита установленных в систему программ, выполните:
+
+[source,bash]
+....
+# pkg audit -F
+....
+
+[[pkgng-advanced-usage]]
+=== Сложные вопросы работы с pkgng
+
+[[pkgng-autoremove]]
+==== Автоматическое удаление неиспользуемых зависимостей при помощи pkgng
+
+После удаления пакета в системе могут остаться неиспользуемые зависимости, наподобие package:security/ca_root_nss[] из примера выше. Такие пакеты остаются установленными, несмотря на то, что они более не требуются другим пакетам. Определить и удалить неиспользуемые пакеты, которые были установлены как зависимости, можно при помощи:
+
+[source,bash]
+....
+# pkg autoremove
+Packages to be autoremoved:
+ ca_root_nss-3.13.5
+
+The autoremoval will free 723 kB
+
+Proceed with autoremoval of packages [y/N]: y
+Deinstalling ca_root_nss-3.13.5... done
+....
+
+[[pkgng-backup]]
+==== Резервное копирование базы данных установленных пакетов pkgng
+
+В отличие от традиционной системы управления пакетами, pkgng располагает своим собственным механизмом резервного копирования базы данных. Для ручного создания резервной копии базы данных установленных пакетов, выполните:
+
+[source,bash]
+....
+# pkg backup -d pkgng.db
+....
+
+[NOTE]
+====
+Замените имя файла _pkgng.db_ на более подходящее.
+====
+
+В дополнение, pkgng содержит скрипт man:periodic[8], позволяющий выполнять ежедневное автоматическое копирование базы данных установленных пакетов. Для активации данной возможности задайте переменной `daily_backup_pkgng_enable` значение `YES` в файле man:periodic.conf[5].
+
+[TIP]
+====
+
+Для предотвращения периодического запуска аналогичного скрипта системы pkg_install, также выполняющего резервное копирование базы данных установленных пакетов, задайте переменной `daily_backup_pkgdb_enable` значение `NO` в файле man:periodic.conf[5].
+====
+
+Для восстановления содержимого базы данных установленных пакетов из резервной копии, выполните:
+
+[source,bash]
+....
+# pkg backup -r /path/to/pkgng.db
+....
+
+[[pkgng-clean]]
+==== Удаление копий устаревших пакетов в системе pkgng
+
+По умолчанию, pkgng сохраняет копии установленных бинарных пакетов в каталог, указанный переменной `PKG_CACHEDIR` в pkg.conf(5). При обновлении пакетов командой `pkg upgrade` старые версии обновленных пакетов автоматически не удаляются.
+
+Для удаления устаревших версий бинарных пакетов из кеш-каталога, выполните:
+
+[source,bash]
+....
+# pkg clean
+....
+
+[[pkgng-set]]
+==== Изменение метаданных пакетов pkgng
+
+Со временем программы из Коллекции Портов могут претерпевать изменения старшего (major) номера версии. В отличие от pkg_install, pkgng располагает встроенной командой для обновления информации о происхождении (origin) пакета. Например, изначально порт package:lang/php5[] был версии `5.3`. Позже этот порт был переименован в package:lang/php53[], а под именем package:lang/php5[] был создан порт версии `5.4`. Утилитам системы pkg_install для обновления информации о происхождении (origin) пакета в собственной базе данных установленных пакетов потребовалась бы помощь дополнительного программного обеспечения, такого как package:ports-mgmt/portmaster[].
+
+В отличие от package:ports-mgmt/portmaster[] и package:ports-mgmt/portupgrade[] для портов, порядок перечисления новой и старой версий отличаются. Для pkgng необходим следующий порядок:
+
+[source,bash]
+....
+# pkg set -o category/oldport:category/newport
+....
+
+Например, в вышеприведенном случае для замены информации о происхождении пакета, выполните:
+
+[source,bash]
+....
+# pkg set -o lang/php5:lang/php53
+....
+
+Еще один пример: для изменения информации о происхождении пакета с package:lang/ruby18[] на package:lang/ruby19[], выполните:
+
+[source,bash]
+....
+# pkg set -o lang/ruby18:lang/ruby19
+....
+
+И последний пример: для замены информации о происхождении пакета разделяемой библиотеки [.filename]#libglut# с package:graphics/libglut[] на package:graphics/freeglut[], запустите:
+
+[source,bash]
+....
+# pkg set -o graphics/libglut:graphics/freeglut
+....
+
+[NOTE]
+====
+Выполняя замену информации о происхождении пакетов, в большинстве случаев также требуется переустановить пакеты, которые зависят от изменившегося пакета. Для принудительной переустановки зависящих пакетов, выполните:
+
+[source,bash]
+....
+# pkg install -Rf graphics/freeglut
+....
+
+====
+
+[[ports-using]]
+== Использование Коллекции Портов
+
+В этом разделе даны базовые сведения по использованию Коллекции Портов для установки или удаления программ. Детальное описание существующих целей `make` и переменных окружения находится в man:ports[7].
+
+[WARNING]
+====
+
+В июле 2012 года проект Портов FreeBSD сменил систему контроля версий: на смену CVS пришел Subversion. Рекомендуемым способом работы с деревом портов является Portsnap. Пользователи, которым требуется локальная подгонка портов (то есть, поддержание дополнительных локальных патчей), возможно предпочтут непосредственное использование Subversion. 28 февраля 2013 года сервис CVSup был выведен из эксплуатации, и дальнейшее использование последнего не рекомендуется.
+====
+
+[[ports-tree]]
+=== Получение Коллекции Портов
+
+Коллекция Портов - это набор файлов, состоящий из [.filename]#Makefile#, патчей и файлов описаний, хранимых в [.filename]#/usr/ports#. Этот набор файлов предназначен для построения и установки приложений во FreeBSD. В нижеследующих разделах описано несколько способов получения Коллекции Портов на тот случай, если Коллекция не была установлена во время инсталляции FreeBSD.
+
+[.procedure]
+====
+*Procedure: Метод Portsnap*
+
+Portsnap это быстрый и удобный инструмент для получения Коллекции Портов, и в то же время - предпочитаемый выбор большинства пользователей.
+
+. Скачайте сжатый снэпшот Коллекции Портов в [.filename]#/var/db/portsnap#.
++
+[source,bash]
+....
+# portsnap fetch
+....
++
+. Если вы запускаете Portsnap впервые, извлеките снэпшот в [.filename]#/usr/ports#:
++
+[source,bash]
+....
+# portsnap extract
+....
++
+. По завершении первого запуска Portsnap, как было показано выше, [.filename]#/usr/ports# может быть обновлен при помощи:
++
+[source,bash]
+....
+# portsnap fetch
+# portsnap update
+....
+====
+
+[.procedure]
+====
+*Procedure: Метод Subversion*
+
+Если необходим контроль за деревом портов (например, для поддержания локальных изменений), то для получения Коллекции Портов может быть задействован Subversion. Обратитесь к link:{committers-guide}#subversion-primer/[Subversion Primer] за детальным описанием Subversion.
+
+. Для создания рабочей копии дерева портов необходимо иметь установленный Subversion. Если порты есть в наличии, то установите Subversion выполнив следующее:
++
+[source,bash]
+....
+# cd /usr/ports/devel/subversion
+# make install clean
+....
++
+Если портов нет, то Subversion может быть установлен при помощи системы пакетов:
++
+[source,bash]
+....
+# pkg_add -r subversion
+....
++
+Если же для управления пакетами используется pkgng, то Subversion устанавливается при помощи следующей команды:
++
+[source,bash]
+....
+# pkg install subversion
+....
++
+. Создайте рабочую копию дерева портов. Для ускорения процесса вместо _svn0.us-east.FreeBSD.org_ укажите ближайшее к вам crossref:mirrors[svn-mirrors,зеркало Subversion]. Коммиттерам необходимо сначала прочитать link:{committers-guide}#subversion-primer/[Subversion Primer], чтобы удостовериться, что выбран корректный протокол.
++
+[source,bash]
+....
+# svn checkout https://svn0.us-east.FreeBSD.org/ports/head /usr/ports
+....
++
+. При наличии рабочей копии [.filename]#/usr/ports# все последующие обновления выполняются просто:
++
+[source,bash]
+....
+# svn update /usr/ports
+....
+====
+
+[.procedure]
+====
+*Procedure: Метод с использованием Sysinstall*
+
+Этот метод подразумевает использование sysinstall для установки Коллекции Портов из установочного носителя. Учтите, что в итоге будет установлена старая копия Коллекции Портов, которая была актуальна на момент создания релиза. Если у вас есть подключение к Интернет, то вам необходимо пользоваться одним из вышеупомянутых методов.
+
+. Работая как пользователь `root`, запустите `sysinstall` так, как это показано ниже:
++
+[source,bash]
+....
+# sysinstall
+....
++
+. Опуститесь вниз и выберите [.guimenuitem]#Configure#, нажмите kbd:[Enter]
+. Опуститесь вниз и выберите [.guimenuitem]#Distributions#, затем нажмите kbd:[Enter]
+. Опуститесь вниз к пункту [.guimenuitem]#ports#, нажмите клавишу kbd:[Пробел]
+. Поднимитесь вверх к [.guimenuitem]#Exit#, нажмите kbd:[Enter]
+. Выберите желаемый носитель для установки, например, CDROM, FTP и так далее.
+. Перейдите на пункт меню [.guimenuitem]#Exit# и нажмите kbd:[Enter].
+. Нажмите kbd:[X] для выхода из sysinstall.
+====
+
+[[cvsup-migration]]
+=== Миграция с CVSup/csup на portsnap
+
+[WARNING]
+====
+
+Начиная с 28 февраля 2013 года дерево портов более не экспортируется в CVS, поэтому CVSup и csup не будут доставлять обновления для дерева портов.
+====
+
+[.procedure]
+====
+*Procedure: Миграция на Portsnap*
+
+Для миграции потребуется около 1 ГБ дискового пространства в [.filename]#/usr#, в добавок, для Portsnap необходимо около 150 МБ дискового пространства в [.filename]#/var#.
+
+. Если у вас настроено автоматическое обновление портов, например при помощи задания man:cron[8], запускающего CVSup или csup, то его необходимо будет отключить.
+. Переместите существующее дерево портов во временный каталог:
++
+[source,bash]
+....
+# mv /usr/ports /usr/ports.old
+....
++
+. При помощи Portsnap скачайте новое дерево портов и извлеките его в [.filename]#/usr/ports#:
++
+[source,bash]
+....
+# portsnap fetch extract
+....
++
+. Переместите дистрибутивные файлы (distfiles) и сохраненные пакеты в новое дерево портов:
++
+[source,bash]
+....
+# mv /usr/ports.old/distfiles /usr/ports
+# mv /usr/ports.old/packages /usr/ports
+....
++
+. Удалите старое дерево портов:
++
+[source,bash]
+....
+# rm -rf /usr/ports.old
+....
++
+. Если ранее использовался CVSup, то сейчас его можно удалить:
++
+[source,bash]
+....
+# pkg_delete -r -v cvsup-without-gui-\*
+....
++
+Пользователям pkgng необходимо запустить следующую команду:
++
+[source,bash]
+....
+# pkg delete cvsup-without-gui
+....
+====
+
+[[ports-skeleton]]
+=== Установка портов
+
+Скелетом порта является набор файлов, который указывает вашей системе FreeBSD, как откомпилировать и установить программу. Скелет каждого порта включает:
+
+* [.filename]#Makefile#: этот файл содержит различные директивы, которые определяют, как приложение должно быть откомпилировано и куда в вашей системе оно должно быть установлено.
+* [.filename]#distinfo#: этот файл содержит информацию о файлах, которые должны быть загружены для сборки порта, а также их контрольные суммы (man:sha256[1]) для проверки того, что файлы не были повреждены в процессе загрузки.
+* [.filename]#files#: этот каталог содержит патчи, необходимые для компиляции и установки программы в вашей системе FreeBSD. Этот каталог также может содержать другие файлы, используемые для построения порта.
+* [.filename]#pkg-descr#: этот файл содержит более подробное описание программы.
+* [.filename]#pkg-plist#: это список всех файлов, которые будут установлены портом. В нем также содержатся указания системе портов на удаление определенных файлов во время удаления порта.
+
+В некоторых портах присутствуют и другие файлы, такие, как [.filename]#pkg-message#. Система портов использует эти файлы для обработки особых ситуаций. Если вы хотите узнать более подробно об этих файлах и о портах вообще, то обратитесь к link:{porters-handbook}[Руководству по созданию портов для FreeBSD].
+
+Порт не содержит собственно исходного кода, также известного как "дистрибутивный файл" (distfile). Способ распространения исходного кода определяется предпочтениями автора программы. Ниже описаны два способа установки порта FreeBSD.
+
+[NOTE]
+====
+Для установки портов вы должны войти в систему как пользователь `root`.
+====
+
+[WARNING]
+====
+
+Перед установкой любого порта необходимо убедиться в наличии свежей Коллекции Портов и заглянуть на http://vuxml.freebsd.org/[http://vuxml.freebsd.org/], где могут освещаться вопросы безопасности, связанные с конкретным портом. Если у вас установлен package:ports-mgmt/portaudit[], то перед установкой нового порта запустите `portaudit -F` для загрузки свежей базы данных уязвимостей. Проверка безопасности и обновление базы данных будут выполняться при ежедневной проверке безопасности системы. За дальнейшей информацией обратитесь к страницам справочника man:portaudit[1] и man:periodic[8].
+====
+
+Использование Коллекции Портов предполагает наличие работающего подключения к Интернет. В противном случае вам придется раздобыть и поместить копию дистрибутивного файла в каталог [.filename]#/usr/ports/distfiles# вручную.
+
+Первым делом переместитесь в каталог устанавливаемого порта:
+
+[source,bash]
+....
+# cd /usr/ports/sysutils/lsof
+....
+
+Для компиляции (или построения - "build") порта наберите команду `make`. Вы должны увидеть вывод команды, подобный следующему:
+
+[source,bash]
+....
+# make
+>> lsof_4.57D.freebsd.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
+>> Attempting to fetch from ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/.
+===> Extracting for lsof-4.57
+...
+[вывод команды при распаковке опущен]
+...
+>> Checksum OK for lsof_4.57D.freebsd.tar.gz.
+===> Patching for lsof-4.57
+===> Applying FreeBSD patches for lsof-4.57
+===> Configuring for lsof-4.57
+...
+[вывод команды при конфигурации опущен]
+...
+===> Building for lsof-4.57
+...
+[вывод команды при компиляции опущен]
+...
+#
+....
+
+По завершении компиляции вы снова вернетесь к приглашению командного процессора. Следующим шагом является установка порта при помощи `make install`:
+
+[source,bash]
+....
+# make install
+===> Installing for lsof-4.57
+...
+[вывод команды при установке опущен]
+...
+===> Generating temporary packing list
+===> Compressing manual pages for lsof-4.57
+===> Registering installation for lsof-4.57
+===> SECURITY NOTE:
+ This port has installed the following binaries which execute with
+ increased privileges.
+#
+....
+
+На этом этапе, получив приглашение оболочки, вы уже можете запустить установленное приложение. Так как `lsof` является программой, которая запускается с повышенными правами, выдаётся предупреждение о безопасности. Во время построения и установки портов следует обращать внимание на любые возникающие предупреждения.
+
+Хорошей идеей является удаление рабочего подкаталога, содержащего временные файлы, использовавшиеся во время компиляции. Такое действие помогает беречь дисковое пространство и минимизирует вероятность возникновения проблем в дальнейшем, при обновлении до более новой версии порта.
+
+[source,bash]
+....
+# make clean
+===> Cleaning for lsof-4.57
+#
+....
+
+[NOTE]
+====
+Вы можете сэкономить два лишних шага, просто выдав команду `make install clean` вместо `make`, `make install` и последующей `make clean` в трех отдельных шагах.
+====
+
+[NOTE]
+====
+Установка порта единственной командой `make install` чревата возможными частыми остановками процесса инсталляции из-за ожидания вмешательства пользователя: некоторым портам требуется ввод опций. Чтобы избежать траты времени, особенно для портов с многими зависимостями, запустите сначала `make config-recursive` чтобы выполнить конфигурирование всех опций за один заход. Далее, запустите `make install [clean]`.
+====
+
+[TIP]
+====
+
+Когда используется `config-recursive`, перечень подлежащих настройке портов собирается целью `all-depends-list` команды man:make[1]. Часто рекомендуется повторять запуск `make config-recursive` до тех пор, пока не будут определены все опции зависимых портов, а меню man:dialog[1] выбора опций портов появляться перестанут. При этом можно быть уверенным, что все опции были настроены как и намеревалось.
+====
+
+[NOTE]
+====
+Некоторые командные процессоры для ускорения поиска исполняемых файлов и команд кэшируют имена программ, доступных для вызова из каталогов, перечисленных в переменной окружения `PATH`. Если вы используете `tcsh`, то вам может потребоваться набрать `rehash`, после чего свежеустановленную программу можно будет вызывать без указания полного пути. Для командного интерпретатора `sh` выполните `hash -r`. Дополнительную информацию можно найти в документации к вашему командному процессору.
+====
+
+В некоторых имеющихся в продаже комплектах DVD от третьих лиц, таких как the FreeBSD Toolkit от http://www.freebsdmall.com/[FreeBSD Mall], содержатся дистрибутивные файлы (distfiles). Их можно использовать с Коллекцией Портов. Смонтируйте DVD в [.filename]#/cdrom#. Если вы используете иную точку монтирования, укажите её в переменной man:make[1] `CD_MOUNTPTS`. Если необходимые для построения порта дистрибутивные файлы находятся на диске, то они будут задействованы автоматически.
+
+[NOTE]
+====
+Лицензии некоторых портов не позволяют помещать их на DVD. Причиной тому может служить обязательность заполнения регистрационной формы перед загрузкой, или запрет на дальнейшее распространение. Если вы хотите установить порт, которого нет на DVD, вам нужно иметь подключение к Интернет.
+====
+
+Для загрузки файлов система портов использует утилиту man:fetch[1], которая проверяет значения некоторых переменных окружения, включая `FTP_PASSIVE_MODE`, `FTP_PROXY` и `FTP_PASSWORD`. Если вы находитесь за сетевым экраном или для работы с FTP/HTTP вам необходимо использовать прокси, то определите соответствующие переменные. Обратитесь к справочной странице по man:fetch[3] для получения полного списка переменных.
+
+Пользователям, которые не могут быть постоянно подключены к сети, поможет команда `make fetch`. Запустите эту команду в каталоге [.filename]#/usr/ports#, и требуемые файлы будут загружены. Эта команда также работает и с вложенными категориями, например: [.filename]#/usr/ports/net#. Заметьте, что если порт имеет зависимости от библиотек или других портов, то команда _не будет_ загружать дистрибутивные файлы для зависимых портов. Для загрузки всех зависимых дистрибутивных файлов задействуйте команду `make fetch-recursive`.
+
+[NOTE]
+====
+Вы можете построить все порты в категории за раз, запустив команду `make` в каталоге верхнего уровня. Однако это опасно, так как некоторые порты не могут сосуществовать. В других случаях некоторые порты могут устанавливать два различных файла с одним и тем же именем.
+====
+
+В некоторых редких случаях пользователям необходимо получить tar-архивы с сайтов, отличающихся от указанных по умолчанию в `MASTER_SITES`. Вы можете переопределить значение `MASTER_SITES` посредством следующей команды:
+
+[source,bash]
+....
+# cd /usr/ports/directory
+# make MASTER_SITE_OVERRIDE= \
+ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/ fetch
+....
+
+В этом примере значение переменной `MASTER_SITES` изменено на `ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/`.
+
+[NOTE]
+====
+Некоторые порты позволяют указывать опции, которые включают или выключают построение отдельных частей приложения, изменяют некоторые параметры безопасности, а также задают прочие настройки. Примерами таких портов могут служить: package:www/firefox[], package:security/gpgme[] и package:mail/sylpheed-claws[]. Если для порта существуют опции компиляции, то перед началом построения будет отображено меню.
+====
+
+==== Переназначение рабочего и целевого каталогов
+
+При помощи переменных `WRKDIRPREFIX` и `PREFIX` можно переопределить назначаемые по умолчанию рабочий и целевой каталоги. Например:
+
+[source,bash]
+....
+# make WRKDIRPREFIX=/usr/home/example/ports install
+....
+
+будет компилировать порт в каталоге [.filename]#/usr/home/example/ports#, а установит всё в [.filename]#/usr/local#.
+
+[source,bash]
+....
+# make PREFIX=/usr/home/example/local install
+....
+
+будет компилировать порт в каталоге [.filename]#/usr/ports#, а установит в [.filename]#/usr/home/example/local#.
+
+И, конечно же,
+
+[source,bash]
+....
+# make WRKDIRPREFIX=../ports PREFIX=../local install
+....
+
+использует обе возможности.
+
+Альтернативным способом является задание этих каталогов в переменных окружения. Обратитесь к страницам справки по вашему командному процессору для получения инструкций о том, как установить переменные окружения.
+
+==== Повторная настройка опций портов
+
+Некоторые порты предоставляют ncurses-меню, содержащее опции построения. Будучи однажды успешно определены, опции сохраняются, и при повторном построении порта меню не вызывается. Для изменения сохраненных опций существует несколько способов повторного вызова меню. Один из них - зайти в каталог порта и набрать `make config`. Второй способ - запустить команду `make showconfig`. Еще один способ - выполнить команду `make rmconfig`, которая удалит все ранее отмеченные опции и позволит вам начать конфигурирование сначала. Эти и другие способы детально описаны на странице man:ports[7].
+
+[[ports-removing]]
+=== Удаление установленных портов
+
+Установленные порты и пакеты удаляются при помощи команды man:pkg_delete[1]:
+
+[source,bash]
+....
+# pkg_delete lsof-4.57
+....
+
+[[ports-upgrading]]
+=== Обновление портов
+
+Прежде всего, при помощи man:pkg_version[1] просмотрите, нет ли в Коллекции Портов более новых версий установленных приложений:
+
+[source,bash]
+....
+# pkg_version -v
+....
+
+[[ports-file-updating]]
+==== Прочитайте [.filename]#/usr/ports/UPDATING#
+
+После обновления Коллекции Портов, и перед тем, как обновить приложение из порта, сверьтесь с файлом [.filename]#/usr/ports/UPDATING#. В нем дана информация по различным вопросам и дополнительным шагам, которые могут быть необходимы для обновления порта, включая информацию о таких вещах как изменения форматов файлов, изменения в расположении конфигурационных файлов, или другие нестыковки с предыдущими версиями.
+
+Если [.filename]#UPDATING# противоречит чему-либо, написанному в этом документе, то доверьтесь информации из [.filename]#UPDATING#.
+
+[[portupgrade]]
+==== Обновление Портов при помощи Portupgrade
+
+Утилита portupgrade создана для простого обновления установленных портов. Она доступна из порта package:ports-mgmt/portupgrade[]. Установите её как и любой иной порт при помощи команды `make install clean`:
+
+[source,bash]
+....
+# cd /usr/ports/ports-mgmt/portupgrade
+# make install clean
+....
+
+Проверьте перечень установленных портов командой `pkgdb -F` и устраните все несоответствия, о которых сообщит утилита. Хорошей идеей является выполнение этого действия регулярно, перед каждым обновлением.
+
+Используйте `portupgrade -a` для обновления всех устаревших портов, установленных в вашей системе. Добавьте флаг `-i` если вы желаете получать запрос на каждый обновляемый порт.
+
+[source,bash]
+....
+# portupgrade -ai
+....
+
+Для обновления конкретного приложения, а не всех установленных портов, запустите `portupgrade _pkgname_`. Включите флаг `-R` при необходимости обновить все порты, требуемые данным приложением.
+
+[source,bash]
+....
+# portupgrade -R firefox
+....
+
+Для использования при установке пакетов, а не портов, укажите флаг `-P`. С этим параметром portupgrade будет искать пакеты в локальных каталогах, указанных в переменной окружения `PKG_PATH`, а если не найдет их, то загрузит с удаленного сайта. Если пакеты не могут быть найдены локально или загружены удаленно, portupgrade использует порты. Чтобы запретить использование портов, укажите `-PP`.
+
+[source,bash]
+....
+# portupgrade -PP gnome2
+....
+
+Для простой загрузки дистрибутивных файлов без построения или установки чего бы то ни было, задайте флаг `-F`. Дополнительную информацию можно получить на странице справки по утилите man:portupgrade[1].
+
+[[portmaster]]
+==== Обновление портов при помощи portmaster
+
+Утилита package:ports-mgmt/portmaster[] - это еще один инструмент для обновления установленных портов. Утилита portmaster опирается на возможности "базовой" системы и не зависит от других портов. Она использует информацию из [.filename]#/var/db/pkg/# для определения портов, подлежащих обновлению. Для установки утилиты выполните следующее:
+
+[source,bash]
+....
+# cd /usr/ports/ports-mgmt/portmaster
+# make install clean
+....
+
+Portmaster делит порты на четыре категории:
+
+* Корневые порты: не зависят от других портов и нет портов, зависимых от корневых;
+* Стволовые порты: не зависят от других портов, но есть порты, зависящие от стволовых;
+* Веточные порты: зависят от других портов и есть порты, зависящие от веточных;
+* Листьевые порты: зависят от других портов, но нет портов, зависящих от листьевых.
+
+Чтобы проверить наличие обновлений для всех установленных портов, задайте утилите флаг `-L`:
+
+[source,bash]
+....
+# portmaster -L
+===>>> Root ports (No dependencies, not depended on)
+===>>> ispell-3.2.06_18
+===>>> screen-4.0.3
+ ===>>> New version available: screen-4.0.3_1
+===>>> tcpflow-0.21_1
+===>>> 7 root ports
+...
+===>>> Branch ports (Have dependencies, are depended on)
+===>>> apache-2.2.3
+ ===>>> New version available: apache-2.2.8
+...
+===>>> Leaf ports (Have dependencies, not depended on)
+===>>> automake-1.9.6_2
+===>>> bash-3.1.17
+ ===>>> New version available: bash-3.2.33
+...
+===>>> 32 leaf ports
+
+===>>> 137 total installed ports
+ ===>>> 83 have new versions available
+....
+
+Все установленные порты могут быть обновлены при помощи одной команды:
+
+[source,bash]
+....
+# portmaster -a
+....
+
+[NOTE]
+====
+По умолчанию, portmaster создаст дублирующий пакет перед удалением установленного порта. Если обновление порта прошло успешно, portmaster удалит дублирующий пакет. При помощи опции `-b` можно проинструктировать portmaster не выполнять автоматическое удаление дублирующего пакета. Указание опции `-i` запустит portmaster в интерактивном режиме, запрашивающим подтверждение пользователя перед обновлением каждого порта.
+====
+
+Если во время процесса обновления возникнут ошибки, задействуйте опцию `-f` для обновления/перестройки всех портов:
+
+[source,bash]
+....
+# portmaster -af
+....
+
+Также, portmaster может быть задействован для установки новых портов в систему, автоматически обновляя другие зависимые порты перед построением и установкой нового порта:
+
+[source,bash]
+....
+# portmaster shells/bash
+....
+
+За подробной информацией обратитесь к man:portmaster[8].
+
+[[ports-disk-space]]
+=== Порты и дисковое пространство
+
+Работа с Коллекцией Портов со временем приводит к увеличению занимаемого дискового пространства. После построения и установки программы из порта удалите временный каталог [.filename]#work# при помощи команды `make clean`. Для очистки всей Коллекции Портов наберите:
+
+[source,bash]
+....
+# portsclean -C
+....
+
+По прошествии некоторого времени у вас соберется множество дистрибутивных файлов в каталоге [.filename]#distfiles#. Следующая команда удалит все дистрибутивные файлы, которые более не связаны ни с какими портами:
+
+[source,bash]
+....
+# portsclean -D
+....
+
+Для удаления всех дистрибутивных файлов, не связанных ни с одним установленным в вашу систему портом, наберите:
+
+[source,bash]
+....
+# portsclean -DD
+....
+
+[NOTE]
+====
+Утилита `portsclean` является частью порта package:ports-mgmt/portupgrade[].
+====
+
+Удобная утилита для автоматизации удаления портов, в которых вы более не нуждаетесь, доступна из порта package:ports-mgmt/pkg_cutleaves[].
+
+[[ports-nextsteps]]
+== Действия после установки
+
+После установки нового приложения вам обычно требуется прочесть любую имеющуюся документацию, отредактировать необходимые конфигурационные файлы и убедиться, что приложение запускается во время загрузки системы.
+
+Очевидно, что шаги, в точности требуемые для конфигурации каждого приложения, отличаются. Однако, если если вы только что установили новое приложение и вам интересно, "Что же дальше?", то вам могут помочь следующие советы:
+
+* Воспользуйтесь командой man:pkg_info[1] для определения того, куда и какие файлы были установлены. К примеру, если вы только что установили FooPackage версии 1.0.0, то по команде
++
+[source,bash]
+....
+# pkg_info -L foopackage-1.0.0 | less
+....
++
+будет выведен список всех файлов, установленных пакетом. Обратите особое внимание на файлы, установленные в каталоги [.filename]#man/#, которые являются справочными страницами, [.filename]#etc/#, которые являются конфигурационными файлами, и [.filename]#doc/#, которые являются более полной документацией.
++
+Чтобы определить, какая версия приложения была установлена, выполните:
++
+[source,bash]
+....
+# pkg_info | grep -i foopackage
+....
++
+команда выведет список всех установленных пакетов, в названии которых присутствует _foopackage_. Замените _foopackage_ на искомый фрагмент текста.
+* Как только вы определите, куда были установлены справочные страницы приложения, просмотрите их при помощи команды man:man[1]. Просмотрите примеры конфигурационных файлов, а также любую дополнительную документацию, если она была установлена.
+* Если у приложения имеется веб-сайт, поищите там дополнительную документацию, ответы на часто задаваемые вопросы и так далее. Если вы не уверены, каков адрес веб-сайта, он может быть указан в выводе команды
++
+[source,bash]
+....
+# pkg_info foopackage-1.0.0
+....
++
+Строка `WWW:`, если она есть, должна содержать URL Web-сайта приложения.
+* Как правило, порты приложений, которые должны запускаться при загрузке системы, устанавливают стартовые скрипты в каталог [.filename]#/usr/local/etc/rc.d#. Просмотрите скрипт на предмет его корректности и, если необходимо, отредактируйте или переименуйте его. Обратитесь к разделу о crossref:config[configtuning-starting-services,Запуске сервисов] за более подробной информацией.
+
+[[ports-broken]]
+== Обработка нерабочих портов
+
+Если вы встретили порт, который не компилируется:
+
+. Выясните, нет ли для порта решения проблемы в link:https://www.FreeBSD.org/support/#gnats[Problem Report database]. Если оно есть, то вы можете воспользоваться предложенным решением.
+. Попросите помощи у мейнтейнера порта. Чтобы найти его адрес наберите команду `make maintainer` или просмотрите [.filename]#Makefile#. Не забудьте указать имя и версию порта (скопировав строчку `$FreeBSD:` из файла [.filename]#Makefile#) и включите в письмо весь вывод, предшествующий возникновению ошибки.
++
+[NOTE]
+====
+Некоторые порты поддерживаются группой людей из link:{mailing-list-faq}[списка рассылки], а не отдельными людьми. В большинстве таких случаев адрес мейнтейнера выглядит подобно следующему: mailto:freebsd-listname@FreeBSD.org[freebsd-listname@FreeBSD.org]. Пожалуйста, учтите это при формулировании ваших вопросов.
+
+В частности, если мейнтейнер порта - mailto:ports@FreeBSD.org[ports@FreeBSD.org], то такой порт вообще никем не поддерживается. Решение проблем и поддержка, если и имеют место, то приходят от общества, которое подписано на тот список рассылки. Волонтёры требуются всегда!
+====
++
+Если вы не получили ответ, то воспользуйтесь командой man:send-pr[1] для посылки сообщения о проблеме (изучите link:{problem-reports}[составление сообщений о проблеме во FreeBSD]).
+. Исправьте его! В link:{porters-handbook}[Руководстве по созданию портов] содержится подробная информация об инфраструктуре портов, так что вы сможете исправить редкий неработающий порт или даже предложить свой собственный!
+. Воспользуйтесь man:pkg_add[1] и установите пакет вместо порта.
diff --git a/documentation/content/ru/books/handbook/ppp-and-slip/_index.adoc b/documentation/content/ru/books/handbook/ppp-and-slip/_index.adoc
new file mode 100644
index 0000000000..c9a96b01b0
--- /dev/null
+++ b/documentation/content/ru/books/handbook/ppp-and-slip/_index.adoc
@@ -0,0 +1,2011 @@
+---
+title: Глава 23. PPP и SLIP
+part: Часть IV. Сетевые коммуникации
+prev: books/handbook/serialcomms
+next: books/handbook/mail
+---
+
+[[ppp-and-slip]]
+= PPP и SLIP
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 23
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/ppp-and-slip/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/ppp-and-slip/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/ppp-and-slip/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[ppp-and-slip-synopsis]]
+== Краткий обзор
+
+В FreeBSD существует множество способов соединения одного компьютера с другим. Для установления соединения с отдельной сетью или интернет через обычный модем, или для открытия доступа к собственному компьютеру необходимо использование PPP или SLIP. В этой главе детально описана настройка таких модемных сервисов.
+
+После прочтения этой главы вы будете знать:
+
+* Как настроить PPP уровня пользователя (user PPP).
+* Как настроить PPP уровня ядра (kernel PPP).
+* Как настроить PPPoE (PPP over Ethernet).
+* Как настроить PPPoA (PPP over ATM).
+* Как настроить SLIP клиента и сервер.
+
+Перед прочтением этой главы вам потребуется:
+
+* Ознакомиться с основными сетевыми технологиями.
+* Понимать основы и назначение модемного соединения и PPP и/или SLIP.
+
+Вы возможно захотите узнать, в чем главное различие между PPP уровня пользователя и ядра. Ответ прост: PPP уровня пользователя обрабатывает входящие и исходящие данные в пространстве пользователя, а не в ядре. В терминах копирования данных между ядром и пространством пользователя это дорогостоящий путь, который однако позволяет значительно расширить возможности реализации PPP. PPP уровня пользователя для связи с внешним миром использует устройство [.filename]#tun#, а PPP уровня ядра - устройство [.filename]#ppp#.
+
+[NOTE]
+====
+В дальнейшем в этой главе PPP уровня пользователя будет обозначаться просто как ppp, пока не потребуется различать его и любое другое программное обеспечение PPP, такое как pppd. Если не указано иначе, все команды, приведенные в этой главе, должны выполняться под `root`.
+====
+
+[[userppp]]
+== PPP уровня пользователя
+
+=== Настройка PPP уровня пользователя
+
+==== Предположения
+
+В этом документе предполагается, что у вас есть следующее:
+
+* Учетная запись у провайдера интернет (Internet Service Provider, ISP), к которому вы подсоединяетесь, используя PPP.
+* Модем или другое подключенное к системе и правильно настроенное устройство, позволяющее подключиться к провайдеру.
+* Номер модемного пула провайдера.
+* Имя пользователя (логин) и пароль (обычная UNIX(R) пара логин/пароль, или PAP/CHAP пара логин/пароль).
+* IP адреса одного или нескольких серверов имен. Обычно провайдер дает для этих целей два IP адреса. Если нет ни одного, вы можете использовать команду `enable dns` в [.filename]#ppp.conf# и ppp настроит список серверов имен. Эта возможность зависит от наличия поддержки согласования DNS в реализации PPP провайдера.
+
+Следующая информация может поставляться провайдером, но не является совершенно необходимой:
+
+* IP адрес шлюза провайдера. Шлюз это компьютер, к которому вы подключитесь и который будет настроен в качестве _маршрута по умолчанию_ (_default route_). Если у вас нет этой информации, она может быть получена от PPP сервера после подключения.
++
+Программой ppp этот IP адрес обозначается как `HISADDR`.
+* Сетевая маска, которую вы должны использовать. Если провайдер не предоставил ее значение, вы можете использовать `255.255.255.255`.
+* Если провайдер предоставил статический IP и имя хоста, используйте их. Иначе позвольте удаленной стороне назначить свободный IP адрес.
+
+Если у вас нет всей необходимой информации, свяжитесь с провайдером.
+
+[NOTE]
+====
+В этом разделе строки файлов настройки из многих примеров пронумерованы. Эти номера приведены только для обсуждения настроек, они не должны помещаться в действующую настройку. Правильные отступы с табуляцией и пробелами также важны.
+====
+
+==== Создание файлов устройств PPP
+
+В обычной ситуации, большинству пользователей нужно только одно устройство [.filename]#tun# ([.filename]#/dev/tun0#). Ссылки на [.filename]#tun0# ниже могут быть заменены на [.filename]#tunN#, где _N_ это любой номер устройства, соответствующий вашей системе.
+
+Для систем FreeBSD без man:devfs[5] (FreeBSD 4.X более ранние), необходимо проверить устройство [.filename]#tun0# (это не требуется, если включена man:devfs[5], поскольку файлы устройств будут создаваться автоматически).
+
+Простейший способ убедиться, что устройство [.filename]#tun0# настроено правильно, это пересоздать устройство. Для пересоздания устройства выполните следующее:
+
+[source,bash]
+....
+# cd /dev
+# sh MAKEDEV tun0
+....
+
+Если вам необходимы 16 туннельных устройств, потребуется их создать. Это можно сделать, выполнив следующие команды:
+
+[source,bash]
+....
+# cd /dev
+# sh MAKEDEV tun15
+....
+
+==== Автоматическая настройка PPP
+
+И `ppp` и `pppd` (реализация PPP уровня ядра) используют файлы настройки, расположенные в каталоге [.filename]#/etc/ppp#. Примеры для ppp уровня пользователя можно найти в [.filename]#/usr/shared/examples/ppp/#.
+
+Настройка `ppp` требует редактирования нескольких файлов, в зависимости от ваших потребностей. То, что вы поместите в эти файлы, зависит в некоторой степени от того, предоставит ли провайдер статический IP адрес (т.е. вы получите один определенный IP адрес и будете использовать его постоянно) или динамический (т.е. ваш IP адрес будет изменяться при каждом подключении к провайдеру).
+
+[[userppp-staticIP]]
+===== PPP и статические IP адреса
+
+Вам потребуется отредактировать файл настройки [.filename]#/etc/ppp/ppp.conf#. Он похож на приведенный ниже пример.
+
+[NOTE]
+====
+Строки, оканчивающиеся на `:`, вводятся без отступа в начале строки, остальные строки должны быть введены с отступом, как показано в примере.
+====
+
+[.programlisting]
+....
+1 default:
+2 set log Phase Chat LCP IPCP CCP tun command
+3 ident user-ppp VERSION (built COMPILATIONDATE)
+4 set device /dev/cuaa0
+5 set speed 115200
+6 set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \
+7 \"\" AT OK-AT-OK ATE1Q0 OK \\dATDT\\T TIMEOUT 40 CONNECT"
+8 set timeout 180
+9 enable dns
+10
+11 provider:
+12 set phone "(123) 456 7890"
+13 set authname foo
+14 set authkey bar
+15 set login "TIMEOUT 10 \"\" \"\" gin:--gin: \\U word: \\P col: ppp"
+16 set timeout 300
+17 set ifaddr x.x.x.x y.y.y.y 255.255.255.255 0.0.0.0
+18 add default HISADDR
+....
+
+Строка 1:::
+Начинает настройку по умолчанию (default). Команды этой настройки выполняются автоматически при запуске ppp.
+
+Строка 2:::
+Включает параметры протоколирования. Когда настройка работает удовлетворительно, эта строка должна быть сокращена до следующей формы
++
+[.programlisting]
+....
+set log phase tun
+....
+
+для предотвращения появления слишком больших лог файлов.
+
+Строка 3:::
+Указывает PPP как идентифицировать себя на удаленной стороне. PPP идентифицирует себя на удаленной стороне если возникают проблемы согласования и установки соединения, предоставляя информацию, по которой администратор на удаленной стороне может воспользоваться для решения таких проблем.
+
+Строка 4:::
+Указывает устройство, к которому подключен модем. [.filename]#COM1# это [.filename]#/dev/cuaa0#, а [.filename]#COM2# это [.filename]#/dev/cuaa1#.
+
+Строка 5:::
+Устанавливает желаемую скорость подключения к модему. Если 115200 не работает (хотя должна работать для любого относительно нового модема) попробуйте 38400.
+
+Строки 6 и 7:::
+Строка дозвона. PPP уровня пользователя применяет expect-send синтаксис, похожий на синтаксис man:chat[8]. Обратитесь к странице справочника за информацией о возможностях этого языка.
++
+Обратите внимание, что эта команда продолжается на следующей строке для улучшения читаемости. Любая команда в [.filename]#ppp.conf# может быть продолжена на следующей строке, если последний символ предыдущей строки "`\`".
+
+Строка 8:::
+Устанавливает предельное время ожидания для соединения. Значение 180 секунд используется по умолчанию, так что строка с этим значением чисто косметическая.
+
+Строка 9:::
+Указывает PPP запросить у удаленной стороны сервера имен. Если вы работаете с локальным сервером имен, эта строка должна быть закомментирована или удалена.
+
+Строка 10:::
+Пустая строка для улучшения читаемости. Пустые строки игнорируются PPP.
+
+Строка 11:::
+Определяет настройки для провайдера, называемого "provider". Это имя может быть изменено на имя вашего провайдера, чтобы в дальнейшем вы могли использовать `load _provider_` для начала соединения.
+
+Строка 12:::
+Определяет телефонный номер для этого провайдера. Несколько телефонных номеров могут быть указаны с помощью двоеточия (`:`) или символа канала (`|`) в качестве разделителя. Различия между двумя разделителями описаны в man:ppp[8]. Главным образом они заключаются в том, что если вы хотите перебирать номера, используйте двоеточие. Если вы хотите дозваниваться по первому номеру в первую очередь, и использовать другие номера только если дозвон по первому завершится неудачно, используйте символ канала. Всегда заключайте список номеров в кавычки, как показано в примере.
++
+Вы должны включить телефонный номер в кавычки (`"`) если в нем используются пробелы. Отсутствие кавычек может вызвать простую, но трудно обнаруживаемую ошибку.
+
+Строки 13 и 14:::
+Задают имя пользователя и пароль. При использовании приглашения login в стиле UNIX(R), эти значения используются командой `set login` через переменные \U и \P. При соединении с использованием PAP или CHAP, эти значения используются во время аутентификации.
+
+Строка 15:::
+Если вы используете PAP или CHAP, приглашение на вход не появится, и эта строка должна быть закомментирована или удалена. Обратитесь к странице <<userppp-PAPnCHAP,аутентификация PAP и CHAP>> за дальнейшей информацией.
++
+Строка для входа записана в том же chat-подобном синтаксисе, что и строка для дозвона. В этом примере строка работает для сервиса, сессия входа которого выглядит примерно так:
++
+[source,bash]
+....
+J. Random Provider
+login: foo
+password: bar
+protocol: ppp
+....
++
+Вам потребуется изменить эту строку для использования с другим сервисом. При первом составлении скрипта убедитесь, что вы включили "chat" протоколирование, чтобы убедиться, что соединение происходит как ожидалось.
+
+Строка 16:::
+Установка максимального времени ожидания по умолчанию для соединения. В данном случае соединение будет разорвано автоматически после 300 секунд неактивности. Если вы не хотите, чтобы соединение разрывалось, установите эту переменную в нуль, или используйте параметр командной строки `-ddial`.
+
+Строка 17:::
+Устанавливает адрес интерфейса. Строка _x.x.x.x_ должна быть заменена на IP адрес, который выделил вам провайдер. Строка _y.y.y.y_ должна быть заменена на IP адрес шлюза провайдера (компьютер, к которому вы подключаетесь). Если провайдер не сообщил адрес шлюза, используйте `10.0.0.2/0`. Если вам требуется использовать "вычисленные" адреса, убедитесь, что создана запись в [.filename]#/etc/ppp/ppp.linkup# в соответствии с инструкциями для <<userppp-dynamicIP,PPP и динамических IP адресов>>. Если эта строка опущена, `ppp` не может быть запущен в режиме `-auto`.
+
+Строка 18:::
+Добавляет маршрут по умолчанию к шлюзу провайдера. Специальное слово `HISADDR` заменяется адресом шлюза, указанном в строке 17. Важно, чтобы эта строка появилась после строки 17, до нее переменная `HISADDR` еще не инициализирована.
++
+Если вы не будете запускать ppp с параметром `-auto`, эта строка должна быть перемещена в файл [.filename]#ppp.linkup#.
+
+Нет необходимости добавлять запись в [.filename]#ppp.linkup#, если у вас статический IP адрес и ppp работает в режиме `-auto`, поскольку таблица маршрутизации настроена правильно еще до подключения. Однако, вы возможно захотите создать запись для запуска программ после соединения. Эта ситуация описана далее в примере по sendmail.
+
+Примерные файлы настройки находятся в каталоге [.filename]#/usr/shared/examples/ppp/#.
+
+[[userppp-dynamicIP]]
+===== PPP и динамические IP адреса
+
+Если провайдер не выделил статический IP адрес, `ppp` может быть настроен для определения локального и удаленного адреса. Это делается путем "вычисления" IP адреса и настройки его программой `ppp` с использованием IP Configuration Protocol (IPCP) после установления соединения. Файл настройки [.filename]#ppp.conf# тот же, что и в примере <<userppp-staticIP,PPP и статические IP адреса>>, со следующим изменением:
+
+[.programlisting]
+....
+17 set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.255
+....
+
+Как и раньше, не включайте номер строки, он используется только для ссылки на строку в этом примере. Требуется отступ хотя бы в один пробел.
+
+Строка 17:::
+Номер после символа `/` это число бит в адресе, которые будут запрошены ppp. Вы можете использовать более подходящие вам IP адреса, но пример выше всегда будет работать.
+
+Если вы не используете режим `-auto`, потребуется создать запись в [.filename]#/etc/ppp/ppp.linkup#. Этот файл используется после установки соединения. На этот момент `ppp` уже настроит адреса интерфейсов и станет возможным добавление записей в таблицу маршрутизации:
+
+[.programlisting]
+....
+1 provider:
+2 add default HISADDR
+....
+
+Строка 1:::
+При установке соединения, `ppp` ищет запись в [.filename]#ppp.linkup# по следующим правилам: сначала в соответствии с меткой, используемой в [.filename]#ppp.conf#. Если это не сработает, ведется поиск записи для IP адреса шлюза. Это метка в IP записывается в виде IP адреса. Если запись все еще не найдена, используется запись `MYADDR`.
+
+Строка 2:::
+Эта строка сообщает `ppp` добавить маршрут по умолчанию, указывающий на `HISADDR`. `HISADDR` будет заменен на IP адрес шлюза, определенного IPCP.
+
+Детальный пример находится в записи `pmdemand` файлов [.filename]#/usr/shared/examples/ppp/ppp.conf.sample# и [.filename]#/usr/shared/examples/ppp/ppp.linkup.sample#.
+
+===== Прием входящих звонков
+
+При настройке ppp для приема входящих звонков на компьютере, подключенном к локальной сети, вам необходимо решить, перенаправлять ли пакеты в локальную сеть. Если вы будете делать это, выделите удаленной стороне IP адрес из диапазона адресов локальной сети, и используйте команду `enable proxy` в файле [.filename]#/etc/ppp/ppp.conf#. Вам потребуется также убедиться, что в файле [.filename]#/etc/rc.conf# присутствует строка:
+
+[.programlisting]
+....
+gateway_enable="YES"
+....
+
+===== Какой getty?
+
+Раздел crossref:serialcomms[dialup,Настройка FreeBSD для входящих соединений] дает хорошее описание включения входящих соединений с использованием man:getty[8].
+
+Альтернатива `getty` это http://www.leo.org/~doering/mgetty/index.html[mgetty], более интеллектуальная версия `getty`, разработанная специально для приема входящих звонков..
+
+Преимущество использование `mgetty` в том, что она активно _общается_ с модемами, то есть если порт будет выключен в [.filename]#/etc/ttys#, модем не будет отвечать на звонок.
+
+Последние версии `mgetty` (от 0.99beta и выше) поддерживают также автоматическое определение потоков PPP, позволяя клиентам безскриптовое подключение к серверу.
+
+Обратитесь к разделу <<userppp-mgetty,Mgetty и AutoPPP>> за дальнейшей информацией по `mgetty`.
+
+===== Права PPP
+
+Программа `ppp` обычно запускается с правами пользователя `root`. Если вы хотите разрешить запуск `ppp` в режиме сервера с правами обычного пользователя путем запуска `ppp` как описано ниже, этого пользователя необходимо добавить в группу `network` в файле [.filename]#/etc/group#.
+
+Вам также потребуется дать ему доступ к одному или более разделов конфигурации, используя команду `allow`:
+
+[.programlisting]
+....
+allow users fred mary
+....
+
+Если эта команда используется в разделе `default`, она дает пользователю полный доступ.
+
+===== Оболочки PPP для пользователей с динамическими IP
+
+Создайте файл, называющийся [.filename]#/etc/ppp/ppp-shell# и содержащий следующее:
+
+[.programlisting]
+....
+#!/bin/sh
+IDENT=`echo $0 | sed -e 's/^.*-\(.*\)$/\1/'`
+CALLEDAS="$IDENT"
+TTY=`tty`
+
+if [ x$IDENT = xdialup ]; then
+ IDENT=`basename $TTY`
+fi
+
+echo "PPP for $CALLEDAS on $TTY"
+echo "Starting PPP for $IDENT"
+
+exec /usr/sbin/ppp -direct $IDENT
+....
+
+Этот скрипт должен быть исполняемым. Теперь создайте на этот скрипт символическую ссылку с именем [.filename]#ppp-dialup# с помощью следующей команды:
+
+[source,bash]
+....
+# ln -s ppp-shell /etc/ppp/ppp-dialup
+....
+
+Используйте этот скрипт в качестве _оболочки_ для удаленных пользователей. Ниже приведен пример записи в [.filename]#/etc/password# для удаленных пользователей PPP с именем пользователя `pchilds` (не забывайте использовать `vipw` для редактирования файла паролей).
+
+[.programlisting]
+....
+pchilds:*:1011:300:Peter Childs PPP:/home/ppp:/etc/ppp/ppp-dialup
+....
+
+Создайте каталог [.filename]#/home/ppp#, который доступен для чтения и содержит следующие файлы нулевой длины:
+
+[source,bash]
+....
+-r--r--r-- 1 root wheel 0 May 27 02:23 .hushlogin
+-r--r--r-- 1 root wheel 0 May 27 02:22 .rhosts
+....
+
+Это предотвратит отображение [.filename]#/etc/motd#.
+
+===== Оболочки PPP для пользователей со статическими IP
+
+Создайте файл [.filename]#ppp-shell# как в примере выше, и для каждой учетной записи со статически назначаемым IP создайте символическую ссылку на [.filename]#ppp-shell#.
+
+Например, если у вас три пользователя удаленного доступа, `fred`, `sam` и `mary`, которые подключаются к вашей сети класса C, выполните следующее:
+
+[source,bash]
+....
+# ln -s /etc/ppp/ppp-shell /etc/ppp/ppp-fred
+# ln -s /etc/ppp/ppp-shell /etc/ppp/ppp-sam
+# ln -s /etc/ppp/ppp-shell /etc/ppp/ppp-mary
+....
+
+Оболочка каждого из этих пользователей удаленного доступа должна быть символической ссылкой, созданной выше (например, оболочка пользователя `mary` должна быть [.filename]#/etc/ppp/ppp-mary#).
+
+===== Настройка [.filename]#ppp.conf# для пользователей с динамическими IP
+
+Файл [.filename]#/etc/ppp/ppp.conf# должен содержать примерно такие строки:
+
+[.programlisting]
+....
+default:
+ set debug phase lcp chat
+ set timeout 0
+
+ttyd0:
+ set ifaddr 203.14.100.1 203.14.100.20 255.255.255.255
+ enable proxy
+
+ttyd1:
+ set ifaddr 203.14.100.1 203.14.100.21 255.255.255.255
+ enable proxy
+....
+
+[NOTE]
+====
+Необходимо соблюдать отступы.
+====
+
+Раздел `default:` загружается для каждого соединения. Для каждой строки, включенной в [.filename]#/etc/ttys#, создайте запись, подобную `ttyd0:` выше. Каждая строка должна содержать уникальные IP адреса из вашего пула IP адресов, выделенных пользователям с динамическими IP.
+
+===== Настройка [.filename]#ppp.conf# для пользователей со статическими IP
+
+Помимо содержимого, описанного в примере файла [.filename]#/usr/shared/examples/ppp/ppp.conf# выше, вам потребуется добавить раздел для каждого из пользователей со статическими IP. Мы продолжим использовать имена `fred`, `sam` и `mary` в качестве примера.
+
+[.programlisting]
+....
+fred:
+ set ifaddr 203.14.100.1 203.14.101.1 255.255.255.255
+
+sam:
+ set ifaddr 203.14.100.1 203.14.102.1 255.255.255.255
+
+mary:
+ set ifaddr 203.14.100.1 203.14.103.1 255.255.255.255
+....
+
+Если требуется, файл [.filename]#/etc/ppp/ppp.linkup# должен также содержать информацию о маршрутизации для каждого пользователя со статическим IP. В строке ниже через клиентское соединение добавляется маршрут к сети класса C``203.14.101.0``.
+
+[.programlisting]
+....
+fred:
+ add 203.14.101.0 netmask 255.255.255.0 HISADDR
+
+sam:
+ add 203.14.102.0 netmask 255.255.255.0 HISADDR
+
+mary:
+ add 203.14.103.0 netmask 255.255.255.0 HISADDR
+....
+
+[[userppp-mgetty]]
+===== `mgetty` и AutoPPP
+
+Настройка и компиляция `mgetty` с параметром `AUTO_PPP` позволяет `mgetty` определять LCP фазу PPP соединений и автоматически порождать оболочку ppp. Однако, поскольку стандартный метод логин/пароль не используется, необходима аутентификация пользователей через PAP или CHAP.
+
+В этом разделе предполагается, что пользователь успешно настроил, скомпилировал и установил версию `mgetty` с параметром `AUTO_PPP` (v0.99beta или более поздняя).
+
+Убедитесь, что в файле [.filename]#/usr/local/etc/mgetty+sendfax/login.config# имеется следующая строка:
+
+[.programlisting]
+....
+/AutoPPP/ - - /etc/ppp/ppp-pap-dialup
+....
+
+Это укажет `mgetty` запускать скрипт [.filename]#ppp-pap-dialup# для обнаруженных соединений PPP.
+
+Создайте файл [.filename]#/etc/ppp/ppp-pap-dialup#, содержащий следующее (этот файл должен быть выполняемым):
+
+[.programlisting]
+....
+#!/bin/sh
+exec /usr/sbin/ppp -direct pap$IDENT
+....
+
+Для каждой линии, включенной в [.filename]#/etc/ttys#, создайте соответствующую запись в [.filename]#/etc/ppp/ppp.conf#. Она будет отлично сочетаться с тем, что было создано выше.
+
+[.programlisting]
+....
+pap:
+ enable pap
+ set ifaddr 203.14.100.1 203.14.100.20-203.14.100.40
+ enable proxy
+....
+
+Для каждого пользователя, входящего по этому методу, в файле [.filename]#/etc/ppp/ppp.secret# должна присутствовать запись с логином/паролем, или, в качестве альтернативы, для аутентификации пользователей по PAP через [.filename]#/etc/password#, необходимо использовать следующий параметр.
+
+[.programlisting]
+....
+enable passwdauth
+....
+
+Если вы хотите присвоить некоторым пользователям статический IP, задайте его в качестве третьего аргумента в [.filename]#/etc/ppp/ppp.secret#. Обратитесь к к [.filename]#/usr/shared/examples/ppp/ppp.secret.sample# за примерами.
+
+===== MS расширения
+
+Возможна настройка PPP для выдачи адресов DNS и NetBIOS по запросу.
+
+Для включения этих расширений с PPP версии 1.x, необходимо добавить к соответствующему разделу [.filename]##/etc/ppp/ppp.conf##следующие строки.
+
+[.programlisting]
+....
+enable msext
+set ns 203.14.100.1 203.14.100.2
+set nbns 203.14.100.5
+....
+
+Для PPP версии 2 и выше:
+
+[.programlisting]
+....
+accept dns
+set dns 203.14.100.1 203.14.100.2
+set nbns 203.14.100.5
+....
+
+Клиентам будут выдаваться адреса первичного и вторичного серверов имен, и адрес хоста NetBIOS.
+
+Если в версии 2 и выше строка `set dns` будет опущена, PPP использует значения из [.filename]#/etc/resolv.conf#.
+
+[[userppp-PAPnCHAP]]
+===== Аутентификация PAP и CHAP
+
+Некоторые провайдеры настраивают систему так, что аутентификация производится с использованием либо PAP либо CHAP. В этом случае, приглашение `login:` при соединении не выдается и соединение PPP начинается сразу.
+
+PAP менее безопасен, чем CHAP, но безопасность в данном случае не страдает, поскольку хотя пароли и передаются открытым текстом, они передаются только по модемной линии. У кракеров не так много возможностей для кражи паролей.
+
+В примерах выше <<userppp-staticIP,PPP и статические IP адреса>> или <<userppp-dynamicIP,PPP и динамические IP адреса>> должны быть сделаны следующие изменения:
+
+[.programlisting]
+....
+13 set authname MyUserName
+14 set authkey MyPassword
+15 set login
+....
+
+Строка 13:::
+Эта строка указывает имя пользователя PAP/CHAP. Вам потребуется заменить _MyUserName_ на правильное значение.
+
+Строка 14:::
+Эта строка указывает пароль PAP/CHAP. Вам потребуется заменить _MyPassword_ на правильное значение. Вы можете также добавить дополнительную строку, такую как:
++
+
+[.programlisting]
+....
+16 accept PAP
+....
+
++
+или
++
+
+[.programlisting]
+....
+16 accept CHAP
+....
+
++
+для явного указания протокола, но и PAP и CHAP поддерживаются по умолчанию.
+
+Строка 15:::
+Ваш провайдер обычно не потребует входа на сервер при использовании PAP или CHAP. Следовательно, вы должны отключить строку "set login".
+
+===== Изменение настроек `ppp` "на лету"
+
+Возможно изменение настроек `ppp` программы во время ее работы в фоновом режиме, но только если открыт соответствующий диагностический порт. Для его открытия добавьте в настройку следующую строку:
+
+[.programlisting]
+....
+set server /var/run/ppp-tun%d DiagnosticPassword 0177
+....
+
+С этой директивой ppp будет прослушивать заданный UNIX(R) сокет, запрашивая у клиентов пароль перед выдачей доступа. Символы``%d`` заменяются на номер используемого устройства [.filename]#tun#.
+
+Как только сокет открыт, в скриптах, выполняющих настройку работающей программы, можно использовать man:pppctl[8].
+
+[[userppp-nat]]
+==== Использование NAT
+
+PPP имеет возможность использовать встроенный NAT без преобразования пакетов в ядре. Эта возможность может быть включена следующей строкой в [.filename]#/etc/ppp/ppp.conf#:
+
+[.programlisting]
+....
+nat enable yes
+....
+
+Альтернативно, PPP NAT может быть включен параметром командной строки `-nat`. Существует также переменная [.filename]#/etc/rc.conf#`ppp_nat`, которая включена по умолчанию.
+
+Если вы используете эту возможность, вы также можете найти полезными параметры [.filename]#/etc/ppp/ppp.conf# для включения пересылки входящих соединений:
+
+[.programlisting]
+....
+nat port tcp 10.0.0.2:ftp ftp
+nat port tcp 10.0.0.2:http http
+....
+
+или отключить все входящие соединения
+
+[.programlisting]
+....
+nat deny_incoming yes
+....
+
+[[userppp-final]]
+==== Завершающая настройка системы
+
+Теперь, когда программа `ppp` настроена, осталось выполнить еще несколько действий прежде, чем все это заработает. Они выполняются путем редактирования файла [.filename]#/etc/rc.conf#.
+
+Просматривая этот файл, убедитесь, что добавлена строка `hostname=`, например:
+
+[.programlisting]
+....
+hostname="foo.example.com"
+....
+
+Если провайдер предоставил вам статический IP адрес и имя, возможно лучше всего использовать это имя в качестве имени хоста.
+
+Проверьте переменную `network_interfaces`. Если вы хотите настроить систему для дозвона по требованию, убедитесь, что устройство [.filename]#tun0# добавлено в список, иначе удалите его.
+
+[.programlisting]
+....
+network_interfaces="lo0 tun0"
+ifconfig_tun0=
+....
+
+[NOTE]
+====
+Переменная `ifconfig_tun0` должна быть пуста, необходимо также создать файл [.filename]#/etc/start_if.tun0#. В этом файле должна находиться строка:
+
+[.programlisting]
+....
+ppp -auto mysystem
+....
+
+Этот скрипт выполняется во время настройки сети, запуская даемона ppp в автоматическом режиме. Если эта машина является шлюзом для локальной сети, вы можете также использовать переключатель `-alias`. Обратитесь к странице справочника за дальнейшей информацией.
+====
+
+Убедитесь, что программа маршрутизации отключена переменной в файле [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+router_enable="NO"
+....
+
+Важно, чтобы даемон `routed` не был запущен, поскольку он может удалить запись маршрута по умолчанию, создаваемую `ppp`.
+
+Возможно, стоит обратить внимание на переменную `sendmail_flags` и убедиться, что она не включает параметр `-q`, иначе `sendmail` попытается сразу же обратиться к сети, и компьютер может начать дозвон. Вы можете попробовать:
+
+[.programlisting]
+....
+sendmail_flags="-bd"
+....
+
+Обратная сторона этого решения в том, что необходим запуск очереди `sendmail` после поднятия соединения ppp:
+
+[source,bash]
+....
+# /usr/sbin/sendmail -q
+....
+
+Вы можете использовать команду `!bg` в файле [.filename]#ppp.linkup# для автоматического выполнения этой задачи:
+
+[.programlisting]
+....
+1 provider:
+2 delete ALL
+3 add 0 0 HISADDR
+4 !bg sendmail -bd -q30m
+....
+
+Если вам это не нужно, возможна настройка "dfilter" для блокирования SMTP трафика. Обратитесь файлам примеров за дальнейшей информацией.
+
+Все, что осталось, это перегрузить компьютер. После перезагрузки вы можете либо выполнить:
+
+[source,bash]
+....
+# ppp
+....
+
+и затем набрать `dial provider` для запуска сессии PPP, либо, если вы хотите, чтобы программа `ppp` начинала соединение автоматически при появлении исходящего трафика (и файл [.filename]#start_if.tun0# не создан), выполните:
+
+[source,bash]
+....
+# ppp -auto provider
+....
+
+==== Итоги
+
+Для первоначальной настройки ppp необходимо пройти следующие шаги:
+
+Сторона клиента:
+
+[.procedure]
+====
+. Убедитесь, что устройство [.filename]#tun# встроено в ядро.
+. Убедитесь, что устройства [.filename]#tunN# находятся в каталоге [.filename]#/dev#.
+. Создайте запись в [.filename]#/etc/ppp/ppp.conf#. Пример [.filename]#pmdemand# должен подойти для большинства провайдеров.
+. Если у вас динамический IP адрес, создайте запись в [.filename]#/etc/ppp/ppp.linkup#.
+. Обновите файл [.filename]#/etc/rc.conf#.
+. Создайте скрипт [.filename]#start_if.tun0#, если необходим дозвон по требованию.
+====
+
+Сторона сервера:
+
+[.procedure]
+====
+. Убедитесь, что устройство [.filename]#tun# встроено в ядро.
+. Убедитесь, что устройства [.filename]#tunN# находятся в каталоге [.filename]#/dev#.
+. Создайте запись в [.filename]#/etc/passwd# (используя программу man:vipw[8]).
+. Создайте профиль в домашнем каталоге пользователя, запускающий `ppp -direct direct-server` или подобную команду.
+. Создайте запись в [.filename]#/etc/ppp/ppp.conf#. Пример [.filename]#direct-server# должен подойти.
+. Создайте запись в [.filename]#/etc/ppp/ppp.linkup#.
+. Обновите файл [.filename]#/etc/rc.conf#.
+====
+
+[[ppp]]
+== PPP уровня ядра
+
+=== Настройка PPP уровня ядра
+
+Перед началом настройки PPP на вашем компьютере, убедитесь, что `pppd` находится в [.filename]#/usr/sbin# и каталог [.filename]#/etc/ppp# существует.
+
+`pppd` может работать в двух режимах:
+
+. В качестве "клиента" - когда вы хотите подключить компьютер к внешнему миру через последовательное соединение PPP или модемную линию.
+. В качестве "сервера" - когда компьютер подключен к сети и используется для подключения других компьютеров через PPP.
+
+В обеих случаях вам потребуется настроить файл параметров ([.filename]#/etc/ppp/options# или [.filename]#~/.ppprc# если на вашем компьютере более одного пользователя работают с PPP).
+
+Вам потребуется также программа для модемных/последовательных линий (предпочтительно package:comms/kermit[]) для дозвона и установки соединения с удаленным хостом.
+
+=== Использование `pppd` в качестве клиента
+
+Для подключения к линии PPP терминального сервера Cisco может использоваться следующий файл [.filename]#/etc/ppp/options#.
+
+[.programlisting]
+....
+crtscts # enable hardware flow control
+modem # modem control line
+noipdefault # remote PPP server must supply your IP address
+ # if the remote host does not send your IP during IPCP
+ # negotiation, remove this option
+passive # wait for LCP packets
+domain ppp.foo.com # put your domain name here
+
+:<remote_ip> # put the IP of remote PPP host here
+ # it will be used to route packets via PPP link
+ # if you didn't specified the noipdefault option
+ # change this line to <local_ip>:<remote_ip>
+
+defaultroute # put this if you want that PPP server will be your
+ # default router
+....
+
+Для подключения:
+
+[.procedure]
+====
+. Дозвонитесь на удаленный хост, используя kermit (или любую другую модемную программу), и введите ваше имя пользователя и пароль (или те данные, которые требуются для установления PPP соединения с удаленным хостом).
+. Выйдите из kermit (без обрыва соединения).
+. Введите следующее:
++
+[source,bash]
+....
+# /usr/src/usr.sbin/pppd.new/pppd /dev/tty01 19200
+....
++
+Убедитесь, что выбраны подходящая скорость и правильное имя устройства.
+====
+
+Теперь ваш компьютер подключен по PPP. Если соединение не состоялось, вы можете добавить параметр `debug` к файлу [.filename]#/etc/ppp/options#, и отследить проблему по сообщениям на консоли.
+
+Следующий скрипт [.filename]#/etc/ppp/pppup# проведет все 3 стадии в автоматическом режиме:
+
+[.programlisting]
+....
+#!/bin/sh
+ps ax |grep pppd |grep -v grep
+pid=`ps ax |grep pppd |grep -v grep|awk '{print $1;}'`
+if [ "X${pid}" != "X" ] ; then
+ echo 'killing pppd, PID=' ${pid}
+ kill ${pid}
+fi
+ps ax |grep kermit |grep -v grep
+pid=`ps ax |grep kermit |grep -v grep|awk '{print $1;}'`
+if [ "X${pid}" != "X" ] ; then
+ echo 'killing kermit, PID=' ${pid}
+ kill -9 ${pid}
+fi
+
+ifconfig ppp0 down
+ifconfig ppp0 delete
+
+kermit -y /etc/ppp/kermit.dial
+pppd /dev/tty01 19200
+....
+
+[.filename]#/etc/ppp/kermit.dial# это скрипт kermit, который дозванивается до удаленного хоста и проходит необходимую авторизацию (пример такого скрипта находится в конце этого раздела).
+
+Используйте следующий скрипт [.filename]#/etc/ppp/pppdown# для отключения от PPP линии:
+
+[.programlisting]
+....
+#!/bin/sh
+pid=`ps ax |grep pppd |grep -v grep|awk '{print $1;}'`
+if [ X${pid} != "X" ] ; then
+ echo 'killing pppd, PID=' ${pid}
+ kill -TERM ${pid}
+fi
+
+ps ax |grep kermit |grep -v grep
+pid=`ps ax |grep kermit |grep -v grep|awk '{print $1;}'`
+if [ "X${pid}" != "X" ] ; then
+ echo 'killing kermit, PID=' ${pid}
+ kill -9 ${pid}
+fi
+
+/sbin/ifconfig ppp0 down
+/sbin/ifconfig ppp0 delete
+kermit -y /etc/ppp/kermit.hup
+/etc/ppp/ppptest
+....
+
+Проверьте, запущен ли еще `pppd`, выполнив [.filename]#/usr/etc/ppp/ppptest#, который выглядит примерно так:
+
+[.programlisting]
+....
+#!/bin/sh
+pid=`ps ax| grep pppd |grep -v grep|awk '{print $1;}'`
+if [ X${pid} != "X" ] ; then
+ echo 'pppd running: PID=' ${pid-NONE}
+else
+ echo 'No pppd running.'
+fi
+set -x
+netstat -n -I ppp0
+ifconfig ppp0
+....
+
+Для обрыва соединения, выполните [.filename]#/etc/ppp/kermit.hup#, который должен содержать:
+
+[.programlisting]
+....
+set line /dev/tty01 ; put your modem device here
+set speed 19200
+set file type binary
+set file names literal
+set win 8
+set rec pack 1024
+set send pack 1024
+set block 3
+set term bytesize 8
+set command bytesize 8
+set flow none
+
+pau 1
+out +++
+inp 5 OK
+out ATH0\13
+echo \13
+exit
+....
+
+Существует альтернативный метод, использующий `chat` вместо `kermit`:
+
+Для установления соединения `pppd` достаточно двух файлов.
+
+[.filename]#/etc/ppp/options#:
+
+[.programlisting]
+....
+/dev/cuaa1 115200
+
+crtscts # enable hardware flow control
+modem # modem control line
+connect "/usr/bin/chat -f /etc/ppp/login.chat.script"
+noipdefault # remote PPP serve must supply your IP address
+ # if the remote host doesn't send your IP during
+ # IPCP negotiation, remove this option
+passive # wait for LCP packets
+domain <your.domain> # put your domain name here
+
+: # put the IP of remote PPP host here
+ # it will be used to route packets via PPP link
+ # if you didn't specified the noipdefault option
+ # change this line to <local_ip>:<remote_ip>
+
+defaultroute # put this if you want that PPP server will be
+ # your default router
+....
+
+[.filename]#/etc/ppp/login.chat.script#:
+
+[NOTE]
+====
+Все это может быть расположено на одной строке.
+====
+
+[.programlisting]
+....
+ABORT BUSY ABORT 'NO CARRIER' "" AT OK ATDT<phone.number>
+ CONNECT "" TIMEOUT 10 ogin:-\\r-ogin: <login-id>
+ TIMEOUT 5 sword: <password>
+....
+
+Как только эти файлы будут созданы и отредактированы, необходимо только запустить `pppd`, вот так:
+
+[source,bash]
+....
+# pppd
+....
+
+=== Использование `pppd` в качестве сервера
+
+[.filename]#/etc/ppp/options# должен содержать примерно следующее:
+
+[.programlisting]
+....
+crtscts # Hardware flow control
+netmask 255.255.255.0 # netmask (not required)
+192.114.208.20:192.114.208.165 # IP's of local and remote hosts
+ # local ip must be different from one
+ # you assigned to the Ethernet (or other)
+ # interface on your machine.
+ # remote IP is IP address that will be
+ # assigned to the remote machine
+domain ppp.foo.com # your domain
+passive # wait for LCP
+modem # modem line
+....
+
+Следующий скрипт [.filename]#/etc/ppp/pppserv# укажет pppd работать в качестве сервера:
+
+[.programlisting]
+....
+#!/bin/sh
+ps ax |grep pppd |grep -v grep
+pid=`ps ax |grep pppd |grep -v grep|awk '{print $1;}'`
+if [ "X${pid}" != "X" ] ; then
+ echo 'killing pppd, PID=' ${pid}
+ kill ${pid}
+fi
+ps ax |grep kermit |grep -v grep
+pid=`ps ax |grep kermit |grep -v grep|awk '{print $1;}'`
+if [ "X${pid}" != "X" ] ; then
+ echo 'killing kermit, PID=' ${pid}
+ kill -9 ${pid}
+fi
+
+# reset ppp interface
+ifconfig ppp0 down
+ifconfig ppp0 delete
+
+# enable autoanswer mode
+kermit -y /etc/ppp/kermit.ans
+
+# run ppp
+pppd /dev/tty01 19200
+....
+
+Используйте этот скрипт [.filename]#/etc/ppp/pppservdown# для остановки сервера:
+
+[.programlisting]
+....
+#!/bin/sh
+ps ax |grep pppd |grep -v grep
+pid=`ps ax |grep pppd |grep -v grep|awk '{print $1;}'`
+if [ "X${pid}" != "X" ] ; then
+ echo 'killing pppd, PID=' ${pid}
+ kill ${pid}
+fi
+ps ax |grep kermit |grep -v grep
+pid=`ps ax |grep kermit |grep -v grep|awk '{print $1;}'`
+if [ "X${pid}" != "X" ] ; then
+ echo 'killing kermit, PID=' ${pid}
+ kill -9 ${pid}
+fi
+ifconfig ppp0 down
+ifconfig ppp0 delete
+
+kermit -y /etc/ppp/kermit.noans
+....
+
+Следующий kermit скрипт ([.filename]#/etc/ppp/kermit.ans#) включит/отключит режим ответа модема на входящие звонки. Он должен выглядеть примерно так:
+
+[.programlisting]
+....
+set line /dev/tty01
+set speed 19200
+set file type binary
+set file names literal
+set win 8
+set rec pack 1024
+set send pack 1024
+set block 3
+set term bytesize 8
+set command bytesize 8
+set flow none
+
+pau 1
+out +++
+inp 5 OK
+out ATH0\13
+inp 5 OK
+echo \13
+out ATS0=1\13 ; change this to out ATS0=0\13 if you want to disable
+ ; autoanswer mode
+inp 5 OK
+echo \13
+exit
+....
+
+Скрипт, называющийся [.filename]#/etc/ppp/kermit.dial#, используется для дозвона и аутентификации на удаленном хосте. Вам потребуется приспособить его под собственные нужды. Поместите ваш логин и пароль в этот скрипт; вам также потребуется изменить операторы input в зависимости от ответов от модема и удаленного хоста.
+
+[.programlisting]
+....
+;
+; put the com line attached to the modem here:
+;
+set line /dev/tty01
+;
+; put the modem speed here:
+;
+set speed 19200
+set file type binary ; full 8 bit file xfer
+set file names literal
+set win 8
+set rec pack 1024
+set send pack 1024
+set block 3
+set term bytesize 8
+set command bytesize 8
+set flow none
+set modem hayes
+set dial hangup off
+set carrier auto ; Then SET CARRIER if necessary,
+set dial display on ; Then SET DIAL if necessary,
+set input echo on
+set input timeout proceed
+set input case ignore
+def \%x 0 ; login prompt counter
+goto slhup
+
+:slcmd ; put the modem in command mode
+echo Put the modem in command mode.
+clear ; Clear unread characters from input buffer
+pause 1
+output +++ ; hayes escape sequence
+input 1 OK\13\10 ; wait for OK
+if success goto slhup
+output \13
+pause 1
+output at\13
+input 1 OK\13\10
+if fail goto slcmd ; if modem doesn't answer OK, try again
+
+:slhup ; hang up the phone
+clear ; Clear unread characters from input buffer
+pause 1
+echo Hanging up the phone.
+output ath0\13 ; hayes command for on hook
+input 2 OK\13\10
+if fail goto slcmd ; if no OK answer, put modem in command mode
+
+:sldial ; dial the number
+pause 1
+echo Dialing.
+output atdt9,550311\13\10 ; put phone number here
+assign \%x 0 ; zero the time counter
+
+:look
+clear ; Clear unread characters from input buffer
+increment \%x ; Count the seconds
+input 1 {CONNECT }
+if success goto sllogin
+reinput 1 {NO CARRIER\13\10}
+if success goto sldial
+reinput 1 {NO DIALTONE\13\10}
+if success goto slnodial
+reinput 1 {\255}
+if success goto slhup
+reinput 1 {\127}
+if success goto slhup
+if < \%x 60 goto look
+else goto slhup
+
+:sllogin ; login
+assign \%x 0 ; zero the time counter
+pause 1
+echo Looking for login prompt.
+
+:slloop
+increment \%x ; Count the seconds
+clear ; Clear unread characters from input buffer
+output \13
+;
+; put your expected login prompt here:
+;
+input 1 {Username: }
+if success goto sluid
+reinput 1 {\255}
+if success goto slhup
+reinput 1 {\127}
+if success goto slhup
+if < \%x 10 goto slloop ; try 10 times to get a login prompt
+else goto slhup ; hang up and start again if 10 failures
+
+:sluid
+;
+; put your userid here:
+;
+output ppp-login\13
+input 1 {Password: }
+;
+; put your password here:
+;
+output ppp-password\13
+input 1 {Entering SLIP mode.}
+echo
+quit
+
+:slnodial
+echo \7No dialtone. Check the telephone line!\7
+exit 1
+
+; local variables:
+; mode: csh
+; comment-start: "; "
+; comment-start-skip: "; "
+; end:
+....
+
+[[ppp-troubleshoot]]
+== Решение проблем с соединениями PPP
+
+Этот раздел охватывает несколько вопросов, которые могут возникнуть при использовании PPP через модемные соединения. Например, предположим, что вам потребовалось узнать, какое именно приглашение отображает система, до которой вы дозваниваетесь. Некоторые провайдеры выдают приглашение `ssword`, другие `password`; если `ppp` скрипт не обрабатывает такие приглашения, попытка входа завершится неудачно. Наиболее общий способ отладки соединений `ppp` это подключение вручную. Ниже дана пошаговая информация по подключению вручную.
+
+=== Проверьте файлы устройств
+
+Если вы пересобирали ядро, проверьте устройство [.filename]#sio#. Если вы не перенастраивали ядро, нет причин для беспокойства. Просто проверьте вывод `dmesg` для модемного устройства следующей командой:
+
+[source,bash]
+....
+# dmesg | grep sio
+....
+
+Вы должны получить информацию о устройствах [.filename]#sio#. Это COM порты, которые нам необходимы. Если ваш модем работает как стандартный последовательный порт, вы увидите его на [.filename]#sio1#, или [.filename]#COM2#. Если это так, вам не требуется пересобирать ядро, необходимо лишь создать последовательное устройство. Вы можете сделать это, зайдя в [.filename]#/dev# и запустив скрипт [.filename]#MAKEDEV#. Создайте последовательные устройства:
+
+[source,bash]
+....
+# sh MAKEDEV cuaa0 cuaa1 cuaa2 cuaa3
+....
+
+Если модем находится на [.filename]#sio1#, или [.filename]#COM2# в DOS, модемным устройством будет [.filename]#/dev/cuaa1#.
+
+=== Подключение вручную
+
+Подключение к интернет с контролированием `ppp` вручную это быстрый, легкий и действенный способ отладки соединения или получения информации о обслуживании провайдером клиентского соединения `ppp`. Запустите PPP из командной строки. В примерах в качестве имени хоста мы будем использовать _example_. Запустите `ppp`, введя команду `ppp`:
+
+[source,bash]
+....
+# ppp
+....
+
+Теперь программа `ppp` запущена.
+
+[source,bash]
+....
+ppp ON example> set device /dev/cuaa1
+....
+
+Мы указали модемное устройство, в данном случае [.filename]#cuaa1#.
+
+[source,bash]
+....
+ppp ON example> set speed 115200
+....
+
+Мы установили скорость подключения к модему, в данном случае 115,200 кбит/с.
+
+[source,bash]
+....
+ppp ON example> enable dns
+....
+
+Сообщает `ppp` настроить разрешение имен, добавив строки в [.filename]#/etc/resolv.conf#. Если `ppp` не может определить имя хоста, его можно настроить позже вручную.
+
+[source,bash]
+....
+ppp ON example> term
+....
+
+Переключение в "терминальный" режим для контроля модема вручную.
+
+[.programlisting]
+....
+deflink: Entering terminal mode on /dev/cuaa1
+type '~h' for help
+....
+
+[source,bash]
+....
+at
+OK
+atdt123456789
+....
+
+Использование команды `at` для инициализации модема, а затем `atdt` и номера провайдера для начала дозвона.
+
+[source,bash]
+....
+CONNECT
+....
+
+Подтверждение соединения, если есть проблемы с соединением, не вызванные проблемами в оборудовании, здесь мы попытаемся решить их.
+
+[source,bash]
+....
+ISP Login:myusername
+....
+
+Здесь вам предлагается ввести имя пользователя в приглашение, выводимое сервером провайдера.
+
+[source,bash]
+....
+ISP Pass:mypassword
+....
+
+Здесь предлагается ввести пароль, предоставленный провайдером. Как и при входе в FreeBSD, пароль не отображается.
+
+[source,bash]
+....
+Shell or PPP:ppp
+....
+
+В зависимости от вашего провайдера, это приглашение может не появиться. Здесь задается вопрос, хотите ли вы использовать оболочку на компьютере провайдера или запустить `ppp`. В этом примере мы выбрали `ppp`, поскольку хотим соединиться с интернет.
+
+[source,bash]
+....
+Ppp ON example>
+....
+
+Обратите внимание, что в этом примере первая буква `p` появилась в верхнем регистре. Это означает, что мы успешно подключились к провайдеру.
+
+[source,bash]
+....
+PPp ON example>
+....
+
+Мы успешно аутентифицировались у провайдера и ожидаем присвоения IP адреса.
+
+[source,bash]
+....
+PPP ON example>
+....
+
+Мы завершили согласование IP адресов, соединение успешно установлено.
+
+[source,bash]
+....
+PPP ON example>add default HISADDR
+....
+
+Это маршрут по умолчанию, его необходимо настроить, чтобы сделать возможной связь с внешним миром, поскольку на этот момент установлена связь только с удаленной стороной. Если маршрут не устанавливается из-за уже существующего маршрута, добавьте символ `!` перед `add`. Альтернативно вы можете сделать настройку перед установкой соединения.
+
+Если все прошло удачно, на данный момент должно работать соединение с интернет, которое можно поместить в фоновый режим клавишами kbd:[CTRL+z]. Переход строки `PPP` в приглашении в нижний регистр (`ppp`) означает, что соединение было разорвано. Таким образом, символы P в верхнем регистре означают наличие соединения, а в нижнем - потерю соединения.
+
+==== Отладка
+
+Если у вас выделенная линия и нет необходимости устанавливать соединение, выключите контроль передачи данных CTS/RTS командой `set ctsrts off`. Это обычно необходимо при подключении к поддерживающим PPP терминальным серверам, когда PPP прерывается при попытке записать данные в ваше соединение, и ожидает сигнала CTS, или Clear To Send, который не появляется. Если вы используете этот параметр, используйте также параметр `set accmap`, который может быть необходим для устранения зависимости от оборудования путем пропускания определенных символов через соединение, обычно XON/XOFF. Обратитесь к странице справочника man:ppp[8] за более подробной информацией по этому параметру и его использованию.
+
+Если у вас старый модем, может потребоваться использование `set parity even`. Проверка четности по умолчанию отключена, но она используется для для устранения ошибок (с серьезным увеличением объема трафика) на старых модемах и у некоторых провайдеров.
+
+PPP может не вернуться в командный режим, что обычно вызвано ошибкой согласования, когда провайдер ждет от вас начала процесса согласования. В этот момент использование команды `~p` заставит ppp начать отправку настроечной информации.
+
+Если вы не получаете приглашения на вход, скорее всего вам требуется использование аутентификации PAP или CHAP вместо UNIX(R) стиля как в примерах выше. Для использования PAP или CHAP просто добавьте следующие параметры PPP перед переходом в терминальный режим:
+
+[source,bash]
+....
+ppp ON example> set authname myusername
+....
+
+Необходимо заменить _myusername_ на имя пользователя, выданное провайдером.
+
+[source,bash]
+....
+ppp ON example> set authkey mypassword
+....
+
+Где _mypassword_ должен быть заменен на пароль, выданный провайдером.
+
+Если вы подключаетесь, не можете определить ни одно доменное имя, попробуйте использовать man:ping[8] с каким-либо IP адресом и просмотрите выводимую информацию. Если 100 процентов (100%) пакетов теряются, скорее всего не назначен маршрут по умолчанию. Дважды проверьте, что параметр `add default HISADDR` установлен во время соединения. Если вы можете подключиться к удаленному IP адресу, возможно, что адрес сервера имен не был добавлен в [.filename]#/etc/resolv.conf#. Этот файл должен выглядеть примерно так:
+
+[.programlisting]
+....
+domain example.com
+nameserver x.x.x.x
+nameserver y.y.y.y
+....
+
+Где _x.x.x.x_ и _y.y.y.y_ должны быть заменены на IP адреса DNS серверов провайдера. Эта информация может предоставляться провайдером, вы можете выяснить это в службе поддержки.
+
+Вы можете также настроить man:syslog[3] для протоколирования PPP соединения. Просто добавьте:
+
+[.programlisting]
+....
+!ppp
+*.* /var/log/ppp.log
+....
+
+в файл [.filename]#/etc/syslog.conf#. В большинстве случаев эти строки уже присутствуют.
+
+[[pppoe]]
+== Использование PPP через Ethernet (PPPoE)
+
+Этот раздел описывает настройку PPP через Ethernet (PPP over Ethernet, PPPoE).
+
+=== Настройка ядра
+
+Для PPPoE более не требуется настройка ядра. Если необходимая поддержка netgraph не встроена в ядро, она будет динамически загружена ppp.
+
+=== Настройка [.filename]#ppp.conf#
+
+Вот пример работающего [.filename]#ppp.conf#:
+
+[.programlisting]
+....
+default:
+ set log Phase tun command # you can add more detailed logging if you wish
+ set ifaddr 10.0.0.1/0 10.0.0.2/0
+
+name_of_service_provider:
+ set device PPPoE:xl1 # replace xl1 with your Ethernet device
+ set authname YOURLOGINNAME
+ set authkey YOURPASSWORD
+ set dial
+ set login
+ add default HISADDR
+....
+
+=== Запуск ppp
+
+Под пользователем `root` вы можете запустить:
+
+[source,bash]
+....
+# ppp -ddial name_of_service_provider
+....
+
+=== Запуск ppp при загрузке
+
+Добавьте к [.filename]#/etc/rc.conf# следующее:
+
+[.programlisting]
+....
+ppp_enable="YES"
+ppp_mode="ddial"
+ppp_nat="YES" # if you want to enable nat for your local network, otherwise NO
+ppp_profile="name_of_service_provider"
+....
+
+=== Использование тега сервиса PPPoE
+
+Иногда для установки соединения необходимо использовать тег сервиса. Теги сервисов используются для различения PPPoE серверов, подключенных к одной сети.
+
+В документации, предоставляемой провайдером, должна находиться необходимая информация о теге сервиса. Если вы не можете ее обнаружить, обратитесь в службу поддержки.
+
+В крайнем случае, вы можете попробовать метод, предложенный в программе http://www.roaringpenguin.com/pppoe/[Roaring Penguin PPPoE], которая находится в crossref:ports[ports,коллекции портов]. Учтите, что этот метод может сделать ваш модем неработоспособным, так что дважды подумайте перед тем, как воспользоваться им. Просто установите программу, поставляемую с модемом вашим провайдером. Затем, войдите в меню menu:System[] программы. Имя вашего профиля должно находиться здесь. Обычно это _ISP_.
+
+Имя профиля (тег сервиса) будет использоваться в записи настройки PPPoE в файле [.filename]#ppp.conf# (часть команды `set device`, относящаяся к провайдеру). Обратитесь к странице справочника man:ppp[8] за более подробной информацией. Эта команда должна выглядеть примерно так:
+
+[.programlisting]
+....
+set device PPPoE:xl1:ISP
+....
+
+Не забудьте изменить _xl1_ на имя устройства вашей Ethernet карты.
+
+Не забудьте изменить _ISP_ на профиль, определенный вами ранее.
+
+Дополнительная информация:
+
+* http://renaud.waldura.com/doc/freebsd/pppoe/[Cheaper Broadband with FreeBSD on DSL], опубликовал Renaud Waldura.
+* http://www.ruhr.de/home/nathan/FreeBSD/tdsl-freebsd.html[ Nutzung von T-DSL und T-Online mit FreeBSD] by Udo Erdelhoff (на немецком).
+
+[[ppp-3com]]
+=== PPPoE c 3Com(R) HomeConnect(TM) ADSL Modem Dual Link
+
+Этот модем не поддерживает http://www.faqs.org/rfcs/rfc2516.html[RFC 2516] (_Метод соединения PPP через Ethernet (PPPoE)_, написанный L. Mamakos, K. Lidl, J. Evarts, D. Carrel, D. Simone, и R. Wheeler). Вместо этого, для фреймов Ethernet используются различные коды типов пакетов. Сообщите http://www.3com.com/[3Com] если считаете, что они должны соблюдать спецификации PPPoE.
+
+Для включения поддержки этого нестандартного устройства, в FreeBSD необходимо установить переменную sysctl. Это может быть сделано автоматически, поместите в [.filename]#/etc/sysctl.conf# следующую переменную:
+
+[.programlisting]
+....
+net.graph.nonstandard_pppoe=1
+....
+
+или, для непосредственного включения, выполните команду `sysctl net.graph.nonstandard_pppoe=1`.
+
+К сожалению, поскольку эта настройка влияет на всю систему, невозможно одновременно взаимодействовать с нормальным PPPoE клиентом или сервером и 3Com(R) HomeConnect(TM) ADSL Modem.
+
+[[pppoa]]
+== Использование PPP через ATM (PPPoA)
+
+Далее описано как настроить PPP через ATM (PPP over ATM, PPPoA). PPPoA популярен у европейских провайдеров DSL.
+
+=== Использование PPPoA с Alcatel SpeedTouch(TM) USB
+
+Поддержка PPPoA для этого устройства в FreeBSD поставляется в виде порта, поскольку встроенное программное обеспечение поставляется под http://www.speedtouchdsl.com/disclaimer_lx.htm[лицензионным соглашением Alcatel] и не может свободно распространяться с основной системой FreeBSD.
+
+Для установки этой программы, просто используйте crossref:ports[ports,коллекцию портов]. Установите порт package:net/pppoa[] и следуйте инструкциям.
+
+Как и многие устройства USB, Alcatel SpeedTouch(TM) USB должен загрузить встроенное программное обеспечение с компьютера. Возможна автоматизация этого процесса в FreeBSD, чтобы эта передача происходила при подключении устройства к порту USB. Для включения этой автоматической передачи необходимо добавить в [.filename]#/etc/usbd.conf# нижеприведенную информацию. Этот файл необходимо отредактировать под пользователем `root`.
+
+[.programlisting]
+....
+device "Alcatel SpeedTouch USB"
+ devname "ugen[0-9]+"
+ vendor 0x06b9
+ product 0x4061
+ attach "/usr/local/sbin/modem_run -f /usr/local/libdata/mgmt.o"
+....
+
+Для включения даемона USB, usbd, поместите в [.filename]#/etc/rc.conf# следующую строку:
+
+[.programlisting]
+....
+usbd_enable="YES"
+....
+
+Возможна также настройка ppp для дозвона при запуске. Для этого добавьте в [.filename]#/etc/rc.conf# нижеприведенные строки. Опять же, для этого вам необходимо войти под пользователем `root`.
+
+[.programlisting]
+....
+ppp_enable="YES"
+ppp_mode="ddial"
+ppp_profile="adsl"
+....
+
+Необходимо также использовать пример файла [.filename]#ppp.conf#, поставляемый с портом package:net/pppoa[].
+
+=== Использование mpd
+
+Вы можете использовать mpd для подключения к различным сервисам, в частности к сервисам PPTP. Вы можете найти mpd в коллекции портов, package:net/mpd[]. Многие ADSL модемы требуют, чтобы PPTP туннель был создан между модемом и компьютером, один из таких модемов это Alcatel SpeedTouch(TM) Home.
+
+Сначала установите порт, затем настройте mpd под собственные нужды и настройки провайдера. Порт помещает набор примеров настройки в каталог [.filename]#PREFIX/etc/mpd/#. _PREFIX_ означает каталог, в который устанавливаются порты, по умолчанию это [.filename]#/usr/local/#. Полное руководство по настройке mpd доступно в HTML формате после установки порта. Оно находится в [.filename]#PREFIX/shared/doc/mpd/#. Ниже находится пример настройки mpd для соединения с ADSL сервисом. Настройка разделена на два файла, первый это [.filename]#mpd.conf#:
+
+[.programlisting]
+....
+default:
+ load adsl
+
+adsl:
+ new -i ng0 adsl adsl
+ set bundle authname username <.>
+ set bundle password password <.>
+ set bundle disable multilink
+
+ set link no pap acfcomp protocomp
+ set link disable chap
+ set link accept chap
+ set link keep-alive 30 10
+
+ set ipcp no vjcomp
+ set ipcp ranges 0.0.0.0/0 0.0.0.0/0
+
+ set iface route default
+ set iface disable on-demand
+ set iface enable proxy-arp
+ set iface idle 0
+
+ open
+....
+
+<.> Имя пользователя, используемое для аутентификации у провайдера.
+
+<.> Пароль, используемый для аутентификации у провайдера.
+
+Файл [.filename]#mpd.links# содержит информацию о соединении или соединениях, которые вы планируете установить. Пример [.filename]#mpd.links#, соответствующий приведенному выше примеру:
+
+[.programlisting]
+....
+adsl:
+ set link type pptp
+ set pptp mode active
+ set pptp enable originate outcall
+ set pptp self 10.0.0.1 <.>
+ set pptp peer 10.0.0.138 <.>
+....
+
+<.> IP адрес компьютера FreeBSD, с которого вы будете использовать mpd.
+<.> IP адрес модема ADSL. Для Alcatel SpeedTouch(TM) Home этот адрес по умолчанию `10.0.0.138`.
+
+Инициализация соединения возможно простым выполнением следующей команды под `root`:
+
+[source,bash]
+....
+# mpd -b adsl
+....
+
+Вы можете просмотреть статус соединения с помощью следующей команды:
+
+[source,bash]
+....
+% ifconfig ng0
+ng0: flags=88d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST> mtu 1500
+ inet 216.136.204.117 --> 204.152.186.171 netmask 0xffffffff
+....
+
+Использование mpd это рекомендуемый способ подключения к сервису ADSL из FreeBSD.
+
+=== Использование pptpclient
+
+Возможно также использование FreeBSD для подключения к сервисам PPPoA с помощью package:net/pptpclient[].
+
+Для подключения к сервису DSL с использованием package:net/pptpclient[], установите порт или пакет и отредактируйте [.filename]#/etc/ppp/ppp.conf#. Вам потребуется работать под `root`. Пример настройки [.filename]#ppp.conf# дан ниже. За дальнейшей информацией по параметрам [.filename]#ppp.conf# обратитесь к странице справочника ppp, man:ppp[8].
+
+[.programlisting]
+....
+adsl:
+ set log phase chat lcp ipcp ccp tun command
+ set timeout 0
+ enable dns
+ set authname username <.>
+ set authkey password <.>
+ set ifaddr 0 0
+ add default HISADDR
+....
+
+<.> Имя пользователя вашей учетной записи у провайдера DSL.
+
+<.> Пароль для вашей учетной записи.
+
+[WARNING]
+====
+
+Поскольку вам необходимо поместить пароль в незашифрованном виде в файл [.filename]#ppp.conf#, убедитесь что никто другой не сможет прочесть содержимое этого файла. Следующая последовательность команд сделает этот файл доступным для чтения только пользователю `root`. Обратитесь к страницам справочника man:chmod[1] и man:chown[8] за дальнейшей информацией.
+
+[source,bash]
+....
+# chown root:wheel /etc/ppp/ppp.conf
+# chmod 600 /etc/ppp/ppp.conf
+....
+
+====
+
+Следующая команда откроет туннель для PPP сессии к вашему DSL маршрутизатору. Модемы Ethernet DSL поставляются с настроенным IP адресом локальной сети, к которому вы подключаетесь. У Alcatel SpeedTouch(TM) Home этот адрес `10.0.0.138`. В документации на ваш маршрутизатор должно быть указано, какой адрес используется. Для открытия туннеля и начала PPP сессии выполните:
+
+[source,bash]
+....
+# pptp address adsl
+....
+
+[TIP]
+====
+
+Чтобы вернуться в приглашение командной строки после выполнения этой команды, добавьте символ "&" в конец строки.
+====
+
+Устройство виртуального туннеля [.filename]#tun# будет создано для взаимодействия между процессами pptp и ppp. Как только вы вернетесь в приглашение, или процесс pptp выполнит соединение, вы можете проверить туннель примерно такой командой:
+
+[source,bash]
+....
+% ifconfig tun0
+tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
+ inet 216.136.204.21 --> 204.152.186.171 netmask 0xffffff00
+ Opened by PID 918
+....
+
+Если вы не сможете соединиться, проверьте настройку маршрутизатора, которая обычно доступна через telnet или через веб браузер. Если вы все еще не можете подключиться, проверьте вывод команды `pptp` и содержимое лог файла ppp, [.filename]#/var/log/ppp.log#.
+
+[[slip]]
+== Использование SLIP
+
+[[slipc]]
+=== Настройка SLIP клиента
+
+Ниже дан один из способов настройки FreeBSD для подключения к SLIP сети со статическим адресом. Для динамического подключения (адрес изменяется при каждом дозвоне) возможно потребуется более сложная настройка.
+
+Сначала определите, к какому последовательному порту подключен модем. Многие создают символическую ссылку, такую как [.filename]#/dev/modem#, на настоящий файл устройства, [.filename]#/dev/cuaaN#. Это позволяет абстрагироваться от имени файла устройства, например если вы переносите модем на другой порт. Довольно сложно править множество файлов в [.filename]#/etc# и [.filename]#.kermrc# во всей системе!
+
+[NOTE]
+====
+[.filename]#/dev/cuaa0# это [.filename]#COM1#, [.filename]#cuaa1# это [.filename]#COM2#, и т.д.
+====
+
+Убедитесь, что в вашем файле настройки ядра присутствует строка:
+
+[.programlisting]
+....
+pseudo-device sl 1
+....
+
+В FreeBSD 5.X, используйте вместо этой строки следующую:
+
+[.programlisting]
+....
+device sl
+....
+
+Эта строка включена в ядро [.filename]#GENERIC#, так что если вы ее не удаляли, проблем быть не должно.
+
+==== То, что необходимо сделать только один раз
+
+[.procedure]
+====
+
+. Добавьте ваш компьютер, шлюз и сервера имен в файл [.filename]#/etc/hosts#. Вот пример такого файла:
++
+[.programlisting]
+....
+127.0.0.1 localhost loghost
+136.152.64.181 water.CS.Example.EDU water.CS water
+136.152.64.1 inr-3.CS.Example.EDU inr-3 slip-gateway
+128.32.136.9 ns1.Example.EDU ns1
+128.32.136.12 ns2.Example.EDU ns2
+....
++
+. Убедитесь, что в файле [.filename]#/etc/host.conf#`hosts` находится перед `bind` (для FreeBSD версий до 5.0). Начиная с FreeBSD 5.0, система использует файл [.filename]#/etc/nsswitch.conf#, убедитесь, что параметр `files` находится перед `dns` в строке `hosts` этого файла. Без этого параметра могут происходить странные вещи.
+. Отредактируйте файл [.filename]#/etc/rc.conf#.
+.. Установите имя хоста, настроив переменную hostname:
++
+[.programlisting]
+....
+hostname="myname.my.domain"
+....
++
+Здесь необходимо использовать полное доменное имя вашего компьютера в интернет.
+.. Добавьте [.filename]#sl0# к списку сетевых интерфейсов, изменив переменную:
++
+[.programlisting]
+....
+network_interfaces="lo0"
+....
++
+на:
++
+[.programlisting]
+....
+network_interfaces="lo0 sl0"
+....
++
+.. Измените параметры [.filename]#sl0#, добавив строку:
++
+[.programlisting]
+....
+ifconfig_sl0="inet ${hostname} slip-gateway netmask 0xffffff00 up"
+....
++
+.. Назначьте маршрутизатор по умолчанию, изменив строку:
++
+[.programlisting]
+....
+defaultrouter="NO"
+....
++
+на:
++
+[.programlisting]
+....
+defaultrouter="slip-gateway"
+....
++
+. Создайте файл [.filename]#/etc/resolv.conf#, содержащий:
++
+[.programlisting]
+....
+domain CS.Example.EDU
+nameserver 128.32.136.9
+nameserver 128.32.136.12
+....
++
+Как вы видите, здесь указаны адреса серверов имен. Конечно, реальные имена доменов и адреса для вас будут другими.
+. Перегрузите компьютер и убедитесь, что его имя хоста настроено правильно.
+====
+
+==== Создание SLIP соединения
+
+[.procedure]
+====
+
+. Дозвонитесь на удаленный сервер, введите `slip` в приглашение, имя своего компьютера и пароль. Все, что требуется ввести в вашем случае. Если вы используете kermit, попробуйте такой скрипт:
++
+[.programlisting]
+....
+# kermit setup
+set modem hayes
+set line /dev/modem
+set speed 115200
+set parity none
+set flow rts/cts
+set terminal bytesize 8
+set file type binary
+# The next macro will dial up and login
+define slip dial 643-9600, input 10 =>, if failure stop, -
+output slip\x0d, input 10 Username:, if failure stop, -
+output silvia\x0d, input 10 Password:, if failure stop, -
+output ***\x0d, echo \x0aCONNECTED\x0a
+....
++
+Конечно, вам потребуется заменить имя хоста и пароль на ваши собственные. После этого, для подключения просто введите `slip` из приглашения kermit.
++
+[NOTE]
+======
+Хранение пароля в любом месте файловой системы в незашифрованном виде это обычно плохая идея. Вы делаете это на свой риск.
+======
++
+. Выйдите из kermit (вы можете приостановить его, нажав kbd:[Ctrl+z]) и введите под `root`:
++
+[source,bash]
+....
+# slattach -h -c -s 115200 /dev/modem
+....
++
+Если вы сможете выполнить `ping` для хостов по другую сторону маршрутизатора, вы подключились! Если это не работает, попробуйте параметр `slattach -a` вместо `-c`.
+====
+
+==== Как прервать соединение:
+
+Сделайте следующее:
+
+[source,bash]
+....
+# kill -INT `cat /var/run/slattach.modem.pid`
+....
+
+для остановки `slattach`. Помните, что вы должны работать под `root` для выполнения этой команды. Затем вернитесь в kermit (запустив `fg`, если он приостановлен) и выйдите из него (`q`).
+
+Страница справочника `slattach` сообщает, что для отключения интерфейса необходимо использовать `ifconfig sl0 down`, но это похоже не играет никакой роли. (`ifconfig sl0` сообщает о том же.)
+
+Иногда модем может не сбросить соединение (это бывает довольно часто). В этом случае просто запустите kermit и выйдите из него еще раз. При второй попытке соединение обычно разрывается.
+
+==== Решение проблем
+
+Вот наиболее часто встречающиеся ситуации:
+
+* Не используются параметры `slattach``-c` или `-a` (это может быть не фатально, но иногда вызывает проблемы.)
+* Используется `s10` вместо `sl0` (с некоторыми шрифтами сложно увидеть разницу).
+* Попробуйте использовать `ifconfig sl0` для просмотра статуса интерфейса. Например, вы можете получить такую информацию:
++
+[source,bash]
+....
+# ifconfig sl0
+sl0: flags=10<POINTOPOINT>
+ inet 136.152.64.181 --> 136.152.64.1 netmask ffffff00
+....
+
+* Если вы получите сообщение `no route to host` от команды ping, возможно это проблема с таблицей маршрутизации. Используйте команду `netstat -r` для отображения существующих маршрутов:
++
+[source,bash]
+....
+# netstat -r
+Routing tables
+Destination Gateway Flags Refs Use IfaceMTU Rtt Netmasks:
+
+(root node)
+(root node)
+
+Route Tree for Protocol Family inet:
+(root node) =>
+default inr-3.Example.EDU UG 8 224515 sl0 - -
+localhost.Exampl localhost.Example. UH 5 42127 lo0 - 0.438
+inr-3.Example.ED water.CS.Example.E UH 1 0 sl0 - -
+water.CS.Example localhost.Example. UGH 34 47641234 lo0 - 0.438
+(root node)
+....
++
+Предыдущий пример получен на относительно загруженной системе. Числа в вашей системе будут сильно зависеть от загрузки сети.
+
+[[slips]]
+=== Настройка SLIP сервера
+
+Этот документ предоставляет решение для настройки SLIP сервера в системе FreeBSD, что обычно означает настройку системы для автоматического запуска соединений при удаленном входе SLIP клиентов.
+
+[[slips-prereqs]]
+==== Предварительные требования
+
+Информация в этом разделе чисто техническая, поэтому требуются некоторые предварительные знания. Предполагается, что вы знакомы с сетевым протоколом TCP/IP, и в частности, с адресацией сетей и хостов, сетевыми масками, делением на подсети, маршрутизацией и протоколами маршрутизации, такими как RIP. Настройка SLIP сервисов на сервере удаленного доступа требует знания этих концепций, и если вы не знакомы с ними, прочтите или книгу _TCP/IP Network Administration_ от Craig Hunt, опубликованную O'Reilly & Associates, Inc. (ISBN Number 0-937175-82-X), или книги Douglas Comer по протоколу TCP/IP.
+
+В дальнейшем предполагается, что вы уже настроили ваш модем (модемы) и настроили соответствующие системные файлы для разрешения входа через них. Если вы еще не подготовили систему соответствующим образом, обратитесь к руководству по настройке сервисов удаленного входа; просмотрите список руководств на link:https://www.FreeBSD.org/ru/docs/[http://www.FreeBSD.org/ru/docs/]. Вы можете также обратиться к странице справочника man:sio[4] за информацией о драйвере последовательного порта и к страницам man:gettytab[5], man:getty[8] и man:init[8] за информацией по настройке системы для удаленного входа в систему через модемы, и возможно man:stty[1] за информацией о настройке параметров последовательных портов (таких как `clocal` для подключаемых непосредственно последовательных интерфейсов).
+
+==== Краткий обзор
+
+В типичной конфигурации FreeBSD работает в качестве SLIP сервера так: пользователь SLIP дозванивается на FreeBSD SLIP сервер и входит в систему со специальным SLIP логином, использующим [.filename]#/usr/sbin/sliplogin# в качестве оболочки. Программа `sliplogin` просматривает файл [.filename]#/etc/sliphome/slip.hosts# на предмет строки, соответствующей специальному пользователю, и если находит совпадение, подключает последовательную линию к доступному SLIP интерфейсу, а затем запускает shell скрипт [.filename]#/etc/sliphome/slip.login# для настройки SLIP интерфейса.
+
+===== Пример входа на SLIP сервер
+
+Например, идентификатор пользователя на SLIP сервере `Shelmerg`. Соответствующая запись в [.filename]#/etc/master.passwd# будет выглядеть примерно так:
+
+[.programlisting]
+....
+Shelmerg:password:1964:89::0:0:Guy Helmer - SLIP:/usr/users/Shelmerg:/usr/sbin/sliplogin
+....
+
+Когда `Shelmerg` входит в систему, `sliplogin` ищет строку в [.filename]#/etc/sliphome/slip.hosts#, в которой находится соответствующий идентификатор пользователя; например, строка может быть такой:
+
+[.programlisting]
+....
+Shelmerg dc-slip sl-helmer 0xfffffc00 autocomp
+....
+
+После обнаружения этой строки `sliplogin` подключает последовательную линию к следующему доступному SLIP интерфейсу, а затем выполняет [.filename]#/etc/sliphome/slip.login# примерно так:
+
+[.programlisting]
+....
+/etc/sliphome/slip.login 0 19200 Shelmerg dc-slip sl-helmer 0xfffffc00 autocomp
+....
+
+Если все проходит нормально, [.filename]#/etc/sliphome/slip.login# вызовет `ifconfig` для SLIP интерфейса, к которому подключилась программа `sliplogin` (slip интерфейс 0 в примере выше, первый параметр в списке, задаваемом [.filename]#slip.login#) для установки локального IP адреса ((`dc-slip`), удаленного IP адреса (`sl-helmer`), сетевой маски для SLIP интерфейса (`0xfffffc00`), и любых дополнительных флагов (`autocomp`). Если что-то идет не так, `sliplogin` обычно протоколирует соответствующие сообщения в через уровень `daemon` syslog; эти сообщения как правило попадают в [.filename]#/var/log/messages# (обратитесь к страницам справочника man:syslogd[8] и man:syslog.conf[5], а также проверьте файл [.filename]#/etc/syslog.conf#, чтобы выяснить, что протоколирует `syslogd` и куда помещается информация).
+
+Достаточно примеров - давайте начнем настройку системы.
+
+==== Настройка ядра
+
+Стандартное ядро FreeBSD обычно поставляется с двумя SLIP интерфейсами (([.filename]#sl0# и [.filename]#sl1#); вы можете использовать команду `netstat -i`, чтобы выяснить, определены ли эти интерфейсы в вашем ядре.
+
+Пример вывода `netstat -i`:
+
+[source,bash]
+....
+Name Mtu Network Address Ipkts Ierrs Opkts Oerrs Coll
+ed0 1500 <Link>0.0.c0.2c.5f.4a 291311 0 174209 0 133
+ed0 1500 138.247.224 ivory 291311 0 174209 0 133
+lo0 65535 <Link> 79 0 79 0 0
+lo0 65535 loop localhost 79 0 79 0 0
+sl0* 296 <Link> 0 0 0 0 0
+sl1* 296 <Link> 0 0 0 0 0
+....
+
+Наличие в выводе `netstat -i` интерфейсов [.filename]#sl0# и [.filename]#sl1# означает, что SLIP интерфейсы встроены в ядро (символ `*` показывает неактивность интерфейсов).
+
+Ядро FreeBSD по умолчанию не пересылает пакеты между интерфейсами (компьютер FreeBSD не работает как маршрутизатор), вследствие требований RFC (см. RFCs 1009 [Requirements for Internet Gateways], 1122 [Requirements for Internet Hosts - Communication Layers], и возможно 1127 [A Perspective on the Host Requirements RFCs]). Если вы хотите, чтобы FreeBSD SLIP работал в качестве маршрутизатора, отредактируйте файл [.filename]#/etc/rc.conf# и присвойте переменной `gateway_enable` значение `YES`.
+
+Для вступления изменений в силу потребуется перезагрузка.
+
+В файле настройки стандартного ядра ([.filename]#/sys/i386/conf/GENERIC#) находится строка:
+
+[.programlisting]
+....
+pseudo-device sl 2
+....
+
+Она определяет число доступных устройств SLIP в ядре; Число в конце строки определяет максимально возможное количество одновременных SLIP соединений.
+
+Обратитесь к crossref:kernelconfig[kernelconfig, Настройка ядра FreeBSD] за информацией по настройке ядра FreeBSD.
+
+==== Настройка sliplogin
+
+Как упоминалось ранее, в каталоге [.filename]#/etc/sliphome# находятся три файла, являющиеся частью настройки для [.filename]#/usr/sbin/sliplogin# (для `sliplogin` существует страница справочника, man:sliplogin[8]): [.filename]#slip.hosts#, определяющий список пользователей SLIP и связанные с ними IP адреса; [.filename]#slip.login#, который обычно всего лишь настраивает SLIP интерфейс; [.filename]#slip.logout#, который восстанавливает состояние системы до запуска [.filename]#slip.login# после завершения последовательного соединения.
+
+===== Настройка [.filename]#slip.hosts#
+
+[.filename]#/etc/sliphome/slip.hosts# содержит строки, в которых находится как минимум четыре параметра, разделенных пробелами:
+
+* ID пользователя SLIP
+* Локальный адрес (локальный для SLIP сервера) SLIP соединения
+* Удаленный адрес SLIP соединения
+* Сетевая маска
+
+Локальные и удаленные адреса могут быть именами хостов (разрешаемыми в IP адреса через файл [.filename]#/etc/hosts# или через службу доменных имен, в зависимости от настроек в файле [.filename]#/etc/nsswitch.conf# для FreeBSD 5.X, или [.filename]#/etc/host.conf# для FreeBSD 4.X), а сетевая маска может быть именем, разрешаемым через файл [.filename]#/etc/networks#. В системе, используемой в качестве примера, файл [.filename]#/etc/sliphome/slip.hosts# выглядит так:
+
+[.programlisting]
+....
+#
+# login local-addr remote-addr mask opt1 opt2
+# (normal,compress,noicmp)
+#
+Shelmerg dc-slip sl-helmerg 0xfffffc00 autocomp
+....
+
+В конце строки находятся один или более параметров.
+
+* `normal` - нет сжатия заголовков
+* `compress` - сжимать заголовки
+* `autocomp` - сжимать заголовки, если удаленная сторона это позволяет
+* `noicmp` - запретить ICMP пакеты (любые "ping" пакеты будут отброшены и не станут помехой для другого трафика)
+
+Выбор локального и удаленного адреса для SLIP соединений зависит от того, используете ли вы выделенную TCP/IP сеть, или используете на SLIP сервере "ARP прокси". (это не "настоящий" ARP прокси, но данная терминология используется в этом разделе). Если вы не уверены, какой метод выбрать, или как присвоить IP адреса, обратитесь к книгам по TCP/IP, упомянутым выше (<<slips-prereqs>>).
+
+Если вы собираетесь использовать отдельную подсеть для SLIP клиентов, потребуется выделить адреса за пределом адресов вашей сети и присвоить каждому SLIP клиенту IP адрес из данной подсети. Затем вам возможно потребуется настроить статический маршрут в используемую для SLIP подсеть через SLIP сервер на ближайшем IP маршрутизаторе.
+
+Иначе, если вы будете использовать метод "proxy ARP", потребуется присвоить SLIP клиентам IP адреса, не входящие в Ethernet подсеть сервера SLIP, а также настроить скрипты [.filename]#/etc/sliphome/slip.login# и [.filename]#/etc/sliphome/slip.logout#, чтобы использовать man:arp[8] для управления записями ARP прокси в таблице ARP сервера SLIP.
+
+===== Настройка [.filename]#slip.login#
+
+Типичный файл [.filename]#/etc/sliphome/slip.login# выглядит примерно так:
+
+[.programlisting]
+....
+#!/bin/sh -
+#
+# @(#)slip.login 5.1 (Berkeley) 7/1/90
+
+#
+# generic login file for a slip line. sliplogin invokes this with
+# the parameters:
+# 1 2 3 4 5 6 7-n
+# slipunit ttyspeed loginname local-addr remote-addr mask opt-args
+#
+/sbin/ifconfig sl$1 inet $4 $5 netmask $6
+....
+
+Этот файл [.filename]#slip.login# всего лишь запускает `ifconfig` для соответствующего SLIP интерфейса с заданными локальным и удаленным адресом и сетевой маской.
+
+Если вы решили использовать метод "ARP прокси" (вместо использования отдельной подсети для SLIP клиентов), ваш файл [.filename]#/etc/sliphome/slip.login# должен выглядеть примерно так:
+
+[.programlisting]
+....
+#!/bin/sh -
+#
+# @(#)slip.login 5.1 (Berkeley) 7/1/90
+
+#
+# generic login file for a slip line. sliplogin invokes this with
+# the parameters:
+# 1 2 3 4 5 6 7-n
+# slipunit ttyspeed loginname local-addr remote-addr mask opt-args
+#
+/sbin/ifconfig sl$1 inet $4 $5 netmask $6
+# Answer ARP requests for the SLIP client with our Ethernet addr
+/usr/sbin/arp -s $5 00:11:22:33:44:55 pub
+....
+
+Дополнительная строка в этом [.filename]#slip.login#, `arp -s $5 00:11:22:33:44:55 pub`, создает ARP запись в ARP таблице SLIP сервера. При соединении другого узла в Ethernet с IP адресом SLIP клиента, SLIP сервер выдает ответ с собственным Ethernet MAC адресом.
+
+При использовании примера выше убедитесь, что заменили Ethernet MAC адрес (`00:11:22:33:44:55`) на MAC адрес Ethernet карты вашей системы, или ваш "ARP прокси" точно не будет работать! Вы можете определить Ethernet MAC адрес SLIP сервера, просмотрев вывод команды `netstat -i` выше; информация об адресе находится второй строке:
+
+[source,bash]
+....
+ed0 1500 <Link>0.2.c1.28.5f.4a 191923 0 129457 0 116
+....
+
+Это означает, что в данной системе Ethernet MAC адрес `00:02:c1:28:5f:4a` - точки в MAC адресе, выдаваемые `netstat -i`, должны быть заменены на двоеточия, необходимо также добавить нуль в начало каждого односимвольного шестнадцатеричного номера для преобразования этого адреса в форму, пригодную для man:arp[8]; обратитесь к странице справочника man:arp[8] за полной информацией по использованию.
+
+[NOTE]
+====
+При создании [.filename]#/etc/sliphome/slip.login# и [.filename]#/etc/sliphome/slip.logout#, должен быть установлен бит "выполнения" (`chmod 755 /etc/sliphome/slip.login /etc/sliphome/slip.logout`), или `sliplogin` не сможет их выполнить.
+====
+
+===== Настройка [.filename]#slip.logout#
+
+[.filename]#/etc/sliphome/slip.logout# не является совершенно необходимым (если только вы не реализуете "ARP прокси"), но если вы решили создать его, воспользуйтесь следующим примером:
+
+[.programlisting]
+....
+#!/bin/sh -
+#
+# slip.logout
+
+#
+# logout file for a slip line. sliplogin invokes this with
+# the parameters:
+# 1 2 3 4 5 6 7-n
+# slipunit ttyspeed loginname local-addr remote-addr mask opt-args
+#
+/sbin/ifconfig sl$1 down
+....
+
+Если вы используете "ARP прокси", потребуется удаление записи ARP для SLIP клиента через [.filename]#/etc/sliphome/slip.logout#:
+
+[.programlisting]
+....
+#!/bin/sh -
+#
+# @(#)slip.logout
+
+#
+# logout file for a slip line. sliplogin invokes this with
+# the parameters:
+# 1 2 3 4 5 6 7-n
+# slipunit ttyspeed loginname local-addr remote-addr mask opt-args
+#
+/sbin/ifconfig sl$1 down
+# Quit answering ARP requests for the SLIP client
+/usr/sbin/arp -d $5
+....
+
+Команда `arp -d $5` удаляет запись ARP, добавленную [.filename]#slip.login# при входе SLIP клиента.
+
+Повторяем: убедитесь, что на файл [.filename]#/etc/sliphome/slip.logout# установлен бит выполнения (`chmod 755 /etc/sliphome/slip.logout`).
+
+==== Соглашения о маршрутизации
+
+Если вы не используете "ARP прокси" метод для маршрутизации пакетов между SLIP клиентами и остальной сетью (и возможно интернет), вам возможно потребуется статический маршрут (маршруты) до ближайшего шлюза (шлюзов) для маршрутизации подсети SLIP клиентов через SLIP сервер.
+
+===== Статические маршруты
+
+Добавление статических маршрутов может стать для кого-то проблемой (это даже невозможно, если у вас нет соответствующих прав). Если в вашей организации сеть с несколькими маршрутизаторами, некоторые маршрутизаторы, например Cisco и Proteon, требуют не только настройки статического маршрута в подсеть SLIP, но и указания, о каких статических маршрутах сообщать другим маршрутизаторам, так что для наладки работоспособности статической маршрутизации может потребоваться некоторое исследование и отладка.
+
+===== Запуск GateD(R)
+
+[NOTE]
+====
+GateD(R) это закрытое программно обеспечение, более недоступное в исходных текстах (дополнительная информация находится на вебсайте http://www.gated.org/[GateD(R)]). Этот раздел существует лишь в целях обратной совместимости для тех, кто все еще использует старую версию.
+====
+
+Альтернатива головной боли со статическими маршрутами это установка GateD(R) на FreeBSD SLIP сервере и настройка его для использования соответствующих протоколов маршрутизации (RIP/OSPF/BGP/EGP) для сообщения другим маршрутизаторам о вашей SLIP подсети. Вам потребуется создать [.filename]#/etc/gated.conf# для настройки gated. Ниже дан пример:
+
+[.programlisting]
+....
+#
+# gated configuration file for dc.dsu.edu; for gated version 3.5alpha5
+# Only broadcast RIP information for xxx.xxx.yy out the ed Ethernet interface
+#
+#
+# tracing options
+#
+traceoptions "/var/tmp/gated.output" replace size 100k files 2 general ;
+
+rip yes {
+ interface sl noripout noripin ;
+ interface ed ripin ripout version 1 ;
+ traceoptions route ;
+} ;
+
+#
+# Turn on a bunch of tracing info for the interface to the kernel:
+kernel {
+ traceoptions remnants request routes info interface ;
+} ;
+
+#
+# Propagate the route to xxx.xxx.yy out the Ethernet interface via RIP
+#
+
+export proto rip interface ed {
+ proto direct {
+ xxx.xxx.yy mask 255.255.252.0 metric 1; # SLIP connections
+ } ;
+} ;
+
+#
+# Accept routes from RIP via ed Ethernet interfaces
+
+import proto rip interface ed {
+ all ;
+} ;
+....
+
+В примере выше используется широковещательная рассылка информации о маршрутизации для подсети SLIP _xxx.xxx.yy_ протоколом RIP на сеть Ethernet; если вы используете другой драйвер Ethernet вместо [.filename]#ed#, потребуется соответственно изменить запись для [.filename]#ed#. В этом примере отладочная информация переправляется в [.filename]#/var/tmp/gated.output#; вы можете выключить отладку, если GateD(R) работает. Вам потребуется заменить _xxx.xxx.yy_ в сетевом адресе на вашу подсеть SLIP (убедитесь, что изменение сетевой маски в `proto direct` работает нормально).
+
+Как только вы установили и настроили GateD(R), потребуется сообщить стартовым скриптам FreeBSD запускать его вместо routed. Простейший способ сделать это - установить переменные `router` и `router_flags` в [.filename]#/etc/rc.conf#. Обратитесь к странице справочника GateD(R) за информацией о параметрах командной строки.
diff --git a/documentation/content/ru/books/handbook/preface/_index.adoc b/documentation/content/ru/books/handbook/preface/_index.adoc
new file mode 100644
index 0000000000..ab9a901262
--- /dev/null
+++ b/documentation/content/ru/books/handbook/preface/_index.adoc
@@ -0,0 +1,232 @@
+---
+title: Предисловие
+prev: books/handbook/
+next: books/handbook/parti
+---
+
+[preface]
+[[book-preface]]
+= Предисловие
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums!:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+
+[[preface-audience]]
+== Целевая аудитория
+
+Люди, которые используют FreeBSD с недавнего времени, найдут, что первая часть этой книги проводит читателя через процесс установки FreeBSD и кратко освещает идеи и традиции, на которых базируется UNIX(R). Работа с этой частью требует несколько большего, чем просто желание исследовать - необходима возможность принимать к сведению новые идеи.
+
+Вторая, много большая часть Руководства, является всеобъемлющим справочником о всех темах, которые могут интересовать администраторов FreeBSD. Некоторые из глав этой части могут рекомендовать вам предварительное чтение других документов, о чём упоминается в кратком обзоре в начале каждой главы.
+
+Список рекомендуемой дополнительной литературы вы можете найти в crossref:bibliography[bibliography,Библиография].
+
+[[preface-changes-from2]]
+== Изменения по сравнению со второй редакцией
+
+Третья редакция является кульминацией более чем двух лет работы отдельных членов проекта документации FreeBSD. Вот основные изменения в новой редакции:
+
+* crossref:config[config-tuning, Настройка и оптимизация], Настройка и оптимизация, была расширена новой информацией о ACPI управлении питанием и ресурсами, системной утилите cron и дополнительных параметрах оптимизации ядра.
+* crossref:security[security, Безопасность], Безопасность, была расширена новой информацией о виртуальных частных сетях (VPN), списках контроля доступа файловой системы (ACL), и сообщениях безопасности.
+* crossref:mac[mac, Принудительный контроль доступа (MAC)], Принудительный контроль доступа (MAC), новая глава этой редакции. Она описывает, что такое MAC и как этот механизм может быть использован для защиты системы FreeBSD.
+* crossref:disks[disks, Устройства хранения], Устройства хранения, была расширена новой информацией о устройствах хранения USB, образах файловой системы, квотах файловой системы, файловых системах в файлах и в сети, зашифрованных дисковых разделах.
+* К crossref:ppp-and-slip[ppp-and-slip, PPP и SLIP], PPP и SLIP, был добавлен раздел о решении проблем.
+* crossref:mail[mail, Электронная почта], Электронная почта, была расширена новой информацией об использовании альтернативных транспортных агентов, SMTP аутентификации, UUCP, fetchmail, procmail, и другими разделами повышенной сложности.
+* crossref:network-servers[network-servers, Сетевые серверы], Сетевые серверы, появилась в этой редакции. Эта главы включает информацию о установке Apache HTTP Server, FTPd, и настройке Samba сервера для клиентов Microsoft Windows. Некоторые разделы были перемещены сюда из crossref:advanced-networking[advanced-networking, Сложные вопросы работы в сети], Сложные вопросы работы в сети.
+* crossref:advanced-networking[advanced-networking, Сложные вопросы работы в сети], Сложные вопросы работы в сети, была расширена новой информацией об использовании устройств Bluetooth в FreeBSD, настройке беспроводных сетей, и сетях Asynchronous Transfer Mode (ATM).
+* Был добавлен глоссарий, объединяющий информацию о технических терминах, используемых в книге.
+* Множество эстетических улучшений были внесены в таблицы и иллюстрации этой книги.
+
+[[preface-changes]]
+== Изменения во второй редакции
+
+Вторая редакция является кульминацией более чем двухлетней работы членов Проекта документации FreeBSD. Нижеследующий список перечисляет все значительные изменения, внесенные в эту редакцию:
+
+* Был добавлен полный указатель тем.
+* Все ASCII-иллюстрации были заменены на графические.
+* Был добавлен стандартный краткий обзор к каждому разделу для того, чтобы читатель мог получить представление о содержании раздела и о том, что необходимо знать для его изучения.
+* Содержимое было логически реорганизовано на три части: "В Начале", "Системное администрирование" и "Приложения".
+* crossref:install[install, Установка FreeBSD версий 8.X и более ранних] ("Установка FreeBSD") была полностью переписана, добавлено большое количество снимков экрана, чтобы облегчить понимание текста для новых пользователей.
+* crossref:basics[basics, Основы UNIX] ("Основы UNIX(R)") была расширена и содержит дополнительную информацию о процессах, даемонах и сигналах.
+* crossref:ports[ports, Установка приложений. порты и пакеты] ("Установка приложений: порты и пакеты") была расширена и содержит дополнительную информации об управлении бинарными пакетами.
+* crossref:x11[x11, X Window System] ("X Window System") была полностью переписана и обращает больше внимания на современные технологии для рабочего стола, такие, как KDE и GNOME на XFree86(TM) 4.X.
+* crossref:boot[boot, Процесс загрузки FreeBSD] ("Процесс загрузки FreeBSD") была расширена.
+* crossref:disks[disks, Устройства хранения] ("Устройства хранения") была составлена из того, что раньше было двумя различными главами: "Диски" и "Резервное копирование". Мы считаем, что данные темы будут проще и более полно описаны как одна глава. Был добавлен раздел о программном и аппаратном RAID.
+* crossref:serialcomms[serialcomms, Последовательные соединения] ("Последовательные коммуникации") была полностью реорганизована и обновлена для FreeBSD 4.X/5.X.
+* crossref:ppp-and-slip[ppp-and-slip, PPP и SLIP] ("PPP и SLIP") была существенно обновлена.
+* Было добавлено множество новых разделов в crossref:advanced-networking[advanced-networking, Сложные вопросы работы в сети] ("Сложные вопросы работы в сети").
+* crossref:mail[mail, Электронная почта] ("Электронная почта") была расширена, теперь она включает больше информации о настройке sendmail.
+* crossref:linuxemu[linuxemu, Двоичная совместимость с Linux] ("Работа с приложениями, написанными для Linux(R)") была дополнена включением информации об установке Oracle(R) и SAP(R) R/3(R).
+* Следующие новые темы были рассмотрены в этой, второй, редакции:
+
+** Настройка и оптимизация (crossref:config[config-tuning, Настройка и оптимизация]).
+** Мультимедиа (crossref:multimedia[multimedia, Мультимедиа])
+
+[[preface-overview]]
+== Структура этой книги
+
+Эта книга разбита на пять частей. В первой части, _В начале_, рассматривается установка и основные навыки использования FreeBSD. Предполагается, что читатель освоит эти разделы последовательно, возможно пропуская разделы, в которых обсуждаются уже знакомые для него темы. Вторая часть, _Общие задачи_, рассказывает о некоторых наиболее часто используемых возможностях FreeBSD. Этот раздел и все последующие могут быть прочитаны не по порядку. Каждая глава начинается с краткого обзора, который описывает, о чём говорится в ней и что читатель должен будет знать для прочтения этой главы. Это сделано для того, чтобы случайно встретивший этот материал читатель мог найти разделы, которые его интересуют. В третьей части, _Системное администрирование_, рассмотрены вопросы администрирования. В четвертой части, _Сетевые коммуникации_, охвачены темы, связанные с серверами и сетью. Пятая часть содержит приложения и справочную информацию.
+
+_crossref:introduction[introduction, Введение], Введение_::
+Знакомит пользователя с FreeBSD. Рассказывает об истории проекта FreeBSD, его задачах и модели разработки.
+
+_crossref:install[install, Установка FreeBSD версий 8.X и более ранних], Установка_::
+Проводит пользователя через весь процесс установки. Обсуждаются также некоторые более сложные вопросы установки, такие как установка по последовательной консоли.
+
+_crossref:basics[basics, Основы UNIX], Основы UNIX(R)_::
+Рассказывает об основных командах и функциональности операционной системы FreeBSD. Если вы знакомы с Linux(R) или другой UNIX(R)-подобной операционной системой, возможно, вы пропустите эту главу.
+
+_crossref:ports[ports, Установка приложений. порты и пакеты], Установка приложений: порты и пакеты_::
+Рассказывает о процессе установки программного обеспечения сторонних производителей с использованием "Коллекции Портов FreeBSD" и стандартных бинарных пакетов.
+
+_crossref:x11[x11, X Window System], X Window System_::
+Описывает X Window System вообще и использование X11 под управлением FreeBSD в частности. Также описывает популярные окружения рабочего стола, такие как KDE и GNOME.
+
+_crossref:desktop[desktop, Приложения для настольного компьютера], Приложения для настольного компьютера_::
+Перечисляет некоторые популярные приложения для рабочей станции, такие как веб-браузеры и офисные пакеты и описывает процесс их установки на FreeBSD.
+
+_crossref:multimedia[multimedia, Мультимедиа], Мультимедиа_::
+Показывает, как настроить поддержку воспроизведения звука и видео на вашей системе. Также описывает некоторые примеры приложений для воспроизведения звука и видео.
+
+_crossref:kernelconfig[kernelconfig, Настройка ядра FreeBSD], Настройка ядра FreeBSD_::
+Объясняет, почему вам может понадобиться перенастроить ядро и детально описывает процесс настройки, сборки и установки нового ядра.
+
+_crossref:printing[printing, Печать], Печать_::
+Рассказывает об управлении принтерами в FreeBSD, включая информацию об титульных страницах, учёте использования принтеров и первоначальной настройке.
+
+_crossref:linuxemu[linuxemu, Двоичная совместимость с Linux], Двоичная совместимость с Linux(R)_::
+Описывает возможности Linux(R)-совместимости в FreeBSD. Также предоставляет детальные инструкции по установке многих популярных приложений для Linux(R), таких как: Oracle(R), SAP(R) R/3(R) и Mathematica(R).
+
+_crossref:config[config-tuning, Настройка и оптимизация], Настройка и оптимизация_::
+Описывает всевозможные параметры настройки FreeBSD, которые может использовать системный администратор для оптимальной настройки системы. Также описывает различные конфигурационные файлы, используемые в FreeBSD и расположение этих файлов на диске.
+
+_crossref:boot[boot, Процесс загрузки FreeBSD], Процесс загрузки FreeBSD_::
+Рассказывает о процессе загрузки FreeBSD и объясняет, как управлять этим процессом при помощи различных настроек.
+
+_crossref:users[users-synopsis, Пользователи и основы управления учётными записями], Пользователи и основы управления учётными записями_::
+Рассказывает о создании и управлении пользовательскими учётными записями. Также обсуждает установку ограничений ресурсов для пользователей и другие задачи управления пользователями.
+
+_crossref:security[security, Безопасность], Безопасность_::
+Описывает множество различных утилит, которые помогут вам поддерживать FreeBSD в безопасном, надёжном состоянии, включая Kerberos, IPsec и OpenSSH.
+
+_crossref:mac[mac, Принудительный контроль доступа (MAC)], Принудительный контроль доступа (MAC)_::
+Описывает что такое принудительный контроль доступа (Mandatory Access Control, MAC) и как этот механизм может быть использован для защиты системы FreeBSD.
+
+_crossref:disks[disks, Устройства хранения], Устройства хранения_::
+Описывает как управлять накопителями информации и файловыми системами в FreeBSD, включая физические диски, массивы RAID, оптические и ленточные носители, диски в оперативной памяти и сетевые файловые системы.
+
+_crossref:geom[GEOM, GEOM. Модульная инфраструктура преобразования дисковых запросов], GEOM_::
+Рассказывает о подсистеме GEOM в FreeBSD и описывает различные поддерживаемые уровни RAID.
+
+_crossref:filesystems[filesystems, Поддержка файловых систем], Поддержка файловых систем_::
+Исследует поддержку неосновных файловых систем во FreeBSD, таких как, например, Sun(TM) Z File System.
+
+_crossref:l10n[l10n, Локализация - использование и настройка i18n/L10n], Локализация - I18N/L10N использование и настройка_::
+Описывает использование FreeBSD с языками, отличными от английского. Рассказывает о локализации на уровне системы и отдельных приложений.
+
+_crossref:cutting-edge[updating-upgrading, Обновление системы и смена версии FreeBSD], Обновление системы и смена версии_::
+Объясняет различия между FreeBSD-STABLE, FreeBSD-CURRENT и FreeBSD-RELEASE. Рассказывает, кому из пользователей будет полезно отслеживать версию системы в разработке и вкратце описывает этот процесс.
+
+_crossref:serialcomms[serialcomms, Последовательные соединения], Последовательные соединения_::
+Объясняет, как подключать терминалы и модемы к вашей системе FreeBSD, как в серверном, так и в клиентском режиме.
+
+_crossref:ppp-and-slip[ppp-and-slip, PPP и SLIP], PPP и SLIP_::
+Описывает использование PPP, SLIP или PPP через Ethernet для соединения с удалёнными системами при помощи FreeBSD.
+
+_crossref:mail[mail, Электронная почта], Электронная почта_::
+Описывает использование различных компонентов почтового сервера и более углублённо рассматривает простые вопросы конфигурации для наиболее популярного программного обеспечения почтовых серверов: sendmail.
+
+_crossref:network-servers[network-servers, Сетевые серверы], Сетевые серверы_::
+Предоставляет детальные инструкции и примеры файлов настройки для использования компьютера с FreeBSD в качестве файлового сервера (NFS), сервера доменных имен (DNS), сервера сетевой информационной системы (NIS), или сервера точного времени (ntpd).
+
+_crossref:firewalls[firewalls, Межсетевые экраны], Брандмауэры_::
+Описывает принципы, на которых основаны программные брандмауэры, и содержит детали конфигурирования различных брандмауэров, доступных в FreeBSD.
+
+_crossref:advanced-networking[advanced-networking, Сложные вопросы работы в сети], Сложные вопросы работы в сети_::
+Рассматривает множество вопросов работы с сетью, включая совместный доступ компьютеров вашей локальной сети к интернет, расширенные вопросы маршрутизации, беспроводные соединения, bluetooth, ATM, IPv6 и многое другое.
+
+_crossref:mirrors[mirrors, Получение FreeBSD], Получение FreeBSD_::
+Перечисляет различные источники, из которых можно получить FreeBSD на CDROM или DVD, равно как и различные сайты в интернет, с которых можно скачать и установить FreeBSD.
+
+_crossref:bibliography[bibliography, Библиография], Библиография_::
+Эта книга касается многих различных тем, которые могут сподвигнуть вас на более детальное изучение. Библиография перечисляет множество отличных книг, упоминаемых в тексте.
+
+_crossref:eresources[eresources, Ресурсы в интернет], Ресурсы в интернет_::
+Описывает множество форумов, доступных для пользователей FreeBSD, где можно задать вопросы и поучаствовать в технических обсуждениях FreeBSD.
+
+_crossref:pgpkeys[pgpkeys, Ключи PGP], Ключи PGP_::
+Содержит ключи PGP некоторых разработчиков FreeBSD.
+
+[[preface-conv]]
+== Договоренности, используемые в этой книге
+
+Для того чтобы обеспечить целостность и простоту чтения текста в данной книге, мы применяем некоторые договорённости.
+
+[[preface-conv-typographic]]
+=== Типографические договорённости
+
+_Наклонный шрифт_::
+_Наклонный шрифт_ используется для имен файлов, адресов в интернет (URL), выделенного текста и первого применения технических терминов.
+
+`Моноширинный шрифт`::
+`Моноширинных шрифт` используется для сообщений об ошибках, команд, имен пользователей, названий групп, названий устройств, переменных и фрагментов кода.
+
+Полужирный шрифт::
+Полужирный шрифт используется для обозначения приложений, команд и параметров.
+
+[[preface-conv-commands]]
+=== Пользовательский ввод
+
+Клавиши представляются в виде *полужирного текста* для того, чтобы выделяться среди остального текста. Комбинации клавиш, которые должны вводиться одновременно, разделяются символом `+`, например:
+
+kbd:[Ctrl+Alt+Del]
+
+Это будет означать, что пользователь должен нажать клавиши kbd:[Ctrl], kbd:[Alt] и kbd:[Del] одновременно.
+
+Комбинации клавиш, которые должны вводиться последовательно, разделяются запятыми, например:
+
+kbd:[Ctrl+X], kbd:[Ctrl+S]
+
+Это будет означать, что пользователь должен нажать kbd:[Ctrl] и kbd:[X] одновременно, после чего одновременно нажать kbd:[Ctrl] и kbd:[S].
+
+[[preface-conv-examples]]
+=== Примеры
+
+Примеры, которые начинаются с [.filename]#E:\># обозначают команды MS-DOS(R). Если не указано обратного, эти команды могут вводиться из окна "Сеанс MS-DOS(R)" в современных системах Microsoft(R) Windows(R).
+
+[source,bash]
+....
+E:\> tools\fdimage floppies\kern.flp A:
+....
+
+Примеры, которые начинаются с # обозначают команды, которые должны быть запущены с правами суперпользователя в FreeBSD. Вы можете войти в систему как пользователь `root` для того, чтобы ввести эти команды или войти в систему обычным пользователем и использовать man:su[1] для того, чтобы получить привилегии суперпользователя.
+
+[source,bash]
+....
+# dd if=kern.flp of=/dev/fd0
+....
+
+Примеры, начинающиеся с %, указывают, что команда должна быть исполнена с правами обычного пользователя. Если не указано обратного, используется синтаксис C-shell для установки переменных окружения и других команд.
+
+[source,bash]
+....
+% top
+....
+
+[[preface-acknowledgements]]
+== Благодарности
+
+Книга, которую вы держите в руках являет собой результат труда многих сотен людей по всему миру. Не имеет значения, присылали ли они исправления опечаток или предоставляли целые главы, их труд был полезен.
+
+Несколько компаний поддерживали разработку этого документа, оплачивая авторам их труд, оплачивая публикацию и т.д. В частности, BSDi (в последствии приобретённая компанией http://www.windriver.com[Wind River Systems]) оплачивала труд по улучшению этой книги участникам Проекта Документации FreeBSD, что в итоге сделало возможным выпуск первой печатной версии в марте 2000 года (ISBN 1-57176-241-8). Впоследствии компания Wind River Systems оплатила работу нескольких авторов по улучшению генерации книги в удобном для печати виде и добавлению нескольких глав. Кульминация этой работы являла собой публикацию второй печатной версии в ноябре 2001 года (ISBN 1-57176-303-1). В 2003-2004 годах http://www.freebsdmall.com[FreeBSD Mall, Inc] заплатила нескольким контрибьюторам за улучшение Handbook при подготовке к третьей редакции.
diff --git a/documentation/content/ru/books/handbook/printing/_index.adoc b/documentation/content/ru/books/handbook/printing/_index.adoc
new file mode 100644
index 0000000000..0f703f2c82
--- /dev/null
+++ b/documentation/content/ru/books/handbook/printing/_index.adoc
@@ -0,0 +1,2416 @@
+---
+title: Глава 10. Печать
+part: Часть II. Общие задачи
+prev: books/handbook/kernelconfig
+next: books/handbook/linuxemu
+---
+
+[[printing]]
+= Печать
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 10
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/printing/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/printing/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/printing/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[printing-synopsis]]
+== Краткий обзор
+
+FreeBSD можно использовать для печати на широком спектре принтеров, от старых матричных до новейших лазерных, без исключений, что позволяет создавать высококачественные распечатки из используемых приложений.
+
+FreeBSD можно также сконфигурировать для работы в качестве сервера печати в сети; в этом качестве FreeBSD может получать задания печати от множества других компьютеров, включая другие компьютеры под управлением ОС FreeBSD, хосты Windows(R) и Mac OS(R). FreeBSD будет гарантировать печать заданий по одному и может сохранять информацию о том, какие пользователи и машины выполняют основную часть печати, выдавать страницы-"баннеры", показывающие, кому принадлежит распечатка, и многое другое.
+
+При прочтении этой главы вы узнаете:
+
+* Как конфигурировать спулер печати FreeBSD.
+* Как устанавливать фильтры печати для специфической обработки определенных заданий печати, включая преобразование поступающих на печать документов в форматы, которые понимает принтер.
+* Как включить при печати колонтитулы или выдачу страниц-баннеров.
+* Как печатать на принтеры, подключенные к другим компьютерам.
+* Как печатать на принтеры, подключенные непосредственно к сети.
+* Как задавать ограничения для принтера, включая ограничение размера заданий печати и запрет печати для отдельных пользователей.
+* Как сохранять статистическую информацию о печати и учитывать использование принтера.
+* Как решать проблемы печати.
+
+Прежде чем читать эту главу, вы должны:
+
+* Знать, как сконфигурировать и установить новое ядро (crossref:kernelconfig[kernelconfig, Настройка ядра FreeBSD]).
+
+[[printing-intro-spooler]]
+== Введение
+
+Для использования принтеров в ОС FreeBSD вы можете настроить их для работы с системой спулинга печати Беркли (Berkeley line printer spooling system), также известной как система спулинга LPD. Это - стандартная система управления принтером во FreeBSD. В этой главе представлена система спулинга LPD и описано ее конфигурирование.
+
+Если вы уже знакомы с LPD или другой системой спулинга печати, вы можете сразу перейти к разделу <<printing-intro-setup,Базовая настройка>>.
+
+LPD управляет всеми аспектами работы принтеров хоста. Она отвечает за несколько вещей:
+
+* Она управляет доступом к непосредственно подключенным принтерам и принтерам, подключенным к другим хостам в сети.
+* Она позволяет пользователям посылать файлы на печать; эти данные называют _заданиями_.
+* Она предотвращает одновременный доступ к принтеру нескольких пользователей путем поддержки _очереди_ для каждого принтера.
+* Она позволяет печатать _страницы заголовка_ (их также называют _баннерными_ или _начальными_ страницами), чтобы пользователи могли легко находить распечатанные задания в пачке распечаток.
+* Она обеспечивает установку параметров взаимодействия для принтеров, подключенных к последовательным портам.
+* Она может отправлять задания по сети спулеру LPD на другом хосте.
+* Она может применять специальные фильтры для форматирования заданий для печати на разных языках описания страниц или задействования специфических возможностей принтера.
+* Она учитывает использование принтера.
+
+С помощью файла конфигурации ([.filename]#/etc/printcap#) и за счет предоставления специальных программ фильтрования, можно потребовать от системы LPD выполнять все или некоторые из перечисленных выше функций на широком спектре принтерного оборудования.
+
+[[printing-intro-why]]
+=== Зачем использовать спулер
+
+Если вы - единственный пользователь системы, вы можете спросить, зачем возиться со спулером, если управление доступом, страницы заголовка или учет использования принтера вам не нужны. Хотя можно обеспечить непосредственный доступ к принтеру, в любом случае следует использовать спулер, поскольку:
+
+* LPD печатает задания в фоновом режиме; вам не придется ждать, пока данные будут скопированы на принтер.
+* LPD позволяет легко пропустить задание печати через фильтры для добавления заголовков с датой/временем или преобразования специального формата файлов (такого как TeX DVI) в формат, который понимает принтер. Вам не придется выполнять эти шаги вручную.
+* Многие свободно распространяемые и коммерческие программы, обеспечивающие возможность печати, обычно предполагают взаимодействие со спулером системы. Путем настройки системы спулинга вы упростите поддержку другого программного обеспечения, которое может быть добавлено в дальнейшем или уже установлено.
+
+[[printing-intro-setup]]
+== Основная настройка
+
+Для использования принтеров с системой спулинга LPD, необходимо настроить как сам принтер, так и программное обеспечение LPD. Этот документ описывает два уровня настройки:
+
+* См. раздел <<printing-simple,Простая настройка принтера>>, чтобы узнать, как подключить принтер, объяснить LPD, как с ним взаимодействовать, и отправлять на принтер простые текстовые файлы.
+* См. раздел <<printing-advanced,Расширенная настройка принтера>>, чтобы узнать, как печатать файлы множества специальных форматов, как печатать страницы заголовка, печатать по сети, управлять доступом к принтерам и учитывать использование принтера.
+
+[[printing-simple]]
+=== Простая настройка принтера
+
+В этом разделе описано, как сконфигурировать принтер и программное обеспечение LPD для использования принтера. Здесь рассматриваются следующие вопросы:
+
+* В разделе <<printing-hardware,Настройка оборудования>> представлены советы по подключению принтера к порту компьютера.
+* В разделе <<printing-software,Настройка программного обеспечения>> показано, как настроить файл конфигурации спулера LPD ([.filename]#/etc/printcap#).
+
+Если вы настраиваете принтер, использующий для принятия заданий печати сетевой протокол, вместо локальных интерфейсов компьютера, см. раздел <<printing-advanced-network-net-if,Принтеры с сетевыми интерфейсами>>.
+
+Хотя этот раздел и назван "Простая настройка принтера", это, на самом деле, достаточно сложно. Заставить принтер работать с компьютером и спулером LPD - самая сложная часть. Расширенные опции, вроде выдачи страниц заголовков и учета использования, установить несложно, как только принтер заработает.
+
+[[printing-hardware]]
+==== Настройка оборудования
+
+В этом разделе описаны различные способы подключения принтера к ПК. Рассматриваются различные порты и кабели, а также параметры конфигурации ядра, которые может потребоваться установить, чтобы ОС FreeBSD могла взаимодействовать с принтером.
+
+Если вы уже подключили ваш принтер и успешно печатали на него в другой операционной системе, можете перейти к разделу <<printing-software,Настройка программного обеспечения>>.
+
+[[printing-ports]]
+===== Порты и кабели
+
+Принтеры, которые продаются сегодня для использования на ПК, обычно поддерживают один или несколько из следующих интерфейсов:
+
+* _Последовательные_ интерфейсы, также известные как RS-232, или COM-порты, используют для посылки данных на принтер последовательный порт компьютера. Последовательные интерфейсы широко распространены в компьютерной индустрии, кабели для них легко найти и просто сделать. Для последовательных интерфейсов иногда нужны специальные кабели, и для их использования может потребоваться настраивать достаточно сложные опции взаимодействия. Большинство последовательных портов ПК имеют максимальную скорость передачи 115200 бит/сек, поэтому печатать через них большие графические задания неудобно.
+* _Параллельные_ интерфейсы используют параллельный порт компьютера для посылки данных на принтер. Параллельные интерфейсы широко распространены на рынке ПК и работают быстрее, чем последовательные RS-232. Кабели легко найти, но сделать самостоятельно сложнее. При использовании параллельных интерфейсов опции взаимодействия обычно задавать не надо, что делает их конфигурирование существенно проще.
++
+Параллельные интерфейсы иногда называют интерфейсами "Centronics", по названию типа разъема на принтере.
+* Интерфейсы USB (сокращение от Universal Serial Bus - универсальная последовательная шина), могут работать на еще больших скоростях, чем параллельные или последовательные интерфейсы RS-232. Кабели для них - простые и дешевые. USB превосходит последовательный RS-232 и параллельный интерфейсы для печати, но не слишком хорошо поддерживается в UNIX(R)-системах. Обойти эту проблему можно, купив принтер с двумя интерфейсами, USB и параллельным, как у многих принтеров.
+
+В общем случае, параллельные интерфейсы обычно обеспечивают только одностороннюю передачу (с компьютера на принтер), тогда как последовательные и USB поддерживают двустороннюю. Более новые параллельные порты (EPP и ECP) и принтеры могут взаимодействовать в обоих направлениях под FreeBSD, если используется кабель, соответствующий стандарту IEEE-1284.
+
+Двустороннее взаимодействие с принтером через параллельный порт обычно выполняется одним из двух способов. Первый метод опирается на использование специально созданного драйвера принтера для FreeBSD, который поддерживает специфический язык данного принтера. Этот метод типичен для струйных принтеров и может использоваться для получения информации об уровне чернил и другой информации о состоянии. Второй метод используется, когда принтер поддерживает PostScript(R).
+
+Фактически, задания PostScript(R) являются программами, посылаемыми для выполнения принтеру; они вообще могут не выдавать результат на бумагу и возвращать его непосредственно компьютеру. PostScript(R) также использует двустороннее взаимодействие для сообщения компьютеру о проблемах, таких как ошибки в PostScript(R)-программе или замятие бумаги. Такая информация может пригодиться пользователям. Более того, лучший способ эффективного учета использования PostScript(R)-принтера требует двустороннего взаимодействия: вы запрашиваете у принтера значение счетчика страниц (сколько страниц напечатал принтер за все время существования), затем посылаете задание пользователя, затем снова запрашиваете значение его счетчика страниц. Вычитаем одно значение из другого, и узнаем, сколько бумаги потратил пользователь.
+
+[[printing-parallel]]
+===== Параллельные порты
+
+Для подключения принтера через параллельный интерфейс, соедините принтер и компьютер кабелем Centronics. Инструкции для принтера, для компьютера или обе должны полностью описывать эту процедуру.
+
+Помните, какой параллельный порт компьютера вы использовали. Первый параллельный порт в ОС FreeBSD - [.filename]#ppc0#; второй - [.filename]#ppc1#, и так далее. Имена устройств для принтеров используют ту же схему: [.filename]#/dev/lpt0# для принтера на первом параллельном порту и т.д.
+
+[[printing-serial]]
+===== Последовательные порты
+
+Для подключения принтера через последовательный интерфейс, соедините принтер с компьютером подходящим последовательным кабелем. Инструкции для принтера, для компьютера или обе должны полностью описывать эту процедуру.
+
+Если вы не знаете, что такое "подходящий последовательный кабель", можете попробовать использовать один из следующих:
+
+* _Модемный_ кабель соединяет каждый штырёк на одном конце кабеля напрямую с соответствующим штырьком на другом конце. Кабель такого типа также называют кабелем "DTE-to-DCE".
+*
++
+_Нуль-модемный_ кабель соединяет часть штырьков напрямую, другие - меняет (пересылку данных на приём данных, например), а некоторые - закорачивает на каждом разъеме. Кабель такого типа также называют кабелем "DTE-to-DTE" cable.
+* Кабель _последовательного принтера_, необходимый для некоторых редко используемых принтеров, похож на нуль-модемный кабель, но посылает часть сигналов на соответствующие штырьки, а не закорачивает их.
+
+Вам надо также настроить эти параметры взаимодействия с принтером, обычно - через элементы управления на лицевой панели или переключатели (DIP switches) на принтере. Выберите максимальную скорость передачи `bps` (бит в секунду, иногда - _baud rate_), которую могут поддерживать как компьютер, так и принтер. Выберите 7 или 8 битов данных; четность none, even или odd; и 1 или 2 стоп-бита. Также надо выбрать протокол управления передачей: none или XON/XOFF (также известный как "внутриполосный" или "программный"). Запомните выбранные установки для последующего конфигурирования программного обеспечения.
+
+[[printing-software]]
+==== Настройка программного обеспечения
+
+В этом разделе описана настройка программного обеспечения, необходимая для печати с помощью системы спулинга LPD в ОС FreeBSD.
+
+Вот план действий, которые необходимо выполнить:
+
+[.procedure]
+====
+. При необходимости, сконфигурировать в ядре поддержку порта, к которому подключен принтер; в разделе <<printing-kernel,Конфигурирование ядра>> описано, что надо сделать.
+. Установить режим взаимодействия для параллельного порта, если используется параллельный порт; детали представлены в разделе <<printing-parallel-port-mode,Настройка режима взаимодействия для параллельного порта>>.
+. Проверить, может ли операционная система посылать данные на принтер. В разделе <<printing-testing,Проверка взаимодействия с принтером>> даны советы, как это сделать.
+. Настроить LPD для принтера, изменяя файл [.filename]#/etc/printcap#. Как это сделать описано далее в этой главе.
+====
+
+[[printing-kernel]]
+===== Конфигурирование ядра
+
+Ядро операционной системы компилируется для работы с конкретным набором устройств. Последовательный или параллельный интерфейс для принтера входит в этот набор. Поэтому может понадобиться добавить поддержку для дополнительного последовательного или параллельного порта, если он еще не сконфигурирован в ядре.
+
+Чтобы узнать, поддерживает ли используемое в настоящий момент ядро последовательный интерфейс, наберите:
+
+[source,bash]
+....
+# grep sioN /var/run/dmesg.boot
+....
+
+Где _N_ - номер последовательного порта, начиная с нуля. Если вы получаете результат, подобный следующему:
+
+[source,bash]
+....
+sio2 at port 0x3e8-0x3ef irq 5 on isa
+sio2: type 16550A
+....
+
+значит, ядро поддерживает порт.
+
+Чтобы узнать, поддерживает ли ядро параллельный интерфейс, наберите:
+
+[source,bash]
+....
+# grep ppcN /var/run/dmesg.boot
+....
+
+Где _N_ номер параллельного порта, начиная с нуля. Если вы получаете результат, подобный следующему:
+
+[source,bash]
+....
+ppc0: <Parallel port> at port 0x378-0x37f irq 7 on isa0
+ppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode
+ppc0: FIFO with 16/16/8 bytes threshold
+....
+
+значит, ядро поддерживает порт.
+
+Может потребоваться переконфигурировать ядро, чтобы операционная система распознала и использовала параллельный или последовательный порт, используемый для подключения принтера.
+
+Чтобы добавить поддержку последовательного порта, обратитесь к разделу, посвященному конфигурированию ядра. Чтобы добавить поддержку параллельного порта, почитайте этот же раздел _и_ следующий раздел.
+
+[[printing-parallel-port-mode]]
+==== Настройка режима взаимодействия для параллельного порта
+
+При использовании параллельного интерфейса можно выбрать, должна ли ОС FreeBSD взаимодействовать с принтером на основе прерываний или путем опроса. Универсальный драйвер принтера (man:lpt[4]) во FreeBSD использует систему man:ppbus[4], которая управляет чипсетом порта с помощью драйвера man:ppc[4].
+
+* Метод взаимодействия _на основе прерываний_ является стандартным для ядра GENERIC. По этому методу, операционная система использует линию запроса прерывания (IRQ line) для определения готовности принтера к приему данных.
+* Метод взаимодействия _путем опроса_ требует от операционной системы постоянно запрашивать принтер, готов ли он к приему данных. Когда он отвечает, что готов, ядро посылает дополнительные данные.
+
+Метод взаимодействия на основе прерываний обычно работает несколько быстрее, но использует ценную линию запроса прерывания. Про некоторые новые принтеры HP утверждают, что они работают некорректно в режиме взаимодействия на основе прерываний, вероятно, из-за некоторой (еще не вполне понятной) проблемы синхронизации. Для этих принтеров необходимо устанавливать режим опроса. Используйте тот режим, который работает. Некоторые принтеры будут работать в обоих режимах, но оказываются крайне медленными в режиме на основе прерываний.
+
+Режим взаимодействия можно установить двумя способами: конфигурируя ядро или с помощью программы man:lptcontrol[8].
+
+_Для установки режима взаимодействия путем конфигурирования ядра:_
+
+[.procedure]
+====
+
+. Отредактируйте файл конфигурации ядра. Найдите запись `ppc0`. Если вы настраиваете второй параллельный порт, ищите запись `ppc1`. Используйте запись `ppc2` для третьего порта, и так далее.
++
+** Если необходимо установить режим на основе прерываний, отредактируйте следующую строку:
++
+[.programlisting]
+....
+hint.ppc.0.irq="N"
+....
++
+в файле [.filename]#/boot/device.hints#, заменив _N_ соответствующим номером IRQ. Файл конфигурации ядра также должен содержать драйвер man:ppc[4]:
++
+[source,bash]
+....
+device ppc
+....
++
+** Если необходимо установить режим опроса, удалите из файла [.filename]#/boot/device.hints# следующую строку:
++
+[.programlisting]
+....
+hint.ppc.0.irq="N"
+....
++
+В некоторых случаях, этого недостаточно для перевода порта в режим опроса под FreeBSD. Чаще всего, проблема связана с драйвером man:acpi[4], который может опрашивать и подключать устройства и, тем самым, управлять режимом доступа к порту принтера. Чтобы решить эту проблему, проверьте конфигурацию man:acpi[4].
++
+. Сохраните файл. Затем сконфигурируйте, соберите и установите ядро и перезагрузите систему. Подробнее см. в разделе crossref:kernelconfig[kernelconfig,конфигурирование ядра].
+====
+
+_Для настройки режима взаимодействия с помощью утилиты_ man:lptcontrol[8]:
+
+[.procedure]
+====
+
+. Введите команду:
++
+[source,bash]
+....
+# lptcontrol -i -d /dev/lptN
+....
++
+для установки режима взаимодействия на основе прерываний для `lpt__N__`.
+. Введите команду:
++
+[source,bash]
+....
+# lptcontrol -p -d /dev/lptN
+....
++
+для установки режима взаимодействия по опросу для `lpt__N__`.
+====
+
+Вы можете поместить эти команды в файл [.filename]#/etc/rc.local# для установки требуемого режима при каждой загрузке системы. Дополнительную информацию об этом ищите на странице справочного руководства man:lptcontrol[8].
+
+[[printing-testing]]
+==== Проверка взаимодействия с принтером
+
+Прежде чем переходить к конфигурированию системы спулинга, надо убедиться, что операционная система может успешно посылать данные на принтер. Намного проще отлаживать взаимодействие с принтером и систему спулинга отдельно.
+
+Для тестирования принтера мы пошлем на него текст. Для принтеров, которые могут непосредственно печатать посланные на них символы, идеально подходит программа man:lptest[1]: она генерирует все 96 печатных символов ASCII в 96 строках.
+
+Для PostScript(R)- (или основанного на другом языке) принтера, необходим более сложный тест. Подойдет небольшая PostScript(R)-программа, вроде следующей:
+
+[.programlisting]
+....
+%!PS
+100 100 moveto 300 300 lineto stroke
+310 310 moveto /Helvetica findfont 12 scalefont setfont
+(Is this thing working?) show
+showpage
+....
+
+Представленный выше PostScript(R)-код можно поместить в в файл и использовать, как показано в примерах в следующих разделах.
+
+[NOTE]
+====
+Когда в этом документе речь идет о языке принтера, подразумевается язык типа PostScript(R), а не PCL компании Hewlett Packard. Хотя PCL имеет прекрасные функциональные возможности, в нем можно смешивать обычный текст с его управляющими последовательностями. PostScript(R) не позволяет непосредственно печатать обычный текст, и это язык принтера именно того рода, для которого надо выполнять специальные настройки.
+====
+
+[[printing-checking-parallel]]
+===== Проверка параллельного принтера
+
+В этом разделе описано, как проверить, может ли ОС FreeBSD взаимодействовать с принтером, подключенным к параллельному порту.
+
+_Для тестирования принтера на параллельном порту:_
+
+[.procedure]
+====
+. Станьте пользователем `root` с помощью команды man:su[1].
+. Пошлите данные на принтер.
+
+** Если принтер может печатать обычный текст, используйте утилиту man:lptest[1]. Введите команду:
++
+[source,bash]
+....
+# lptest > /dev/lptN
+....
++
+Где _N_ - номер параллельного порта, начиная с нуля.
+** Если принтер понимает PostScript(R) или другой язык принтера, пошлите на принтер небольшую программу. Введите команду:
++
+[source,bash]
+....
+# cat > /dev/lptN
+....
++
+Затем, построчно, _внимательно_ введите программу, поскольку вы не сможете отредактировать строку после нажатия клавиши `RETURN` или `ENTER`. По окончании ввода программы, нажмите `CONTROL+D` или другую комбинацию клавиш, используемую для ввода символа конца файла.
++
+Можно также поместить программу в файл и выполнить команду:
++
+[source,bash]
+....
+# cat file > /dev/lptN
+....
++
+Где _file_ - имя файла, содержащего программу, которую вы хотите послать принтеру.
+====
+
+Вы должны увидеть распечатку. Не переживайте, если текст выглядит не так, как предполагалось; этими проблемами мы займемся позже.
+
+[[printing-checking-serial]]
+===== Проверка последовательного принтера
+
+В этом разделе описано, как проверить, может ли ОС FreeBSD взаимодействовать с принтером, подключенным к последовательному порту.
+
+_Для тестирования принтера на последовательном порту:_
+
+[.procedure]
+====
+
+. Станьте пользователем `root` с помощью команды man:su[1].
+. Отредактируйте файл [.filename]#/etc/remote#. Добавьте следующую запись:
++
+[.programlisting]
+....
+printer:dv=/dev/port:br#bps-rate:pa=parity
+....
++
+Где _port_ - специальный файл устройства для последовательного порта (`ttyd0`, `ttyd1` и т.д.), _bps-rate_ - скорость обработки данных принтером, в битах в секунду, а _parity_ - требуемая принтером четность (значение `even`, `odd`, `none` или `zero`).
++
+Вот пример записи для принтера, подключенного к третьему последовательному порту на скорости 19200 bps без четности:
++
+[.programlisting]
+....
+printer:dv=/dev/ttyd2:br#19200:pa=none
+....
++
+. Подключитесь к принтеру с помощью man:tip[1]. Введите команду:
++
+[source,bash]
+....
+# tip printer
+....
++
+Если этот шаг не срабатывает, снова отредактируйте файл [.filename]#/etc/remote# и попробуйте использовать устройство [.filename]#/dev/cuaaN# вместо [.filename]#/dev/ttydN#.
+. Пошлите данные на принтер.
++
+** Если принтер может печатать обычный текст, используйте утилиту man:lptest[1]. Введите команду:
++
+[source,bash]
+....
+% $lptest
+....
++
+** Если принтер понимает PostScript(R) или другой язык принтера, пошлите на принтер небольшую программу. Вводите программу, построчно, _очень внимательно_, поскольку нажатие клавиши Backspacе или других клавиш редактирования может иметь значение для принтера. Может также понадобиться нажать специальную комбинацию клавиш, обозначающую конец файла, чтобы принтер понял, что получена вся программа. Для PostScript(R)-принтеров нажмите `CONTROL+D`.
++
+Можно также поместить программу в файл и ввести команду:
++
+[source,bash]
+....
+% >file
+....
++
+Где _file_ - имя файла, содержащего программу. После того, как утилита man:tip[1] пошлет файл, нажмите требуемую для ввода признака конца файла комбинацию клавиш.
+====
+
+Вы должны увидеть распечатку. Не переживайте, если текст выглядит не так, как предполагалось; этими проблемами мы займемся позже.
+
+[[printing-printcap]]
+==== Включение спулера: файл [.filename]#/etc/printcap#
+
+Сейчас ваш принтер уже должен быть подключен, ядро (при необходимости) - сконфигурировано для взаимодействия с ним, и вы смогли послать на принтер простые данные. Теперь мы готовы к конфигурированию системы LPD для управления доступом к принтеру.
+
+Система LPD конфигурируется путем редактирования файла [.filename]#/etc/printcap#. Система спулинга LPD читает этот файл при каждом использовании спулера, так что, изменения в файле сразу же учитываются.
+
+Формат файла man:printcap[5] прост. Используйте свой любимый текстовый редактор для изменения файла [.filename]#/etc/printcap#. Формат файла идентичен формату других файлов, описывающих характеристики, например, [.filename]#/usr/shared/misc/termcap# и [.filename]#/etc/remote#. Полная информация о формате представлена на странице справочного руководства man:cgetent[3].
+
+Простое конфигурирование спулера включает следующие шаги:
+
+[.procedure]
+====
+. Выберите имя (и несколько удобных псевдонимов) для принтера и поместите их в файл [.filename]#/etc/printcap#; подробнее об именовании см. в разделе <<printing-naming,Именование принтера>>.
+. Отключите выдачу начальных страниц (которые по умолчанию выдаются), вставив характеристику `sh`; подробнее об этом см. в разделе <<printing-no-header-pages,Подавление выдачи начальных страниц>>.
+. Создайте каталог для спулинга и укажите его местонахождение с помощью характеристики `sd`; подробнее об этом см. в разделе <<printing-spooldir,Создание каталога спулинга>>.
+. Выберите специальный файл устройства [.filename]#/dev# для использования с принтером и укажите его в файле [.filename]#/etc/printcap# с помощью характеристики `lp`; подробнее об этом см. в разделе <<printing-device,Выбор устройства для принтера>>. Кроме того, если принтер подключен к последовательному порту, настройте параметры взаимодействия с помощью характеристики `ms#`, которая обсуждается в разделе <<printing-commparam,Конфигурирование параметров взаимодействия для спулера>>.
+. Установите фильтр для обычного текста; подробнее об этом см. в разделе <<printing-textfilter,Установка текстового фильтра>>.
+. Проверьте настройку, напечатав что-нибудь с помощью команды man:lpr[1]. Подробнее об этом см. в разделах <<printing-trying,Проверка>> и <<printing-troubleshooting,Выявление проблем>>.
+====
+
+[NOTE]
+====
+Принтеры, использующие специальные языки, например, PostScript(R)-принтеры, не могут непосредственно печатать обычный текст. Простая настройка, представленная выше и описанная в следующих разделах, предполагает, что, если вы устанавливаете такой принтер, то будете печатать только файлы, которые он может обработать.
+====
+
+Пользователи часто предполагают, что они могут печатать обычный текст на любом из установленных в системе принтеров. Программы, взаимодействующие для обеспечения печати с системой LPD, обычно исходят из этого же предположения. Если вы устанавливаете такой принтер и хотите иметь возможность посылать на печать задания на языке принтера _и_ в виде обычного текста, настоятельно рекомендуется добавить дополнительный шаг к представленной выше простой последовательности настройки: установите программу автоматического преобразования обычного текста в PostScript(R) (или другой язык принтера). В разделе <<printing-advanced-if-conversion,Прием заданий с обычным текстом на PostScript(R)-принтеры>> рассказано, как это сделать.
+
+[[printing-naming]]
+===== Именование принтера
+
+Первый (простой) шаг - выбрать имя для принтера. На самом деле, не важно, выберете ли вы функциональное имя или причудливое, поскольку для принтера можно также задать несколько псевдонимов.
+
+По крайней мере, один из принтеров, указанных в файле [.filename]#/etc/printcap#, должен иметь псевдоним `lp`. Это - стандартное имя принтера. Если пользователи не установят переменную среды `PRINTER` и не укажут имя принтера в командной сроке при вводе любой команды системы LPD, по умолчанию для ее выполнения будет использован принтер `lp`.
+
+Также широко распространена практика в качестве последнего псевдонима для принтера задавать полное его описание, включая производителя и модель.
+
+После выбора имени и нескольких популярных псевдонимов поместите их в файл [.filename]#/etc/printcap#. Имя принтера должно начинаться с крайнего левого столбца. Каждый псевдоним отделяйте вертикальной чертой, а после последнего псевдонима поместите двоеточие.
+
+В следующем примере мы начнем со скелетного файла [.filename]#/etc/printcap#, определяющего два принтера (построчный принтер Diablo 630 и лазерный PostScript(R)-принтер Panasonic KX-P4455):
+
+[.programlisting]
+....
+#
+# /etc/printcap для хоста rose
+#
+rattan|line|diablo|lp|Diablo 630 Line Printer:
+
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:
+....
+
+В этом примере первый принтер назван `rattan` и ему заданы псевдонимы `line`, `diablo`, `lp` и `Diablo 630 Line Printer`. Поскольку у него есть псевдоним `lp`, он является стандартным принтером. Второму принтеру дано имя `bamboo` и ему заданы псевдонимы `ps`, `PS`, `S`, `panasonic` и `Panasonic KX-P4455 PostScript v51.4`.
+
+[[printing-no-header-pages]]
+===== Подавление выдачи начальных страниц
+
+Система спулинга LPD будет по умолчанию печатать _заголовочную страницу_ для каждого задания. Заголовочная страница содержит имя пользователя, отправившего задание, хост, с которого поступило задание, и имя задания, красивыми большими буквами. К сожалению, все эти дополнительные тексты мешают отладке простой настройки принтера, поэтому мы будет отключать выдачу начальных страниц.
+
+Для подавления выдачи начальных страниц добавьте характеристику `sh` к записи принтера в файле [.filename]#/etc/printcap#. Вот пример файла [.filename]#/etc/printcap# с добавлением `sh`:
+
+[.programlisting]
+....
+#
+# /etc/printcap для хоста rose - никаких начальных страниц
+#
+rattan|line|diablo|lp|Diablo 630 Line Printer:\
+ :sh:
+
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :sh:
+....
+
+Обратите внимание, как мы использовали правильный формат: первая строка начинается с самого левого столбца, а последующие строки смещены. Каждая строка в записи, кроме последней, завершается символом обратной косой черты.
+
+[[printing-spooldir]]
+===== Создание каталога для спулинга
+
+Следующий шаг в простой настройке спулера - создать _каталог для спулинга_, каталог, в котором находятся задания печати, пока не будут напечатаны, и где находятся еще несколько других файлов для поддержки спулера.
+
+Из-за присущих каталогам спулинга постоянных изменений, принято помещать эти каталоги в каталог [.filename]#/var/spool#. Кроме того, не нужно создавать резервные копии содержимого каталогов спулинга. Пересоздать их можно с помощью простой команды man:mkdir[1].
+
+Принято также задавать для каталога имя, совпадающее с именем принтера, как показано ниже:
+
+[source,bash]
+....
+# mkdir /var/spool/имя-принтера
+....
+
+Однако при наличии большого количества принтеров в сети может иметь смысл поместить все каталоги спулинга в один каталог, который просто резервируется для печати с помощью LPD. Мы сделаем это для наших двух принтеров, `rattan` и `bamboo`:
+
+[source,bash]
+....
+# mkdir /var/spool/lpd
+# mkdir /var/spool/lpd/rattan
+# mkdir /var/spool/lpd/bamboo
+....
+
+[NOTE]
+====
+Если вас интересует конфиденциальность заданий, отправляемых пользователями на печать, можно защитить каталог спулинга, чтобы он не был общедоступным. Каталоги спулинга должны принадлежать и быть доступны на чтение, запись и просмотр содержимого пользователю daemon и группе daemon, и никому больше. Мы установим это для каталогов спулинга принтеров из нашего примера:
+
+[source,bash]
+....
+# chown daemon:daemon /var/spool/lpd/rattan
+# chown daemon:daemon /var/spool/lpd/bamboo
+# chmod 770 /var/spool/lpd/rattan
+# chmod 770 /var/spool/lpd/bamboo
+....
+
+====
+
+Наконец, надо сообщить системе LPD об этих каталогах с помощью файла [.filename]#/etc/printcap#. Полное имя каталога спулинга задается с помощью характеристики `sd`:
+
+[.programlisting]
+....
+#
+# /etc/printcap для хоста rose - добавлены каталоги спулинга
+#
+rattan|line|diablo|lp|Diablo 630 Line Printer:\
+ :sh:sd=/var/spool/lpd/rattan:
+
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :sh:sd=/var/spool/lpd/bamboo:
+....
+
+Обратите внимание, что имя принтера начинается с самого первого столбца, а все последующие строки смещены, и каждая строка в записи, кроме последней, завершается символом обратной косой черты.
+
+Если вы не зададите каталог спулинга с помощью характеристики `sd`, система спулинга будет использовать по умолчанию каталог [.filename]#/var/spool/lpd#.
+
+[[printing-device]]
+===== Выбор устройства для принтера
+
+Мы выяснили, какой специальный файл устройства в каталоге [.filename]#/dev# FreeBSD будет использовать для взаимодействия с принтером. Теперь мы сообщаем эту информацию системе LPD. Когда у системы спулинга есть задание для печати, она будет открывать указанное устройство от имени программы-фильтра (которая отвечает за передачу данных на принтер).
+
+Задайте полное имя устройства [.filename]#/dev# в файле [.filename]#/etc/printcap# с помощью характеристики `lp`.
+
+В нашем текущем примере давайте предположим, что принтер `rattan` подключен к первому параллельному порту, а принтер `bamboo` - к шестому последовательному порту; вот что нужно добавить в файл [.filename]#/etc/printcap#:
+
+[.programlisting]
+....
+#
+# /etc/printcap для хоста rose - указано, какие устройства использовать
+#
+rattan|line|diablo|lp|Diablo 630 Line Printer:\
+ :sh:sd=/var/spool/lpd/rattan:\
+ :lp=/dev/lpt0:
+
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :sh:sd=/var/spool/lpd/bamboo:\
+ :lp=/dev/ttyd5:
+....
+
+Если вы не укажете характеристику `lp` для принтера в файле [.filename]#/etc/printcap#, система LPD использует по умолчанию устройство [.filename]#/dev/lp#. Устройство [.filename]#/dev/lp# сейчас в ОС FreeBSD не существует.
+
+Если устанавливаемый принтер подключен к параллельному порту, перейдите к разделу <<printing-textfilter,Установка текстового фильтра>>. Иначе выполните сначала инструкции, представленные в следующем разделе.
+
+[[printing-commparam]]
+===== Конфигурирование параметров взаимодействия спулера
+
+Для принтеров на последовательных портах система LPD может устанавливать скорость передачи, четность и другие параметры взаимодействия через последовательных порт от имени программы-фильтра, которая посылает данные на принтер. Это полезно потому, что:
+
+* Позволяет опробовать различные параметры взаимодействия, просто редактируя файл [.filename]#/etc/printcap#; программу-фильтр перекомпилировать не нужно.
+* Позволяет системе спулинга использовать одну и ту же программу-фильтр для нескольких принтеров, которые могут иметь различные установки для взаимодействия через последовательный порт.
+
+Следующие характеристики в файле [.filename]#/etc/printcap# задают параметры взаимодействия через последовательный порт для устройства, указанного в качестве значения характеристики `lp`:
+
+`br#_bps-rate_`::
+Устанавливает скорость взаимодействия для устройства в _bps-rate_, где _bps-rate_ может иметь значение 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600 или 115200 бит в секунду.
+
+`ms#_stty-mode_`::
+Устанавливает опции для терминального устройства после открытия устройства. Поддерживаемые опции описаны на странице справочного руководства man:stty[1].
+
+Когда система LPD открывает устройство, заданное характеристикой `lp`, она устанавливает опции устройства в соответствии со значением характеристики `ms#`. Наибольший интерес представляют режимы `parenb`, `parodd`, `cs5`, `cs6`, `cs7`, `cs8`, `cstopb`, `crtscts` и `ixon`, которые описаны на странице справочного руководства man:stty[1].
+
+Давайте зададим опции для нашего принтера на шестом последовательном порту. Мы установим скорость передачи 38400. В качестве режима установим режим без четности с помощью `-parenb`, 8-битовые символы с помощью `cs8`, отсутствие модемного управления с помощью `clocal` и аппаратное управление потоком с помощью опции `crtscts`:
+
+[.programlisting]
+....
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :sh:sd=/var/spool/lpd/bamboo:\
+ :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:
+....
+
+[[printing-textfilter]]
+===== Установка текстового фильтра
+
+Теперь мы готовы задать системе LPD, какой текстовый фильтр использовать для посылки заданий на принтер. _Текстовый фильтр_, известный также как _входной фильтр_, - это программа, которую система LPD запускает при получении задания на печать. Когда система LPD запускает текстовый фильтр для принтера, она направляет на стандартный входной поток фильтра задание печати, а его стандартный выходной поток - на устройство принтера, заданное характеристикой `lp`. Предполагается, что фильтр прочитает задание из стандартного входного потока, выполнит все необходимые для принтера преобразования и выдаст результат в стандартный выходной поток, который и будет напечатан. Подробнее о текстовом фильтре см. в разделе <<printing-advanced-filters,Фильтры>>.
+
+Для простой настройки принтера в качестве текстового фильтра можно задать небольшой скрипт командного интерпретатора, который просто выполняет `/bin/cat` для посылки задания на принтер. В составе FreeBSD поставляется другой фильтр, [.filename]#lpf#, обрабатывающий забой и подчеркивание для принтеров, которые не слишком хорошо справляются с потоком данных, содержащих такие символы. И, конечно же, вы можете использовать любую другую необходимую программу-фильтр. Фильтр `lpf` детально описан в разделе <<printing-advanced-lpf,lpf: текстовый фильтр>>.
+
+Сначала давайте создадим скрипт командного интерпретатора [.filename]#/usr/local/libexec/if-simple# для простого тестового фильтра. Поместите в этот файл следующий текст с помощью любимого текстового редактора:
+
+[.programlisting]
+....
+#!/bin/sh
+#
+# if-simple - Простой фильтр входного текста для lpd
+# Установлен в /usr/local/libexec/if-simple
+#
+# Просто копирует stdin в stdout. Игнорирует все аргументы фильтра.
+
+/bin/cat && exit 0
+exit 2
+....
+
+Сделайте этот файл выполняемым:
+
+[source,bash]
+....
+# chmod 555 /usr/local/libexec/if-simple
+....
+
+А теперь потребуйте от системы LPD его использовать, указав его в качестве значения характеристики `if` в файле [.filename]#/etc/printcap#. Мы добавим его для двух принтеров, имеющихся пока в примере файла [.filename]#/etc/printcap#:
+
+[.programlisting]
+....
+#
+# /etc/printcap для хоста rose - добавлен текстовый фильтр
+#
+rattan|line|diablo|lp|Diablo 630 Line Printer:\
+ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\
+ :if=/usr/local/libexec/if-simple:
+
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :sh:sd=/var/spool/lpd/bamboo:\
+ :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:\
+ :if=/usr/local/libexec/if-simple:
+....
+
+[NOTE]
+====
+Копию скрипта [.filename]#if-simple# можно найти в каталоге [.filename]#/usr/shared/examples/printing#.
+====
+
+===== Запуск системы LPD
+
+Даемон man:lpd[8] запускается из [.filename]#/etc/rc#, а необходимость запуска задается переменной `lpd_enable`. Эта переменная по умолчанию имеет значение `NO`. Если вы еще этого не сделали, добавьте строку:
+
+[.programlisting]
+....
+lpd_enable="YES"
+....
+
+в файл [.filename]#/etc/rc.conf#, а затем либо перезапустите машину, либо просто выполните команду man:lpd[8].
+
+[source,bash]
+....
+# lpd
+....
+
+[[printing-trying]]
+===== Проверка
+
+Вы добрались до конца простой настройки системы LPD. К сожалению, поздравлять вас еще рано, поскольку надо еще проверить настройку и устранить все выявленные проблемы. Для проверки настройки, попытайтесь что-то распечатать. Для печати с помощью системы LPD используется команда man:lpr[1], которая посылает задание на печать.
+
+Можно скомбинировать man:lpr[1] с программой man:lptest[1], представленной в разделе <<printing-testing,Проверка взаимодействия с принтером>>, генерирующей тестовый текст.
+
+_Для тестирования простой настройки LPD:_
+
+Введите команду:
+
+[source,bash]
+....
+# lptest 20 5 | lpr -Pprinter-name
+....
+
+Где _printer-name_ - имя (или псевдоним) принтера, заданное в файле [.filename]#/etc/printcap#. Для проверки стандартного принтера, введите команду man:lpr[1] без аргумента `-P`. Как уже отмечалось, если тестируется принтер, предполагающий использование PostScript(R), пошлите ему PostScript(R)-программу вместо использования утилиты man:lptest[1]. Это можно сделать, поместив программу в файл и выполнив команду `lpr _file_`.
+
+Для PostScript(R)-принтера вы должны получить результаты выполнения программы. Если вы используете man:lptest[1], ваши результаты должны иметь такой вид:
+
+[.programlisting]
+....
+!"#$%&'()*+,-./01234
+"#$%&'()*+,-./012345
+#$%&'()*+,-./0123456
+$%&'()*+,-./01234567
+%&'()*+,-./012345678
+....
+
+Для дальнейшего тестирования принтера, попытайтесь загрузить программы побольше (для принтеров, поддерживающих определенный язык) или выполните команду man:lptest[1] с другими аргументами. Например, команда `lptest 80 60` выдаст 60 строк по 80 символов в каждой.
+
+Если принтер не работает, см. раздел <<printing-troubleshooting,Выявление проблем>>.
+
+[[printing-advanced]]
+== Расширенная настройка принтера
+
+В этом разделе описаны фильтры для печати специально сформатированных файлов, начальных страниц, печати по сети, ограничения и учета использования принтера.
+
+[[printing-advanced-filter-intro]]
+=== Фильтры
+
+Хотя система LPD поддерживает сетевые протоколы, очереди, контроль доступа и другие аспекты печати, большая часть _реальной_ работы происходит в _фильтрах_. Фильтры - это программы, взаимодействующие с принтером и обеспечивающие учет особенностей устройства и специальных требований. При простой настройке принтера мы установили фильтр для обычного текста - крайне простой, который должен работать с большинством принтеров (см. раздел <<printing-textfilter,Установка текстового фильтра>>).
+
+Однако, чтобы обеспечить преобразования формата, учет использования принтера и индивидуальных особенностей отдельных принтеров и т.п., надо разобраться, как работают фильтры. В конечном итоге, всеми этими аспектами печати должен заниматься фильтр. А плохая новость состоит в том, что, в большинстве случаев, вы _сами_ должны предоставить соответствующие фильтры. Хорошая новость состоит в том, что многие фильтры общедоступны; а если подходящих нет, их обычно легко написать.
+
+Кроме того, в составе ОС FreeBSD поставляется один фильтр, [.filename]#/usr/libexec/lpr/lpf#, работающий со многими принтерами, которые могут печатать обычный текст. (Он обрабатывает символы забоя и табуляции в файле, выполняет учет использования, но и не более того.) Есть также ряд фильтров и компонентов фильтров в наборе портов FreeBSD.
+
+Вот что вы найдете в этом разделе:
+
+* В разделе <<printing-advanced-filters,Как работают фильтры>> сделана попытка дать обзор роли фильтра в процессе печати. Прочтите этот раздел, чтобы понять, что происходит "за кадром", когда система LPD использует фильтры. Это понимание поможет предвидеть и решать проблемы, с которыми вы можете столкнуться при добавлении дополнительных фильтров для каждого из принтеров.
+* Система LPD предполагает, что каждый принтер, по умолчанию, может печатать обычный текст. Это проблематично для PostScript(R)-принтеров (или принтеров на базе другого языка), поскольку они не могут печатать обычный текст непосредственно. В разделе <<printing-advanced-if-conversion,Прием заданий с обычным текстом на PostScript(R)-принтеры>> описано, что нужно сделать, чтобы решить эту проблему. Прочтите этот раздел, если используете PostScript(R)-принтер.
+* PostScript(R) - популярный формат выдачи для многих программ. Некоторые люди даже пишут PostScript(R)-код непосредственно. К сожалению, PostScript(R)-принтеры дороги. В разделе <<printing-advanced-ps,Имитация PostScript(R) на не-PostScript(R) принтерах>> описано, как можно дополнительно изменить текстовый фильтр принтера для приема и печати данных PostScript(R) не _не-PostScript(R)_ принтере. Прочтите этот раздел, если ваш принтер не поддерживает PostScript(R).
+* В разделе <<printing-advanced-convfilters,Фильтры преобразования>> описан способ автоматизации преобразования определенных форматов файлов, например, графики или данных для печатного станка, в форматы, которые может обработать ваш принтер. После чтения этого раздела вы сможете настроить свои принтеры так, что пользователи смогут выполнять команду `lpr -t` для печати данных troff, или `lpr -d` для печати данных TeX DVI, или `lpr -v` - для печати растровых изображений, и так далее. Я рекомендую прочитать этот раздел.
+* В разделе <<printing-advanced-of,Выходные фильтры>> описана не часто используемая возможность задавать выходные фильтры в системе LPD. Если только вы не печатаете начальные страницы (см. <<printing-advanced-header-pages,Начальные страницы>>), можно, пожалуй, вообще пропустить этот раздел.
+* В разделе <<printing-advanced-lpf,lpf: текстовый фильтр>> описана команда `lpf`, - достаточно полный, хотя и простой текстовый фильтр для строчных принтеров (и лазерных принтеров, работающих как строчные), поставляемый в составе ОС FreeBSD. Если надо быстро настроить учет использования принтера для обычного текста или если используется принтер, из которого при получении символов забоя идет дым, несомненно, стоит подумать об использовании `lpf`.
+
+[NOTE]
+====
+Различные скрипты, описанные далее, можно найти в каталоге [.filename]#/usr/shared/examples/printing#.
+====
+
+[[printing-advanced-filters]]
+==== Как работают фильтры
+
+Как уже упоминалось, фильтр - это выполняемая программа, запускаемая системой LPD для поддержки специфических особенностей устройства при взаимодействии с принтером.
+
+Когда системе LPD надо напечатать входящий в задание файл, она запускает программу-фильтр. Стандартный входной поток фильтра связывается с файлом, который надо распечатать, его стандартный выходной поток - с принтером, а стандартный поток ошибок перенаправляется в файл регистрации ошибок (задается характеристикой `lf` в файле [.filename]#/etc/printcap#, или используется стандартное устройство [.filename]#/dev/console#).
+
+Запускаемый системой LPD фильтр и его аргументы зависят от того, что указано в файле [.filename]#/etc/printcap#, и какие аргументы указал пользователь для задания в команде man:lpr[1]. Например, если пользователь ввел команду `lpr -t`, система LPD должна запустить фильтр troff, заданный характеристикой `tf` для соответствующего принтера. Если пользователь хочет печатать обычный текст, система должна запустить фильтр `if` (это верно в большинстве случаев: подробнее см. в разделе <<printing-advanced-of,Выходные фильтры>>).
+
+В файле [.filename]#/etc/printcap# можно задавать три вида фильтров:
+
+* _Текстовый фильтр_, который в документации LPD двусмысленно называют _входным фильтром_, обеспечивает печать обычного текста. Рассматривайте его как стандартный фильтр. Система LPD предполагает, что любой принтер может по умолчанию печатать обычный текст, а на текстовый фильтр возлагается задача обеспечить, чтобы символы забоя, табуляции или другие специальные символы не сбивали принтер с толку. Если вы работаете в среде, где надо учитывать использование принтера, текстовый фильтр должен также учитывать количество напечатанных страниц, обычно, подсчитывая количество напечатанных строк и сравнивая их с количеством строк на страницу, поддерживаемых принтером. Текстовый фильтр запускается со следующим списком аргументов:
++
+`имя-фильтра [-c] -wширина -lдлина -iсдвиг -n имя-пользователя -h хост учетный-файл`
+
+`-c`:::
+указывается, если задание послано командой `lpr -l`
+
+_ширина_:::
+значение из характеристики `pw` (page width - ширина страницы), указанной в файле [.filename]#/etc/printcap#, по умолчанию - 132
+
+_длина_:::
+значение из характеристики `pl` (page length - длина страницы), по умолчанию - 66
+
+_сдвиг_:::
+сдвиг, заданный командой `lpr -i`, по умолчанию - 0
+
+_имя-пользователя_:::
+регистрационное имя пользователя, печатающего файл
+
+_хост_:::
+имя хоста, с которого было послано задание
+
+_учетный-файл_:::
+имя учетного файла, задаваемое характеристикой `af`.
+
+* _Фильтр преобразования_ преобразует специфичный формат файла в то, что принтер может воспроизвести на бумаге. Например, данные системы набора ditroff нельзя печатать непосредственно, но можно установить фильтр преобразования для файлов ditroff, чтобы преобразовывать данные ditroff в тот вид, который принтер может воспринять и напечатать. В разделе <<printing-advanced-convfilters,Фильтры преобразования>> написано всё об этих фильтрах. Фильтры преобразования также необходимы для учета, если предполагается учет использования принтера. Фильтры преобразования запускаются со следующими аргументами:
++
+`имя-фильтра` -x__ширина-пиксела__ -y__высота-пиксела__ -n __имя-пользователя__ -h __хост__ __учетный-файл__ где __ширина-пиксела__ - значение характеристики px (по умолчанию - 0), а __высота-пиксела__ - значение характеристики py (по умолчанию - 0).
+* _Выходной фильтр_ используется только если нет текстового фильтра или если включена выдача начальных страниц. Судя по моему опыту, выходные фильтры используются редко. Они описаны в разделе <<printing-advanced-of,Выходные фильтры>>. У выходного фильтра есть всего два аргумента:
++
+`имя-фильтра` -w__ширина__ -l__длина__ которые идентичны аргументам `-w` и `-l` текстового фильтра.
+
+Фильтры также должны _завершать работу_ со следующим статусом выхода:
+
+exit 0::
+Если фильтр успешно напечатал файл.
+
+exit 1::
+Если фильтр не смог напечатать файл, но хочет, чтобы система LPD попыталась распечатать файл ещё раз. Система LPD перезапустит фильтр, если его работа завершена с этим статусом.
+
+exit 2::
+Если фильтр не смог напечатать файл и не хочет, чтобы система LPD пыталась его печатать еще раз. Система LPD удалит файл.
+
+Поставляемый в составе FreeBSD текстовый фильтр [.filename]#/usr/libexec/lpr/lpf# использует аргументы, задающие ширину и длину страницы для определения того, когда посылать символ прогона страницы (form feed) и как учитывать использование принтера. Он использует переданные в качестве аргументов имя пользователя, хост и учетный файл для внесения учетных записей.
+
+При поиске фильтров убедитесь, что они совместимы с системой LPD. Если да, они должны поддерживать описанные выше списки аргументов. Если вы планируете создавать фильтры для общего использования, позаботьтесь о поддержке этих списков аргументов и кодов выхода.
+
+[[printing-advanced-if-conversion]]
+==== Прием заданий с обычным текстом на PostScript(R)-принтеры
+
+Если вы - единственный пользователь компьютера и PostScript(R)-принтера (или принтера на основе другого языка), и вы обещаете никогда не посылать на принтер обычный текст и никогда не использовать возможностей различных программ, требующих посылки на принтер обычного текста, вам можно не заботиться о том, что описано в этом разделе.
+
+Но, если вы хотите посылать на принтер как задания PostScript(R), так и обычный текст, рекомендуется дополнить настройку принтера. Для этого надо, чтобы текстовый фильтр определял, является ли поступающее задание обычным текстом или программой на языке PostScript(R). Все PostScript(R)-задания должны начинаться с `%!` (для других языков принтеров обратитесь к соответствующей документации). Если первые два символа в задании - именно эти, речь идет о PostScript(R), и мы можем остальную часть задания передавать непосредственно. Если же первые два символа в файле - другие, фильтр будет преобразовывать текст в PostScript(R) и печатать результат.
+
+Как нам это сделать?
+
+Если вы используете последовательный принтер, хороший способ достичь поставленной цели состоит в установке `lprps`. `lprps` - это фильтр для PostScript(R)-принтера, выполняющий двустороннее взаимодействие с принтером. Он обновляет файл состояния принтера, помещая в него подробную информацию, выданную принтером, так что пользователи и администраторы могут узнать, в каком именно состоянии (например, `toner low` или `paper jam`) находится принтер. Но еще важнее, что он включает программу `psif`, которая определяет, является ли входящее задание обычным текстом, и вызывает `textps` (еще одну программу, поставляемую вместе с `lprps`) для преобразования его в PostScript(R). Затем `lprps` посылает преобразованное задание на принтер.
+
+`lprps` входит в набор портов FreeBSD (см. crossref:ports[ports,Набор портов]). Вы, конечно, можете загрузить, собрать и установить его самостоятельно. После установки `lprps` просто укажите путь к программе `psif`, входящей в состав пакета `lprps`. Если вы установили `lprps` из Коллекции Портов, используйте следующий текст в записи для последовательного PostScript(R)-принтера в файле [.filename]#/etc/printcap#:
+
+[.programlisting]
+....
+:if=/usr/local/libexec/psif:
+....
+
+Надо также задать характеристику `rw`; она требует от системы LPD открывать принтер в режиме чтения и записи.
+
+При использовании параллельного PostScript(R)-принтера (что не позволяет обеспечить двустороннее взаимодействие с принтером, необходимое для системы `lprps`), можно использовать в качестве текстового фильтра следующий скрипт командного интерпретатора:
+
+[.programlisting]
+....
+#!/bin/sh
+#
+# psif - Печать PostScript или обычного текста на PostScript-принтере
+# Скрипт, а НЕ версия, входящая в состав lprps
+# Установлен в /usr/local/libexec/psif
+#
+
+IFS="" read -r first_line
+first_two_chars=`expr "$first_line" : '\(..\)'`
+
+if [ "$first_two_chars" = "%!" ]; then
+ #
+ # Задание PostScript, печатать его.
+ #
+ echo "$first_line" && cat && printf "\004" && exit 0
+ exit 2
+else
+ #
+ # Обычный текст, преобразовать его, а затем напечатать.
+ #
+ ( echo "$first_line"; cat ) | /usr/local/bin/textps && printf "\004" && exit 0
+ exit 2
+fi
+....
+
+В представленном выше скрипте, `textps` - отдельно установленная программа для преобразования обычного текста в PostScript(R). Можно использовать любую программу преобразования текста в PostScript(R). Коллекция Портов FreeBSD (см. материал о crossref:ports[ports,Коллекции Портов]) включает полнофункциональную программу преобразования текста в PostScript(R) под названием `a2ps`, которую тоже можно попробовать использовать.
+
+[[printing-advanced-ps]]
+==== Имитация PostScript(R) на не-PostScript(R) принтерах
+
+PostScript(R) является _фактическим_ стандартом для высококачественного набора и печати. PostScript(R), однако, - _дорогой_ стандарт. К счастью, благодаря компании Aladdin Enterprises есть свободный аналог PostScript(R) под названием Ghostscript, который работает с FreeBSD. Ghostscript может читать большинство PostScript(R)-файлов и выдавать соответствующие страницы на множество устройств, включая многие моделей не-PostScript принтеров. Установив Ghostscript и используя специальный текстовый фильтр для принтера, можно заставить ваш не-PostScript(R) принтер работать фактически как PostScript(R)-принтер.
+
+Ghostscript входит в набор портов FreeBSD, если вы хотите устанавливать его оттуда. Вы можете также легко загрузить, собрать и установить его самостоятельно.
+
+Для имитации PostScript(R) надо, чтобы текстовый фильтр определял, печатается ли PostScript(R)-файл. Если нет, фильтр будет передавать файл на принтер непосредственно; в противном случае, он будет использовать Ghostscript, чтобы сначала преобразовать файл в формат, который поймет принтер.
+
+Рассмотрим пример: следующий сценарий представляет собой текстовый фильтр для принтеров Hewlett Packard DeskJet 500. Для других принтеров замените аргумент `-sDEVICE` в команде `gs` (Ghostscript). (Введите команду `gs -h` для получения списка устройств, поддерживаемых установленной версией Ghostscript.)
+
+[.programlisting]
+....
+#!/bin/sh
+#
+# ifhp - Печать Ghostscript-эмулированного PostScript на DeskJet 500
+# Установлен в /usr/local/libexec/ifhp
+
+#
+# Обрабатывать LF как CR+LF (чтобы избежать "эффекта ступенек"
+# на принтерах HP/PCL:
+#
+printf "\033&k2G" || exit 2
+
+#
+# Прочитать первые два символа файла
+#
+IFS="" read -r first_line
+first_two_chars=`expr "$first_line" : '\(..\)'`
+
+if [ "$first_two_chars" = "%!" ]; then
+ #
+ # Это PostScript; используем Ghostscript для чтения, преобразования и печати.
+ #
+ /usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 \
+ -sOutputFile=- - && exit 0
+else
+ #
+ # Обычный текст или HP/PCL, поэтому просто печатаем его напрямую; печатаем в
+ # конце символ прогона страницы, чтобы была выдана последняя страница.
+ #
+ echo "$first_line" && cat && printf "\033&l0H" &&
+exit 0
+fi
+
+exit 2
+....
+
+Наконец, надо указать системе LPD, какой фильтр использовать, задав характеристику `if`:
+
+[.programlisting]
+....
+:if=/usr/local/libexec/ifhp:
+....
+
+Вот и все. Теперь можно выполнять `lpr plain.text` и [.filename]#lpr whatever.ps#, и обе команды должны успешно печатать.
+
+[[printing-advanced-convfilters]]
+==== Фильтры преобразования
+
+После завершения простой настройки, описанной в разделе <<printing-simple,Простая настройка принтера>>, прежде всего, вам может потребоваться установить фильтры преобразования для любимых форматов файлов (кроме обычных текстов ASCII).
+
+===== Зачем устанавливать фильтры преобразования?
+
+Фильтры преобразования упрощают печать различного рода файлов. В качестве примера, предположим, что активно используется издательская система TeX и имеется PostScript(R)-принтер. При каждой генерации DVI-файла из TeX, мы не можем печатать его непосредственно, пока не преобразуем в PostScript(R). Для этого используется такая последовательность команд:
+
+[source,bash]
+....
+% dvips seaweed-analysis.dvi
+% lpr seaweed-analysis.ps
+....
+
+Установив фильтр преобразования для файлов DVI, мы можем не конвертировать файл каждый раз вручную, возложив эту задачу на систему LPD. Теперь при каждом получении DVI-файла нас от его распечатки отделяет только один шаг:
+
+[source,bash]
+....
+% lpr -d seaweed-analysis.dvi
+....
+
+Мы заставили систему LPD автоматически преобразовывать DVI-файл, указав опцию `-d`. Все опции преобразования представлены в разделе <<printing-lpr-options-format,Опции форматирования и преобразования>>.
+
+Для каждой из опций преобразования, которая должна поддерживаться принтером, установите _фильтр преобразования_ и укажите его полное имя в файле [.filename]#/etc/printcap#. Фильтр преобразования аналогичен текстовому фильтру для простой настройки принтера (см. раздел <<printing-textfilter,Установка текстового фильтра>>), но вместо печати обычного текста он преобразует файл в формат, который может понять принтер.
+
+===== Какие фильтры преобразования следует устанавливать?
+
+Устанавливать надо те фильтры преобразования, которые предполагается использовать. Если вы часто печатаете файлы DVI, значит, фильтр преобразования DVI необходим. Если вам часто приходится печатать результаты работы troff, может потребоваться фильтр troff.
+
+В следующей таблице представлены фильтры, с которыми работает система LPD, их соответствующие характеристики для файла [.filename]#/etc/printcap#, а также способ их вызова в команде `lpr`:
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Тип файла
+| Характеристика /etc/printcap
+| Опция lpr
+
+|cifplot
+|`cf`
+|`-c`
+
+|DVI
+|`df`
+|`-d`
+
+|plot
+|`gf`
+|`-g`
+
+|ditroff
+|`nf`
+|`-n`
+
+|Текст на языке FORTRAN
+|`rf`
+|`-f`
+
+|troff
+|`tf`
+|`-f`
+
+|растровое изображение
+|`vf`
+|`-v`
+
+|обычный текст
+|`if`
+|никакой, `-p` или `-l`
+|===
+
+В нашем примере использование `lpr -d` означает, что для принтера должна быть задана характеристика `df` в записи в файле [.filename]#/etc/printcap#.
+
+Вопреки мнению многих, форматы вроде текста на языке FORTRAN и plot, вероятно, устарели. У себя на машине вы можете дать новые значения этим или любым другим опциям форматирования, установив соответствующие специализированные фильтры. Например, пусть необходимо напрямую печатать файлы Printerleaf (файлы настольной издательской системы Interleaf), но вообще вы не собираетесь печатать файлы типа plot. Можно установить фильтр преобразования Printerleaf в качестве значения характеристики `gf` и научить своих пользователей, что команда `lpr -g` означает "печатать файлы Printerleaf".
+
+===== Установка фильтров преобразования
+
+Поскольку фильтры преобразования представляют собой программы, не входящие в базовую поставку FreeBSD, их, видимо, надо помещать в каталоге [.filename]#/usr/local#. Популярное местонахождение - каталог [.filename]#/usr/local/libexec#, поскольку эти фильтры являются специализированными программами для выполнения системой LPD; обычным пользователям никогда не понадобится их выполнять.
+
+Для включения фильтра преобразования, укажите его полное имя в качестве значения соответствующей характеристики для принтера в файле [.filename]#/etc/printcap#.
+
+В качестве примера, давайте добавим фильтр преобразования DVI в запись для принтера `bamboo`. Вот опять пример файла [.filename]#/etc/printcap#, с новой характеристикой `df` для принтера `bamboo`.
+
+[.programlisting]
+....
+#
+# /etc/printcap для хоста rose - добавлен фильтр df для bamboo
+#
+rattan|line|diablo|lp|Diablo 630 Line Printer:\
+ :sh:sd=/var/spool/lpd/rattan:\
+ :lp=/dev/lpt0:\
+ :if=/usr/local/libexec/if-simple:
+
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :sh:sd=/var/spool/lpd/bamboo:\
+ :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\
+ :if=/usr/local/libexec/psif:\
+ :df=/usr/local/libexec/psdf:
+....
+
+Фильтр DVI - скрипт командного интерпретатора по имени [.filename]#/usr/local/libexec/psdf#. Вот его текст:
+
+[.programlisting]
+....
+#!/bin/sh
+#
+# psdf - фильтр принтера, преобразующий DVI в PostScript
+# Установлен в /usr/local/libexec/psdf
+#
+# Вызывается системой lpd при выполнении пользователем команды lpr -d
+#
+exec /usr/local/bin/dvips -f | /usr/local/libexec/lprps "$@"
+....
+
+Это скрипт выполняет команду `dvips` в режиме фильтрования (аргумент `-f`) входного потока, представляющего собой задание для печати. Затем запускается фильтр PostScript(R)-принтера `lprps` (см. раздел <<printing-advanced-if-conversion,Прием заданий с обычным текстом на PostScript(R)-принтеры>>) с аргументами, переданными системой LPD этому скрипту. Команда `lprps` будет использовать эти аргументы для учета распечатанных страниц.
+
+===== Дополнительные примеры фильтров преобразования
+
+Поскольку нет фиксированного набора шагов для установки фильтров преобразования, я просто представлю дополнительные примеры. Используйте их в качестве руководства при создании собственных фильтров. Используйте их непосредственно, если нужно.
+
+Следующий пример фильтра преобразует растровый файл (точнее, GIF-файл) для печати на принтере Hewlett Packard LaserJet III-Si:
+
+[.programlisting]
+....
+#!/bin/sh
+#
+# hpvf - Преобразовать GIF-файлы в HP/PCL и напечатать
+# Установлен в /usr/local/libexec/hpvf
+
+PATH=/usr/X11R6/bin:$PATH; export PATH
+giftopnm | ppmtopgm | pgmtopbm | pbmtolj -resolution 300 \
+ && exit 0 \
+ || exit 2
+....
+
+Он работает путем преобразования GIF-файла в переносимый формат anymap, его - в переносимый формат graymap, затем - в переносимый bitmap, а уже его - в данные, подходящие для LaserJet/PCL.
+
+Вот файл [.filename]#/etc/printcap# с записью для принтера, в которой используется представленный выше фильтр:
+
+[.programlisting]
+....
+#
+# /etc/printcap для хоста orchid
+#
+teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
+ :lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
+ :if=/usr/local/libexec/hpif:\
+ :vf=/usr/local/libexec/hpvf:
+....
+
+Следующий скрипт является фильтром преобразования для печати данных troff, получаемых из системы набора groff, на PostScript(R)-принтере `bamboo`:
+
+[.programlisting]
+....
+#!/bin/sh
+#
+# pstf - Преобразует выдаваемые groff данные troff в PS и печатает.
+# Установлен в /usr/local/libexec/pstf
+#
+exec grops | /usr/local/libexec/lprps "$@"
+....
+
+Представленный выше скрипт снова использует команду `lprps` для взаимодействия с принтером. Если принтер подключен к параллельному порту, придется использовать следующий скрипт:
+
+[.programlisting]
+....
+#!/bin/sh
+#
+# pstf - Преобразует выдаваемые groff данные troff в PS и печатает.
+# Установлен в /usr/local/libexec/pstf
+#
+exec grops
+....
+
+Вот и все. Вот какую запись надо добавить в файл [.filename]#/etc/printcap#, чтобы включить этот фильтр:
+
+[.programlisting]
+....
+:tf=/usr/local/libexec/pstf:
+....
+
+Вот пример, который пригодится старым специалистам по языку FORTRAN. Это фильтр для печати текста программы на языке FORTRAN на любом принтере, который может непосредственно печатать обычный текст. Мы установим его для принтера `teak`:
+
+[.programlisting]
+....
+#!/bin/sh
+#
+# hprf - Фильтр текста на языке FORTRAN для LaserJet 3si:
+# Установлен в /usr/local/libexec/hprf
+#
+
+printf "\033&k2G" && fpr && printf "\033&l0H" &&
+ exit 0
+exit 2
+....
+
+Надо добавить следующую строку к записи в файле [.filename]#/etc/printcap# для принтера `teak`, чтобы включить этот фильтр:
+
+[.programlisting]
+....
+:rf=/usr/local/libexec/hprf:
+....
+
+Перейдем к последнему, более сложному примеру. Мы добавим фильтр DVI для уже использовавшегося принтера LaserJet по имени `teak`. Сначала простая часть: изменить файл [.filename]#/etc/printcap#, указав местонахождение фильтра DVI:
+
+[.programlisting]
+....
+:df=/usr/local/libexec/hpdf:
+....
+
+А теперь - часть посложнее: создать фильтр. Для этого нам понадобится программа преобразования DVI в LaserJet/PCL. Набор портов FreeBSD (см. crossref:ports[ports,Набор портов]) содержит одну: соответствующий пакет называется `dvi2xx`. Установка этого пакета дает нам необходимую программу, `dvilj2p`, которая преобразует DVI в коды, подходящие для LaserJet IIp, LaserJet III и LaserJet 2000.
+
+Команда `dvilj2p` требует создания достаточно сложного фильтра `hpdf`, поскольку она не может читать стандартный входной поток. Она хочет работать с именем файла. Что еще хуже, имя файла должно завершаться расширением [.filename]#.dvi#, так что использование стандартного входного потока [.filename]#/dev/fd/0# тоже проблематично. Мы можем обойти эту проблему, создав (символическую) связь (с именем, завершающимся суффиксом [.filename]#.dvi#) с устройством [.filename]#/dev/fd/0#, тем самым, заставив команду `dvilj2p` читать из стандартного входного потока.
+
+Единственная оставшаяся проблема состоит в том, что мы не можем создавать временную связь в каталоге [.filename]#/tmp#. Символьные связи принадлежат пользователю и группе `bin`. Фильтр же работает от имени пользователя `daemon`. А у каталога [.filename]#/tmp# установлен sticky bit. Фильтр сможет создать связь, но не сможет почистить за собой и удалить ее, поскольку связь будет принадлежать другому пользователю.
+
+Вместо этого, фильтр будет создавать символическую связь в текущем рабочем каталоге, которым является каталог спулинга (задаваемый характеристикой `sd` в файле [.filename]#/etc/printcap#). Это отличное место для выполнения фильтрами своих действий, особенно потому, что (иногда) в каталоге спулинга места больше, чем в [.filename]#/tmp#.
+
+Вот, наконец, и сам фильтр:
+
+[.programlisting]
+....
+#!/bin/sh
+#
+# hpdf - Печать данных DVI на принтере HP/PCL
+# Установлен в /usr/local/libexec/hpdf
+
+PATH=/usr/local/bin:$PATH; export PATH
+
+#
+# Определяем функцию для удаления временных файлов. Они существуют
+# в текущем каталоге - в каталоге спулинга для принтера.
+#
+cleanup() {
+ rm -f hpdf$$.dvi
+}
+
+#
+# Определяем функцию для обработки критических ошибок: напечатать заданное
+# сообщение и выйти с кодом 2. Код выхода 2 сообщает системе LPD, что не
+# надо повторно пытаться печатать задание.
+#
+fatal() {
+ echo "$@" 1>&2
+ cleanup
+ exit 2
+}
+
+#
+# Если пользователь удаляет задание, система LPD будет посылать сигнал SIGINT,
+# поэтому перехватываем SIGINT (и пару других сигналов), чтобы убрать за собой.
+#
+trap cleanup 1 2 15
+
+#
+# Гарантируем, что не конфликтуем с существующими файлами.
+#
+cleanup
+
+#
+# Связываем входной файл DVI со стандартным входным потоком (файлом для печати).
+#
+ln -s /dev/fd/0 hpdf$$.dvi || fatal "Cannot symlink /dev/fd/0"
+
+#
+# Заменяем LF = CR+LF
+#
+printf "\033&k2G" || fatal "Cannot initialize printer"
+
+#
+# Преобразуем и печатаем. Значение, возвращаемое программой dvilj2p, не надежно,
+# так что мы его игнорируем.
+#
+dvilj2p -M1 -q -e- dfhp$$.dvi
+
+#
+# Убираем за собой и завершаем работу
+#
+cleanup
+exit 0
+....
+
+[[printing-advanced-autoconv]]
+===== Автоматизированное преобразование: альтернатива фильтрам преобразования
+
+Все эти фильтры преобразования многое дают для среды печати, но требуют от пользователя указывать (в командной строке man:lpr[1]), какой именно фильтр использовать. Если пользователи не особенно разбираются в компьютерах, необходимость указывать опцию фильтра будет их раздражать. Что еще хуже, однако, при неправильном указании опции фильтрования может быть применен фильтр, не соответствующий типу файла, и принтер испортит несколько сотен страниц бумаги.
+
+Вместо установки фильтров преобразования, можно попытаться заставить текстовый фильтр (поскольку он применяется по умолчанию) определять тип файла, который его попросили напечатать, и затем автоматически вызывать соответствующий фильтр преобразования. В этом могут помочь утилиты вроде `file`. Конечно, будет сложно различать _некоторые_ типы файлов - и, конечно же, можно задавать фильтры преобразования только для них.
+
+В наборе портов FreeBSD есть текстовый фильтр, выполняющий автоматическое преобразование; это `apsfilter`. Он может выявлять обычный текст, PostScript(R) и файлы DVI, выполнять соответствующие преобразования и печатать результат.
+
+[[printing-advanced-of]]
+==== Выходные фильтры
+
+Система спулинга LPD поддерживает еще один тип фильтров, который мы еще не рассматривали: выходные фильтры. Выходной фильтр предназначен только для печати обычного текста, как текстовый фильтр, но с множеством упрощений. Если вы используете выходной фильтр, а текстовый фильтр не задан, то:
+
+* Система LPD запускает выходной фильтр один раз для всего задания, а не для каждого файла задания.
+* Система LPD не пытается определить начало или конец файлов в задании для выходного фильтра.
+* Система LPD не передает выходному фильтру имя пользователя или хоста, так что этот фильтр не предназначен для учета использования принтера. Фактически, он получает всего два аргумента:
++
+`имя-фильтра` -w__ширина__ -l__длина__
++
+Где _ширина_ берется из характеристики `pw`, а _длина_ - из характеристики `pl` для соответствующего принтера.
+
+Не соблазняйтесь простотой выходного фильтра. Если вы хотите, чтобы каждый файл в задании начинал печататься с новой страницы, выходной фильтр _не поможет_. Используйте текстовый фильтр (также известный как входной); см. раздел <<printing-textfilter,Установка текстового фильтра>>. Более того, выходной фильтр, фактически, - _более сложный_, поскольку он должен проверять посылаемый ему поток байтов в поисках специальных символов-флагов и посылать себе сигналы от имени системы LPD.
+
+Однако выходной фильтр _необходим_, если надо выдавать начальные страницы и требуется посылать управляющие последовательности или другие строки инициализации, чтобы можно было напечатать начальную страницу. (Но он _не поможет_, если необходимо учитывать начальные страницы для пользователя, поскольку система LPD не передает выходному фильтру никакой информации о пользователе или хосте.)
+
+На одном принтере система LPD позволяет совместно с выходным использовать текстовый или другие фильтры. В таких случаях, система LPD будет запускать выходной фильтр только для печати начальной страницы (см. раздел <<printing-advanced-header-pages,Начальные страницы>>). Система LPD затем предполагает, что выходной фильтр _остановится_, посылая ему два байта: ASCII 031 и ASCII 001. Когда выходной фильтр видит эти два байта (031, 001), он должен остановиться, посылая себе сигнал `SIGSTOP`. Когда система LPD закончит выполнение остальных фильтров, она перезапускает выходной фильтр, посылая ему сигнал `SIGCONT`.
+
+Если есть выходной фильтр, но _нет_ текстового, и система LPD обрабатывает задания с обычным текстом, LPD использует для выполнения задания выходной фильтр. Как уже было сказано, выходной фильтр будет печатать все файлы задания последовательно, без прогонов страниц или других настроек бумаги, а это _вряд ли_ вас устроит. Почти во всех случаях необходим текстовый фильтр.
+
+Программа `lpf`, которую мы представили ранее как текстовый фильтр, может также работать как выходной фильтр. Если срочно необходим простой выходной фильтр, но вы не хотите писать код для выявления байтов и посылки сигнала, попробуйте использовать `lpf`. Можно также поместить `lpf` в скрипт командного интерпретатора для обработки любых кодов инициализации, которые может потребовать принтер.
+
+[[printing-advanced-lpf]]
+==== `lpf`: текстовый фильтр
+
+Программа [.filename]#/usr/libexec/lpr/lpf#, поставляемая в составе двоичного дистрибутива FreeBSD, представляет собой текстовый (входной) фильтр, который может печатать с отступом (если задание послано командой `lpr -i`), пропускать все символы на печать (если задание послано командой `lpr -l`), настраивать позицию печати при получении в задании символов забоя и табуляции, а также учитывать количество напечатанных страниц. Она может также использоваться как выходной фильтр.
+
+Программа `lpf` подходит для многих сред печати. И хотя она не позволяет посылать на принтер инициализационные последовательности, легко написать скрипт командного интерпретатора, который будет выполнять необходимую инициализацию, а затем вызывать `lpf`.
+
+Чтобы программа `lpf` корректно выполняла учет страниц, ей необходимо указать корректные значения характеристик `pw` и `pl` в файле [.filename]#/etc/printcap#. Она использует эти значения для определения того, сколько текста может поместиться на странице и сколько страниц было в задании пользователя. Подробнее об учете использования принтера см. в разделе <<printing-advanced-acct,Учет использования принтера>>.
+
+[[printing-advanced-header-pages]]
+=== Начальные страницы
+
+При наличии _множества_ пользователей, использующих различные принтеры, вероятно, можно считать _начальные страницы_ неизбежным злом.
+
+Начальные страницы, которые также называют _баннерными_ или _разделительными страницами_, идентифицируют, кому принадлежат задания после их печати. Обычно информация на них выдается большими, жирными буквами, возможно, с декоративными рамочками, чтобы в пачке распечаток они отличались от реальных документов, образующих задания пользователей. Они позволяют пользователям быстро находить свои задания. Очевидный недостаток выдачи начальных страниц состоит в том, что для каждого задания надо печатать на одну страницу больше, причем, страница эта хоть сколько-нибудь нужна несколько минут, а затем она оказывается в мусорной корзине или сдается в макулатуру. (Учтите, что начальная страница выдается в начале задания, а не перед каждым файлом, так что бумаги может теряться не так уж и много.)
+
+Система LPD может выдавать заголовочные страницы для ваших распечаток автоматически, _если_ ваш принтер может непосредственно печатать обычный текст. Если используется PostScript(R)-принтер, потребуется внешняя программа для генерации начальной страницы; см. <<printing-advanced-header-pages-ps,Начальные страницы на PostScript(R)-принтерах>>.
+
+[[printing-advanced-header-pages-enabling]]
+==== Включение выдачи начальных страниц
+
+В разделе <<printing-simple,Простая настройка принтера>> мы отключили выдачу начальных страниц, задав характеристику `sh` (что означает "suppress header") в файле [.filename]#/etc/printcap#. Для включения выдачи начальных страниц на принтер, просто удалите характеристику `sh`.
+
+Кажется слишком просто, правда?
+
+Вы правы. _Может_ потребоваться задать выходной фильтр для посылки строк инициализации на принтер. Вот пример выходного фильтра для Hewlett Packard PCL-совместимых принтеров:
+
+[.programlisting]
+....
+#!/bin/sh
+#
+# hpof - Выходной фильтр для Hewlett Packard PCL-совместимых принтеров
+# Установлен в /usr/local/libexec/hpof
+
+printf "\033&k2G" || exit 2
+exec /usr/libexec/lpr/lpf
+....
+
+Задайте полное имя выходного фильтра в качестве значения характеристики `of`. Подробнее об этом см. в разделе <<printing-advanced-of,Выходные фильтры>>.
+
+Вот пример файла [.filename]#/etc/printcap# для принтера `teak`, который мы представили ранее; мы включили выдачу начальных страниц и добавили показанный выше выходной фильтр:
+
+[.programlisting]
+....
+#
+# /etc/printcap для хоста orchid
+#
+teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
+ :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\
+ :if=/usr/local/libexec/hpif:\
+ :vf=/usr/local/libexec/hpvf:\
+ :of=/usr/local/libexec/hpof:
+....
+
+Теперь, когда пользователи выдают задания на принтер `teak`, они получают начальную страницу с каждым заданием. Если пользователи хотят тратить время на поиск своих распечаток, они могут подавить вывод начальных страниц, посылая задание с опцией `lpr -h`; другие опции man:lpr[1] см. в разделе <<printing-lpr-options-misc,Опции начальных страниц>>.
+
+[NOTE]
+====
+Система LPD выдает символ прогона страницы (form feed) после начальной страницы. Если ваш принтер использует другой символ или последовательность символов для выброса напечатанной страницы, укажите их в качестве значения характеристики `ff` в файле [.filename]#/etc/printcap#.
+====
+
+[[printing-advanced-header-pages-controlling]]
+==== Управление начальными страницами
+
+Включая выдачу начальных страниц, система LPD будет выдавать длинный _длинный заголовок_, целую страницу с большими буквами, идентифицирующими пользователя, хост и задание. Ниже представлен пример (kelly напечатала задание по имени outline с хоста `rose`):
+
+[.programlisting]
+....
+ k ll ll
+ k l l
+ k l l
+ k k eeee l l y y
+ k k e e l l y y
+ k k eeeeee l l y y
+ kk k e l l y y
+ k k e e l l y yy
+ k k eeee lll lll yyy y
+ y
+ y y
+ yyyy
+
+ ll
+ t l i
+ t l
+ oooo u u ttttt l ii n nnn eeee
+ o o u u t l i nn n e e
+ o o u u t l i n n eeeeee
+ o o u u t l i n n e
+ o o u uu t t l i n n e e
+ oooo uuu u tt lll iii n n eeee
+
+ r rrr oooo ssss eeee
+ rr r o o s s e e
+ r o o ss eeeeee
+ r o o ss e
+ r o o s s e e
+ r oooo ssss eeee
+
+ Job: outline
+ Date: Sun Sep 17 11:04:58 1995
+....
+
+Система LPD добавляет прогон страницы после этого текста, чтобы задание начиналось с новой страницы (если только вы не указали характеристику `sf` (suppress form feeds) в записи соответствующего принтера в файле [.filename]#/etc/printcap#).
+
+Если вы предпочитаете, чтобы система LPD создавала _короткий заголовок_, укажите характеристику `sb` (short banner) в файле [.filename]#/etc/printcap#. Начальная страница будет иметь следующий вид:
+
+[.programlisting]
+....
+rose:kelly Job: outline Date: Sun Sep 17 11:07:51 1995
+....
+
+Также по умолчанию система LPD печатает начальную страницу перед заданием. Для изменения порядка на обратный, укажите характеристику `hl` (header last) в файле [.filename]#/etc/printcap#.
+
+[[printing-advanced-header-pages-accounting]]
+==== Учет начальных страниц
+
+Использование встроенных начальных страниц системы LPD порождает определенную парадигму учета использования принтера: начальные страницы пользователи _не должны оплачивать_.
+
+Почему?
+
+Поскольку выходной фильтр - единственная внешняя программа, управляющая выдачей начальных страниц, которая может выполнять учет, а ей не передают информацию о _пользователе или хосте_ и учётный файл, так что, она не имеет никакого представления о том, на чей счет отнести использование принтера. Также недостаточно просто "добавлять одну страницу" в текстовом фильтре или в любом из фильтров преобразований (которые имеют информацию о пользователе и хосте), поскольку пользователи могут подавлять выдачу начальных страниц с помощью опции `lpr -h`. И их заставят оплачивать начальные страницы, которые они не печатали. Понятно, что опцию `lpr -h` будут использовать в большинстве случаев те, кто озабочен проблемами окружающей среды, но вы никак не можете стимулировать ее использование.
+
+Также _недостаточно_, чтобы каждый из фильтров генерировал собственные начальные страницы (и, тем самым, мог их учитывать). Если пользователи захотят отказаться от выдачи начальных страниц и укажут опцию `lpr -h`, они все равно их получат, и будут вынуждены оплатить, поскольку система LPD не передает информации о наличии опции `-h` ни одному из этих фильтров.
+
+Итак, что же вы можете сделать?
+
+Вы можете:
+
+* Принять парадигму системы LPD и сделать начальные страницы бесплатными.
+* Установить альтернативную систему вместо LPD, такую как LPRng. В разделе <<printing-lpd-alternatives,Альтернативы стандартному спулеру>> представлена дополнительная информация о других системах спулинга, которые можно использовать вместо LPD.
+* Написать _умный_ выходной фильтр. Обычно выходной фильтр не предназначен для выполнения чего-то кроме инициализации принтера и простых преобразований символов. Он подходит для начальных страниц и заданий с обычным текстом (когда нет текстового (входного) фильтра). Но, если есть текстовый фильтр для заданий с обычным текстом, то система LPD будет запускать выходной фильтр только для начальных страниц. И выходной фильтр может анализировать текст начальной страницы, которую генерирует система LPD, чтобы определить, на счет какого пользователя и хоста отнести начальную страницу. Единственная проблема этого метода в том, что выходной фильтр все равно не знает, какой учетный файл использовать (ему не передают имя файла, заданное в качестве значения характеристики `af`), но при наличии хорошо известного учетного файла, его имя можно явно указать в выходном фильтре. Для упрощения этапа анализа задайте характеристику `sh` (short header) в файле [.filename]#/etc/printcap#. Повторимся, что это может оказаться слишком сложным, и пользователи, несомненно, больше оценят великодушного системного администратора, который сделает начальные страницы бесплатными.
+
+[[printing-advanced-header-pages-ps]]
+==== Начальные страницы на PostScript(R)-принтерах
+
+Как было описано выше, система LPD может генерировать начальную страницу в виде обычного текста, что подходит для многих принтеров. Конечно, PostScript(R)-принтеры не могут непосредственно печатать обычный текст, так что, для них возможность выдачи начальных страниц системы LPD бесполезна - или почти бесполезна.
+
+Один очевидный способ получить начальные страницы - заставить каждый фильтр преобразования и текстовый фильтр генерировать начальную страницу. Эти фильтры должны использовать аргументы имя пользователя и хост для генерации соответствующей начальной страницы. Недостаток этого метода состоит в том, что пользователи будут всегда получать начальные страницы, даже если будут посылать задания с помощью команды `lpr -h`.
+
+Давайте рассмотрим этот метод детально. Следующий сценарий принимает три аргумента (регистрационное имя пользователя, имя хоста и имя задания) и создает простую начальную страницу на языке PostScript(R):
+
+[.programlisting]
+....
+#!/bin/sh
+#
+# make-ps-header - выдать начальную страницу на языке PostScript в stdout
+# Установлен в /usr/local/libexec/make-ps-header
+#
+
+#
+# Это единицы измерения PostScript (72 на дюйм). Измените значения для A4 или
+# другого используемого формата бумаги:
+#
+page_width=612
+page_height=792
+border=72
+
+#
+# Проверяем аргументы
+#
+if [ $# -ne 3 ]; then
+ echo "Usage: `basename $0` <user> <host> <job>" 1>&2
+ exit 1
+fi
+
+#
+# Сохраняем значения в переменных, в основном, для упрощения понимания
+# последующего PostScript-кода.
+#
+user=$1
+host=$2
+job=$3
+date=`date`
+
+#
+# Посылаем PostScript-код в stdout.
+#
+exec cat <<EOF
+%!PS
+
+%
+% Гарантируем, что не будем влиять на следующее далее задание пользователя
+%
+save
+
+%
+% Делаем тонкую некрасивую рамку по краям бумаги.
+%
+$border $border moveto
+$page_width $border 2 mul sub 0 rlineto
+0 $page_height $border 2 mul sub rlineto
+currentscreen 3 -1 roll pop 100 3 1 roll setscreen
+$border 2 mul $page_width sub 0 rlineto closepath
+0.8 setgray 10 setlinewidth stroke 0 setgray
+
+%
+% Выдаем регистрационное имя пользователя, красивыми, большими и рельефными буквами
+%
+/Helvetica-Bold findfont 64 scalefont setfont
+$page_width ($user) stringwidth pop sub 2 div $page_height 200 sub moveto
+($user) show
+
+%
+% Теперь выдаем всякие детали
+%
+/Helvetica findfont 14 scalefont setfont
+/y 200 def
+[ (Job:) (Host:) (Date:) ] {
+200 y moveto show /y y 18 sub def }
+forall
+
+/Helvetica-Bold findfont 14 scalefont setfont
+/y 200 def
+[ ($job) ($host) ($date) ] {
+ 270 y moveto show /y y 18 sub def
+} forall
+
+%
+% Вот и все
+%
+restore
+showpage
+EOF
+....
+
+Теперь, каждый из фильтров преобразования и текстовый фильтр может вызвать этот сценарий, чтобы сначала сгенерировать начальную страницу, а затем напечатать задание пользователя. Вот фильтр преобразования DVI, представленный ранее в этом документе, измененный для выдачи начальной страницы:
+
+[.programlisting]
+....
+#!/bin/sh
+#
+# psdf - фильтр преобразования DVI в PostScript
+# Установлен в /usr/local/libexec/psdf
+#
+# Вызывается системой lpd при выполнении пользователем команды lpr -d
+#
+
+orig_args="$@"
+
+fail() {
+ echo "$@" 1>&2
+ exit 2
+}
+
+while getopts "x:y:n:h:" option; do
+ case $option in
+ x|y) ;; # Ignore
+ n) login=$OPTARG ;;
+ h) host=$OPTARG ;;
+ *) echo "LPD started `basename $0` wrong." 1>&2
+ exit 2
+ ;;
+ esac
+done
+
+[ "$login" ] || fail "No login name"
+[ "$host" ] || fail "No host name"
+
+( /usr/local/libexec/make-ps-header $login $host "DVI File"
+ /usr/local/bin/dvips -f ) | eval /usr/local/libexec/lprps $orig_args
+....
+
+Обратите внимание, как фильтр должен анализировать список аргументов, чтобы определить имя пользователя и имя хоста. Анализ аргументов в других фильтрах аргументов выполняется точно так же. Текстовый фильтр принимает, однако, немного другой набор аргументов (см. раздел <<printing-advanced-filters,Как работают фильтры>>).
+
+Как уже упоминалось, представленная выше схема хотя и достаточно проста, но не позволяет учесть опцию "подавить вывод начальной страницы" (опция `-h`) команды `lpr`. Если пользователи хотят сберечь деревья (или несколько копеек, если вы берете деньги и за начальные страницы), они не смогут этого сделать, поскольку каждый фильтр будет выдавать начальную страницу для каждого задания.
+
+Чтобы позволить пользователям отключать выдачу начальной страницы для отдельного задания, надо будет использовать прием, представленный в разделе <<printing-advanced-header-pages-accounting,Учет начальных страниц>>: написать выходной фильтр, который анализирует сгенерированную системой LPD начальную страницу и выдает ее PostScript(R)-версию. Если пользователь посылает задание командой `lpr -h`, система LPD не будет генерировать начальную страницу, как и ваш выходной фильтр. В противном случае, ваш выходной фильтр будет читать текст, полученный от системы LPD, и посылать на принтер соответствующий PostScript(R)-код для начальной страницы.
+
+Если вы используете PostScript(R)-принтер с последовательным интерфейсом, можно использовать систему `lprps`, которая включает выходной фильтр, `psof`, делающий то, что описано выше. Помните, что программа `psof` не учитывает напечатанные пользователями начальные страницы.
+
+[[printing-advanced-network-printers]]
+=== Печать по сети
+
+FreeBSD поддерживает печать по сети: посылку заданий на удаленные принтеры. Печатью по сети обычно называют две разные ситуации:
+
+* Работа с принтером, подключенным к удаленному хосту. Вы устанавливаете принтер с обычным последовательным или параллельным интерфейсом на одном хосте. Затем, вы настраиваете систему LPD для обеспечения доступа к принтеру с других хостов в сети. В разделе <<printing-advanced-network-rm,"Принтеры, установленные на удаленных хостах">> описано, как это сделать.
+* Работа с принтером, подключенным непосредственно к сети. Принтер имеет сетевой интерфейс, кроме (или вместо) более традиционного последовательного или параллельного. Такой принтер может работать следующим образом:
+
+** Он может понимать протокол LPD и даже поддерживать очереди заданий с удаленных хостов. В этом случае, он работает просто как обычный хост с системой LPD. Для настройки такого принтера следуйте той же процедуре, которая описана в разделе <<printing-advanced-network-rm,"Принтеры, установленные на удаленных хостах">>.
+** Он может поддерживать получение потока данных по сети. В этом случае, вы "подключаете" принтер к одному из хостов в сети, делая этот хост ответственным за поддержку очередей заданий и их посылку на принтер. В разделе <<printing-advanced-network-net-if,Принтеры с сетевыми интерфейсами>> представлен ряд советов по установке таких принтеров.
+
+[[printing-advanced-network-rm]]
+==== Принтеры, установленные на удаленных хостах
+
+Система спулинга LPD имеет встроенную поддержку посылки заданий на другие хосты, на которых тоже работает система LPD (или совместимая с LPD). Это позволяет установить принтер на одном хосте и сделать его доступным с других хостов. Она также работает с принтерами, имеющими сетевые интерфейсы и понимающими протокол LPD.
+
+Для обеспечения такого рода удаленной печати, сначала установите принтер на одном хосте, _хосте принтера_, с помощью процедуры, описанной в разделе <<printing-simple,Простая настройка принтера>>. Выполните любые необходимые дополнительные настройки, как описано в разделе <<printing-advanced,Расширенная настройка принтера>>. Не забудьте протестировать принтер и убедиться, обеспечивает ли он заданные возможности системы LPD. Также проверьте, что _локальный хост_ имеет право использовать службу LPD на _удаленном хосте_ (см. раздел <<printing-advanced-restricting-remote,Ограничение приема заданий с удаленных хостов>>).
+
+Если вы используете принтер с сетевым интерфейсом, совместимый с системой LPD, упомянутым в обсуждении выше _хостом принтера_ будет сам принтер, а в качестве _имени принтера_ будет выступать имя, которое вы сконфигурировали для принтера. См. документацию, поставляемую с принтером и/или сетевым интерфейсом принтера.
+
+[TIP]
+====
+
+Если вы используете Hewlett Packard Laserjet, то при задании принтеру имени `text` будет автоматически выполняться преобразование символа LF в последовательность CRLF, так что, сценарий [.filename]#hpif# не понадобится.
+====
+
+Затем, на других хостах, для которых вы хотите обеспечить доступ к принтеру, создайте запись в их файлах [.filename]#/etc/printcap# со следующими компонентами:
+
+. Дайте записи любое подходящее имя. Для простоты, однако, имеет смысл задавать такое же имя и псевдонимы, как и на хосте принтера.
+. Характеристику `lp` оставьте пустой, указав это явно (`:lp=:`).
+. Создайте каталог спулинга и укажите его местонахождение в характеристике `sd`. Система LPD будет сохранять задания в нем, прежде чем они будут посланы на хост принтера.
+. Укажите имя хоста принтера в качестве значения характеристики `rm`.
+. Укажите имя принтера на _хосте принтера_ в качестве значения характеристики `rp`.
+
+Вот и все. Не нужно перечислять фильтры преобразования, размеры страницы и вообще ничего больше в файле [.filename]#/etc/printcap#.
+
+Рассмотрим пример. На хосте `rose` есть два принтера, `bamboo` и `rattan`. Мы позволим пользователям хоста `orchid` печатать на эти принтеры. Вот файл [.filename]#/etc/printcap# для хоста `orchid` (из раздела <<printing-advanced-header-pages-enabling,Включение выдачи начальных страниц>>). В нем уже есть запись для принтера `teak`; мы добавили две записи для принтеров на хосте `rose`:
+
+[.programlisting]
+....
+#
+# /etc/printcap для хоста orchid - добавлены (удаленные) принтеры на rose
+#
+
+#
+# teak - локальный принтер; он подключен непосредственно к orchid:
+#
+teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
+ :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\
+ :if=/usr/local/libexec/ifhp:\
+ :vf=/usr/local/libexec/vfhp:\
+ :of=/usr/local/libexec/ofhp:
+
+#
+# rattan подключен к rose; посылать задания для rattan на хост rose:
+#
+rattan|line|diablo|lp|Diablo 630 Line Printer:\
+ :lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan:
+
+#
+# bamboo тоже подключен к rose:
+#
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:
+....
+
+Затем достаточно только создать каталоги спулинга на `orchid`:
+
+[source,bash]
+....
+# mkdir -p /var/spool/lpd/rattan /var/spool/lpd/bamboo
+# chmod 770 /var/spool/lpd/rattan /var/spool/lpd/bamboo
+# chown daemon:daemon /var/spool/lpd/rattan /var/spool/lpd/bamboo
+....
+
+Теперь пользователи хоста `orchid` могут печатать на принтеры `rattan` и `bamboo`. Если, например, пользователь на `orchid` выполнит команду
+
+[source,bash]
+....
+% lpr -P bamboo -d sushi-review.dvi
+....
+
+система LPD на `orchid` будет копировать задание в каталог спулинга [.filename]#/var/spool/lpd/bamboo# и учтет, что печатается задание DVI. Как только на хосте `rose` появится место в каталоге спулинга принтера `bamboo`, две системы LPD передадут файл на хост `rose`. Файл будет ждать в очереди на `rose` пока, наконец, не будет напечатан. Он будет преобразован из формата DVI в PostScript(R) (поскольку `bamboo` является PostScript(R)-принтером) на хосте `rose`.
+
+[[printing-advanced-network-net-if]]
+==== Принтеры с сетевыми интерфейсами
+
+Часто при покупке сетевой карты для принтера можно приобрести две версии: эмулирующую спулер (более дорогая версия) или просто позволяющую принимать на принтер данные так, как если бы использовался последовательный или параллельный порт (более дешевая версия). В этом разделе описано, как использовать более дешёвую версию. Использование более дорогой версии описано в предыдущем разделе <<printing-advanced-network-rm,"Принтеры, установленные на удаленных хостах">>.
+
+Формат файла [.filename]#/etc/printcap# позволяет указывать, какой последовательный или параллельный интерфейс использовать, и (при использовании последовательного интерфейса), какую установить скорость, использовать ли управление потоком, размер отступов для табуляций, преобразование символов новой строки и другие параметры. Но нет способа указать подключение к принтеру, прослушивающему TCP/IP или другой сетевой порт.
+
+Для посылки данных на подключенный к сети принтер, надо разработать программу взаимодействия, которую могут вызывать текстовый фильтр и фильтры преобразований. Вот один из примеров: скрипт `netprint` принимает все данные со стандартного входного потока и посылает их на принтер, подключенный к сети. Мы указываем имя хоста принтера в качестве первого аргумента, а номер порта, к которому надо подключаться - в качестве второго аргумента команды `netprint`. Учтите, что поддерживается только одностороннее взаимодействие (с ОС FreeBSD на принтер); многие сетевые принтеры поддерживают двустороннее взаимодействие, и вы можете захотеть его использовать (для получения состояния принтера, учета и т.п.).
+
+[.programlisting]
+....
+#!/usr/bin/perl
+#
+# netprint - Текстовый фильтр для принтера, подключенного к сети
+# Установлен в /usr/local/libexec/netprint
+#
+$#ARGV eq 1 || die "Usage: $0 <printer-hostname> <port-number>";
+
+$printer_host = $ARGV[0];
+$printer_port = $ARGV[1];
+
+require 'sys/socket.ph';
+
+($ignore, $ignore, $protocol) = getprotobyname('tcp');
+($ignore, $ignore, $ignore, $ignore, $address)
+ = gethostbyname($printer_host);
+
+$sockaddr = pack('S n a4 x8', &AF_INET, $printer_port, $address);
+
+socket(PRINTER, &PF_INET, &SOCK_STREAM, $protocol)
+ || die "Can't create TCP/IP stream socket: $!";
+connect(PRINTER, $sockaddr) || die "Can't contact $printer_host: $!";
+while (<STDIN>) { print PRINTER; }
+exit 0;
+....
+
+Затем можно использовать этот сценарий в различных фильтрах. Пусть у нас есть строчный принтер Diablo 750-N, подключенный к сети. Принтер принимает данные на печать через порт 5100. Имя хоста для принтера - scrivener. Вот текстовый фильтр для этого принтера:
+
+[.programlisting]
+....
+#!/bin/sh
+#
+# diablo-if-net - Текстовый фильтр для принтера Diablo `scrivener',
+# прослушивающего порт 5100. Установлен в /usr/local/libexec/diablo-if-net
+#
+exec /usr/libexec/lpr/lpf "$@" | /usr/local/libexec/netprint scrivener 5100
+....
+
+[[printing-advanced-restricting]]
+=== Ограничение использования принтера
+
+В этом разделе представлена информация об ограничении доступа к принтеру. Система LPD позволяет управлять тем, кто может обращаться к принтеру, как локально, так и удаленно, смогут ли они печатать несколько копий, насколько большими могут быть их задания и насколько могут разрастаться очереди печати.
+
+[[printing-advanced-restricting-copies]]
+==== Ограничение количества копий
+
+Система LPD позволяет пользователям легко печатать несколько копий файла. Пользователи могут печатать задания с помощью команды `lpr -#5` (например) и получать пять копий каждого файла в задании. Хорошо это или нет - решать вам.
+
+Если вы считаете, что многочисленные копии только изнашивают ваши принтеры, можете отключить опцию `-#` команды man:lpr[1], добавив характеристику `sc` в файл [.filename]##/etc/printcap##. Когда пользователи пошлют задания с опцией `-##`, они увидят:
+
+[source,bash]
+....
+lpr: multiple copies are not allowed
+....
+
+Учтите, что если вы настроили удаленный доступ к принтеру (см. раздел <<printing-advanced-network-rm,"Принтеры, установленные на удаленных хостах">>), необходимо задать характеристику `sc` также и в файлах [.filename]#/etc/printcap# удаленных хостов, иначе пользователи все равно смогут посылать задания с несколькими копиями с других хостов.
+
+Рассмотрим пример. Вот файл [.filename]#/etc/printcap# для хоста `rose`. Принтер `rattan` вполне надежен, поэтому мы разрешим печатать на него несколько копий, но лазерный принтер `bamboo` несколько более изношен, поэтому мы отключим для него печать нескольких копий, добавив характеристику `sc`:
+
+[.programlisting]
+....
+#
+# /etc/printcap для хоста rose - запрещает печать нескольких копий на bamboo
+#
+rattan|line|diablo|lp|Diablo 630 Line Printer:\
+ :sh:sd=/var/spool/lpd/rattan:\
+ :lp=/dev/lpt0:\
+ :if=/usr/local/libexec/if-simple:
+
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :sh:sd=/var/spool/lpd/bamboo:sc:\
+ :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\
+ :if=/usr/local/libexec/psif:\
+ :df=/usr/local/libexec/psdf:
+....
+
+Теперь нам также нужно добавить характеристику `sc` в файле [.filename]#/etc/printcap# на хосте `orchid` (и раз уж мы его меняем, давайте отключим печать нескольких копий для принтера `teak`):
+
+[.programlisting]
+....
+#
+# /etc/printcap для хоста orchid - отключена печать нескольких копий на
+# локальном принтере teak и на удаленном принтере bamboo
+teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
+ :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:sc:\
+ :if=/usr/local/libexec/ifhp:\
+ :vf=/usr/local/libexec/vfhp:\
+ :of=/usr/local/libexec/ofhp:
+
+rattan|line|diablo|lp|Diablo 630 Line Printer:\
+ :lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan:
+
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:sc:
+....
+
+С помощью характеристики `sc` мы предотвращаем использование команды `lpr -#`, но это не мешает пользователям просто выполнить команду man:lpr[1] несколько раз или просто послать один и тот же файл несколько раз в одном задании следующим образом:
+
+[source,bash]
+....
+% lpr forsale.sign forsale.sign forsale.sign forsale.sign forsale.sign
+....
+
+Есть много способов предотвратить такое некорректное использование (включая его игнорирование), которые вы можете разработать самостоятельно.
+
+[[printing-advanced-restricting-access]]
+==== Ограничение доступа к принтерам
+
+Вы можете управлять тем, кто и на какие принтеры может печатать, с помощью механизма групп UNIX(R) и характеристики `rg` в файле [.filename]#/etc/printcap#. Просто поместите пользователей, которым необходимо предоставить доступ к принтеру, в определенную группу, a затем укажите эту группу в качестве значения характеристики `rg`.
+
+Пользователи, не входящие в эту группу (включая `root`) будут получать уведомление `lpr: Not a member of the restricted group` при попытке печатать на контролируемый принтер.
+
+Как и в случае с характеристикой `sc` (подавить выдачу нескольких копий), при необходимости, надо указывать характеристику `rg` и на удаленных хостах, имеющих доступ к вашим принтерам (см. раздел <<printing-advanced-network-rm,"Принтеры, установленные на удаленных хостах">>).
+
+Например, давайте разрешим всем обращаться к принтеру `rattan`, но только пользователи группы `artists` смогут использовать принтер `bamboo`. Вот знакомый уже файл [.filename]#/etc/printcap# для хоста `rose`:
+
+[.programlisting]
+....
+#
+# /etc/printcap для хоста rose - ограничение группы для bamboo
+#
+rattan|line|diablo|lp|Diablo 630 Line Printer:\
+ :sh:sd=/var/spool/lpd/rattan:\
+ :lp=/dev/lpt0:\
+ :if=/usr/local/libexec/if-simple:
+
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:\
+ :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\
+ :if=/usr/local/libexec/psif:\
+ :df=/usr/local/libexec/psdf:
+....
+
+Давайте не будем менять другой рассматриваемый файл [.filename]#/etc/printcap# (для хоста `orchid`). Конечно, в результате, любой пользователь `orchid` может печатать на `bamboo`. Возможно, на хосте `orchid` учетных записей и так немного, и вы хотите, чтобы все они имели доступ к принтеру. Или нет.
+
+[NOTE]
+====
+Для принтера может быть только одна ограниченная группа.
+====
+
+[[printing-advanced-restricting-sizes]]
+==== Контроль размеров посылаемых заданий
+
+Если к принтеру обращается несколько пользователей, вам, возможно, понадобиться установить ограничение на максимальный размер файлов, которые пользователи могут посылать на печать. В конечном итоге, размер файловой системы, в которой находятся каталоги спулинга, ограничен, и надо гарантировать, что в нем останется место для заданий других пользователей.
+
+Система LPD ограничить максимально допустимый размер файла в задании с помощью характеристики `mx`. Размер задается в блоках, размер которых, `BUFSIZ`, составляет 1024 байта. Если задать этой характеристике значение ноль, размер файла ограничиваться не будет; однако, если характеристика `mx` вообще не задана, то будет использоваться стандартное ограничение - 1000 блоков.
+
+[NOTE]
+====
+Ограничение применяется к _файлам в задании_, а _не_ к общему размеру задания.
+====
+
+Система LPD не откажется печатать файл больше максимально допустимого для принтера размера. Вместо этого, она поставит в очередь часть файла до заданного предела, и она будет напечатана. Остальное не будет напечатано. Правильность такого поведения не бесспорна.
+
+Давайте установим ограничения для принтеров из наших примеров, `rattan` и `bamboo`. Поскольку PostScript(R)-файлы этих художников обычно бывают весьма большими, мы ограничим их размер пятью мегабайтами. Мы не будем ограничивать использование обычного текстового строчного принтера:
+
+[.programlisting]
+....
+#
+# /etc/printcap для хоста rose
+#
+
+#
+# Без ограничения на размер задания:
+#
+rattan|line|diablo|lp|Diablo 630 Line Printer:\
+ :sh:mx#0:sd=/var/spool/lpd/rattan:\
+ :lp=/dev/lpt0:\
+ :if=/usr/local/libexec/if-simple:
+
+#
+# Размер файла - не более пяти мегабайт:
+#
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
+ :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\
+ :if=/usr/local/libexec/psif:\
+ :df=/usr/local/libexec/psdf:
+....
+
+Опять таки, ограничения применяются только для локальных пользователей. Если вы настроили удаленный доступ к принтерам, для удаленных пользователей эти ограничения не действуют. Надо задать характеристику `mx` и в файлах [.filename]#/etc/printcap# удаленных хостов. Более детальную информацию по удаленной печати см. в разделе <<printing-advanced-network-rm,"Принтеры, установленные на удаленных хостах">>.
+
+Есть еще один специализированный способ ограничить размер заданий печати с удаленных принтеров; см. раздел <<printing-advanced-restricting-remote,Ограничение печати заданий с удаленных хостов>>.
+
+[[printing-advanced-restricting-remote]]
+==== Ограничение печати заданий с удаленных хостов
+
+Система спулинга LPD обеспечивает несколько способов ограничить посылку заданий с удаленных хостов:
+
+Ограничения хостов::
+Вы можете управлять тем, с каких удаленных хостов локальная система LPD принимает запросы, с помощью файлов [.filename]#/etc/hosts.equiv# и [.filename]#/etc/hosts.lpd#. Система LPD проверяет, поступает ли входящий запрос с хоста, указанного в одном из этих файлов. Если нет, система LPD отвергает запрос.
++
+Формат этих файлов простой: по одному имени хоста в строке. Учтите, что файл [.filename]#/etc/hosts.equiv# также используется протоколом man:ruserok[3] и влияет на программы man:rsh[1] и man:rcp[1], так что, будьте внимательны.
++
+Например, вот файл [.filename]#/etc/hosts.lpd# для хоста `rose`:
++
+[.programlisting]
+....
+orchid
+violet
+madrigal.fishbaum.de
+....
++
+Это означает, что хост `rose` будет принимать запросы с хостов `orchid`, `violet` и `madrigal.fishbaum.de`. Если любой другой хост попытается обратиться к системе LPD хоста `rose`, его задание будет отвергнуто.
+
+Ограничения размера::
+Вы можете управлять тем, сколько свободного места должно оставаться в файловой системе, в которой находится каталог спулинга. Создайте файл с именем [.filename]#minfree# в каталоге спулинга для локального принтера. Вставьте в этот файл число, задающее, сколько блоков диска (по 512 байтов) должно быть свободными, чтобы удаленное задание было принято.
++
+Это позволяет гарантировать, что удаленные пользователи не заполнят вашу файловую систему. Можно также использовать этот механизм для предоставления определенного преимущества локальным пользователям: они смогут ставить задания в очередь еще долго после того, как свободного места на диске станет меньше, чем указано в файле [.filename]#minfree#.
++
+Например, давайте добавим файл [.filename]#minfree# для принтера `bamboo`. Найдем в файле [.filename]#/etc/printcap# каталог спулинга для этого принтера; вот запись для принтера `bamboo`:
++
+[.programlisting]
+....
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
+ :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:mx#5000:\
+ :if=/usr/local/libexec/psif:\
+ :df=/usr/local/libexec/psdf:
+....
++
+Каталог спулинга задается характеристикой `sd`. Укажем, что в файловой системе должно быть три мегабайта (что составляет 6144 блоков диска) свободного места, чтобы система LPD принимала удаленные задания:
++
+[source,bash]
+....
+# echo 6144 > /var/spool/lpd/bamboo/minfree
+....
+
+Ограничения пользователей::
+Вы можете управлять тем, какие удаленные пользователи смогут печатать на локальные принтеры, задавая характеристику `rs` в файле [.filename]#/etc/printcap#. Когда характеристика `rs` указана в записи для локально подключенного принтера, система LPD будет принимать задания с удаленных хостов, _если_ пользователь, посылающий задание, также имеет учетную запись с тем же именем на локальном хосте. В противном случае, система LPD отвергает задание.
++
+Эта возможность особенно полезна в среде, где есть, например, несколько отделов, совместно использующих сеть, и некоторые пользователи могут переходить из отдела в отдел. Если дать им учетные записи в системах, они смогут использовать принтеры из систем в своих отделах. Если вы хотели бы позволить им использовать _только_ принтеры, но не остальные ресурсы вашего компьютера, можно дать им "формальные" учетные записи, без начального каталога и с бесполезным начальным командным интерпретатором вроде [.filename]#/usr/bin/false#.
+
+[[printing-advanced-acct]]
+=== Учет использования принтера
+
+Итак, вам надо брать деньги за распечатки. А почему нет? Бумага и чернила стоят денег. А есть еще и затраты на поддержку в работоспособном состоянии - принтеры имеют множество движущихся частей и склонны к поломкам. Вы проанализировали состояние принтеров, объемы использования и затраты на их эксплуатацию, и получили определенную стоимость страницы (или фута, метра или чего угодно). Теперь, как же начать реально учитывать распечатки?
+
+Итак, плохая новость состоит в том, что система спулинга LPD в этом не сильно поможет. Учет сильно зависит от типа используемого принтера, форматов распечаток и _ваших_ требований к оплате использования принтеров.
+
+Для реализации учета надо изменить текстовый фильтр принтера (чтобы учитывать обычные текстовые задания) и фильтры преобразования (чтобы учитывать другие форматы файлов), для подсчета страниц или запроса количества напечатанных страниц у принтера. Не получится обойтись использованием простого выходного фильтра, поскольку он не может выполнять учет. См. раздел <<printing-advanced-filter-intro,Фильтры>>.
+
+Обычно есть два способа выполнения учета:
+
+* _Периодический учет_ - более распространенный способ, возможно, потому, что он проще. Когда кто-то печатает задание, фильтр регистрирует пользователя, хост и количество страниц в учетном файле. Каждый месяц, семестр, год или раз в любой желаемый период времени, вы собираете учетные файлы для различных принтеров, суммируете напечатанные каждым пользователем страницы и выставляете суммы за использование. Затем вы очищаете все регистрационные файлы, начиная с чистого листа новый отчетный период.
+* _Постоянный учет_ используется реже, вероятно, потому, что сложнее в реализации. Этот метод требует от фильтров выставлять пользователям суммы за распечатки сразу после использования принтеров. Как и проверка дисковых квот, этот учет выполняется немедленно. Вы можете не давать пользователям печатать, если баланс на их счету стал отрицательным, а также предоставить им способ проверить и изменить свои "квоты печати". Но этот метод требует поддержки базы данных для отслеживания пользователей и квот.
+
+Система спулинга LPD легко поддерживает оба метода: поскольку вы (в большинстве случаев) должны предоставить фильтры, вам придется предоставить и код для учета. Но есть и положительный момент: методы учета могут быть сколько угодно гибкими. Например, можно выбрать периодический или постоянный учет. Можно выбрать, какую именно информацию регистрировать: имена пользователей, имена хостов, типы заданий, количество напечатанных страниц, квадратные метры использованной бумаги, продолжительность печати заданий, и т.д. Это делается путем изменения фильтров так, чтобы они сохраняли соответствующую информацию.
+
+==== Простая система учета использования принтера
+
+В составе FreeBSD поставляется две программы, которые можно сразу использовать для организации простой системы периодического учета. Речь идет о текстовом фильтре `lpf`, описанном в разделе <<printing-advanced-lpf,lpf: текстовый фильтр>>, и о программе man:pac[8], обеспечивающей сбор и суммирование записей из учетных файлов принтеров.
+
+Как уже упоминалось в разделе, посвященном фильтрам (<<printing-advanced-filters,Фильтры>>), система LPD при запуске текстового фильтра и фильтров преобразований передает им имя учетного файла в командной строке. Фильтры могут использовать соответствующий аргумент, чтобы определить, куда записывать учетную информацию. Имя этого файла берется из значения характеристики `af` в файле [.filename]#/etc/printcap# и, если не заданно как абсолютное, интерпретируется относительно каталога спулинга.
+
+Система LPD запускает `lpf` с аргументами ширины и длины страницы (которые берутся из характеристик `pw` и `pl`). Программа `lpf` использует эти аргументы для определения количества бумаги, которая будет использована. После посылки файла на принтер она вносит запись в учетный файл. Эти записи имеют следующий вид:
+
+[.programlisting]
+....
+2.00 rose:andy
+3.00 rose:kelly
+3.00 orchid:mary
+5.00 orchid:mary
+2.00 orchid:zhang
+....
+
+Следует использовать отдельный учетный файл для каждого принтера, поскольку программа `lpf` не реализует механизм блокирования файлов, и два экземпляра `lpf` могут повредить записи друг друга, если записывают одновременно в один и тот же файл. Простой способ выделить отдельный учетный файл для каждого принтера - использовать характеристику `af=acct` в файле [.filename]#/etc/printcap#. Тогда каждый учетный файл окажется в каталоге спулинга соответствующего принтера и будет назван [.filename]#acct#.
+
+Когда вы будете готовы выставить пользователям счет за распечатки, запустите программу man:pac[8]. Просто перейдите в каталог спулинга принтера, учетную информацию которого вы хотите обработать, и введите команду `pac`. Вы получите итоговые суммы в долларах, как показано ниже:
+
+[source,bash]
+....
+ Login pages/feet runs price
+orchid:kelly 5.00 1 $ 0.10
+orchid:mary 31.00 3 $ 0.62
+orchid:zhang 9.00 1 $ 0.18
+rose:andy 2.00 1 $ 0.04
+rose:kelly 177.00 104 $ 3.54
+rose:mary 87.00 32 $ 1.74
+rose:root 26.00 12 $ 0.52
+
+total 337.00 154 $ 6.74
+....
+
+Команда man:pac[8] принимает следующие аргументы:
+
+`-P _принтер_`::
+По какому _принтеру_ подсчитывать итоговые суммы. Эта опция работает, только если в качестве значения характеристики `af` в файле [.filename]#/etc/printcap# указано абсолютное имя.
+
+`-c`::
+Сортировать отчет по сумме, а не по имени пользователя в алфавитном порядке.
+
+`-m`::
+Игнорировать имя хоста в учетных файлах. При указании этой опции, пользователь `smith` на хосте `alpha` считается тем же, что и пользователь `smith` на хосте `gamma`. Обычно эти пользователи считаются разными.
+
+`-p _стоимость_`::
+Вычислять суммы из расчета _стоимость_ долларов за страницу или за фут, вместо использования значения характеристики `pc` в файле [.filename]#/etc/printcap#, или двух центов (как принято по умолчанию). Можно задавать _стоимость_ как число с плавающей запятой.
+
+`-r`::
+Изменить порядок сортировки.
+
+`-s`::
+Создать итоговый учетный файл и очистить учетный файл.
+
+_имя..._::
+Выдать учетную информацию только для пользователей с заданными _именами_.
+
+В стандартном отчете, который создает команда man:pac[8], выдается количество страниц, напечатанное каждым из пользователей с различных хостов. Если для вас хосты не имеют значения (поскольку пользователи могут работать на любом хосте), выполните команду `pac -m` для получения следующих итогов:
+
+[source,bash]
+....
+ Login pages/feet runs price
+andy 2.00 1 $ 0.04
+kelly 182.00 105 $ 3.64
+mary 118.00 35 $ 2.36
+root 26.00 12 $ 0.52
+zhang 9.00 1 $ 0.18
+
+total 337.00 154 $ 6.74
+....
+
+Для получения сумм в долларах программа man:pac[8] использует значение характеристики `pc` в файле [.filename]#/etc/printcap# (по умолчанию - 200, или 2 цента за страницу). Укажите в качестве значения этой характеристики, в сотых долях цента, стоимость страницы или фута, исходя из которой вы хотите брать деньги за распечатки. Это значение можно переопределить при вызове команды man:pac[8] с помощью опции `-p`. Но при использовании опции `-p` стоимость надо указывать в долларах, а не в сотых долях цента. Например, команда
+
+[source,bash]
+....
+# pac -p1.50
+....
+
+приводит к тому, что страница будет стоить один доллар пятьдесят центов. Используя эту опцию, можно фактически начинать грести деньги лопатой.
+
+Наконец, при выполнении команды `pac -s` итоговая информация будет сохранена в итоговом учетном файле, имя которого строится как имя учетного файла принтера с суффиксом `_sum`. Затем учетный файл принтера очищается. Когда команда man:pac[8] выполняется повторно, она перечитывает итоговый файл для получения начальных сумм, а затем добавляет информацию из обычного учетного файла.
+
+==== Как можно подсчитать количество напечатанных страниц?
+
+Для выполнения хоть отдаленно точного учета надо уметь определять, сколько бумаги использовано для печати задания. Это - основная проблема учета использования принтеров.
+
+Для обычных текстовых заданий решить эту проблему не сложно: надо считать, сколько строк входит в задание, и сравнивать с количеством строк на страницу, которые поддерживает принтер. Не забывайте учитывать символы забоя в файлах, которые приводят к перепечатке строк поверх, а также длинные логические строки, которые переносятся на несколько физических.
+
+Текстовый фильтр `lpf` (представленный в разделе <<printing-advanced-lpf,lpf: текстовый фильтр>>) учитывает эти вещи при выполнении учета. Если вы пишете текстовый фильтр, который должен осуществлять учет, может иметь смысл просмотреть исходный код программы `lpf`.
+
+Но как обрабатывать файлы других форматов?
+
+Ну, для преобразования из DVI в формат LaserJet или из DVI в PostScript(R), можно в фильтре анализировать диагностические результаты команды `dvilj` или `dvips`, чтобы определить, сколько страниц было преобразовано. Может оказаться возможным применить этот прием и для других форматов файлов и программ преобразования.
+
+Но эти методы несовершенны из-за того, что принтер мог фактически и не напечатать все эти страницы. Например, он мог замять бумагу, в нем мог закончиться тонер или он мог вообще взорваться - и пользователю все равно пришлось бы платить.
+
+Так что же делать?
+
+Есть только один _надежный_ способ _точного_ учета. Купите принтер, который может сообщать, сколько бумаги он использовал, и подключите его через последовательный порт или по сети. Практически все PostScript(R)-принтеры поддерживают такую возможность. Другие модели - тоже (сетевые лазерные принтеры Imagen, например). Измените фильтры для этих принтеров так, чтобы получать количество использованных страниц после печати каждого задания, и пусть они записывают учетную информацию _только_ на основе этого значения. Не надо ни считать строки, ни выполнять чреватую ошибками обработку файла.
+
+Конечно, всегда можно поступить великодушно и не брать денег за распечатки.
+
+[[printing-using]]
+== Использование принтеров
+
+В этом разделе описано, как использовать настроенные принтеры в ОС FreeBSD. Вот сводка команд пользовательского уровня:
+
+man:lpr[1]::
+Печать заданий
+
+man:lpq[1]::
+Проверка очередей принтеров
+
+man:lprm[1]::
+Удаление заданий из очередей принтеров
+
+Есть также административная команда, man:lpc[8], описанная в разделе <<printing-lpc,Администрирование принтеров>>, используемая для управления принтерами и их очередями.
+
+Все три команды, man:lpr[1], man:lprm[1] и man:lpq[1], поддерживают опцию `-P _имя-принтера_`, позволяющую указать, с каким принтером/очередью из указанных в файле [.filename]#/etc/printcap# работать. Это позволяет посылать, удалять и проверять задания на разных принтерах. Если вы не используете опцию `-P`, эти команды используют принтер, указанный в качестве значения переменной среды `PRINTER`. Наконец, если переменная среды `PRINTER` не задана, эти команды по умолчанию направляются на принтер по имени `lp`.
+
+Далее термин _стандартный принтер_ означает принтер, указанный переменной среды `PRINTER` или принтер по имени `lp`, если переменная среды `PRINTER` не задана.
+
+[[printing-lpr]]
+=== Задания печати
+
+Для печати файлов, выполните команду:
+
+[source,bash]
+....
+% lpr имя-файла ...
+....
+
+Эта команда печатает каждый из перечисленных файлов на стандартный принтер. Если файлы не указаны, команда man:lpr[1] читает данные для печати со стандартного входного потока. Например, следующая команда печатает некоторые важные системные файлы:
+
+[source,bash]
+....
+% lpr /etc/host.conf /etc/hosts.equiv
+....
+
+Для выбора конкретного принтера, введите:
+
+[source,bash]
+....
+% lpr -P имя-принтера имя-файла ...
+....
+
+Следующая команда печатает подробный листинг текущего каталога на принтере `rattan`:
+
+[source,bash]
+....
+% ls -l | lpr -P rattan
+....
+
+Поскольку для команды man:lpr[1] файлы не указаны, команда `lpr` читает данные для печати из стандартного входного потока, который содержит результат выполнения команды `ls -l`.
+
+Команда man:lpr[1] может также принимать множество опций для управления форматированием, применения преобразований, печати нескольких копий и т.д. Дополнительную информацию см. в разделе <<printing-lpr-options,Опции печати>>.
+
+[[printing-lpq]]
+=== Проверка заданий
+
+При печати с помощью команды man:lpr[1], данные, которые надо напечатать, помещаются вместе в пакет, который называют "заданием печати", и посылаются системе спулинга LPD. Каждый принтер имеет очередь заданий, и ваше задание ждет в этой очереди вместе с другими вашими заданиями и заданиями других пользователей. Принтер печатает эти задания по принципу первым пришло, первым выполнено.
+
+Для получения очереди стандартного принтера, введите команду man:lpq[1]. Чтобы указать конкретный принтер, используйте опцию `-P`. Например, команда
+
+[source,bash]
+....
+% lpq -P bamboo
+....
+
+показывает очередь для принтера по имени `bamboo`. Вот пример результатов выполнения команды `lpq`:
+
+[source,bash]
+....
+bamboo is ready and printing
+Rank Owner Job Files Total Size
+active kelly 9 /etc/host.conf, /etc/hosts.equiv 88 bytes
+2nd kelly 10 (standard input) 1635 bytes
+3rd mary 11 ... 78519 bytes
+....
+
+Показано, что в очереди `bamboo` есть три задания. Первое задание, посланное пользователем kelly, получило "номер задания" 9. Каждое задание для принтера получает уникальный номер задания. В большинстве случаев номер задания можно игнорировать, но он потребуется, если надо будет отменить задание; подробнее об этом см. в разделе <<printing-lprm,Удаление заданий>>.
+
+Задание номер 9 состоит из двух файлов; несколько файлов, указанных в командной строке man:lpr[1], считаются частью одного задания. Это задание является текущим активным (обратите внимание на слово `active` в столбце "Rank"), т.е. принтер должен сейчас печатать это задание. Второе задание состоит из данных, передаваемых в качестве стандартного входного потока команде man:lpr[1]. Третье задание послано пользователем `mary`; оно намного больше по объему. Полное имя файла, который печатается, слишком длинное и не помещается, поэтому команда man:lpq[1] просто выдает три точки.
+
+Самая первая строка результатов команды man:lpq[1] тоже полезна: она говорит о том, что сейчас делает принтер (или, по крайней мере, что он делает по мнению системы LPD).
+
+Команда man:lpq[1] также поддерживает опцию `-l` для генерации подробного длинного листинга. Вот пример результатов выполнения команды `lpq -l`:
+
+[source,bash]
+....
+waiting for bamboo to become ready (offline ?)
+kelly: 1st [job 009rose]
+ /etc/host.conf 73 bytes
+ /etc/hosts.equiv 15 bytes
+
+kelly: 2nd [job 010rose]
+ (standard input) 1635 bytes
+
+mary: 3rd [job 011rose]
+ /home/orchid/mary/research/venus/alpha-regio/mapping 78519 bytes
+....
+
+[[printing-lprm]]
+=== Удаление заданий
+
+Если вы передумали печатать задание, можно удалить его из очереди заданий с помощью команды man:lprm[1]. Часто можно использовать man:lprm[1] для удаления активного задания, но часть задания или даже все задание все равно может быть напечатано.
+
+Для удаления задания со стандартного принтера сначала используйте команду man:lpq[1] для поиска номера задания. Затем введите команду:
+
+[source,bash]
+....
+% lprm номер-задания
+....
+
+Для удаления задания с указанного принтера, задайте опцию `-P` option. Следующая команда удаляет задание номер 10 из очереди заданий принтера `bamboo`:
+
+[source,bash]
+....
+% lprm -P bamboo 10
+....
+
+Для команды man:lprm[1] есть ряд сокращений:
+
+lprm -::
+Удаляет все задания (со стандартного принтера), принадлежащие пользователю, который выполнил команду.
+
+lprm _пользователь_::
+Удаляет все задания (для стандартного принтера), принадлежащие указанному _пользователю_. Суперпользователь может удалять задания других пользователей; обычный пользователь может удалять только собственные задания.
+
+lprm::
+Если в командной строке не указаны номер задания, имя пользователя, или указана опция `-`, команда man:lprm[1] удаляет текущее активное задание на стандартном принтере, если оно принадлежит вам. Суперпользователь может удалять любое активное задание.
+
+Добавьте опцию `-P` для любого из перечисленных выше сокращений, чтобы работать с любым необходимым принтером вместо стандартного. Например, следующая команда удаляет все задания текущего пользователя из очереди принтера по имени `rattan`:
+
+[source,bash]
+....
+% lprm -P rattan -
+....
+
+[NOTE]
+====
+Если вы работаете в сетевой среде, команда man:lprm[1] позволит вам удалять задания только с хоста, с которого они были посланы, даже если тот же принтер доступен и с других хостов. Следующая последовательность команд демонстрирует это:
+
+[source,bash]
+....
+% lpr -P rattan myfile
+% rlogin orchid
+% lpq -P rattan
+Rank Owner Job Files Total Size
+active seeyan 12 ... 49123 bytes
+2nd kelly 13 myfile 12 bytes
+% lprm -P rattan 13
+rose: Permission denied
+% logout
+% lprm -P rattan 13
+dfA013rose dequeued
+cfA013rose dequeued
+....
+
+====
+
+[[printing-lpr-options]]
+=== Не только обычный текст: опции печати
+
+Команда man:lpr[1] поддерживает несколько опций, управляющих форматированием текста, преобразованием графики и других форматов файлов, выдачей нескольких копий, обработкой задания и др. В этом разделе описаны эти опции.
+
+[[printing-lpr-options-format]]
+==== Опции форматирования и преобразования
+
+Следующие опции команды man:lpr[1] управляют форматированием файлов в задании. Используйте эти опции, если задание содержит не простой текст или если вы хотите сформатировать простой текст с помощью утилиты man:pr[1].
+
+Например, следующая команда печатает файл DVI (из системы верстки TeX) по имени [.filename]#fish-report.dvi# на принтере `bamboo`:
+
+[source,bash]
+....
+% lpr -P bamboo -d fish-report.dvi
+....
+
+Эти опции применяются для каждого файла в задании, так что нельзя смешивать (например) файлы DVI и ditroff в одном задании. Вместо этого посылайте однотипные файлы отдельными заданиями, используя для каждого задания соответствующие опции преобразования.
+
+[NOTE]
+====
+Все эти опции, кроме `-p` и `-T`, требуют наличия установленных для целевого принтера фильтров преобразования. Например, опция `-d` требует фильтра преобразования DVI. Подробнее см. в разделе <<printing-advanced-convfilters,Фильтры преобразования>>.
+====
+
+`-c`::
+Печать файлов cifplot.
+
+`-d`::
+Печать файлов DVI.
+
+`-f`::
+Печать текстовых файлов на языке FORTRAN.
+
+`-g`::
+Печать графиков.
+
+`-i _число_`::
+Сдвинуть результат вправо на _число_ столбцов; если _число_ не указано, сдвиг выполняется на 8 столбцов. Эта опция работает только с определенными фильтрами преобразования.
++
+[NOTE]
+====
+Не помещайте пробелы между `-i` и числом.
+====
+
+`-l`::
+Печать текстовых данных буквально, включая управляющие символы.
+
+`-n`::
+Печать данных ditroff (device independent troff).
+
+-p::
+Форматировать обычный текст перед печатью утилитой man:pr[1]. Подробнее см. man:pr[1].
+
+`-T _заголовок_`::
+Использовать указанный _заголовок_ в колонтитуле man:pr[1] вместо имени файла. Эта опция учитывается только при использовании вместе с опцией `-p`.
+
+`-t`::
+Печать данных troff.
+
+`-v`::
+Печать растровых данных.
+
+Вот пример: следующая команда печатает красиво сформатированную версию справочного руководства по команде man:ls[1] на стандартный принтер:
+
+[source,bash]
+....
+% zcat /usr/shared/man/man1/ls.1.gz | troff -t -man | lpr -t
+....
+
+Команда man:zcat[1] распаковывает исходный код страницы справочного руководства man:ls[1] и передает его команде man:troff[1], которая форматирует его и выдает результат в формате GNU troff, передаваемый команде man:lpr[1], посылающей задание спулеру LPD. Поскольку мы использовали опцию `-t` команды man:lpr[1], спулер при печати задания будет преобразовывать результат GNU troff в формат, понятный стандартному принтеру.
+
+[[printing-lpr-options-job-handling]]
+==== Опции обработки заданий
+
+Следующие опции команды man:lpr[1] требуют от системы LPD специальной обработки задания:
+
+-# _копий_::
+Выдавать указанное количество _копий_ каждого файла в задании вместо одной. Администратор может отключить эту опцию для уменьшения износа принтера и поощрения использования ксерокса. См. раздел <<printing-advanced-restricting-copies,Ограничение количества копий>>.
++
+В следующем примере на стандартный принтер печатается три копии файла [.filename]#parser.c#, а затем - три копии [.filename]#parser.h#:
++
+[source,bash]
+....
+% lpr -#3 parser.c parser.h
+....
+
+-m::
+Посылать почту после завершения задания печати. При указании этой опции, система LPD будет посылать почту на ваше имя после завершения обработки вашего задания. В сообщении будет сказано, выполнено ли задание успешно или по ходу была ошибка, и (часто) - в чем она состояла.
+
+-s::
+Не копировать файлы в каталог спулинга, а сделать там на них символические связи.
++
+Эту опцию имеет смысл использовать при печати больших заданий. Она экономит место в каталоге спулинга (ваше задание может занять все свободное место в файловой системе, в которой находится каталог спулинга). Она также экономит время, поскольку системе LPD не придется копировать каждый байт задания в каталог спулинга.
++
+Есть, однако, и недостаток: поскольку система LPD будет ссылаться на исходные файлы непосредственно, вы не сможете изменять или удалять их, пока они не будут распечатаны.
++
+[NOTE]
+====
+Если вы печатаете на удаленный принтер, система LPD будет вынуждена, так или иначе, скопировать файлы с локального хоста на удаленный, поэтому опция ``-s``сэкономит место только в локальном каталоге спулинга, но не в удаленном. Но, она все равно полезна.
+====
+
+-r::
+Удалять файлы в задании после копирования в каталог спулинга или после печати, если указана опция `-s`. Будьте внимательны при использовании этой опции!
+
+[[printing-lpr-options-misc]]
+==== Опции начальных страниц
+
+Эти опции команды man:lpr[1] изменяют текст, который обычно выдается на начальной странице задания. Если выдача начальных страниц для целевого принтера отключена, эти опции не действуют. Информацию по настройке начальных страниц см. в разделе <<printing-advanced-header-pages,Начальные страницы>>.
+
+-C _текст_::
+Заменить имя хоста на начальной странице _текстом_. Обычно на ней выдается имя хоста, с которого было послано задание.
+
+-J _текст_::
+Заменить имя задания на начальной странице _текстом_. Имя задания обычно совпадает с именем первого файла в задании или имеет значение [.filename]#stdin#, если печатается стандартный входной поток.
+
+-h::
+Не выдавать начальной страницы.
++
+[NOTE]
+====
+В некоторых организациях эта опция может не действовать, что определяется способом генерации начальных страниц. Подробнее см. в разделе <<printing-advanced-header-pages,Начальные страницы>>.
+====
+
+[[printing-lpc]]
+=== Администрирование принтеров
+
+Как администратор принтеров, вы должны их установить, настроить и протестировать. С помощью команды man:lpc[8] вы можете взаимодействовать с принтерами и другими способами. С помощью man:lpc[8] вы можете:
+
+* Запускать и останавливать принтеры
+* Включать и отключать их очереди
+* Изменять порядок заданий в каждой очереди.
+
+Начнем с замечания по терминологии: если принтер _остановлен_, он не будет печатать ничего из своей очереди. Пользователи могут продолжать посылать задания, которые будут ждать в очереди, пока принтер не будет _запущен_ или пока очередь не будет очищена.
+
+Если очередь _отключена_, ни один пользователь (кроме `root`) не может посылать задания на принтер. Во _включенную_ очередь можно посылать задания. Принтер для отключенной очереди может быть _запущен_; при этом он будет продолжать печатать находящиеся в очереди задания, пока очередь не станет пустой.
+
+В общем случае, для использования команды man:lpc[8] необходимо иметь привилегии `root`. Обычные пользователи могут использовать команду man:lpc[8] только для получения состояния принтера и перезапуска зависшего принтера.
+
+Далее представлена сводка команд man:lpc[8]. Большинство команд принимает аргумент _имя-принтера_, задающий, с каким принтером работать. Можно использовать значение `all` вместо _имени-принтера_, означающее все принтеры, перечисленные в файле [.filename]#/etc/printcap#.
+
+`abort _имя-принтера_`::
+Снять текущее задание и остановить принтер. Пользователи могут продолжать посылать задания, если очередь включена.
+
+`clean _имя-принтера_`::
+Удалить старые файлы из каталога спулинга принтера. Иногда файлы, составляющие задание, не удаляются как положено системой LPD, особенно если в ходе печати были ошибки и выполнялось много административных действий. Эта команда находит файлы, не принадлежащие каталогу спулинга, и удаляет их.
+
+`disable _имя-принтера_`::
+Отключить постановку новых заданий в очередь. Если принтер работает, он продолжит печатать задания, остающиеся в очереди. Суперпользователь (`root`) всегда может посылать задания, даже в отключенную очередь.
++
+Эта команда полезна при тестировании вновь установленного принтера или фильтра: отключаем очередь и посылаем задания как `root`. Другие пользователи не смогут посылать задания, пока вы не закончите тестирование и не включите очередь повторно командой `enable`.
+
+`down _имя-принтера_ _сообщение_`::
+Отключить принтер. Аналогична последовательности команд `disable` и `stop`. Указанное _сообщение_ выдается как состояние принтера при проверке пользователем очереди принтера с помощью man:lpq[1] или запросе его состояния командой `lpc status`.
+
+`enable _имя-принтера_`::
+Включить очередь для принтера. Пользователи могут посылать задания, но принтер не будет их печатать, пока не будет запущен.
+
+`help _имя-команды_`::
+Выдать справочную информацию по команде _имя-команды_. Если _имя-команды_ не указано, выдает сводку по имеющимся командам.
+
+`restart _имя-принтера_`::
+Перезапустить принтер. Обычные пользователи могут использовать эту команду, если в результате неких чрезвычайных обстоятельств система LPD зависла, но они не могут запустить принтер, остановленный командами `stop` или `down`. Команда `restart` эквивалентна последовательности команд `abort` и `start`.
+
+`start _имя-принтера_`::
+Запустить принтер. Принтер будет печатать задания, находящиеся в его очереди.
+
+`stop _имя-принтера_`::
+Остановить принтер. Принтер закончит печать текущего задания и больше ничего из очереди печатать не будет. Хотя принтер и остановлен, пользователи могут посылать задания во включенную очередь.
+
+`topq _имя-принтера_ _задание-или-имя-пользователя_`::
+Переупорядочить очередь для указанного принтера, помещая указанные по номеру _задания_ или задания указанного по имени _пользователя_ в начало очереди. Для этой команды нельзя использовать `all` в качестве _имени-принтера_.
+
+`up _имя-принтера_`::
+Включить принтер; команда по действию противоположна команде `down`. Эквивалентна последовательности команд `start` и `enable`.
+
+Утилита man:lpc[8] принимает перечисленные выше команды в командной строке. Если команда не указана, утилита man:lpc[8] входит в интерактивный режим, в котором можно вводить команды, пока не будет введена команда `exit`, `quit` или символ конца файла.
+
+[[printing-lpd-alternatives]]
+== Альтернативы стандартному спулеру
+
+Если вы прочитали все это руководство, к этому моменту вы знаете практически все, что надо знать о системе спулинга LPD, входящей в состав ОС FreeBSD. Вы, возможно, уже осознали многие из ее недостатков, что, естественно, приводит к вопросу: "Какие еще системы спулинга существуют (и работают с ОС FreeBSD)"?
+
+LPRng::
+Система LPRng, имя которой означает "LPR: the Next Generation" (LPR: следующее поколение) - это полностью переписанная система PLP. Патрик Пауэл (Patrick Powell) и Джастин Мейсон (Justin Mason) (основной специалист, занимающийся поддержкой PLP) объединили усилия для создания системы LPRng. Основной сайт по системе LPRng - http://www.lprng.org/[http://www.lprng.org/].
+
+CUPS::
+Система CUPS (сокращение от Common UNIX Printing System) предоставляет переносимый механизм печати для операционных систем, основанных на UNIX(R). Она была разработана компанией Easy Software Products в качестве стандартного механизма печати для всех производителей и пользователей UNIX(R).
++
+Система CUPS использует протокол Internet Printing Protocol (IPP) для управления заданиями и очередями. Протоколы Line Printer Daemon (LPD), Server Message Block (SMB) и AppSocket (известный также как JetDirect) также поддерживаются, но с меньшими возможностями. Система CUPS добавляет поиск сетевых принтеров и опции печати на основе PostScript Printer Description (PPD), для поддержки практической печати в UNIX(R).
++
+Основной сайт по системе CUPS - http://www.cups.org/[http://www.cups.org/].
+
+[[printing-troubleshooting]]
+== Выявление проблем
+
+После выполнения простого тестирования с помощью команды man:lptest[1] вы можете получить один из следующих результатов вместо корректной распечатки:
+
+Все работает, после определенной задержки; или не выдается распечатанная страница.::
+Принтер напечатал все, что нужно, но он на некоторое время задумывался и ничего не делал. Фактически, могло потребоваться нажать кнопку PRINT REMAINING или FORM FEED на принтере, чтобы результаты были выданы.
++
+Если это произошло, вероятно, принтер ждал, нет ли в задании еще данных, прежде чем что бы то ни было печатать. Для решения этой проблемы можно посылать в текстовом фильтре на принтер символ FORM FEED (или любую необходимую последовательность символов). Этого обычно достаточно, чтобы принтер немедленно распечатал любой остающийся в его внутреннем буфере текст. Также полезно убедиться, что каждое задание печати заканчивается полной страницей, чтобы следующее задание не начиналось где-то с середины последней страницы предыдущего задания.
++
+Следующий измененный скрипт командного интерпретатора [.filename]#/usr/local/libexec/if-simple# выдает символ прогона страницы после посылки задания на принтер:
++
+[.programlisting]
+....
+#!/bin/sh
+#
+# if-simple - Простой текстовый входной фильтр для lpd
+# Установлен в /usr/local/libexec/if-simple
+#
+# Просто копирует stdin в stdout. Игнорирует все аргументы фильтра.
+# Выдает символ прогона страницы (\f) после печати задания.
+
+/bin/cat && printf "\f" && exit 0
+exit 2
+....
+
+Принтер печатает "лесенкой".::
+Вы получаете на бумаге следующее:
++
+[.programlisting]
+....
+!"#$%&'()*+,-./01234
+ "#$%&'()*+,-./012345
+ #$%&'()*+,-./0123456
+....
++
+Вы стали очередной жертвой _эффекта лесенки_, вызванного различными интерпретациями того, какие символы должны обозначать новую строку. Операционные системы UNIX(R)-стиля используют один символ: ASCII-код 10, перевод строки (line feed - LF). MS-DOS(R), OS/2(R) и другие используют пару символов, ASCII-код 10 _и_ ASCII-код 13 (возврат каретки, carriage return или CR). Многие принтеры используют соглашение MS-DOS(R) для представления новых строк.
++
+При печати из FreeBSD в тексте используется только символ перевода строки. Принтер, встретив символ перевода строки, переходит на следующую строку, но оставляет ту же горизонтальную позицию на строке для следующего печатаемого символа. Вот зачем нужен символ возврата каретки: чтобы перенести следующий печатаемый символ на левый край бумаги.
++
+Вот что ОС FreeBSD хочет от принтера:
++
+[.informaltable]
+[cols="1,1", frame="none"]
+|===
+
+|Принтер получает CR
+|Принтер печатает CR
+
+|Принтер получает LF
+|Принтер печатает CR + LF
+|===
++
+Вот несколько способов этого добиться:
+
+** Использовать переключатели конфигурации принтера или панель управления, чтобы изменить его интерпретацию этих символов. Поищите как это сделать в руководстве по своему принтеру.
++
+[NOTE]
+====
+Если вы загружаете другие операционные системы, кроме FreeBSD, может иметь смысл _переконфигурировать_ принтер для использования такой интерпретации символов CR и LF, которая принята в этих операционных системах. Затем можно использовать одно из представленных далее решений.
+====
+
+** Заставить драйвер последовательного порта FreeBSD автоматически преобразовывать LF в CR+LF. Конечно, это подойдет _только_ для принтеров, подключенных к последовательным портам. Для включения этой возможности используйте характеристику `ms#` и установите режим `onlcr` для принтера в файле [.filename]#/etc/printcap#.
+** Послать _управляющий код_ на принтер, заставляющий его временно обрабатывать символы LF по-другому. Управляющие коды, которые может поддерживать ваш принтер, поищите в руководстве своего принтера. Когда найдете соответствующий управляющий код, измените текстовый фильтр для посылки сначала этого кода, а затем - задания печати.
++
+Вот пример текстового фильтра для принтеров, понимающих управляющие последовательности языка Hewlett-Packard PCL. Этот фильтр заставляет принтер обрабатывать символы LF как LF и CR; затем он посылает задание; наконец, он посылает символ прогона страницы для выдачи последней страницы задания. Он должен работать практически со всеми принтерами Hewlett Packard.
++
+[.programlisting]
+....
+#!/bin/sh
+#
+# hpif - Простой текстовый входной фильтр для lpd для принтеров на базе HP-PCL
+# Установлен в /usr/local/libexec/hpif
+#
+# Просто копирует stdin в stdout. Игнорирует все аргументы фильтра.
+# Требует от принтера обрабатывать LF как CR+LF. Выдает страницу по окончании.
+
+printf "\033&k2G" && cat && printf "\033&l0H" && exit 0
+exit 2
+....
++
+Вот пример файла [.filename]#/etc/printcap# с хоста `orchid`. К нему через первый параллельный порт подключен один принтер, Hewlett Packard LaserJet 3Si, по имени `teak`. Для него в качестве текстового фильтра используется представленный выше скрипт:
++
+[.programlisting]
+....
+#
+# /etc/printcap для хоста orchid
+#
+teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
+ :lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
+ :if=/usr/local/libexec/hpif:
+....
+
+Строки напечатаны одна поверх другой.::
+Принтер так и не перешел на следующую строку. Все строки текста были напечатаны одна поверх другой, на одной строке.
++
+Эта проблема "обратна" эффекту лесенки, описанному выше, и встречается намного реже. Каким-то образом, символы LF, которые ОС FreeBSD использует для завершения строк, обрабатывались как символы CR и вызывали перевод позиции печати на левый край бумаги, но не переход на следующую строку.
++
+Используйте переключатели конфигурации принтера или панель управления для обеспечения следующей интерпретации символов LF и CR:
++
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Принтер получает
+| Принтер печатает
+
+|CR
+|CR
+
+|LF
+|CR + LF
+|===
+Принтер теряет символы.::
+По ходу печати принтер не печатает несколько символов в каждой строке. Проблема со временем может становиться все хуже, так что теряется все больше символов.
++
+Проблема состоит в том, что принтер не справляется с той скоростью, с которой компьютер посылает данные по последовательной линии (эта проблема не должна возникать на принтерах, подключенных к параллельным портам). Есть два способа решить проблему:
+
+** Если принтер поддерживает управление потоком XON/XOFF, заставить FreeBSD использовать его, указав режим `ixon` в характеристике `ms#`.
+** Если принтер поддерживает управление несущим потоком (carrier flow control), укажите режим `crtscts` в характеристике `ms#`. Убедитесь, что кабель, соединяющий принтер с компьютером, правильно распаян для управления несущим потоком.
+
+Напечатан мусор.::
+Принтер напечатал нечто похожее на случайный мусор, а не требуемый текст.
++
+Это, обычно, - еще один симптом неправильных параметров взаимодействия с последовательным принтером. Перепроверьте скорость взаимодействия в характеристике `br` и установку четности в характеристике `ms#`; проверьте, что принтер использует те же установки, которые заданы в файле [.filename]#/etc/printcap#.
+
+Ничего не произошло.::
+Если ничего не произошло, проблема, вероятно, связана с FreeBSD, а не с оборудованием. Добавьте характеристику журнального файла (`lf`) в файл [.filename]#/etc/printcap# для принтера, работу с которым отлаживаете. Например, вот запись для принтера `rattan` с характеристикой `lf`:
++
+[.programlisting]
+....
+rattan|line|diablo|lp|Diablo 630 Line Printer:\
+ :sh:sd=/var/spool/lpd/rattan:\
+ :lp=/dev/lpt0:\
+ :if=/usr/local/libexec/if-simple:\
+ :lf=/var/log/rattan.log
+....
++
+Затем попытайтесь напечатать снова. Поищите в журнальном файле (в нашем примере - [.filename]#/var/log/rattan.log#) возможные сообщения об ошибках. На основе полученных сообщений попытайтесь решить проблему.
++
+Если вы не зададите характеристику `lf`, система LPD использует по умолчанию [.filename]#/dev/console#.
diff --git a/documentation/content/ru/books/handbook/security/_index.adoc b/documentation/content/ru/books/handbook/security/_index.adoc
new file mode 100644
index 0000000000..8ffa5f89f0
--- /dev/null
+++ b/documentation/content/ru/books/handbook/security/_index.adoc
@@ -0,0 +1,2279 @@
+---
+title: Глава 14. Безопасность
+part: Часть III. Системное администрирование
+prev: books/handbook/boot
+next: books/handbook/mac
+---
+
+[[security]]
+= Безопасность
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 14
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../../images/books/handbook/security/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/security/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/security/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[security-synopsis]]
+== Краткое описание
+
+Эта глава представляет введение в основные концепции безопасности системы, некоторые эмпирические правила и более подробно обращается к отдельным темам, касающимся FreeBSD. Большая часть затрагиваемых тем может быть применена к безопасности системы и безопасности в интернет вообще. Интернет больше не то "дружественное" место, где каждый хочет быть вам добрым соседом. Защита системы необходима для сохранения ваших данных, интеллектуальной собственности, времени и всего остального от хакеров и им подобных.
+
+FreeBSD предоставляет массу утилит и механизмов для обеспечения целостности и безопасности системы и сети.
+
+После прочтения этой главы вы узнаете:
+
+* Основные концепции безопасности системы, специфику FreeBSD.
+* О различных механизмах шифрования в FreeBSD, таких как DES и MD5.
+* Как настроить аутентификацию с использованием одноразовых паролей.
+* Как настроить TCP Wrappers для использования с `inetd`.
+* Как настроить KerberosIV в релизах FreeBSD до 5.0.
+* Как настроить Kerberos5 в FreeBSD.
+* Как настроить IPsec и создать VPN между компьютерами на FreeBSD/Windows(R).
+* Как настроить и использовать OpenSSH, реализацию SSH в FreeBSD.
+* Что такое ACL и как их использовать.
+* Как использовать утилиту Portaudit для проверки пакетов сторонних разработчиков, установленных из Коллекции Портов.
+* Как работать с сообщениями безопасности FreeBSD.
+* Что такое Process Accounting и как активировать его во FreeBSD.
+
+Перед чтением этой главы вам потребуется:
+
+* Понимание основных концепций FreeBSD и интернет.
+
+В этой книге рассмотрены и другие вопросы безопасности. Например, принудительный контроль доступа (Mandatory Access Control) рассматривается в crossref:mac[mac, Принудительный контроль доступа (MAC)], а брандмауэры в crossref:firewalls[firewalls, Межсетевые экраны].
+
+[[security-intro]]
+== Введение
+
+Безопасность это первая и основная функция системного администратора. Хотя все многопользовательские системы BSD UNIX(R) уже снабжены некоторой защитой, работа по созданию и поддержке дополнительных механизмов безопасности, обеспечивающих защищенную работу пользователей, это одна из самых серьезных задач системного администратора. Компьютеры безопасны настолько, насколько вы сделаете их безопасными и требования безопасности всегда находятся в противоречии с удобством работы пользователей. Системы UNIX(R) способны одновременно работать с огромным количеством процессов и многие из этих процессов серверные - это означает, что с ними могут взаимодействовать внешние программы. Сегодня десктопы заменили мини-компьютеры и мэйнфрэймы, и поскольку компьютеры в наши дни подключены к сети интернет, безопасность важна как никогда.
+
+Наилучшая реализация системы безопасности представима в виде "послойной" системы. Вообще говоря все, что нужно сделать, это создать столько слоев безопасности, сколько необходимо и затем внимательно следить за вторжениями в систему. Не переусердствуйте в настройке системы безопасности, иначе она сделает невозможной обнаружение вторжений, являющееся одним из наиболее важных аспектов механизма безопасности. Например, нет большого смысла в установке флага `schg` (man:chflags[1]) на каждый исполняемый файл системы, поскольку хотя таким способом можно временно защитить исполняемые файлы, это помешает обнаружению факта взлома системы.
+
+Безопасность системы также относится к различным формам атак, имеющих своей целью вызвать крах системы, или сделать систему недоступной другим способом, но не пытающихся получить доступ к учётной записи `root` ("break root"). Угрозы безопасности могут быть поделены на несколько категорий:
+
+. Отказ в обслуживании (Denial of service, DoS).
+. Взлом пользовательских учётных записей.
+. Взлом учётной записи root через доступные сервисы.
+. Взлом учётной записи root через учётные записи пользователей.
+. Создание backdoor.
+
+Атака "отказ в обслуживании" отбирает у машины необходимые ресурсы. Обычно DoS атаки используют грубую силу, чтобы попытаться обрушить систему или сделать ее недоступной другим способом, превысив лимиты ее сервисов или сетевого стека. Некоторые DoS атаки пытаются использовать ошибки в сетевом стеке для обрушения системы одним пакетом. Эту проблему можно решить только исправив ядро системы. Атаки зачастую можно предотвратить правильной установкой параметров, ограничивающих нагрузку на систему в неблагоприятных условиях. С атаками, использующими грубую силу, бороться сложно. Например, атака с использованием пакетов с поддельными адресами, которую почти невозможно остановить, может быстро отключить вашу систему от интернет. Возможно, она не приведет к отказу системы, но сможет переполнить соединение с интернет.
+
+Взлом учётной записи пользователя обычно встречается чаще, чем DoS атаки. Многие системные администраторы все еще используют стандартные сервисы telnetd, rlogind и ftpd на своих серверах. Эти сервисы по умолчанию не работают с зашифрованными соединениям. В результате при среднем количестве пользователей пароль одного или нескольких пользователей, входящих в систему через внешнее соединение (это обычный и наиболее удобный способ входа в систему), будет перехвачен. Внимательный системный администратор должен анализировать логи удаленного доступа на предмет подозрительных адресов пользователей даже в случае успешного входа.
+
+Кто-то может предположить, что атакующий при наличии доступа к учётной записи пользователя может взломать учётную запись `root`. Однако, реальность такова, что в хорошо защищенной и поддерживаемой системе доступ к учётной записи пользователя не обязательно даст атакующему доступ к `root`. Разница между доступом к обычной учётной записи и к `root` важна, поскольку без доступа к `root` атакующий обычно не способен скрыть свои действия, и в худшем случае сможет лишь испортить файлы пользователя или вызвать крах системы. Взлом пользовательских учётных записей встречается очень часто, поскольку пользователи заботятся о безопасности так, как системные администраторы.
+
+Системные администраторы должны помнить, что существует множество потенциальных способов взлома учётной записи `root`. Атакующий может узнать пароль `root`, найти ошибку в сервисе, работающем с привилегиями и взломать учётную запись `root` через сетевое соединение с этим сервисом, или узнать об ошибке в suid-root программе, позволяющей атакующему взлом `root` с помощью взломанной учётной записи пользователя. Если атакующий нашел способ взлома `root`, ему может не понадобиться установка backdoor. Многие из обнаруженных и закрытых на сегодняшний день брешей в системе, позволяющие взлом `root`, требуют от атакующего серьезной работы по заметанию следов, поэтому большинство атакующих устанавливают backdoor. Backdoor предоставляет атакующему простой способ восстановления доступа к системе с привилегиями `root`, но также дает системному администратору удобный способ обнаружения вторжения. Устранение возможности установки backdoor возможно повредит безопасности системы, поскольку это не устранит брешь, позволившую проникнуть в систему.
+
+Меры безопасности всегда должны реализовываться на нескольких уровнях, которые могут быть классифицированы следующим образом:
+
+. Защита `root` и служебных учётных записей.
+. Защита работающих под `root` сервисов и suid/sgid исполняемых файлов.
+. Защита учётных записей пользователей.
+. Защита файла паролей.
+. Защита ядра, raw устройств и файловых систем.
+. Быстрое обнаружение несанкционированных изменений в системе.
+. Паранойя.
+
+В следующем разделе этой главы эти темы изложены более подробно.
+
+[[securing-freebsd]]
+== Защита FreeBSD
+
+[NOTE]
+.Команда и протокол
+====
+В этом документе мы будет использовать выделенный текст, упоминая приложение, и `моноширинный` шрифт, упоминая определенные команды. Для протоколов используется обычный шрифт. Это типографическое отличие полезно для таких случаев, как ssh, поскольку это и команда и протокол.
+====
+
+В последующем разделе будут рассмотрены методы защиты системы FreeBSD, упомянутые в <<security-intro,предыдущем разделе>> этой главы.
+
+[[securing-root-and-staff]]
+=== Защита учётной записи `root` и служебных учётных записей
+
+Во-первых, не беспокойтесь о защите служебных учётных записей, если не защищена учётная запись `root`. В большинстве систем у учётной записи `root` есть пароль. Использование пароля `root` опасно _всегда_. Это не означает, что вы должны удалить пароль. Пароль почти всегда необходим для доступа по консоли. Но это означает, что вы должны сделать невозможным использование пароля не из консоли или может быть даже с помощью команды man:su[1]. Например, убедитесь, что псевдо-терминалы в файле [.filename]#/etc/ttys# перечислены с параметром `insecure`, что делает невозможным вход на них под `root` напрямую с помощью `telnet` или `rlogin`. При использовании других средств входа, таких как sshd, убедитесь что вход под `root` напрямую отключен и в них. Сделайте это, открыв файл [.filename]#/etc/ssh/sshd_config#, и убедившись, что параметр `PermitRootLogin` установлен в `NO`. Проверьте каждый метод доступа - сервис FTP и ему подобные часто подвержены взлому. Прямой вход под `root` должен быть разрешен только с системной консоли.
+
+Конечно, как системный администратор вы должны иметь доступ `root`, поэтому потребуется открыть несколько "лазеек". Но убедитесь, что для доступа к ним необходим дополнительный пароль. Одним из способов доступа к `root` является добавление соответствующих учётных записей к группе `wheel` (в файле [.filename]#/etc/group#). Это позволяет использовать `su` для доступа к `root`. Вы никогда не должны давать таким учётным записям доступ к `wheel` непосредственно, помещая их в группу `wheel` в файле паролей. Служебные учётные записи должны помещаться в группу `staff`, а затем добавляться к группе `wheel` в файле [.filename]#/etc/group#. Только те члены группы staff, которым действительно нужен доступ к `root`, должны быть помещены в группу `wheel`. При работе с такими методами аутентификации как Kerberos, возможно также использование файла [.filename]#.k5login# в каталоге пользователя `root` для доступа к учётной записи `root` с помощью man:ksu[1] без помещения кого-либо в группу `wheel`. Это решение возможно лучше, поскольку механизм `wheel` все еще позволяет взлом `root`, если злоумышленник получил копию файла паролей и смог взломать служебную учётную запись. Хотя использование механизма `wheel` лучше, чем работа через `root` напрямую, это не обязательно самый безопасный способ.
+
+Непрямой способ защиты служебных учётных записей и конечно `root` это использование альтернативных методов доступа и замена зашифрованных паролей на символ "`*`". Используя команду man:vipw[8], замените каждый зашифрованный пароль служебных учётных записей на этот символ для запрета входа с аутентификацией по паролю. Эта команда обновит файл [.filename]#/etc/master.passwd# и базу данных пользователей/паролей.
+
+Служебная учётная запись вроде этой:
+
+[.programlisting]
+....
+foobar:R9DT/Fa1/LV9U:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh
+....
+
+Должна быть заменена на такую:
+
+[.programlisting]
+....
+foobar:*:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh
+....
+
+Это изменение предотвратит обычный вход, поскольку зашифрованный пароль никогда не совпадет с "`\*`". После этого члены группы staff должны использовать другой механизм аутентификации, например man:kerberos[1] или man:ssh[1] с парой ключей: публичным и приватным. При использовании такой системы как Kerberos, потребуется защитить сервер Kerberos и рабочую станцию. При использовании пары публичного/приватного ключей с ssh, потребуется защитить компьютер, _с_ которого происходит вход (обычно это рабочая станция). Дополнительных слой защиты может быть добавлен путем защиты пары ключей при создании их с помощью man:ssh-keygen[1]. Возможность заменить пароли служебных учётных записей на "`*`" гарантирует также, что вход может быть осуществлен только через защищенные методы доступа, которые вы настроили. Это принуждает всех членов staff использовать защищенные, шифрованные соединения для всех входов, что закрывает большую брешь, используемую многими нарушителями: перехват паролей с другого, слабо защищенного компьютера.
+
+Более непрямой механизм безопасности предполагает, что вы входите с более защищенного сервера на менее защищенный. Например, если главный сервер работает со всеми сервисами, рабочая станция не должна работать ни с одним. Для поднятия уровня безопасности до приемлемого уровня, число запущенных на ней сервисов необходимо сократить до минимума, вплоть до отключения их всех, кроме того необходимо использовать защищенный паролем хранитель экрана. Конечно, при наличии физического доступа к рабочей станции атакующий может взломать любую систему безопасности. Это определенно проблема, которую вы должны учитывать, но учтите также тот факт, что большинство взломов совершаются удаленно, через сеть, людьми, которые не имеют физического доступа к вашим рабочим станциям или серверам.
+
+Использование такой системы как Kerberos дает возможность заблокировать или изменить пароль в одном месте, что сразу отразиться на всех компьютерах, где существует служебная учётная запись. Если эта учётная запись будет взломана, возможность немедленно изменить пароль на всех компьютерах нельзя недооценивать. Без этой возможности изменение паролей на N машинах может стать проблемой. Вы можете также наложить ограничения на смену паролей с помощью Kerberos: не только установить значения timeout в Kerberos, но и добавить требование смены пароля пользователем после определенного периода времени (скажем, раз в месяц).
+
+=== Защита работающих под root сервисов и suid/sgid исполняемых файлов
+
+Предусмотрительный системный администратор запускает только те сервисы, в которых нуждается, ни больше ни меньше. Учитывайте, что сервисы сторонних разработчиков наиболее подвержены ошибкам. К примеру, работа со старыми версиями imapd или popper это все равно что раздача доступа `root` всему миру. Никогда не запускайте сервисы, которые вы не проверили достаточно внимательно. Многим сервисам не требуется работа под `root`. Например, даемоны ntalk, comsat, и finger могут быть запущены в так называемых _песочницах_ (_sandboxes_). Песочница это не идеальное решение, поскольку вызывает много проблем, но она подходит под модель послойной безопасности: если кто-то сможет взломать сервис, работающий в песочнице, ему потребуется взломать еще и саму песочницу. Чем больше уровней ("слоев") потребуется пройти атакующему, тем меньше вероятность его успеха. Ошибки, позволяющие получать root доступ, находили фактически во всех сервисах, запускаемых под `root`, включая основные системные сервисы. Если вы обслуживаете машину, на которую входят только через sshd и никогда не входят через telnetd, rshd или rlogind, отключите эти сервисы!
+
+В FreeBSD сервисы ntalkd, comsat и finger теперь по умолчанию работают в "песочнице". Другая программа, которая может быть кандидатом на запуск в "песочнице" это man:named[8]. [.filename]#/etc/defaults/rc.conf# включает необходимые для запуска named в "песочнице" аргументы в закомментированой форме. В зависимости от того, устанавливаете ли вы новую систему, или обновляете старую, учётные записи пользователей, используемые этими "песочницами" могут не быть созданы. Предусмотрительный системный администратор должен узнать о "песочницах" для сервисов и установить их если есть возможность.
+
+Есть множество других сервисов, которые обычно не работают в "песочницах": sendmail, popper, imapd, ftpd, и другие. Некоторым из этих сервисов есть альтернативы, но их установка может потребовать больше работы, чем вы готовы выполнить (фактор удобства). Вы можете запустить эти сервисы под `root` и положиться на другие механизмы обнаружения вторжений, которые могут пройти через них.
+
+Другая большая потенциальная `root` брешь в системе это suid-root и sgid исполняемые файлы. Большинство этих исполняемых файлов, таких как rlogin, установлены в [.filename]#/bin#, [.filename]#/sbin#, [.filename]#/usr/bin#, или [.filename]#/usr/sbin#. Хотя ничто не может быть безопасно на 100%, находящиеся по умолчанию в системе suid и sgid исполняемые файлы могут быть признаны достаточно безопасными. Но `root` бреши все еще обнаруживаются в этих исполняемых файлах. `root` брешь, обнаруженная в `Xlib` в 1998 делала xterm (который обычно suid) подверженным взлому. Лучше сразу принять меры предосторожности, чем сожалеть потом. Предусмотрительный системный администратор ограничит права запуска suid исполняемых файлов, которые должны запускаться пользователями группы staff, только этой группой, а также запретит доступ (`chmod 000`) к тем исполняемым файлам suid, которые никем не используются. Серверу без монитора обычно не требуется исполняемый файл xterm. Исполняемые sgid исполняемые файлы могут быть почти так же опасны. Если нарушитель сможет взломать sgid-kmem исполняемый файл, он возможно сможет прочесть [.filename]#/dev/kmem# и таким образом получить файл зашифрованных паролей, что потенциально делает возможным взлом любой защищённой паролем учётной записи. Аналогично нарушитель, проникший в группу `kmem`, может отслеживать последовательности клавиш, отправляемые через псевдо-терминалы, включая те, что используют защищённые соединения. Нарушитель, вошедший в группу `tty` может сделать вывод почти на любой пользовательский терминал. Если пользователь работает с терминальной программой или эмулятором с возможностью эмуляции клавиатуры, взломщик может потенциально сгенерировать поток данных, который заставит терминал пользователя ввести команду, и она будет запущена с правами этого пользователя.
+
+[[secure-users]]
+=== Защита учётных записей пользователей
+
+Учетные записи пользователей обычно сложнее всего защитить. Вы можете ввести драконовские ограничения доступа к служебным учётным записям, заменив их пароли на символ "`*`", но возможно не сможете сделать то же с обычными учётными записями пользователей. Если есть такая возможность, вы возможно сможете защитить учётные записи пользователей соответствующим образом. Если нет, просто более бдительно отслеживайте эти учётные записи. Использование ssh и Kerberos для учётных записей пользователей более проблематично, поскольку требует дополнительной административной работы и технической поддержки, но все же это решение лучше, чем файл с шифрованными паролями.
+
+=== Защита файла паролей
+
+Единственный абсолютно надежный способ это замена на `*` максимально возможного количества паролей и использование ssh или Kerberos для доступа к таким учётным записям. Хотя файл с шифрованными паролями ([.filename]#/etc/spwd.db#) доступен для чтения только `root`, возможно, что нарушитель сможет получить доступ на чтение к этому файлу, даже если не получит права `root` на запись.
+
+Ваши скрипты безопасности должны всегда проверять и составлять отчет об изменениях файла паролей (обратитесь к разделу <<security-integrity,Проверка целостности файлов>> ниже по тексту).
+
+=== Защита ядра, raw устройств и файловых систем
+
+Если атакующий взломает `root`, он сможет сделать практически все, но есть способы усложнить его задачу. Например, в большинстве современных ядер встроено устройство перехвата пакетов. В FreeBSD оно называется [.filename]#bpf#. Нарушитель обычно пытается запустить перехват пакетов на взломанной машине. Вы не должны предоставлять ему такой возможности, на большинстве систем устройство [.filename]#bpf# не должно быть встроено в ядро.
+
+Но даже если вы выключите устройство [.filename]#bpf#, все еще остаются проблемы, связанные с устройствами [.filename]#/dev/mem# и [.filename]#/dev/kmem#. Нарушитель все еще может писать на дисковые raw устройства. Есть также другая возможность ядра, загрузка модулей, man:kldload[8]. Активный нарушитель может использовать KLD модуль для установки собственного устройства [.filename]#bpf# или другого перехватывающего устройства на работающее ядро. Для решения этих проблем запускайте ядро с большим уровнем безопасности, как минимум 1. Уровень безопасности может быть установлен с помощью `sysctl` через переменную `kern.securelevel`. После установки уровня безопасности в 1 доступ на запись в raw устройства будет запрещена и полностью заработают специальные флаги `chflags`, такие как `schg`. Убедитесь также, что флаг `schg` установлен на критически важных загрузочных исполняемых файлах, каталогах и файлах скриптов - на всем, что запускается до установке уровня безопасности. Это требует большого объема работы, и обновление системы на более высоком уровне безопасности может стать гораздо сложнее. Вы можете пойти на компромисс и запускать систему на высоком уровне безопасности, но не устанавливать флаг `schg` для каждого существующего системного файла и каталога. Другая возможность состоит в монтировании [.filename]#/# и [.filename]#/usr# только для чтения. Необходимо заметить, что такие правила слишком жесткие и могут помешать обнаружению вторжения.
+
+[[security-integrity]]
+=== Проверка целостности файлов: исполняемые, конфигурационные файлы и т.д.
+
+Вы можете защищать только ядро, файлы настройки и управления системой только до тех пор, пока эта защита не вступит в конфликт с удобством работы в системе. Например, использование `chflags` для установки бита `schg` на большинство файлов в [.filename]#/# вероятно может только навредить, поскольку хотя и может защитить файлы, препятствует обнаружению. Последний слой системы безопасности, возможно, наиболее важный - обнаружение. Остальные меры безопасности практически бесполезны (или, что еще хуже, могут дать вам ложное ощущение безопасности) если вы не обнаружите потенциальное вторжение. Половина функций системы безопасности направлена на замедление атакующего, а не на его остановку, для того, чтобы дать системе обнаружения возможность поймать нарушителя на месте преступления.
+
+Лучший способ обнаружения вторжения - отслеживание измененных, отсутствующих, или неожиданно появившихся файлов. Для наблюдения за измененными файлами лучше всего использовать другую (зачастую централизованную) систему с ограниченным доступом. Добавление написанных вами скриптов к этой дополнительно защищенной системе с ограниченным доступом делает ее практически невидимой для потенциальных взломщиков, и это важно. В целях достижения максимального эффекта вам может потребоваться предоставить этой системе доступ к другим машинам в сети, обычно с помощью NFS экспорта только для чтения или сгенерировав пары ключей ssh для доступа к другим машинам по ssh. Помимо большого объема сетевого трафика, NFS более скрытый метод - он позволяет контролировать файловые системы на каждом клиентском компьютере практически незаметно. Если ваш сервер с ограниченным доступом подключен к клиентским компьютерам через коммутатор, NFS метод это зачастую лучший выбор. При соединении через концентратор, или через несколько маршрутизаторов, NFS метод может стать слишком небезопасным и использование ssh может стать лучшим выбором даже несмотря на то, что ssh оставляет следы своей работы.
+
+Как только у вас появился сервер с ограниченным доступом, и как минимум доступ на чтение в клиентских системах, потребуется написать скрипты для выполнения мониторинга. При наличии доступа по NFS вы можете написать скрипты с помощью простых системных утилит, таких как man:find[1] и man:md5[1]. Лучше всего подсчитывать md5 файлов на клиентском компьютере как минимум один раз в день, а файлы, контролирующие запуск из [.filename]#/etc# и [.filename]#/usr/local/etc# даже более часто. При обнаружении расхождений в md5, контролирующий компьютер должен просигналить системному администратору проверить изменившиеся файлы. Хороший скрипт безопасности проверит также наличие несоответствующих исполняемых suid файлов и новых или измененных файлов в системных разделах [.filename]#/# и [.filename]#/usr#.
+
+При использовании ssh вместо NFS, написать скрипты безопасности гораздо сложнее. Вам обязательно потребуется скопировать (`scp`) скрипты на клиентский компьютер, сделать из невидимыми, и для безопасности потребуется также скопировать исполняемые файлы (такие как find), которые будут использоваться скриптом. Приложение ssh на клиентском компьютере может быть уже взломано. В конечном итоге, без ssh не обойтись при работе через небезопасные соединения, но его гораздо сложнее использовать.
+
+Хороший скрипт безопасности проверит также изменения в файлах настройки, работающих при подключении пользователей и служебных учётных записей: [.filename]#.rhosts#, [.filename]#.shosts#, [.filename]#.ssh/authorized_keys# и так далее... файлы, которые могли не попасть в область проверки `MD5`.
+
+Если для пользователей выделен большой объем дискового пространства, проверка каждого файла на таких разделах может занять слишком много времени. В таком случае установка флагов монтирования для запрета suid исполняемых файлов и устройств на таких разделах это хорошая идея. Примените параметры man:mount[8] `nodev` и `nosuid`. Проверяйте эти разделы в любом случае, хотя бы раз в неделю, поскольку необходимо обнаруживать попытки взлома, независимо от того, эффективны они или нет.
+
+Учет процессов (man:accton[8]) это относительно несложная возможность операционной системы, которая может помочь как механизм обнаружения состоявшихся вторжений. Она особенно полезна для обнаружения пути проникновения нарушителя в систему, если файл не был затронут проникновением.
+
+Наконец, скрипты безопасности должны обработать лог файлы, которые необходимо создавать настолько защищенным способом, насколько это возможно - подключение syslog удаленно может быть очень полезным. Злоумышленник попытается уничтожить следы взлома, и лог файлы критически важны для системного администратора, пытающегося отследить время и метод первого проникновения. Один из надежных способов получения лог файлов является подключение системной консоли к последовательному порту и постоянный сбор информации через защищенную машину, отслеживающую консоли.
+
+=== Паранойя
+
+Немного паранойи никогда не повредит. Как правило, системный администратор может добавлять элементы безопасности в любом количестве, пока это не влияет на удобство, а также некоторое количество элементов безопасности, _влияющих_ на удобство. Что даже более важно, системный администратор должен немного изменить их - если вы используете рекомендации, например те, что даны в этом документе, они становятся известны атакующему, который также имеет доступ к этому документу.
+
+=== Атаки DoS
+
+Этот раздел охватывает DoS атаки. DoS атаки это обычно пакетные атаки. Хотя против современной атаки с подделкой пакетов, которая перегружает сеть, мало что можно сделать, вы можете ограничить повреждения, убедившись, что атака не может обрушить ваши сервера.
+
+. Ограничение количества порождаемых процессов.
+. Уменьшение последствий springboard атак (ICMP ответ, широковещательный ping и т.д.).
+. Кэш маршрутизации ядра.
+
+Обычная DoS атака против порождающего процессы сервера пытается исчерпать ресурсы сервера по процессам, файловым дескрипторам и памяти до тех пор, пока машина не "повиснет". У inetd (обратитесь к man:inetd[8]) есть несколько параметров, позволяющих ограничить такие атаки. Необходимо учесть, что хотя можно предотвратить падение системы, в общем случае невозможно предотвратить прекращение работы сервиса. Внимательно прочтите страницу справочника и обратите особое внимание на параметры `-c`, `-C`, и `-R`. Учтите, что параметр `-C` не работает в случае атак с использованием поддельных IP пакетов, поэтому как правило необходимо использование комбинации параметров. Некоторые standalone сервисы используют собственные параметры, ограничивающие порождение процессов.
+
+У Sendmail есть собственный параметр `-OMaxDaemonChildren`, которая работает гораздо лучше, чем параметр sendmail, ограничивающий нагрузку. Вам необходимо задать параметр запуска sendmail`MaxDaemonChildren` достаточно большим, чтобы обслуживать ожидаемую нагрузку, но так, чтобы компьютер мог обслужить такое количество приложений sendmail без падения системы. Хорошей мерой является запуск sendmail в режиме очереди (`-ODeliveryMode=queued`) и запуск даемона (`sendmail -bd`) отдельно от очереди (`sendmail -q15m`). Если вы все же хотите организовать доставку в режиме реального времени, запускайте очередь с меньшим интервалом `-q1m`, но убедитесь в правильной установке параметра sendmail `MaxDaemonChildren` для предотвращения ошибок.
+
+Syslogd может быть атакован непосредственно, настоятельно рекомендуется использовать параметр `-s` если это возможно и параметр `-a` в остальных случаях.
+
+Вы также должны быть очень осторожны с сервисами, совершающими обратное подключение, например, с TCP Wrapper и его обратным identd-запросом, который может быть атакован напрямую. По этой причине возможность TCP Wrapper генерировать обратный ident обычно не следует использовать.
+
+Правильным будет запрет доступа к внутренним сервисам из внешней сети путем соответствующей настройки брандмауэра на внешнем маршрутизаторе. Идея в том, чтобы предотвратить перегрузку сервисов атаками из внешней сети, а кроме того защитить `root` от взлома через сеть. Всегда настраивайте исключающий брандмауэр, т.е. "закрыть все _кроме_ портов A, B, C, D, и M-Z". Этим способом вы можете закрыть все порты нижнего диапазона, кроме явно указанных, таких как named (если вы поддерживаете интернет-зону), ntalkd, sendmail, и других сервисов, доступных из интернет. Если вы попробуете настроить брандмауэр другим способом - включающий, или разрешающий брандмауэр, есть большой шанс забыть "закрыть" пару сервисов, или добавить новый внутрисетевой сервис и забыть обновить брандмауэр. Вы можете открыть диапазон портов с большими номерами для обычных приложений без угрозы портам нижнего диапазона. Учтите также, что FreeBSD позволяет вам контролировать диапазоны портов, используемые для динамической привязки через различные переменные `sysctl``net.inet.ip.portrange` (`sysctl -a | fgrep portrange`), что позволяет упростить настройку брандмауэра. Например, вы можете использовать обычный диапазон портов со значениями от 4000 до 5000, и диапазон портов с большими номерами от 49152 до 65535, а затем заблокировать все до 4000 порта (конечно оставив доступ из интернет к определенным портам.
+
+Другой распространенный тип DoS атак называется springboard - сервер атакуется таким образом, что генерируемые ответы перегружают его, локальную сеть или какие-то другие компьютеры. Наиболее распространенная атака этого вида это _широковещательная ICMP ping атака_. Атакующий подделывает пакеты ping, подставляя IP адрес машины, которую он намеревается атаковать, и отправляет их на широковещательный адрес вашей локальной сети. Если ваш внешний маршрутизатор не настроен на отбрасывание пакетов ping на широковещательные адреса, ваша сеть начинает генерировать соответствующие ответы на поддельный адрес, что приводит к перегрузке хоста-жертвы, особенно если атакующий использует этот же трюк с множеством широковещательных адресов в множестве сетей одновременно. Были зарегистрированы широковещательные атаки свыше ста двадцати мегабит. Другая распространенная springboard атака направлена на ICMP систему сообщения об ошибках. Конструируя пакеты, вызывающие ICMP сообщения об ошибках, атакующий может нагрузить входящее соединение сервера и вынудить сервер нагрузить исходящее соединение ICMP ответами. Этот тип атаки может также обрушить сервер, когда тот исчерпает mbuf, обычно если сервер не может ограничить число ответов ICMP, когда они генерируются слишком быстро. Используйте переменную sysctl`net.inet.icmp.icmplim`. Последний основной класс springboard атак относится к определенным внутренним сервисам inetd, таким как сервис udp echo. Атакующий просто подделывает адрес источника и адрес назначения UDP пакетов, устанавливая в их качестве соответственно echo порт сервера A и B, оба этих сервера принадлежат вашей локальной сети. Эти два сервера начинают перебрасываться этим пакетом друг с другом. Атакующий может вызвать перегрузку обеих серверов и их сетей, просто отправив несколько пакетов таким способом. Аналогичные проблемы существуют с портом chargen. Компетентный системный администратор должен отключить эти тестовые сервисы inetd.
+
+Атаки с поддельными пакетами могут также использоваться для переполнения кэша маршрутизации ядра. Обратитесь к параметрам `sysctl``net.inet.ip.rtexpire`, `rtminexpire`, и `rtmaxcache`. Атака с поддельными пакетами, использующая произвольный IP адрес источника, заставит ядро сгенерировать временный кэшированный маршрут в таблице маршрутизации, который можно увидеть с помощью `netstat -rna | fgrep W3`. Эти маршруты обычно удаляются через 1600 секунд или около того. Если ядро определит, что кэшированная маршрутная таблица стала слишком большой, оно динамически уменьшит `rtexpire`, но никогда не станет делать его меньше чем `rtminexpire`. С этим связаны две проблемы:
+
+. Ядро не отреагирует достаточно быстро, когда легко нагруженный сервер будет внезапно атакован.
+. Значение `rtminexpire` недостаточно мало для поддержки работоспособности в условиях продолжительной атаки.
+
+Если ваши серверы подключены к интернет через линию T3 или более быструю, предусмотрительно будет изменить оба значения `rtexpire` и `rtminexpire` с помощью man:sysctl[8]. Никогда не устанавливайте ни один из этих параметров в нуль (если только вы не хотите обрушить систему). Установка обеих параметров в значение 2 секунды должна предотвратить таблицу маршрутизации от атак.
+
+=== Проблемы, связанные с доступом к Kerberos и SSH
+
+При использовании Kerberos и ssh необходимо учесть несколько возможных проблем. Kerberos V это отличный протокол аутентификации, но в адаптированных к нему приложениях telnet и rlogin есть несколько ошибок, которые могут сделать их непригодными к работе с бинарными потоками. К тому же, по умолчанию Kerberos не шифрует сессию, если вы не используете параметр `-x`. ssh шифрует все по умолчанию.
+
+ssh работает очень хорошо во всех ситуациях, но пересылает ключи по умолчанию. Это означает, что если вы работаете с защищенной рабочей станции, ключи на которой дают доступ к остальной сети, и заходите по ssh на незащищенный компьютер, эти ключи могут быть использованы для взлома. Атакующему не удастся получить сами ключи, но поскольку ssh открывает порт во время входа в систему, то если на незащищенной машине взломан `root`, эти ключи могут быть использованы для доступа к другим компьютерам, на которых они действуют.
+
+Мы рекомендуем использовать ssh в комбинации с Kerberos для служебных учётных записей если это возможно. ssh может быть собран с поддержкой Kerberos. Это уменьшает зависимость от потенциально подверженных взлому ssh ключей, и в то же время защищает пароли через Kerberos. Ключи ssh должны использоваться только для работы скриптов на защищенных компьютерах (там, где Kerberos использовать не получится). Мы также рекомендуем или выключить передачу ключей в настройках ssh, или использовать параметр `from=IP/DOMAIN`, поддерживаемый ssh в файле [.filename]#authorized_keys#, который позволяет использовать ключи только с определенных компьютеров.
+
+[[crypt]]
+== DES, MD5, и шифрование
+
+У каждого пользователя UNIX(R) системы есть пароль, связанный с его учётной записью. Очевидно, что эти пароли должны быть известны только пользователю и соответствующей операционной системе. Для защиты паролей они шифруются способом, известным как "односторонний хэш", то есть их можно легко зашифровать, но нельзя расшифровать. Другими словами, то, что мы сказали чуть раньше было очевидно, но не совсем верно: операционной системе _сам пароль_ неизвестен. Ей известен только пароль в _зашифрованной_ форме. Единственный способ получить "обычный" пароль это простой перебор всех возможных паролей.
+
+К сожалению, единственный способ шифрования пароля при появлении UNIX(R) был основан на DES, Data Encryption Standard. Это не было проблемой для пользователей, живущих в США, но поскольку исходный код DES нельзя было экспортировать из США, FreeBSD нашла способ одновременно не нарушать законов США и сохранить совместимость со всеми другими вариантами UNIX(R), где все еще использовался DES.
+
+Решение было в разделении библиотек шифрования, чтобы пользователи в США могли устанавливать и использовать библиотеки DES, а у остальных пользователей был метод шифрования, разрешенный к экспорту. Так FreeBSD пришла к использованию MD5 в качестве метода шифрования по умолчанию. MD5 считается более безопасным, чем DES, поэтому установка DES рекомендуется в основном из соображений совместимости.
+
+=== Определения механизма шифрования
+
+На данный момент библиотека поддерживает хэши DES, MD5 и Blowfish. По умолчанию FreeBSD использует для шифрования паролей MD5.
+
+Довольно легко определить какой метод шифрования используется в FreeBSD. Один из способов это проверка файла [.filename]#/etc/master.passwd#. Пароли, зашифрованные в хэш MD5 длиннее, чем те, что зашифрованы с помощью DES и начинаются с символов `$1$`. Пароли, начинающиеся с символов `$2a$` зашифрованы с помощью Blowfish. Пароли, зашифрованные DES не содержат каких-то определенных идентифицирующих символов, но они короче, чем пароли MD5 и закодированы в 64-символьном алфавите, не содержащем символа `$`, поэтому относительно короткая строка, не начинающаяся с этого символа это скорее всего DES пароль.
+
+Формат паролей, используемых для новых паролей, определяется параметром `passwd_format` в [.filename]#/etc/login.conf#, которое может принимать значения `des`, `md5` или `blf`. Обратитесь к странице справочника man:login.conf[5] за дополнительной информацией о параметрах login.
+
+[[one-time-passwords]]
+== Одноразовые пароли
+
+FreeBSD использует для одноразовых паролей OPIE (One-time Passwords In Everything). OPIE по умолчанию использует MD5.
+
+Есть три различных вида паролей, о которых мы поговорим ниже. Первый вид это ваш обычный пароль UNIX(R) или пароль Kerberos; мы будем называть его "пароль UNIX(R)". Второй вид это одноразовый пароль, сгенерированный программой OPIE man:opiekey[1] и принимаемый командой man:opiepasswd[1] и в приглашении login; мы будем называть их "одноразовыми паролями". Последний вид паролей это защищенные пароли, которые вы передаете программам `opiekey` (и иногда `opiepasswd`), и которые эти программы используют для создания одноразовых паролей; мы будем называть его "защищенными паролями" или просто "паролями".
+
+Защищенный пароль не имеет никакого отношения к вашему паролю UNIX(R); они могут быть одинаковыми, но это не рекомендуется. Защищенные пароли OPIE не ограничены 8-ю символами, как старые UNIX(R) пароли, они могут быть настолько длинными, насколько вы захотите. Очень часто используются пароли длиной в шесть или семь символов. По большей части система OPIE работает полностью независимо от системы паролей UNIX(R).
+
+Помимо паролей, есть два других вида данных, важных для OPIE. Первый, известный как "seed" или "ключ", состоит из двух букв и пяти цифр. Другой, называемый "счетчиком цикла", это номер от 1 до 100. OPIE создает одноразовый пароль, соединяя ключ и защищенный пароль, а затем применяя MD4 столько раз, сколько указано счетчиком цикла и выдает результат в виде шести коротких слов на английском. Эти шесть слов на английском и есть ваш одноразовый пароль. Система аутентификации (как правило PAM) хранит последний использованный одноразовый пароль, и пользователь аутентифицируется если хэш вводимого пользователем пароля совпадает с предыдущим паролем. Поскольку используется односторонний хэш, невозможно сгенерировать следующий одноразовый пароль если получен предыдущий; счетчик цикла уменьшается после каждого успешного входа для поддержки синхронизации пользователя с программой login. Когда счетчик цикла уменьшается до 1, набор OPIE должен быть переинициализирован.
+
+В каждой из обсуждаемых ниже систем задействованы три программы. Программа `opiekey` получает счетчик цикла, ключ и защищенный пароль и создает одноразовый пароль или последовательный список одноразовых паролей. Программа `opiepasswd` используется для инициализации OPIE соответственно, и для смены паролей, счетчиков цикла, или ключей; она принимает защищенный пароль или счетчик цикла, ключ и одноразовый пароль. Программа `opieinfo` проверяет соответствующий файл ([.filename]#/etc/opiekeys#) и печатает текущий счетчик цикла и ключ вызывающего пользователя.
+
+Мы рассмотрим четыре вида операций. Первая это использование `opiepasswd` через защищенное соединение для первоначальной настройки системы одноразовых паролей, или для изменения пароля или ключа. Вторая операция это использование в тех же целях `opiepasswd` через незащищенное соединение, в сочетании с `opiekey` через защищенное соединение. Третья это использование `opiekey` для входа через незащищенное соединение. Четвертая это использование `opiekey` для генерации набора ключей, которые могут быть записаны или распечатаны для соединения из места, где защищенное соединение недоступно.
+
+=== Защищенная установка соединения
+
+Для первоначальной настройки OPIE используется команда `opiepasswd`:
+
+[source,bash]
+....
+% opiepasswd -c
+[grimreaper] ~ $ opiepasswd -f -c
+Adding unfurl:
+Only use this method from the console; NEVER from remote. If you are using
+telnet, xterm, or a dial-in, type ^C now or exit with no password.
+Then run opiepasswd without the -c parameter.
+Using MD5 to compute responses.
+Enter new secret pass phrase:
+Again new secret pass phrase:
+ID unfurl OTP key is 499 to4268
+MOS MALL GOAT ARM AVID COED
+....
+
+В приглашениях `Enter new secret pass phrase:` или `Enter secret password:`, введите пароль или фразу. Запомните, это не тот пароль, с которым вы будете входить, он используется для генерации одноразовых паролей. Строка "ID" содержит информацию для вашего конкретного случая: имя пользователя, счетчик цикла и ключ. При входе система запомнит эти параметры и отправит их вам, поэтому их не надо запоминать. В последней строке находится одноразовый пароль, соответствующий этим параметрам и секретному паролю; если вы войдете в систему сразу, используйте этот одноразовый пароль.
+
+=== Незащищенная установка соединения
+
+Для инициализации или изменения защищенного пароля через незащищенное соединение, вам потребуется существующее защищенное соединение куда-то, где вы сможете запустить `opiekey`; это может быть shell на компьютере, которому вы доверяете. Вам потребуется также установить значение счетчика цикла (100 возможно подойдет), и задать ключ или использовать сгенерированный. Через незащищенное соединение (к компьютеру, на котором производится настройка), используйте команду `opiepasswd`:
+
+[source,bash]
+....
+% opiepasswd
+
+Updating unfurl:
+You need the response from an OTP generator.
+Old secret pass phrase:
+ otp-md5 498 to4268 ext
+ Response: GAME GAG WELT OUT DOWN CHAT
+New secret pass phrase:
+ otp-md5 499 to4269
+ Response: LINE PAP MILK NELL BUOY TROY
+
+ID mark OTP key is 499 gr4269
+LINE PAP MILK NELL BUOY TROY
+....
+
+Чтобы принять ключ по умолчанию нажмите kbd:[Enter]. Затем, перед вводом пароля доступа введите те же параметры в вашем защищенном соединении или средстве доступа OPIE:
+
+[source,bash]
+....
+% opiekey 498 to4268
+Using the MD5 algorithm to compute response.
+Reminder: Don't use opiekey from telnet or dial-in sessions.
+Enter secret pass phrase:
+GAME GAG WELT OUT DOWN CHAT
+....
+
+Теперь переключитесь на незащищенное соединение и скопируйте одноразовый пароль, сгенерированный соответствующей программой.
+
+=== Создание одного одноразового пароля
+
+Как только вы настроите OPIE, во время входа появится приглашение вроде этого:
+
+[source,bash]
+....
+% telnet example.com
+Trying 10.0.0.1...
+Connected to example.com
+Escape character is '^]'.
+
+FreeBSD/i386 (example.com) (ttypa)
+
+login: <username>
+otp-md5 498 gr4269 ext
+Password:
+....
+
+Кроме того, у OPIE есть полезная особенность (не показанная здесь): если вы нажмете kbd:[Enter] в приглашении на ввод пароля, включится эхо, и вы сможете увидеть то, что вводите. Это может быть очень полезно, если вы пытаетесь ввести пароль вручную, например с распечатки.
+
+В этот момент вам потребуется сгенерировать одноразовый пароль, чтобы ввести его в приглашение. Это должно быть выполнено на защищенной системе, в которой вы можете запустить `opiekey` (есть версии для DOS, Windows(R) и Mac OS(R)). Им требуются значения счетчика цикла и ключ в качестве параметров командной строки. Вы можете скопировать и вставить их прямо из приглашения login компьютера, на который входите.
+
+В защищенной системе:
+
+[source,bash]
+....
+% opiekey 498 to4268
+Using the MD5 algorithm to compute response.
+Reminder: Don't use opiekey from telnet or dial-in sessions.
+Enter secret pass phrase:
+GAME GAG WELT OUT DOWN CHAT
+....
+
+Теперь, когда у вас есть одноразовый пароль, можете продолжить вход в систему.
+
+=== Создание нескольких одноразовых паролей
+
+Иногда вы отправляетесь туда, где нет доступа к защищенному компьютеру или защищенному соединению. В этом случае, можно использовать команду `opiekey` для создания нескольких одноразовых паролей, которые вы сможете распечатать и забрать с собой. Например:
+
+[source,bash]
+....
+% opiekey -n 5 30 zz99999
+Using the MD5 algorithm to compute response.
+Reminder: Don't use opiekey from telnet or dial-in sessions.
+Enter secret pass phrase: <secret password>
+26: JOAN BORE FOSS DES NAY QUIT
+27: LATE BIAS SLAY FOLK MUCH TRIG
+28: SALT TIN ANTI LOON NEAL USE
+29: RIO ODIN GO BYE FURY TIC
+30: GREW JIVE SAN GIRD BOIL PHI
+....
+
+Параметр `-n 5` запрашивает пять паролей, `30` указывает значение последнего счетчика цикла. Обратите внимание, что пароли печатаются в _обратном_ по сравнению с обычным использованием порядке. Если вы действительно параноик, перепишите результат вручную; иначе скопируйте и передайте его `lpr`. Обратите внимание, что каждая линия содержит как счетчик цикла, так и одноразовый пароль; вам может показаться удобным отрывать пароль после использования.
+
+=== Ограничение использования UNIX(R) паролей
+
+OPIE может ограничивать использование паролей UNIX(R) на основе IP адреса. Соответствующий файл называется [.filename]#/etc/opieaccess#, он существует по умолчанию. Обратитесь к man:opieaccess[5] за более подробной информацией об этом файле и о предосторожностях, которые вы должны предпринять при использовании этого файла.
+
+Вот пример файла [.filename]#opieaccess#:
+
+[.programlisting]
+....
+permit 192.168.0.0 255.255.0.0
+....
+
+Эта строка позволяет пользователям, чей IP адрес (который подвержен подделке) соответствует указанному значению и маске, входить с паролем UNIX(R).
+
+Если ни одно из правил в [.filename]#opieaccess# не сработало, поведением по умолчанию является запрет всех не-OPIE входов.
+
+[[tcpwrappers]]
+== TCP Wrappers
+
+Каждый, кто знаком с man:inetd[8], возможно когда-то слышал о TCP Wrappers. Но немногие полностью понимают их полезность в сетевой среде: большинство используют брандмауэр. Хотя его применимость очень широка, есть вещи, с которыми брандмауэр не может работать, такие как отправка текста обратно вызывающей стороне. Программное обеспечение уровня TCP может делать это и многое другое. В следующих нескольких разделах обсуждаются многие возможности TCP Wrappers, и, когда это необходимо, даются примеры настроек.
+
+Программное обеспечение TCP Wrappers расширяет возможность `inetd` по поддержке каждого даемона. С ним становится возможным протоколирование, возврат сообщений вызывающей стороне, ограничение подключений внутренней сетью и т.п. Хотя некоторые из этих возможностей могут быть реализованы брандмауэром, TCP Wrappers не только предоставляют дополнительный уровень защиты, но и дают больше контроля над системой, чем это возможно с брандмауэром.
+
+Расширенная функциональность обработчиков TCP не может заменить хороший сетевой экран. Тем не менее, обработчики TCP могут использоваться совместно с сетевым экраном и другими средствами обеспечения информационной безопасности, обеспечивая тем самым дополнительный уровень защиты системы.
+
+Поскольку рассматривается расширение к настройкам `inetd`, предполагается, что читатель ознакомился с разделом о crossref:network-servers[network-inetd,настройке inetd].
+
+[NOTE]
+====
+Хотя программы, запускаемые из man:inetd[8], на самом деле не соответствуют термину "даемоны", существует традиция называть их именно так. Этот термин и используется в данном разделе.
+====
+
+=== Начальная настройка
+
+Единственное требование для использования TCP Wrappers в FreeBSD это наличие в [.filename]#rc.conf# параметров запуска `inetd``-Ww`; это настройки по умолчанию. Конечно, ожидается также наличие правильной настройки [.filename]#/etc/hosts.allow#, но man:syslogd[8] отправит сообщения в системный протокол если что-то не так.
+
+[NOTE]
+====
+В отличие от других реализаций TCP Wrappers, использование [.filename]#hosts.deny# не поддерживается. Все параметры настройки должны быть помещены в [.filename]#/etc/hosts.allow#.
+====
+
+В простейшей конфигурации, политика подключения сводится к разрешению или блокированию в зависимости от параметров в [.filename]#/etc/hosts.allow#. Настройка в FreeBSD по умолчанию заключается в разрешении подключения к любому даемону, запущенному из `inetd`. Изменение этого поведения будет обсуждаться только после рассмотрения базовой настройки.
+
+Базовая настройка обычно принимает форму `daemon : address : action`, где `daemon` это имя даемона, который запускается `inetd`. В поле `address` может находиться имя хоста, IP адрес, или IPv6 адрес, заключенный в квадратные скобки ([ ]). Поле action может принимать значения allow или deny, чтобы соответственно разрешать или запрещать доступ. Помните, что поиск правил производится до первого совпадения. При обнаружении совпадения применяется соответствующее правило и поиск прерывается.
+
+Существуют и другие параметры, но они будут описаны в следующих разделах. Простая конфигурация может быть, например, такой: для разрешения соединений по протоколу POP3 к даемону package:mail/qpopper[], в [.filename]#hosts.allow# необходимо добавить следующие строки:
+
+[.programlisting]
+....
+# This line is required for POP3 connections:
+qpopper : ALL : allow
+....
+
+После добавления этой строки, `inetd` необходимо перезапустить. Это можно выполнить командой man:kill[1] или скриптом [.filename]#/etc/rc.d/inetd# с параметром [parameter]#restart#.
+
+=== Расширенная конфигурация
+
+У TCP Wrappers имеются дополнительные параметры; они дают дополнительные возможности контроля над соединениями. Иногда бывает полезно возвращать комментарий определенным хостам или при подключении к определенным даемонам. В других случаях может быть необходимо добавить запись в лог файл, или отправить письмо администратору. В определенных ситуациях сервис должен использоваться только для локальных соединений. Все это возможно с использованием параметров c шаблонами, символами подстановки и путем выполнения внешних команд. Следующие два раздела посвящены этим типам настроек.
+
+==== Внешние команды
+
+Предположим ситуацию, в которой соединение должно быть запрещено, а о причине необходимо сообщить вызывающей стороне. Как это можно сделать? Соответствующую возможность предоставляет параметр `twist`. При попытке подключения выполняется команда или скрипт, заданный этим параметром. Пример дан в файле [.filename]#hosts.allow#:
+
+[.programlisting]
+....
+# The rest of the daemons are protected.
+ALL : ALL \
+ : severity auth.info \
+ : twist /bin/echo "You are not welcome to use %d from %h."
+....
+
+В этом примере сообщение, "You are not allowed to use `daemon` from `hostname`." будет возвращено от всех даемонов, которые не были предварительно настроены в файле доступа. Обратите внимание, что возвращаемое сообщение _должно_ быть заключено в кавычки; из этого правила нет исключений.
+
+[WARNING]
+====
+
+Возможна реализация DoS атаки, когда группа атакующих производит множество запросов на подключение.
+====
+
+Возможно также использование параметра `spawn`. Как и параметр `twist`, параметр `spawn` подразумевает запрет соединения и может использоваться для запуска команд или скриптов. В отличие от `twist`, `spawn` не отправляет ответ вызывающей стороне. Например, следующая конфигурация:
+
+[.programlisting]
+....
+# We do not allow connections from example.com:
+ALL : .example.com \
+ : spawn (/bin/echo %a from %h attempted to access %d >> \
+ /var/log/connections.log) \
+ : deny
+....
+
+отклонит все попытки соединения из домена `*.example.com`; имя хоста, IP адрес и даемон протоколируются в файл [.filename]#/var/log/connections.log#.
+
+Помимо приведенных выше символов подстановки, например %a, существует еще несколько символов. Обратитесь к странице man:hosts_access[5] справочной системы за полным списком.
+
+==== Параметры - шаблоны
+
+До этого момента в примерах использовался шаблон `ALL`. Существуют и другие параметры, функциональность которых в дальнейшем может быть расширена. `ALL` соответствует любому даемону, домену или IP адресу. Другой доступный шаблон это `PARANOID`, который соответствует хосту, IP адрес которого может быть подделан. Другими словами, `paranoid` может быть использован для определения действия с хостами, IP адрес которых не соответствует имени хоста. Вот пример применения этого параметра:
+
+[.programlisting]
+....
+# Block possibly spoofed requests to sendmail:
+sendmail : PARANOID : deny
+....
+
+В этом примере все запросы на подключения к `sendmail` от хостов, IP адрес которых не соответствует имени хоста, будут отклонены.
+
+[CAUTION]
+====
+
+Использование `PARANOID` невозможно, если у клиента или сервера неправильно настроен DNS. В таких случаях необходимо вмешательство администратора.
+====
+
+Более подробная информация о шаблонах и их возможностях дана на странице man:hosts_access[5] справочной системы.
+
+Для того, чтобы любая выбранная конфигурация заработала, в [.filename]#hosts.allow# необходимо закомментировать первую строку настройки. В начале раздела об этом не упоминалось.
+
+[[kerberosIV]]
+== KerberosIV
+
+Kerberos это сетевая дополнительная система/протокол, которая делает возможной аутентификацию пользователей через сервисы на защищенном сервере. Такие сервисы, как удаленный вход, удаленное копирование, защищенное копирование файлов между системами и другие задачи с высоким риском становятся допустимо безопасными и более контролируемыми.
+
+Последующие инструкции могут использоваться в качестве руководства по настройке поставляемого с FreeBSD Kerberos. Тем не менее, вам могут потребоваться страницы справочника полного дистрибутива.
+
+=== Установка KerberosIV
+
+Kerberos это опциональный компонент FreeBSD. Простейший способ установки этой программы это выбор `krb4` или `krb5` из sysinstall во время первой установки FreeBSD. Будет установлен "eBones" (KerberosIV) или "Heimdal" (Kerberos5) вариант Kerberos. Включение этих реализаций объясняется тем, что они разработаны вне США/Канады и доступны вне этих стран, поскольку на них не влияют ограничения на экспорт криптографического кода из США.
+
+Кроме того, реализация MIT Kerberos доступна из Коллекции Портов в виде пакета package:security/krb5[].
+
+=== Создание базы данных
+
+Это необходимо сделать только на сервере Kerberos. Во-первых, убедитесь что не осталось старой базы данных Kerberos. Войдите в каталог [.filename]#/etc/kerberosIV# и убедитесь, что в нем находятся только эти файлы:
+
+[source,bash]
+....
+# cd /etc/kerberosIV
+# ls
+README krb.conf krb.realms
+....
+
+Если присутствуют еще какие-то файлы (такие как [.filename]#principal.*# или [.filename]#master_key#), используйте команду `kdb_destroy` для удаления старой базы данных Kerberos, или, если Kerberos не запущен, просто удалите эти файлы.
+
+Затем отредактируйте файлы [.filename]#krb.conf# и [.filename]#krb.realms#, введя ваши данные. В этом примере уникальный идентификатор `EXAMPLE.COM`, сервер `grunt.example.com`. Отредактируем или создадим файл [.filename]#krb.conf#:
+
+[source,bash]
+....
+# cat krb.conf
+EXAMPLE.COM
+EXAMPLE.COM grunt.example.com admin server
+CS.BERKELEY.EDU okeeffe.berkeley.edu
+ATHENA.MIT.EDU kerberos.mit.edu
+ATHENA.MIT.EDU kerberos-1.mit.edu
+ATHENA.MIT.EDU kerberos-2.mit.edu
+ATHENA.MIT.EDU kerberos-3.mit.edu
+LCS.MIT.EDU kerberos.lcs.mit.edu
+TELECOM.MIT.EDU bitsy.mit.edu
+ARC.NASA.GOV trident.arc.nasa.gov
+....
+
+В этом примере другие идентификаторы введены для иллюстрации настройки c несколькими хостами. С целью упрощения настройки вы можете не включать их.
+
+Первая строка содержит идентификатор, под которым работает эта система. Остальные строки связывают идентификаторы с именами хостов. Сначала указывается идентификатор, затем хост под этим идентификатором, работающий как "центр распространения ключей". Слова `admin server` с последующим именем хоста означают, что этот хост также является сервером администрирования базы данных. За дальнейшей информацией об этих терминах обратитесь к страницам справочника по Kerberos.
+
+Мы добавили `grunt.example.com` к идентификатору `EXAMPLE.COM` и кроме того сопоставили всем хостам в домене `.example.com` идентификатор `EXAMPLE.COM`. Файл [.filename]#krb.realms# будет выглядеть так:
+
+[source,bash]
+....
+# cat krb.realms
+grunt.example.com EXAMPLE.COM
+.example.com EXAMPLE.COM
+.berkeley.edu CS.BERKELEY.EDU
+.MIT.EDU ATHENA.MIT.EDU
+.mit.edu ATHENA.MIT.EDU
+....
+
+Как и в предыдущем примере, другие идентификаторы добавлены только для примера. С целью упрощения настройки вы можете не включать их.
+
+В первой строке _определенная_ система сопоставляется с идентификатором. В остальных строках показано, сопоставить идентификатору остальные системы определенного поддомена.
+
+Теперь мы готовы к созданию базы данных. Потребуется всего лишь запустить сервер Kerberos (или центр распространения ключей). Используйте для этого `kdb_init`:
+
+[source,bash]
+....
+# kdb_init
+Realm name [default ATHENA.MIT.EDU ]: EXAMPLE.COM
+You will be prompted for the database Master Password.
+It is important that you NOT FORGET this password.
+
+Введите главный ключ Kerberos:
+....
+
+Теперь мы должны сохранить ключ, чтобы сервера на локальных компьютерах могли его взять. Используйте для этого команду `kstash`:
+
+[source,bash]
+....
+# kstash
+
+Enter Kerberos master key:
+
+Current Kerberos master key version is 1.
+
+Master key entered. BEWARE!
+....
+
+Этой командой зашифрованный главный пароль сохранен в [.filename]#/etc/kerberosIV/master_key#.
+
+=== Запуск Kerberos
+
+Для каждой системы, защищаемой Kerberos, в базу данных должны быть добавлены две записи. Это `kpasswd` и `rcmd`. Они добавляются вместе с именем системы.
+
+Эти даемоны, kpasswd и rcmd позволяют другим системам изменять пароли Kerberos и запускать такие команды как man:rcp[1], man:rlogin[1], man:rsh[1].
+
+Теперь добавим эти записи:
+
+[source,bash]
+....
+# kdb_edit
+Opening database...
+
+Enter Kerberos master key:
+
+Current Kerberos master key version is 1.
+
+Master key entered. BEWARE!
+Previous or default values are in [brackets] ,
+enter return to leave the same, or new value.
+
+Principal name: passwd
+Instance: grunt
+
+<Not found>, Create [y] ? y
+
+Principal: passwd, Instance: grunt, kdc_key_ver: 1
+New Password: <---- enter RANDOM here
+Verifying password
+
+New Password: <---- enter RANDOM here
+
+Random password [y] ? y
+
+Principal's new key version = 1
+Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?
+Max ticket lifetime (*5 minutes) [ 255 ] ?
+Attributes [ 0 ] ?
+Edit O.K.
+Principal name: rcmd
+Instance: grunt
+
+<Not found>, Create [y] ?
+
+Principal: rcmd, Instance: grunt, kdc_key_ver: 1
+New Password: <---- enter RANDOM here
+Verifying password
+
+New Password: <---- enter RANDOM here
+
+Random password [y] ?
+
+Principal's new key version = 1
+Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?
+Max ticket lifetime (*5 minutes) [ 255 ] ?
+Attributes [ 0 ] ?
+Edit O.K.
+Principal name: <---- null entry here will cause an exit
+....
+
+=== Создание файла настройки сервера
+
+Теперь необходимо создать все записи сервисов, которые были определены для каждого компьютера. Используем для этого команду `ext_srvtab`. Будет создан файл, который должен быть скопирован или перемещен _безопасным способом_ в каталог [.filename]#/etc/kerberosIV# каждого Kerberos клиента. Этот файл должен присутствовать на каждом сервере и клиенте, он необходим для работы Kerberos.
+
+[source,bash]
+....
+# ext_srvtab grunt
+Enter Kerberos master key:
+
+Current Kerberos master key version is 1.
+
+Master key entered. BEWARE!
+Generating 'grunt-new-srvtab'....
+....
+
+Эта команда создаст временный файл, который должен быть переименован в [.filename]#srvtab#, чтобы серверы смогли обратиться к нему. Используйте команду man:mv[1] для перемещения его в исходной системе:
+
+[source,bash]
+....
+# mv grunt-new-srvtab srvtab
+....
+
+Если файл предназначен для клиентской системы, и сеть не безопасна, скопируйте [.filename]#client-new-srvtab# на съемный носитель и перенесите файл с его помощью. Убедитесь, что переименовали его в [.filename]#srvtab# в каталоге [.filename]#/etc/kerberosIV# клиента, и что режим доступа к нему 600:
+
+[source,bash]
+....
+# mv grumble-new-srvtab srvtab
+# chmod 600 srvtab
+....
+
+=== Пополнение базы данных
+
+Теперь необходимо добавить в базу данных пользователей. Во-первых, создадим запись для пользователя `jane`. Используйте команду `kdb_edit`:
+
+[source,bash]
+....
+# kdb_edit
+Opening database...
+
+Enter Kerberos master key:
+
+Current Kerberos master key version is 1.
+
+Master key entered. BEWARE!
+Previous or default values are in [brackets] ,
+enter return to leave the same, or new value.
+
+Principal name: jane
+Instance:
+
+<Not found>, Create [y] ? y
+
+Principal: jane, Instance: , kdc_key_ver: 1
+New Password: <---- enter a secure password here
+Verifying password
+
+New Password: <---- re-enter the password here
+Principal's new key version = 1
+Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?
+Max ticket lifetime (*5 minutes) [ 255 ] ?
+Attributes [ 0 ] ?
+Edit O.K.
+Principal name: <---- null entry here will cause an exit
+....
+
+=== Тестирование всей системы
+
+Во-первых, запустите даемоны Kerberos. При правильном редактировании файла [.filename]#/etc/rc.conf# они запустятся автоматически при перезагрузке. Это необходимо только на сервере Kerberos. Клиенты Kerberos получат все необходимые данные из каталога [.filename]#/etc/kerberosIV#.
+
+[source,bash]
+....
+# kerberos &
+Kerberos server starting
+Sleep forever on error
+Log file is /var/log/kerberos.log
+Current Kerberos master key version is 1.
+
+Master key entered. BEWARE!
+
+Current Kerberos master key version is 1
+Local realm: EXAMPLE.COM
+# kadmind -n &
+KADM Server KADM0.0A initializing
+Please do not use 'kill -9' to kill this job, use a
+regular kill instead
+
+Current Kerberos master key version is 1.
+
+Master key entered. BEWARE!
+....
+
+Теперь для получения доступа через созданного пользователя `jane` используйте `kinit`:
+
+[source,bash]
+....
+% kinit jane
+MIT Project Athena (grunt.example.com)
+Kerberos Initialization for "jane"
+Password:
+....
+
+Попробуйте просмотреть имеющиеся данные с помощью `klist`:
+
+[source,bash]
+....
+% klist
+Ticket file: /tmp/tkt245
+Principal: jane@EXAMPLE.COM
+
+ Issued Expires Principal
+Apr 30 11:23:22 Apr 30 19:23:22 krbtgt.EXAMPLE.COM@EXAMPLE.COM
+....
+
+Теперь попробуйте изменить пароль с помощью man:passwd[1], чтобы убедиться, что даемон kpasswd может получить информацию из базы данных Kerberos:
+
+[source,bash]
+....
+% passwd
+realm EXAMPLE.COM
+Old password for jane:
+New Password for jane:
+Verifying password
+New Password for jane:
+Password changed.
+....
+
+=== Включение `su`
+
+Kerberos позволяет назначить _каждому_ пользователю, который нуждается в привилегиях `root`, свой _собственный_ пароль man:su[1]. Необходимо добавить учётную запись, которой разрешено получать `root` доступ через man:su[1]. Это делается путем связывания учётной записи `root` с пользовательской учётной записью. Создадим в базе данных Kerberos запись `jane.root` с помощью `kdb_edit`:
+
+[source,bash]
+....
+# kdb_edit
+Opening database...
+
+Enter Kerberos master key:
+
+Current Kerberos master key version is 1.
+
+Master key entered. BEWARE!
+Previous or default values are in [brackets] ,
+enter return to leave the same, or new value.
+
+Principal name: jane
+Instance: root
+
+<Not found>, Create [y] ? y
+
+Principal: jane, Instance: root, kdc_key_ver: 1
+New Password: <---- enter a SECURE password here
+Verifying password
+
+New Password: <---- re-enter the password here
+
+Principal's new key version = 1
+Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?
+Max ticket lifetime (*5 minutes) [ 255 ] ? 12 <--- Keep this short!
+Attributes [ 0 ] ?
+Edit O.K.
+Principal name: <---- null entry here will cause an exit
+....
+
+Теперь проверим работоспособность этой записи:
+
+[source,bash]
+....
+# kinit jane.root
+MIT Project Athena (grunt.example.com)
+Kerberos Initialization for "jane.root"
+Password:
+....
+
+Необходимо добавить пользователя к `root` файлу [.filename]#.klogin#:
+
+[source,bash]
+....
+# cat /root/.klogin
+jane.root@EXAMPLE.COM
+....
+
+Теперь попробуйте выполнить man:su[1]:
+
+[source,bash]
+....
+% su
+Password:
+....
+
+и посмотрите на имеющиеся данные:
+
+[source,bash]
+....
+# klist
+Ticket file: /tmp/tkt_root_245
+Principal: jane.root@EXAMPLE.COM
+
+ Issued Expires Principal
+May 2 20:43:12 May 3 04:43:12 krbtgt.EXAMPLE.COM@EXAMPLE.COM
+....
+
+=== Использование других команд
+
+В примере выше мы создали запись (principal) `jane` с доступом к `root` (instance). Она основана на пользователе с таким же именем, как и идентификатор, что принято Kerberos по умолчанию; `<principal>.<instance>` в форме `<username>.``root` позволяет использовать man:su[1] для доступа к `root`, если соответствующие записи находятся в файле [.filename]#.klogin# домашнего каталога `root`:
+
+[source,bash]
+....
+# cat /root/.klogin
+jane.root@EXAMPLE.COM
+....
+
+Подобно этому, если в файле [.filename]#.klogin# из домашнего каталога пользователя есть строки в форме:
+
+[source,bash]
+....
+% cat ~/.klogin
+jane@EXAMPLE.COM
+jack@EXAMPLE.COM
+....
+
+это позволит любому с идентификатором `EXAMPLE.COM`, кто аутентифицировался как `jane` или `jack` (с помощью команды `kinit`, см. выше) получить доступ к учётной записи пользователя `jane` или файлам этой системы (`grunt`) через man:rlogin[1], man:rsh[1] или man:rcp[1].
+
+Например, `jane` может входить в другую систему используя Kerberos:
+
+[source,bash]
+....
+% kinit
+MIT Project Athena (grunt.example.com)
+Password:
+% rlogin grunt
+Last login: Mon May 1 21:14:47 from grumble
+Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
+ The Regents of the University of California. All rights reserved.
+
+FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995
+....
+
+Или `jack` входит в учётную запись `jane`'s на этом же компьютере (файл [.filename]#.klogin#`jane` настроен как показано выше, и в Kerberos настроена учётная запись _jack_):
+
+[source,bash]
+....
+% kinit
+% rlogin grunt -l jane
+MIT Project Athena (grunt.example.com)
+Password:
+Last login: Mon May 1 21:16:55 from grumble
+Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
+ The Regents of the University of California. All rights reserved.
+FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995
+....
+
+[[kerberos5]]
+== Kerberos5
+
+Все релизы FreeBSD после FreeBSD-5.1 включают поддержку только Kerberos5. Таким образом, Kerberos5 это единственная включаемая в поставку версия и его конфигурация похожа на KerberosIV во многих аспектах. Эта информация применима только к Kerberos5 из релизов после FreeBSD-5.0. Пользователи, желающие использовать пакет KerberosIV, могут установить его из порта package:security/krb4[].
+
+Kerberos это дополнительная сетевая система/протокол, позволяющая пользователям авторизоваться через защищенные сервисы на защищенном сервере. Такие сервисы как удаленный вход, удаленное копирование, защищенное копирование файлов между системами и другие задачи с высоким риском становятся допустимо безопасными и более контролируемыми.
+
+Kerberos может быть описана как прокси система идентификации-проверки. Она также может быть описана как защищенная внешняя система аутентификации. Kerberos предоставляет только одну функцию - защищенную аутентификацию пользователей сети. Он не предоставляет функций авторизации (что разрешено делать пользователям) или функций аудита (какой пользователь что делает). После того, как клиент и сервер использовали Kerberos для идентификации, они могут зашифровать все соединения для гарантирования собственной безопасности и целостности данных.
+
+Следовательно крайне рекомендуется использовать Kerberos с другими методами безопасности, предоставляющими сервисы авторизации и аудита.
+
+Последующие инструкции могут использоваться в качестве руководства по настройке Kerberos, поставляемого с FreeBSD. Тем не менее, вам потребуется обратиться к соответствующим страницам справочника за полным описанием.
+
+В целях демонстрации установки Kerberos, будут применены следующие обозначения:
+
+* DNS домен ("зона") example.org.
+* Уникальный идентификатор Kerberos EXAMPLE.ORG.
+
+[NOTE]
+====
+Используйте действующие имена доменов при настройке Kerberos даже если вы будете использовать его во внутренней сети. Это позволит избежать проблем с DNS и гарантирует возможность связи с Kerberos под другими идентификаторами.
+====
+
+=== История
+
+Kerberos был создан MIT в качестве решения проблем с безопасностью сети. Протокол Kerberos использует стойкую криптографию, так что клиент может идентифицироваться на сервере (и обратно) через незащищенное сетевое соединение.
+
+Kerberos это и имя сетевого протокола аутентификации и общий термин для описания программ, где он реализован (например, Kerberos telnet). Текущая версия протокола 5 описана в RFC 1510.
+
+Доступно несколько свободных реализаций этого протокола, работающих на множестве операционных систем. Massachusetts Institute of Technology (MIT), где Kerberos был первоначально разработан, продолжает разрабатывать собственный пакет Kerberos. Он обычно использовался в США как криптографический продукт, и в этом качестве попадал под действие ограничений на экспорт. MITKerberos доступен в виде порта (package:security/krb5[]). Heimdal Kerberos это другая реализация версии 5, которая разрабатывалась исключительно вне США для обхода экспортных ограничений (и поэтому часто включалась в некоммерческие реализации UNIX(R)). Heimdal Kerberos доступен в виде порта (package:security/heimdal[]), его минимальный комплект включен в базовую установку FreeBSD.
+
+В целях получения наибольшей аудитории, в этих инструкциях предполагается использование Heimdal включаемого в FreeBSD.
+
+=== Настройка Heimdal KDC
+
+Центр распространения ключей (Key Distribution Center, KDC) это централизованный сервис аутентификации, предоставляемый Kerberos - это компьютер, который предоставляет доступ через Kerberos. KDC считается доверяемым всеми другими компьютерами с определенным идентификатором Kerberos и поэтому к нему предъявляются высокие требования безопасности.
+
+Имейте ввиду, что хотя работа сервера Kerberos требует очень немного вычислительных ресурсов, из соображений безопасности для него рекомендуется отдельный компьютер, работающий только в качестве KDC.
+
+Перед началом настройки KDC, убедитесь что в файле [.filename]#/etc/rc.conf# содержатся правильные настройки для работы в качестве KDC (вам может потребоваться изменить пути в соответствии с собственной системой):
+
+[.programlisting]
+....
+kerberos5_server_enable="YES"
+kadmind5_server_enable="YES"
+....
+
+Затем приступим к редактированию файла настройки Kerberos, [.filename]#/etc/krb5.conf#:
+
+[.programlisting]
+....
+[libdefaults]
+ default_realm = EXAMPLE.ORG
+[realms]
+ EXAMPLE.ORG = {
+ kdc = kerberos.example.org
+ admin_server = kerberos.example.org
+ }
+[domain_realm]
+ .example.org = EXAMPLE.ORG
+....
+
+Обратите внимание что в файле [.filename]#/etc/krb5.conf# подразумевается наличие у KDC полного имени `kerberos.example.org`. Вам потребуется добавить CNAME (синоним) к файлу зоны, если у KDC другое имя.
+
+[NOTE]
+====
+Для больших сетей с правильно настроенным сервером BINDDNS пример выше может быть урезан до:
+
+[.programlisting]
+....
+[libdefaults]
+ default_realm = EXAMPLE.ORG
+....
+
+Со следующими строками, добавленными в файл зоны `example.org`:
+
+[.programlisting]
+....
+_kerberos._udp IN SRV 01 00 88 kerberos.example.org.
+_kerberos._tcp IN SRV 01 00 88 kerberos.example.org.
+_kpasswd._udp IN SRV 01 00 464 kerberos.example.org.
+_kerberos-adm._tcp IN SRV 01 00 749 kerberos.example.org.
+_kerberos IN TXT EXAMPLE.ORG
+....
+
+====
+
+[NOTE]
+====
+Чтобы клиенты могли найти сервисы Kerberos, _необходимо_ наличие или полностью настроенного [.filename]#/etc/krb5.conf# или минимально настроенного [.filename]#/etc/krb5.conf#_и_ правильно настроенного DNS сервера.
+====
+
+Создадим теперь базу данных Kerberos. Эта база данных содержит ключи всех основных хостов, зашифрованных с помощью главного пароля. Вам не требуется помнить этот пароль, он хранится в файле ([.filename]#/var/heimdal/m-key#). Для создания главного ключа запустите `kstash` и введите пароль.
+
+Как только будет создан главный ключ, вы можете инициализировать базу данных с помощью программы `kadmin` с ключом `-l` (означающим "local"). Этот ключ сообщает `kadmin` обращаться к файлам базы данных непосредственно вместо использования сетевого сервиса `kadmind`. Это помогает решить "проблему курицы и яйца", когда обращение идет к еще не созданной базе данных. Как только вы увидите приглашение `kadmin`, используйте команду `init` для создания базы данных идентификаторов.
+
+Наконец, оставаясь в приглашении `kadmin`, создайте первую запись с помощью команды `add`. Оставьте неизменными параметры по умолчанию, вы всегда сможете изменить их позже с помощью команды `modify`. Обратите внимание, что вы всегда можете использовать команду `?` для просмотра доступных параметров.
+
+Пример создания базы данных показан ниже:
+
+[source,bash]
+....
+# kstash
+Master key: xxxxxxxx
+Verifying password - Master key: xxxxxxxx
+
+# kadmin -l
+kadmin> init EXAMPLE.ORG
+Realm max ticket life [unlimited]:
+kadmin> add tillman
+Max ticket life [unlimited]:
+Max renewable life [unlimited]:
+Attributes []:
+Password: xxxxxxxx
+Verifying password - Password: xxxxxxxx
+....
+
+Теперь пришло время запустить сервисы KDC. Выполните команды `/etc/rc.d/kerberos start` и `/etc/rc.d/kadmind start` для запуска сервисов. Заметьте, что ни один из поддерживающих Kerberos даемонов на этот момент запущен не будет, но у вас должна быть возможность убедиться в том, что KDC функционирует путем получения списка доступа для пользователя, которого вы только что самостоятельно создали из командной строки самого KDC:
+
+[source,bash]
+....
+% k5init tillman
+tillman@EXAMPLE.ORG's Password:
+
+% k5list
+Credentials cache: FILE:/tmp/krb5cc_500
+ Principal: tillman@EXAMPLE.ORG
+
+ Issued Expires Principal
+Aug 27 15:37:58 Aug 28 01:37:58 krbtgt/EXAMPLE.ORG@EXAMPLE.ORG
+....
+
+=== Сервер Kerberos с сервисами Heimdal
+
+Для начала нам потребуется копия файла настройки Kerberos, [.filename]#/etc/krb5.conf#. Просто скопируйте его с KDC на клиентский компьютер безопасным способом (используя сетевые утилиты, такие как man:scp[1], или физически, с помощью дискеты).
+
+Затем вам понадобится файл [.filename]#/etc/krb5.keytab#. Это основное различие между сервером, поддерживающим Kerberos и рабочими станциями - на сервере должен быть файл [.filename]#keytab#. В этом файле находится центральный ключ сервера, который позволяет KDC проверять все другие идентификаторы. Он должен быть помещен на сервер безопасным способом, поскольку безопасность сервера может быть нарушена, если ключ станет общедоступен. Это означает, что его передача через прозрачный канал, такой как FTP - очень плохая идея.
+
+Обычно перенос файла [.filename]#keytab# на сервер производится с помощью программы `kadmin`. Это удобно, поскольку вам потребуется также создать запись хоста (KDC часть [.filename]#krb5.keytab#) с помощью `kadmin`.
+
+Обратите внимание, что должны быть уже зарегистрированы в системе и необходимо наличие прав на использование интерфейса `kadmin` в файле [.filename]#kadmind.acl#. Обратитесь к разделу "Remote administration" в info страницах Heimdal (`info heimdal`) за деталями по составлению списка доступа. Если вы не хотите включать удаленный доступ `kadmin`, можете просто подключиться к KDC через защищенное соединение (локальную консоль, man:ssh[1] или Kerberos man:telnet[1]) и выполнять администрирование локально с помощью `kadmin -l`.
+
+После добавления файла [.filename]#/etc/krb5.conf#, вы можете использовать `kadmin` с сервера Kerberos. Команда `add --random-key` позволит вам добавить запись для сервера, а команда `ext` позволит перенести эту запись в собственный keytab файл сервера. Например:
+
+[source,bash]
+....
+# kadmin
+kadmin> add --random-key host/myserver.example.org
+Max ticket life [unlimited]:
+Max renewable life [unlimited]:
+Attributes []:
+kadmin> ext host/myserver.example.org
+kadmin> exit
+....
+
+Обратите внимание, что команда `ext` (сокращение от "extract") сохраняет полученный ключ в файле [.filename]#/etc/krb5.keytab# по умолчанию.
+
+Если на KDC не запущен `kadmind` (возможно по соображениям безопасности) и вы не можете получить доступ к `kadmin` удаленно, возможно добавление записи хоста (`host/myserver.EXAMPLE.ORG`) непосредственно на KDC с последующим извлечением ее во временный файл (и перезаписью [.filename]#/etc/krb5.keytab# на KDC) примерно так:
+
+[source,bash]
+....
+# kadmin
+kadmin> ext --keytab=/tmp/example.keytab host/myserver.example.org
+kadmin> exit
+....
+
+Затем вы можете скопировать keytab на сервер защищенным способом (например, используя `scp` или дискету). Убедитесь, что используемое имя keytab не совпадает с именем по умолчанию во избежание перезаписывания keytab на KDC.
+
+Теперь ваш сервер может связываться с KDC (добавлен файл [.filename]#krb5.conf#) и идентифицировать себя (добавлен файл [.filename]#krb5.keytab#). Теперь вы готовы к включению некоторых сервисов Kerberos. В этом примере мы включим сервис `telnet`, поместив в [.filename]#/etc/inetd.conf# нижеприведенную строку и перезапустив сервис man:inetd[8] командой `/etc/rc.d/inetd restart`:
+
+[.programlisting]
+....
+telnet stream tcp nowait root /usr/libexec/telnetd telnetd -a user
+....
+
+Очень важно установить ключ `-a` (тип аутентификации) в user. Обратитесь к странице справочника man:telnetd[8] за подробной информацией.
+
+=== Клиент Kerberos с Heimdal
+
+Настройка клиентского компьютера почти тривиально проста. Как только настройка Kerberos закончена, вам потребуется только файл настройки Kerberos, [.filename]#/etc/krb5.conf#. Просто скопируйте его безопасным способом на клиентский компьютер с KDC.
+
+Протестируйте клиентский компьютер, попытавшись использовать `kinit`, `klist`, и `kdestroy` для получения, отображения и удаления списка доступа. Соединитесь с Kerberos севером используя клиент Kerberos, если соединение не работает и получение доступа является проблемой, это скорее всего проблема сервера, а не клиента или KDC.
+
+При тестировании приложения вроде `telnet`, попробуйте использовать программу перехвата пакетов (такую как man:tcpdump[1]), чтобы убедиться, что ваш пароль не передается незашифрованным. Попробуйте использовать `telnet` с параметром `-x`, чтобы зашифровать весь поток данных (подобно `ssh`).
+
+Основные клиентские приложения Kerberos (традиционно называющиеся `kinit`, `klist`, `kdestroy`, и `kpasswd`) находятся в базовой установке FreeBSD. Обратите внимание, что в FreeBSD версий до 5.0 они были переименованы в `k5init`, `k5list`, `k5destroy`, `k5passwd`, и `k5stash` (хотя их обычно использовали лишь однократно).
+
+Различные неосновные клиентские приложения Kerberos также устанавливаются по умолчанию. Здесь проявляется "минимальность" базовой установки Heimdal: `telnet` это единственное приложение, поддерживающее Kerberos.
+
+Порт Heimdal добавляет некоторые отсутствующие клиентские приложения: поддерживающие Kerberos версии `ftp`, `rsh`, `rcp`, `rlogin`, и некоторые другие реже используемые программы. Порт MIT также содержит полный пакет клиентских приложений Kerberos.
+
+=== Пользовательские файлы настройки: [.filename]#.k5login# и [.filename]#.k5users#
+
+Учётные записи пользователя в Kerberos (например `tillman@EXAMPLE.ORG`) обычно связаны с локальными учётными записями (например с локальной учётной записью6 `tillman`). Клиентские приложения, такие как `telnet`, обычно не требуют указания имени пользователя или учётной записи.
+
+Тем не менее, время от времени вам может потребоваться дать доступ к локальной учётной записи кому-то, у кого нет соответствующей учётной записи Kerberos. Например, пользователю `tillman@EXAMPLE.ORG` может потребоваться доступ к локальной учётной записи `webdevelopers`. Другим учётным записям также может потребоваться доступ к этой локальной учётной записи.
+
+Файлы [.filename]#.k5login# и [.filename]#.k5users#, помещенные в домашний каталог пользователя, могут быть использованы подобно действенной комбинации [.filename]#.hosts# и [.filename]#.rhosts# для решения этой проблемы. Например, файл [.filename]#.k5login# со следующим содержанием:
+
+[source,bash]
+....
+tillman@example.org
+jdoe@example.org
+....
+
+помещен в домашний каталог локального пользователя `webdevelopers`, то обе упомянутые учётные записи получат доступ к этой учётной записи без необходимости наличия общего пароля.
+
+Рекомендуется прочитать страницу справочника по этим командам. Обратите внимание, что страница справочника о `ksu` содержит информацию по [.filename]#.k5users#.
+
+=== Подсказки, советы и решение проблем с Kerberos
+
+* При использовании портов как Heimdal так и MITKerberos убедитесь, что в `PATH` версии Kerberos клиентов указаны перед их версиями в базовой системе.
+* Все ли компьютеры в пределах данного realm синхронизированы по времени? Если нет, аутентификация может завершиться неудачно. crossref:network-servers[network-ntp,Синхронизация часов через NTP] описывает как синхронизировать часы с использованием NTP.
+* MIT и Heimdal успешно взаимодействуют. За исключением `kadmin`, протокол для которого не стандартизован.
+* Если вы изменяете hostname, потребуется также изменить учётную запись `host/` и обновить keytab. Это также необходимо для специальных записей в keytab, таких как `www/` запись модуля Apache package:www/mod_auth_kerb[].
+* Все хосты под общим идентификатором должны разрешаться DNS (прямое и обратное разрешение), или как минимум через [.filename]#/etc/hosts#. Записи CNAME будут работать, но записи A и PTR должны быть корректны и находиться на своем месте. Сообщение об ошибке не всегда интуитивно понятно: `Kerberos5 refuses authentication because Read req failed: Key table entry not found`.
+* Некоторые операционные системы, способные работать в качестве клиентов KDC не устанавливают права для `ksu` в setuid `root`. Это означает, что `ksu` не работает, что хорошо является хорошей идеей для безопасности, но неудобно. Это не ошибка KDC.
+* С MITKerberos, если вы хотите продлить действие доступа до значения большего, чем десять часов по умолчанию, используйте команду `modify_principal` в `kadmin` для изменения maxlife доступа к самой учётной записи и к учётной записи `krbtgt`. Затем возможно использование `kinit` с параметром `-l` для запроса доступа с большим временем действия.
+*
+[NOTE]
+====
+Если вы запускаете перехватчик пакетов на KDC для разрешения проблем, а затем запускаете `kinit` с рабочей станции, то увидите, что TGT посылается непосредственно при запуске `kinit` - даже до того, как вы введете пароль! Объяснение в том, что сервер Kerberos свободно распространяет TGT (Ticket Granting Ticket) на каждый неавторизованный запрос; однако, каждый TGT зашифрован ключом, полученным из пароля пользователя. Следовательно, когда пользователь вводит свой пароль, он не отправляется на KDC, а используется для расшифровка TGT, который уже получен `kinit`. Если в процессе расшифровки получается правильный билет с правильным значением времени, у пользователя есть действующее "удостоверение". Это удостоверение содержит ключ сессии для установления безопасного соединения с сервером Kerberos, как и действующий TGT, зашифрованный ключом сервера Kerberos. Второй уровень шифрования недоступен пользователю, но позволяет серверу Kerberos проверять правильность каждого TGT.
+====
+
+* Если вы хотите установить большое время жизни доступа (например, неделю), и используете OpenSSH для соединения с компьютером, где хранится "билет", убедитесь, что параметр Kerberos`TicketCleanup` установлен в `no` в файле [.filename]#sshd_config#, или билеты будут уничтожены при выходе из сеанса.
+* Запомните, что время жизни билетов хостов больше. Если время жизни билета для учётной записи пользователя составляет неделю, а время жизни учётной записи хоста, к которому вы подсоединяетесь девять часов, учётная запись хоста в кэше устареет и кэш билетов будет работать не так, как ожидается.
+* При настройке файла [.filename]#krb5.dict# на предотвращение использования определенных плохих паролей (страница справочника для `kadmind` кратко рассказывает об этом), запомните, что это применимо только к учётным записям, для которых действует политика паролей. Формат файла [.filename]#krb5.dict# прост: одно слово на строку. Может помочь создание символической ссылки на [.filename]#/usr/shared/dict/words#.
+
+=== Отличия от порта MIT
+
+Основное различие между установками MIT и Heimdal относится к программе `kadmin`, которая имеет другой (но эквивалентный) набор команд и использует другой протокол. Если ваш KDC работает на MIT, вы не сможете использовать `kadmin` для удаленного администрирования KDC (и наоборот, по этой же причине).
+
+Опции командной строки клиентов также могут немного отличаться для одинаковых задач. Рекомендуется следование инструкциям на MITKerberos Web-сайте (http://web.mit.edu/Kerberos/www/[http://web.mit.edu/Kerberos/www/]). Будьте внимательны при определении `PATH`: порт MIT устанавливается по умолчанию в [.filename]#/usr/local/#, и если в `PATH` вначале указаны системные каталоги, вместо приложений MIT могут быть запущены системные приложения.
+
+[NOTE]
+====
+С портом MITpackage:security/krb5[], предоставляемым FreeBSD, убедитесь что файл [.filename]#/usr/local/shared/doc/krb5/README.FreeBSD# установлен портом, если вы хотите понять почему вход через `telnetd` и `klogind` иногда происходит так странно. Наиболее важно, исправление "incorrect permissions on cache file" требует использования бинарного файла `login.krb5` для аутентификации, чтобы права на переданное удостоверение передавались правильно.
+====
+
+=== Преодоление ограничений, обнаруженных в Kerberos
+
+==== Kerberos это все или ничего
+
+Каждый сервис, работающий в сети, должен быть модифицирован для работы с Kerberos (или другим способом защищен от атак по сети) или удостоверения пользователей могут быть украдены или использованы повторно. В качестве примера может быть приведено использование Kerberos версий оболочек для удаленной работы (например через `rsh` и `telnet`), при наличии POP3 сервера, получающего пароли в незашифрованном виде.
+
+==== Kerberos предназначен для однопользовательских рабочих станций
+
+В многопользовательской среде Kerberos менее безопасен. Это потому, что он хранит билеты в каталоге [.filename]#/tmp#, которая доступна для чтения всем. Если пользователь работает с несколькими другими пользователями одновременно на одном компьютере (т.е. в многопользовательской среде), возможна кража (копирование) билета другим пользователем.
+
+Решить проблему можно с помощью параметра командной строки `-c` или (предпочтительно) с помощью переменной окружения `KRB5CCNAME`, но это делается редко. Для преодоления ограничения достаточно сохранять билет в домашнем каталоге пользователя и использовать простые ограничения на доступ к файлам.
+
+==== От KDC зависит вся система
+
+Архитектура системы такова, что KDC должен быть максимально защищен, поскольку главный пароль базы данных содержится в нем. На KDC не должно быть запущено никаких других сервисов и он должен быть защищен физически. Опасность велика, поскольку Kerberos хранит все пароли зашифрованными одним ключом ("главным" ключом), который хранится в файле на KDC.
+
+Хорошей новостью является то, что кража главного ключа не станет такой проблемой, как может показаться. Главный ключ используется только для шифрования базы данных Kerberos и в качестве seed для генератора случайных чисел. Поскольку доступ к KDC защищен, атакующий мало что сможет сделать с главным ключом.
+
+Кроме того, если KDC станет недоступен (возможно по причине атак DoS или проблем в сети) сетевые сервисы будет невозможно использовать, поскольку аутентификация не может быть выполнена. Уменьшить последствия можно при наличии нескольких KDC (один главный и один или несколько резервных) и с аккуратно реализованной резервной аутентификацией (отлично подойдет PAM).
+
+==== Недостатки Kerberos
+
+Kerberos позволяет пользователям, хостам и сервисам производить аутентификацию друг друга. В нем нет механизма аутентификации KDC для пользователей, хостов или сервисов. Это означает, что поддельный `kinit` (например) может записывать все имена пользователей и паролей. Помочь решить проблему может package:security/tripwire[] или другой инструмент проверки целостности файловой системы.
+
+=== Ресурсы и информация для дальнейшего изучения
+
+* http://www.faqs.org/faqs/Kerberos-faq/general/preamble.html[ Kerberos FAQ]
+* http://web.mit.edu/Kerberos/www/dialogue.html[Разработка системы аутентификации: диалог в четырех сценах]
+* http://www.ietf.org/rfc/rfc1510.txt?number=1510[RFC 1510, Kerberos Network Authentication Service (V5)]
+* http://web.mit.edu/Kerberos/www/[Домашняя страница MIT Kerberos]
+* http://www.pdc.kth.se/heimdal/[Домашняя страница Heimdal Kerberos]
+
+[[openssl]]
+== OpenSSL
+
+Одной из программ, требующих особого внимания пользователей, является набор программ OpenSSL, включенный в FreeBSD. OpenSSL предоставляет уровень шифрования поверх обычных уровней соединения; следовательно, он может быть использован многими сетевыми приложениями и сервисами.
+
+OpenSSL может использоваться для шифрования соединений почтовых клиентов, транзакций через интернет, например для кредитных карт, и многого другого. Многие порты, такие как package:www/apache13-ssl[] и package:mail/sylpheed-claws[] собираются с OpenSSL.
+
+[NOTE]
+====
+В большинстве случаев в Коллекции Портов будет сделана попытка построения порта package:security/openssl[], если только переменная `WITH_OPENSSL_BASE` не установлена явно в "yes".
+====
+
+Версия OpenSSL, включаемая в FreeBSD, поддерживает сетевые протоколы безопасности Secure Sockets Layer v2/v3 (SSLv2/SSLv3), Transport Layer Security v1 (TLSv1) и может быть использована в качестве основной криптографической библиотеки.
+
+[NOTE]
+====
+Хотя OpenSSL поддерживает алгоритм IDEA, по умолчанию он отключен из-за патентных ограничений Соединенных Штатов. Для его использования необходимо ознакомиться с лицензией, и, если ограничения приемлемы, установить в [.filename]#make.conf# переменную `MAKE_IDEA`.
+====
+
+Наиболее часто OpenSSL используется для создания сертификатов, используемых программными пакетами. Эти сертификаты подтверждают, что данные компании или частного лица верны и не подделаны. Если рассматриваемый сертификат не был проверен одним из нескольких сертификационных центров ("Certificate Authorities" - CA), обычно выводится предупреждение. Центр сертификации представляет собой компанию, такую, как http://www.verisign.com[ VeriSign], которая подписывает сертификаты для подтверждения данных частных лиц или компаний. Эта процедура не бесплатна и не является абсолютно необходимой для использования сертификатов; однако может успокоить некоторых особо осторожных пользователей.
+
+=== Генерирование сертификатов
+
+Для генерирования сертификатов доступна следующая команда:
+
+[source,bash]
+....
+# openssl req -new -nodes -out req.pem -keyout cert.pem
+Generating a 1024 bit RSA private key
+................++++++
+.......................................++++++
+writing new private key to 'cert.pem'
+-----
+You are about to be asked to enter information that will be incorporated
+into your certificate request.
+What you are about to enter is what is called a Distinguished Name or a DN.
+There are quite a few fields but you can leave some blank
+For some fields there will be a default value,
+If you enter '.', the field will be left blank.
+-----
+Country Name (2 letter code) [AU]:US
+State or Province Name (full name) [Some-State]:PA
+Locality Name (eg, city) []:Pittsburgh
+Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company
+Organizational Unit Name (eg, section) []:Systems Administrator
+Common Name (eg, YOUR name) []:localhost.example.org
+Email Address []:trhodes@FreeBSD.org
+
+Please enter the following 'extra' attributes
+to be sent with your certificate request
+A challenge password []:SOME PASSWORD
+An optional company name []:Another Name
+....
+
+Ввод после приглашения "Common Name" содержит имя домена. Здесь вводится имя сервера для верификации; помещение в это поле чего-либо кроме этого имени приведет к созданию бесполезного сертификата. Доступны и другие параметры, например срок действия, альтернативные алгоритмы шифрования и т.д. Полный список находится на странице справочного руководства man:openssl[1].
+
+В текущем каталоге, из которого была вызвана вышеуказанная команда, должны появиться два файла. Файл [.filename]#req.pem# с запросом на сертификацию может быть послан в центр выдачи сертификатов, который проверит введённые вами подтверждающие данные, подпишет запрос и возвратит сертификат вам. Второй созданный файл будет иметь название [.filename]#cert.pem# и содержать приватный сертификационный ключ, который необходимо тщательно защищать; если он попадёт в руки посторонних лиц, то может быть использован для имитации лично вас (или вашего сервера).
+
+Когда подпись CA не требуется, может быть создан самоподписанный сертификат. Сначала создайте ключ RSA:
+
+[source,bash]
+....
+# openssl dsaparam -rand -genkey -out myRSA.key 1024
+....
+
+Теперь создайте ключ CA:
+
+[source,bash]
+....
+# openssl gendsa -des3 -out myca.key myRSA.key
+....
+
+Используйте этот ключ при создании сертификата:
+
+[source,bash]
+....
+# openssl req -new -x509 -days 365 -key myca.key -out new.crt
+....
+
+В каталоге должно появиться два новых файла: подпись сертификата, [.filename]#myca.key# и сам сертификат, [.filename]#new.crt#. Они должны быть помещены в каталог, доступный для чтения только `root`, желательно внутри [.filename]#/etc#. Права на каталог можно изменить `chmod` с параметрами 0700.
+
+=== Использование сертификатов, пример
+
+Итак, что могут сделать эти файлы? Хорошим применением может стать шифрование соединений для SendmailMTA. Это сделает ненужным использование простой текстовой аутентификации для тех, кто отправляет почту через локальный MTA.
+
+[NOTE]
+====
+Это не лучшее из возможных использований, поскольку некоторые MUA выдадут ошибку, если сертификат не установлен локально. Обратитесь к поставляемой с программой документации за информацией по установке сертификата.
+====
+
+Следующие строки должны быть помещены в локальный файл [.filename]#.mc#:
+
+[.programlisting]
+....
+dnl SSL Options
+define(`confCACERT_PATH',`/etc/certs')dnl
+define(`confCACERT',`/etc/certs/new.crt')dnl
+define(`confSERVER_CERT',`/etc/certs/new.crt')dnl
+define(`confSERVER_KEY',`/etc/certs/myca.key')dnl
+define(`confTLS_SRV_OPTIONS', `V')dnl
+....
+
+Где [.filename]#/etc/certs/# это каталог для локального хранения сертификата и ключей. После настройки необходимо собрать локальный файл [.filename]#.cf#. Это легко сделать, набрав `make`[parameter]#install# в каталоге [.filename]#/etc/mail#. Затем выполните команду `make`[parameter]#restart#, которая должна запустить даемон Sendmail.
+
+Если все пройдет нормально, в файле [.filename]#/var/log/maillog# не появятся сообщения об ошибках и запустится процесс Sendmail.
+
+Для проведения простого теста подключитесь к почтовому серверу программой man:telnet[1]:
+
+[source,bash]
+....
+# telnet example.com 25
+Trying 192.0.34.166...
+Connected to example.com.
+Escape character is '^]'.
+220 example.com ESMTP Sendmail 8.12.10/8.12.10; Tue, 31 Aug 2004 03:41:22 -0400 (EDT)
+ehlo example.com
+250-example.com Hello example.com [192.0.34.166], pleased to meet you
+250-ENHANCEDSTATUSCODES
+250-PIPELINING
+250-8BITMIME
+250-SIZE
+250-DSN
+250-ETRN
+250-AUTH LOGIN PLAIN
+250-STARTTLS
+250-DELIVERBY
+250 HELP
+quit
+221 2.0.0 example.com closing connection
+Connection closed by foreign host.
+....
+
+Если в выводе появилась строка "STARTTLS", все работает правильно.
+
+[[ipsec]]
+== VPN через IPsec
+
+Создание VPN между двумя сетями, соединенными через интернет, с использованием шлюзов FreeBSD.
+
+=== Принципы работы IPsec
+
+Этот раздел послужит вам руководством по настройке IPsec и его использованию в среде FreeBSD и Microsoft(R) Windows(R) 2000/XP, соединяемых безопасным способом. Для настройки IPsec необходимо ознакомиться с процессом сборки ядра (crossref:kernelconfig[kernelconfig, Настройка ядра FreeBSD]).
+
+_IPsec_ это протокол, расположенный поверх слоя Internet Protocol (IP). Он позволяет двум или более хостам связываться защищенным способом (отсюда и название протокола). "Сетевой стек" FreeBSD IPsec основан на реализации http://www.kame.net/[KAME], поддерживающей оба семейства протоколов, IPv4 и IPv6.
+
+[NOTE]
+====
+FreeBSD содержит "аппаратно поддерживаемый" стек IPsec, известный как "Fast IPsec", заимствованный из OpenBSD. Для оптимизации производительности IPsec он задействует криптографическое оборудование (когда оно доступно) через подсистему man:crypto[4]. Это новая подсистема и она не поддерживает всех возможностей, доступных в KAME версии IPsec. Для включения IPsec с аппаратной поддержкой необходимо добавить в файл настройки ядра следующий параметр:
+
+[source,bash]
+....
+options FAST_IPSEC # new IPsec (cannot define w/ IPSEC)
+....
+
+Обратите внимание, что на данный момент невозможно использовать подсистему "Fast IPsec" вместе с KAME реализацией IPsec. Обратитесь к странице справочника man:fast_ipsec[4] за дальнейшей информацией.
+====
+
+[NOTE]
+====
+Для того, чтобы применять к туннелям man:gif[4] межсетевые экраны, вам потребуется включить в ядро опцию `IPSEC_FILTERGIF`:
+
+[source,bash]
+....
+options IPSEC_FILTERGIF #filter ipsec packets from a tunnel
+....
+
+====
+
+IPsec состоит из двух подпротоколов:
+
+* _Encapsulated Security Payload (ESP)_, защищающей данные IP пакета от вмешательства третьей стороны путем шифрования содержимого с помощью симметричных криптографических алгоритмов (таких как Blowfish,3DES).
+* _Authentication Header (AH)_, защищающий заголовок IP пакета от вмешательства третьей стороны и подделки путем вычисления криптографической контрольной суммы и хеширования полей заголовка IP пакета защищенной функцией хеширования. К пакету добавляется дополнительный заголовок с хэшем, позволяющий аутентификацию информации пакета.
+
+ESP и AH могут быть использованы вместе или по отдельности, в зависимости от обстоятельств.
+
+IPsec может быть использован или для непосредственного шифрования трафика между двумя хостами (_транспортный режим_); или для построения "виртуальных туннелей" между двумя подсетями, которые могут быть использованы для защиты соединений между двумя корпоративными сетями (_туннельный режим_). Последний обычно называют _виртуальной частной сетью_ (Virtual Private Network, VPN). За детальной информацией о подсистеме IPsec в FreeBSD обратитесь к странице справочника man:ipsec[4].
+
+Для включения поддержки IPsec в ядре, добавьте следующие параметры к файлу настройки ядра:
+
+[source,bash]
+....
+options IPSEC #IP security
+options IPSEC_ESP #IP security (crypto; define w/ IPSEC)
+....
+
+Если желательна поддержка отладки IPsec, должна быть также добавлена следующая строка:
+
+[source,bash]
+....
+options IPSEC_DEBUG debug for IP security
+....
+
+=== Проблема
+
+Не существует стандарта VPN. Они могут быть реализованы множеством различных технологий, каждая из которых имеет свои сильные и слабые стороны. Этот раздел представляет сценарий и стратегию реализации VPN для этого сценария.
+
+=== Сценарий: Две сети, подключенных к интернет, работающие как одна
+
+Исходные условия таковы:
+
+* Существует как минимум две сети
+* Внутри обеих сетей используется IP
+* Обе сети соединены через интернет через шлюз, работающий на FreeBSD.
+* У шлюза каждой из сетей есть как минимум один публичный IP адрес.
+* Внутренние IP адреса двух сетей могут быть публичными или приватными, не имеет значения. На шлюзе может работать NAT, если это необходимо.
+* Внутренние IP адреса двух сетей _не должны пересекаться_. Хотя вероятно теоретически возможно использование комбинации VPN технологии и NAT для настройки такой конфигурации, эта конфигурация будет кошмарна.
+
+Если две сети, которые вы пытаетесь соединить, используют один и тот же диапазон приватных адресов (например, обе используют `192.168.1.x`), номера в одной из сетей необходимо изменить.
+
+Топология сети может выглядеть примерно так:
+
+image::ipsec-network.png[]
+
+Заметьте, что здесь присутствуют два публичных IP-адреса. В дальнейшем для их обозначения будут использоваться буквы. Если вы увидите эти буквы, замените их на свои публичные IP адреса. Также обратите внимание, что у обеих шлюзов внутренний адрес заканчивается на .1 и диапазоны приватных адресов двух сетей различны (`192.168.1.x` и `192.168.2.x` соответственно). Все компьютеры локальных сетей настроены на использование в качестве шлюза по умолчанию компьютера с адресом, оканчивающимся на `.1`.
+
+С сетевой точки зрения замысел в том, чтобы каждая сеть видела компьютеры из другой сети так, как если бы они были непосредственно подключены к тому же самому маршрутизатору - хотя и немного медленному маршрутизатору, иногда теряющему пакеты.
+
+Это означает, что (например) компьютер `192.168.1.20` может запустить
+
+[.programlisting]
+....
+ping 192.168.2.34
+....
+
+и это будет прозрачно работать. Компьютеры с Windows(R) должны видеть компьютеры в другой сети, просматривать сетевые ресурсы, и так далее, точно так же, как и для компьютеров в локальной сети.
+
+И все это безопасным способом. Это означает, что трафик между сетями зашифрован.
+
+Создание VPN между этими двумя сетями это многошаговый процесс. Этапы создания VPN таковы:
+
+. Создание "виртуального" сетевого подключения между двумя сетями через интернет. Тестирование подключения с помощью таких инструментов как man:ping[8], чтобы убедиться, что оно работает.
+. Применение политики безопасности чтобы убедиться, что трафик между двумя сетями прозрачно шифруется и расшифровывается если необходимо. Тестирование с помощью таких инструментов как man:tcpdump[1], чтобы убедиться, что трафик шифруется.
+. Настройка дополнительных программ на шлюзах FreeBSD, чтобы компьютеры Windows(R) из одной сети видели компьютеры в другой через VPN.
+
+==== Шаг 1: Создание и тестирование "виртуального" сетевого подключения
+
+Предположим, что вы работаете на шлюзе сети #1 (с публичным адресом `A.B.C.D`, приватным адресом `192.168.1.1`) и запускаете `ping 192.168.2.1`, т.е. на приватный адрес машины с IP адресом `W.X.Y.Z`. Что должно произойти, чтобы это сработало?
+
+. Шлюз должен знать, как достичь `192.168.2.1`. Другими словами, у него должен быть маршрут к `192.168.2.1`.
+. Приватные IP адреса, такие как диапазон `192.168.x` не адресуются в интернет. Каждый пакет, отправляемый на `192.168.2.1` должен быть "завернут" в другой пакет. Исходным адресом пакета должен быть `A.B.C.D`, а адресом назначения `W.X.Y.Z`. Этот процесс называется _инкапсуляцией_.
+. Как только этот пакет достигнет `W.X.Y.Z`, необходимо будет "декапсулировать" его и доставить к `192.168.2.1`.
+
+Как вы можете увидеть, это требует "туннеля" между двумя сетями. Два конца "туннеля" это IP адреса `A.B.C.D` и `W.X.Y.Z`. Туннель используется для передачи трафика с приватными IP адресами через интернет.
+
+В FreeBSD этот туннель создается с помощью устройства generic interface, или [.filename]#gif#. Как вы можете догадаться, интерфейс [.filename]#gif# на каждом хосте должен быть настроен с четырьмя IP адресами; два для публичных IP адресов и два для приватных IP адресов.
+
+В ядро обеих компьютеров FreeBSD должна быть встроена поддержка устройства gif. Вы можете сделать это, добавив строку:
+
+[.programlisting]
+....
+device gif
+....
+
+к файлу настройки ядра на обеих компьютерах, с последующей компиляцией, установкой и перезагрузкой.
+
+Настройка туннеля это двухшаговый процесс. Во-первых, необходимо задать сведения о внешнем (или публичном) IP адресе с помощью man:ifconfig[8]. Затем о приватном IP адресе, также с помощью man:ifconfig[8].
+
+На шлюзе сети #1 для настройки туннеля вам потребуется запустить следующие две команды.
+
+[.programlisting]
+....
+ifconfig gif0 A.B.C.D W.X.Y.Z
+ifconfig gif0 inet 192.168.1.1 192.168.2.1 netmask 0xffffffff
+....
+
+На другом шлюзе подобные команды, но с IP адресами в обратном порядке.
+
+[.programlisting]
+....
+ifconfig gif0 W.X.Y.Z A.B.C.D
+ifconfig gif0 inet 192.168.2.1 192.168.1.1 netmask 0xffffffff
+....
+
+Затем вы можете запустить:
+
+[.programlisting]
+....
+ifconfig gif0
+....
+
+для просмотра настройки. Например, на шлюзе сети #1 вы увидите:
+
+[source,bash]
+....
+# ifconfig gif0
+gif0: flags=8011<UP,POINTTOPOINT,MULTICAST> mtu 1280
+inet 192.168.1.1 --> 192.168.2.1 netmask 0xffffffff
+physical address inet A.B.C.D --> W.X.Y.Z
+....
+
+Как вы можете видеть, был создан туннель между физическими адресами `A.B.C.D` и `W.X.Y.Z`, для туннелирования разрешен трафик между `192.168.1.1` и `192.168.2.1`.
+
+Это также добавляет запись к таблице маршрутизации на обеих машинах, вы можете проверить запись командой `netstat -rn`. Вот вывод этой команды на шлюзе сети #1.
+
+[source,bash]
+....
+# netstat -rn
+Routing tables
+
+Internet:
+Destination Gateway Flags Refs Use Netif Expire
+...
+192.168.2.1 192.168.1.1 UH 0 0 gif0
+...
+....
+
+Как показывает значение поля "Flags", это маршрут к хосту, что означает, что каждый шлюз знает, как достичь другого шлюза, но не знает как достичь остальной части соответствующей сети. Эта проблема будет быстро решена.
+
+Вероятно, на обеих машинах запущен брандмауэр. VPN должен обходить его. Вы можете разрешить весь трафик между двумя сетями, или включить правила, защищающие каждый конец соединения от другого.
+
+Это сильно упрощает тестирование настройки брандмауэра, если вы разрешаете весь трафик через VPN. Вы всегда можете усилить защиту позже. Если вы используете на шлюзах man:ipfw[8], команда вроде этой
+
+[.programlisting]
+....
+ipfw add 1 allow ip from any to any via gif0
+....
+
+разрешит весь трафик между двумя концами VPN без влияния на другие правила брандмауэра. Очевидно, вам потребуется запустить эту команду на обеих шлюзах.
+
+Этого достаточно для включения ping с одного шлюза на другой. На `192.168.1.1`, вы сможете запустить
+
+[.programlisting]
+....
+ping 192.168.2.1
+....
+
+и получить ответ, и аналогично на другом шлюзе.
+
+Однако, машины в другой сети пока недоступны. Это из-за маршрутизации - хотя шлюзы знают, как связаться друг с другом, они не знают, как связаться с сетью за другим шлюзом.
+
+Для решения этой проблемы вы должны добавить статический маршрут на каждом шлюзе. Команда на первом шлюзе будет выглядеть так:
+
+[.programlisting]
+....
+route add 192.168.2.0 192.168.2.1 netmask 0xffffff00
+....
+
+Она говорит "Для достижения хостов в сети `192.168.2.0`, отправляйте пакеты хосту `192.168.2.1`". Вам потребуется запустить похожую команду на другом шлюзе, но с адресами `192.168.1.x`.
+
+IP трафик с хостов в одной сети теперь может достичь хосты в другой сети.
+
+Теперь создано две трети VPN между двумя сетями, поскольку это "виртуальная (virtual)""сеть (network)". Она еще не приватная (private). Вы можете протестировать ее с помощью man:ping[8] и man:tcpdump[1]. Войдите на шлюз и запустите
+
+[.programlisting]
+....
+tcpdump dst host 192.168.2.1
+....
+
+В другой сессии на этом же хосте запустите
+
+[.programlisting]
+....
+ping 192.168.2.1
+....
+
+Вы увидите примерно такие строки:
+
+[.programlisting]
+....
+
+16:10:24.018080 192.168.1.1 > 192.168.2.1: icmp: echo request
+16:10:24.018109 192.168.1.1 > 192.168.2.1: icmp: echo reply
+16:10:25.018814 192.168.1.1 > 192.168.2.1: icmp: echo request
+16:10:25.018847 192.168.1.1 > 192.168.2.1: icmp: echo reply
+16:10:26.028896 192.168.1.1 > 192.168.2.1: icmp: echo request
+16:10:26.029112 192.168.1.1 > 192.168.2.1: icmp: echo reply
+....
+
+Как вы видите, ICMP сообщения пересылаются вперед и назад незашифрованными. Если вы использовали с man:tcpdump[1] параметр `-s` для получения большего объема данных пакета, то увидите больше информации.
+
+Конечно же это неприемлемо. В следующем разделе мы обсудим защиту соединения между двумя сетями, так что весь трафик будет автоматически шифроваться.
+
+.Резюме:
+* Настройте оба ядра с "device gif".
+* Отредактируйте [.filename]#/etc/rc.conf# на шлюзе #1 и добавьте следующие строки (подставляя IP адреса где необходимо).
++
+[.programlisting]
+....
+gifconfig_gif0="A.B.C.D W.X.Y.Z"
+ifconfig_gif0="inet 192.168.1.1 192.168.2.1 netmask 0xffffffff"
+static_routes="vpn"
+route_vpn="192.168.2.0 192.168.2.1 netmask 0xffffff00"
+....
+
+* Отредактируйте скрипт брандмауэра ([.filename]#/etc/rc.firewall#, или подобный) на обеих хостах и добавьте
++
+[.programlisting]
+....
+ipfw add 1 allow ip from any to any via gif0
+....
+
+* Выполните соответствующие изменения в [.filename]#/etc/rc.conf# на шлюзе #2, меняя порядок IP адресов.
+
+==== Шаг 2: Защита соединения
+
+Для защиты соединения мы будем использовать IPsec. IPsec предоставляет хостам механизм определения ключа для шифрования и для последующего использования этого ключа для шифрования данных между двумя хостами.
+
+Здесь будут рассмотрены два аспекта настройки.
+
+. У хостов должен быть способ согласования используемого алгоритма шифрования. Как только хосты договорятся об этом, можно говорить об установленном между ними "безопасном соединении".
+. Должен быть механизм определения, какой трафик необходимо шифровать. Конечно, вам не требуется шифровать весь исходящий трафик - достаточно шифровать только трафик, идущий через VPN. Правила, определяющие то, какой трафик необходимо шифровать, называются "политикой безопасности".
+
+Безопасное соединение и политика безопасности поддерживаются ядром, и могут быть изменены программами пользователя. Однако перед тем, как вы сможете сделать это, необходимо настроить поддержку протоколов IPsec и Encapsulated Security Payload (ESP) в ядре. Это делается добавлением в настройку ядра параметров:
+
+[.programlisting]
+....
+options IPSEC
+options IPSEC_ESP
+....
+
+с последующим перекомпилированием, переустановкой и перезагрузкой. Как и прежде вам потребуется сделать это с ядрами на обеих шлюзах.
+
+При настройке параметров безопасности (security associations) у вас есть два варианта. Вы можете настроить их вручную для обеих хостов, задав алгоритм шифрования, ключи для шифрования и так далее, или использовать даемоны, реализующие Internet Key Exchange protocol (IKE), который сделает это за вас.
+
+Рекомендуется последнее. Помимо прочего, этот способ более прост.
+
+Редактирование и отображение политики безопасности выполняется с помощью man:setkey[8]. По аналогии, `setkey` используется для настройки таблиц политики безопасности ядра так же, как man:route[8] используется для настройки таблиц маршрутизации ядра. `setkey` также может отображать текущие параметры безопасности, и продолжая аналогию дальше, это соответствует `netstat -r`.
+
+Существует множество даемонов для управления параметрами безопасности в FreeBSD. Здесь будет описано использование одного из них, racoon - он доступен в составе порта package:security/ipsec-tools[] в Коллекции Портов FreeBSD.
+
+Даемон racoon должен работать на обеих шлюзах. На каждом из хостов он настраивается с IP адресом другого конца VPN, и секретным ключом (по вашему выбору, должен быть одним и тем же на обеих шлюзах).
+
+Эти два даемона подключаются друг к другу, подтверждают, что они именно те, за кого себя выдают (используя секретный ключ, заданный вами). Затем даемоны генерируют новый секретный ключ и используют его для шифрования трафика через VPN. Они периодически изменяют этот ключ, так что даже если атакующий сломает один из ключей (что теоретически почти невозможно) это не даст ему слишком много - он сломал ключ, который два даемона уже сменили на другой.
+
+Настройки racoon сохраняются в файле [.filename]#${PREFIX}/etc/racoon#. Этот файл не требует слишком больших изменений. Другим компонентом настройки racoon, который потребуется изменить, является "предварительный ключ".
+
+В настройке по умолчанию racoon ищет его в файле [.filename]#${PREFIX}/etc/racoon/psk.txt#. Необходимо отметить, что предварительный ключ _не_ используется для шифрования трафика через VPN соединение это просто маркер, позволяющий управляющим ключами даемонам доверять друг другу.
+
+[.filename]#psk.txt# содержит строку для каждого удаленного сервера, с которым происходит соединение. В этом примере два сервера, каждый файл [.filename]#psk.txt# будет содержать одну строку (каждый конец VPN общается только с другим концом.
+
+На шлюзе #1 эта строка будет выглядеть примерно так:
+
+[.programlisting]
+....
+W.X.Y.Z secret
+....
+
+То есть _публичный_ IP-адрес противоположной стороны, пробел и текстовая строка c секретной фразой. Конечно, вам не стоит использовать в качестве ключевой фразы слово "secret" -- здесь применяются обычные правила выбора паролей.
+
+На шлюзе #2 строка будет выглядеть примерно так:
+
+[.programlisting]
+....
+A.B.C.D secret
+....
+
+То есть публичный IP адрес удаленной стороны и та же секретная фраза. Перед запуском racoon режим доступа к файлу [.filename]#psk.txt# должен быть установлен в `0600` (т.е. запись и чтение только для `root`).
+
+Вы должны запустить racoon на обоих шлюзах. Вам также потребуется добавить правила для включения IKE трафика, передающегося по UDP через порт ISAKMP (Internet Security Association Key Management Protocol). Опять же, они должны быть расположены насколько возможно ближе к началу набора правил.
+
+[.programlisting]
+....
+ipfw add 1 allow udp from A.B.C.D to W.X.Y.Z isakmp
+ipfw add 1 allow udp from W.X.Y.Z to A.B.C.D isakmp
+....
+
+Как только racoon будет запущен, вы можете попробовать выполнить ping с одного шлюза на другой. Соединение все еще не зашифровано, но racoon установит параметры безопасности между двумя хостами - это может занять время и вы можете заметить небольшую задержку перед началом ответа команды ping.
+
+Как только параметры безопасности установлены, вы можете просмотреть их используя man:setkey[8]. Запустите
+
+[.programlisting]
+....
+setkey -D
+....
+
+на любом из хостов для просмотра информации о параметрах безопасности.
+
+Это одна сторона проблемы. Другая сторона это настройка политики безопасности.
+
+Для создания разумной политики безопасности давайте вспомним, что уже было настроено. Это рассмотрение относится к обеим концам соединения.
+
+Каждый отправляемый IP пакет имеет заголовок, содержащий информацию о пакете. Заголовок включает IP адреса источника и назначения. Как мы уже знаем, приватные IP адреса, такие как `192.168.x.y`, не могут появиться в интернет. Они должны быть сначала включены внутрь другого пакета. В этом пакете приватные IP адреса источника и назначения заменяются публичными IP адресами.
+
+То есть исходящий пакет, который выглядит примерно так:
+
+image::security/ipsec-out-pkt.png[]
+
+будет инкапсулирован в другой пакет, выглядящий примерно так:
+
+image::security/ipsec-encap-pkt.png[]
+
+Этой инкапсуляцией занимается устройство [.filename]#gif#. Как вы можете видеть, теперь у пакета есть реальный IP адрес, исходный пакет был включен в этот пакет в виде данных, которые передаются через интернет.
+
+Конечно, мы хотим зашифровать весь трафик между VPN. Вы можете сформулировать это на словах так:
+
+"Если пакет отправляется с `A.B.C.D`, и предназначен для `W.X.Y.Z`, расшифровать его, используя необходимые параметры безопасности."
+
+"Если пакет отправляется с `W.X.Y.Z`, и предназначен для `A.B.C.D`, расшифровать его, используя необходимые параметры безопасности."
+
+Это похоже на желаемое, но не совсем то. Если вы сделаете это, весь трафик от и к `W.X.Y.Z`, даже если он не является частью VPN, будет зашифрован. Правильная политика такова:
+
+"Если пакет отправляется с `A.B.C.D`, в нем инкапсулирован другой пакет и адрес назначения `W.X.Y.Z`, зашифровать его, используя необходимые параметры безопасности."
+
+"Если пакет отправляется с `W.X.Y.Z`, в нем инкапсулирован другой пакет и адрес назначения `A.B.C.D`, зашифровать его, используя необходимые параметры безопасности."
+
+Тонкое, но необходимое различие.
+
+Политика безопасности также устанавливается с использованием man:setkey[8]. В man:setkey[8] предусмотрен язык определения политики man:setkey[8]. Вы можете или ввести инструкции по настройке со стандартного ввода, или использовать параметр `-f` для задания файла, содержащего эти инструкции.
+
+Настройка на шлюзе #1 (где есть публичный IP адрес `A.B.C.D`) для включения шифрования всего предназначенного `W.X.Y.Z` трафика:
+
+[.programlisting]
+....
+
+spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P out ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require;
+....
+
+Поместите эти команды в файл (например, [.filename]#/etc/ipsec.conf#) и запустите
+
+[source,bash]
+....
+# setkey -f /etc/ipsec.conf
+....
+
+`spdadd` указывает man:setkey[8] добавить правило к базе данных политики безопасности. Остальная часть строки указывает какие пакеты будут соответствовать политике. `A.B.C.D/32` и `W.X.Y.Z/32` это IP адреса и сетевые маски, определяющие сети или хосты, к которым будет применяться данная политика. В данном случае мы хотим применить их к трафику между этими двумя хостами. Параметр `ipencap` сообщает ядру, что эта политика должна применяться только к пакетам, инкапсулирующим другие пакеты. Параметр `-P out` сообщает, что эта политика применяется к исходящим пакетам, и `ipsec` - то, что пакеты будут зашифрованы.
+
+Оставшаяся часть строки определяет, как эти пакеты будут зашифрованы. Будет использоваться протокол `esp`, а параметр `tunnel` показывает, что пакет в дальнейшем будет инкапсулирован в IPsec пакет. Повторное использование `A.B.C.D` и `W.X.Y.Z` предназначено для выбора используемых параметров безопасности, и наконец параметр `require` разрешает шифрование пакетов, попадающих под это правило.
+
+Это правило соответствует только исходящим пакетам. Вам потребуется похожее правило, соответствующее входящим пакетам.
+
+[.programlisting]
+....
+spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P in ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require;
+....
+
+Обратите внимание, что вместо `in` используется `out` и IP адреса переставлены.
+
+Другому шлюзу (с публичным IP адресом `W.X.Y.Z`) потребуются похожие правила.
+
+[.programlisting]
+....
+spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P out ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require;
+spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P in ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require;
+....
+
+Наконец, вам потребуется добавить правила к брандмауэру для включения прохождения пакетов ESP и IPENCAP в обе стороны. На обеих хостах потребуется добавить следующие правила:
+
+[.programlisting]
+....
+ipfw add 1 allow esp from A.B.C.D to W.X.Y.Z
+ipfw add 1 allow esp from W.X.Y.Z to A.B.C.D
+ipfw add 1 allow ipencap from A.B.C.D to W.X.Y.Z
+ipfw add 1 allow ipencap from W.X.Y.Z to A.B.C.D
+....
+
+Поскольку правила симметричны, можно использовать их без изменения на обеих хостах
+
+Исходящие пакеты теперь будут выглядеть примерно так:
+
+image::security/ipsec-crypt-pkt.png[]
+
+Когда эти пакеты будут получены на удаленном конце VPN соединения, они будут расшифрованы (используя параметры безопасности, о которых договорился racoon). Затем они будут переданы интерфейсу [.filename]#gif#, который "развернет" второй слой, оставив пакет с внутренними адресами, который сможет попасть во внутреннюю сеть.
+
+Вы можете проверить безопасность тем же man:ping[8], который использовался ранее. Сначала войдите на шлюз `A.B.C.D` и запустите:
+
+[.programlisting]
+....
+tcpdump dst host 192.168.2.1
+....
+
+В другой сессии на том же хосте запустите
+
+[.programlisting]
+....
+ping 192.168.2.1
+....
+
+В этот момент вы должны увидеть примерно это:
+
+[.programlisting]
+....
+XXX tcpdump output
+....
+
+Теперь, как видите, man:tcpdump[1] показывает ESP пакеты. Если вы попытаетесь просмотреть их с параметром `-s`, то вероятно увидите нечто непонятное, поскольку применяется шифрование.
+
+Поздравляем. Вы только что настроили VPN между двумя удаленными сетями.
+
+.Резюме
+* Настройте оба ядра с:
++
+[.programlisting]
+....
+options IPSEC
+options IPSEC_ESP
+....
+
+* Установите package:security/ipsec-tools[]. Отредактируйте [.filename]#${PREFIX}/etc/racoon/psk.txt# на обеих шлюзах, добавив запись для каждого IP адреса удаленного хоста и секретный ключ, который будет известен им обеим. Убедитесь, что режим доступа к файлу 0600.
+* Добавьте к [.filename]#/etc/rc.conf# на каждом хосте следующие строки:
++
+[.programlisting]
+....
+ipsec_enable="YES"
+ipsec_file="/etc/ipsec.conf"
+....
+
+* Создайте [.filename]#/etc/ipsec.conf# на каждом хосте с необходимыми строками spdadd. На шлюзе #1 он будет таким:
++
+[.programlisting]
+....
+
+spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P out ipsec
+ esp/tunnel/A.B.C.D-W.X.Y.Z/require;
+spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P in ipsec
+ esp/tunnel/W.X.Y.Z-A.B.C.D/require;
+....
+
++
+А на шлюзе #2 таким:
++
+[.programlisting]
+....
+
+spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P out ipsec
+ esp/tunnel/W.X.Y.Z-A.B.C.D/require;
+spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P in ipsec
+ esp/tunnel/A.B.C.D-W.X.Y.Z/require;
+....
+
+* Добавьте правила к брандмауэрам обеих хостов для включения IKE, ESP и IPENCAP трафика:
++
+[.programlisting]
+....
+
+ipfw add 1 allow udp from A.B.C.D to W.X.Y.Z isakmp
+ipfw add 1 allow udp from W.X.Y.Z to A.B.C.D isakmp
+ipfw add 1 allow esp from A.B.C.D to W.X.Y.Z
+ipfw add 1 allow esp from W.X.Y.Z to A.B.C.D
+ipfw add 1 allow ipencap from A.B.C.D to W.X.Y.Z
+ipfw add 1 allow ipencap from W.X.Y.Z to A.B.C.D
+....
+
+Двух приведенных шагов должно быть достаточно для настройки и включения VPN. Машины в каждой сети смогут обращаться друг к другу по IP адресам, и весь трафик через соединение будет автоматически надежно зашифрован.
+
+[[openssh]]
+== OpenSSH
+
+OpenSSH это набор сетевых инструментов, используемых для защищенного доступа к удаленным компьютерам. Он может быть использован в качестве непосредственной замены `rlogin`, `rsh`, `rcp` и `telnet`. Кроме того, через SSH могут быть безопасно туннелированы и/или перенаправлены произвольные TCP/IP соединения. OpenSSH шифрует весь трафик, эффективно предотвращая кражу данных, перехват соединения и другие сетевые атаки.
+
+OpenSSH поддерживается проектом OpenBSD, он основан на SSH v1.2.12 со всеми последними исправлениями и обновлениями, совместим с протоколами SSH версий 1 и 2.
+
+=== Преимущества использования OpenSSH
+
+Обычно при использовании man:telnet[1] или man:rlogin[1] данные пересылаются по сети в незашифрованной форме. Перехватчик пакетов в любой точке сети между клиентом и сервером может похитить информацию о пользователе/пароле или данные, передаваемые через соединение. Для предотвращения этого OpenSSH предлагает различные методы шифрования.
+
+=== Включение sshd
+
+В FreeBSD даемон sshd должен быть разрешен в процессе инсталляции. За запуск ответственна следующая строка в файле [.filename]#rc.conf#:
+
+[source,bash]
+....
+sshd_enable="YES"
+....
+
+При следующей загрузке системы будет запущен man:sshd[8], даемон для OpenSSH. Вы можете также воспользоваться скриптом [.filename]#/etc/rc.d/sshd# системы man:rc[8] для запуска OpenSSH:
+
+[.programlisting]
+....
+/etc/rc.d/sshd start
+....
+
+=== SSH клиент
+
+Утилита man:ssh[1] работает подобно man:rlogin[1].
+
+[source,bash]
+....
+# ssh user@example.com
+Host key not found from the list of known hosts.
+Are you sure you want to continue connecting (yes/no)? yes
+Host 'example.com' added to the list of known hosts.
+user@example.com's password: *******
+....
+
+Вход продолжится так же, как если бы сессия была инициирована с использованием `rlogin` или `telnet`. SSH использует систему опознавательных ключей для проверки подлинности сервера при подключении клиента. Пользователю предлагается `yes` только при первом подключении. Дальнейшие попытки входа предваряются проверкой сохраненного ключа сервера. SSH клиент сообщит вам, если сохраненный ключ будет отличаться от только что полученного. Ключи серверов сохраняются в [.filename]#~/.ssh/known_hosts#, или в [.filename]#~/.ssh/known_hosts2# для SSH v2.
+
+По умолчанию современные серверы OpenSSH настроены на приём только соединений SSH v2. Клиент будет использовать версию 2 там, где это возможно, а затем версию 1. Также, клиент можно заставить использовать конкретную версию при помощи опций `-1` и `-2` для указания соответствующей версии протокола. Версия 1 поддерживается ради совместимости со старыми серверами.
+
+=== Безопасное копирование
+
+Команда man:scp[1] работает подобно man:rcp[1]; она копирует файл с удаленного компьютера, но делает это безопасным способом.
+
+[source,bash]
+....
+# scp user@example.com:/COPYRIGHT COPYRIGHT
+user@example.com's password: *******
+COPYRIGHT 100% |*****************************| 4735 00:00
+#
+....
+
+Поскольку в предыдущем примере ключ сервера уже был сохранен, в этом примере он проверяется при использовании man:scp[1].
+
+Параметры, передаваемые man:scp[1], похожи на параметры man:cp[1], с файлом или файлами в качестве первого аргумента и приемником копирования во втором. Поскольку файлы передаются по сети через SSH, один или более аргументов принимают форму `user@host:<path_to_remote_file>`.
+
+=== Настройка
+
+Системные файлы настройки для даемона и клиента OpenSSH расположены в каталоге [.filename]#/etc/ssh#.
+
+Файл [.filename]#ssh_config# используется для настройки клиента, а [.filename]#sshd_config# для даемона.
+
+Кроме того, параметры `sshd_program` (по умолчанию [.filename]#/usr/sbin/sshd#), и `sshd_flags`[.filename]#rc.conf# дают дополнительные возможности настройки.
+
+[[ssh-keygen]]
+=== ssh-keygen
+
+Вместо использования паролей, с помощью man:ssh-keygen[1] можно создать ключи DSA или RSA, которыми пользователи могут аутентифицироваться:
+
+[source,bash]
+....
+% ssh-keygen -t dsa
+Generating public/private dsa key pair.
+Enter file in which to save the key (/home/user/.ssh/id_dsa):
+Created directory '/home/user/.ssh'.
+Enter passphrase (empty for no passphrase):
+Enter same passphrase again:
+Your identification has been saved in /home/user/.ssh/id_dsa.
+Your public key has been saved in /home/user/.ssh/id_dsa.pub.
+The key fingerprint is:
+bb:48:db:f2:93:57:80:b6:aa:bc:f5:d5:ba:8f:79:17 user@host.example.com
+....
+
+man:ssh-keygen[1] создаст пару публичного и приватного ключей, используемых для аутентификации. Приватный ключ сохраняется в [.filename]#~/.ssh/id_dsa# или [.filename]#~/.ssh/id_rsa#, а публичный в [.filename]#~/.ssh/id_dsa.pub# или [.filename]#~/.ssh/id_rsa.pub# (для ключей DSA и RSA соответственно). Для включения аутентификации по ключам публичный ключ должен быть помещен в файл [.filename]#~/.ssh/authorized_keys# на удаленном компьютере.
+
+Это позволяет соединяться с удаленным компьютером с помощью SSH-ключей вместо паролей.
+
+Если при генерации ключей был использован пароль, каждый раз при использовании приватного ключа он будет запрашиваться у пользователя. Для того, чтобы избежать непрерывного набора кодовой фразы, можно использовать утилиту man:ssh-agent[1], как описано в разделе <<security-ssh-agent>> ниже.
+
+[WARNING]
+====
+
+Параметры и имена файлов могут различаться для разных версий OpenSSH, установленных в системе, для решения проблем обратитесь к странице справочника man:ssh-keygen[1].
+====
+
+[[security-ssh-agent]]
+=== Утилиты ssh-agent и ssh-add
+
+Утилиты man:ssh-agent[1] и man:ssh-add[1] позволяют сохранять ключи SSH в памяти, чтобы не набирать кодовые фразы при каждом использовании ключа.
+
+Утилита man:ssh-agent[1] обеспечивает процесс аутентификации загруженными в нее секретными ключами; для этого утилита man:ssh-agent[1] должна запустить внешний процесс. В самом простом случае это может быть шелл-процесс; в чуть более продвинутом - оконный менеджер.
+
+Для использования man:ssh-agent[1] совместно с шеллом, man:ssh-agent[1] должен быть запущен с именем этого шелла в качестве аргумента. После этого в его память при помощи утилиты man:ssh-add[1] могут быть добавлены необходимые ключи; при этом будут запрошены соответствующие кодовые фразы. Добавленные ключи могут затем использоваться для man:ssh[1] на машины, на которых установлены соответствующие публичные ключи:
+
+[source,bash]
+....
+% ssh-agent csh
+% ssh-add
+Enter passphrase for /home/user/.ssh/id_dsa:
+Identity added: /home/user/.ssh/id_dsa (/home/user/.ssh/id_dsa)
+%
+....
+
+Для того чтобы использовать man:ssh-agent[1] в X11, вызов man:ssh-agent[1]должен быть помещен в файл [.filename]#~/.xinitrc#. Это обеспечит поддержкой man:ssh-agent[1] все программы, запущенные в X11. Файл [.filename]#~/.xinitrc# может выглядеть, например, так:
+
+[.programlisting]
+....
+exec ssh-agent startxfce4
+....
+
+При этом будет запущен man:ssh-agent[1], который, в свою очередь, вызовет запуск XFCE, при каждом старте X11. После запуска X11, выполните команду man:ssh-add[1] для добавления ваших SSH-ключей.
+
+[[security-ssh-tunneling]]
+=== Туннелирование SSH
+
+OpenSSH поддерживает возможность создания туннеля для пропуска соединения по другому протоколу через защищенную сессию.
+
+Следующая команда указывает man:ssh[1] создать туннель для telnet:
+
+[source,bash]
+....
+% ssh -2 -N -f -L 5023:localhost:23 user@foo.example.com
+%
+....
+
+Команда `ssh` используется со следующими параметрами:
+
+`-2`::
+Указывает `ssh` использовать версию 2 протокола (не используйте этот параметр, если работаете со старыми SSH серверами).
+
+`-N`::
+Означает использование в не-командном режиме, только для туннелирования. Если этот параметр опущен, `ssh` запустит обычную сессию.
+
+`-f`::
+Указывает `ssh` запускаться в фоновом режиме.
+
+`-L`::
+Означает локальный туннель в стиле _localport:remotehost:remoteport_.
+
+`user@foo.example.com`::
+Удаленный сервер SSH.
+
+Туннель SSH создается путем создания прослушивающего сокета на определенном порту `localhost`. Затем все принятые на локальном хосту/порту соединения переправляются через SSH на определенный удаленный хост и порт.
+
+В этом примере, порт _5023_ на `localhost` перенаправляется на порт _23_ на `localhost` удаленного компьютера. Поскольку _23_ это порт telnet, будет создано защищенное соединение telnet через туннель SSH.
+
+Этот метод можно использовать для любого числа небезопасных протоколов, таких как SMTP, POP3, FTP, и так далее.
+
+.Использование SSH для создания защищенного туннеля на SMTP
+[example]
+====
+
+[source,bash]
+....
+% ssh -2 -N -f -L 5025:localhost:25 user@mailserver.example.com
+user@mailserver.example.com's password: *****
+% telnet localhost 5025
+Trying 127.0.0.1...
+Connected to localhost.
+Escape character is '^]'.
+220 mailserver.example.com ESMTP
+....
+Этот метод можно использовать вместе с man:ssh-keygen[1] и дополнительными пользовательскими учётными записями для создания более удобного автоматического SSH туннелирования. Ключи могут быть использованы вместо паролей, и туннели могут запускаться от отдельных пользователей.
+====
+
+==== Практические примеры SSH туннелирования
+
+===== Защищенный доступ к серверу POP3
+
+На работе находится SSH сервер, принимающий соединения снаружи. В этой же офисной сети находится почтовый сервер, поддерживающий протокол POP3. Сеть или сетевое соединение между вашим домом и офисом могут быть или не быть полностью доверяемыми. По этой причине вам потребуется проверять почту через защищенное соединение. Решение состоит в создании SSH соединения к офисному серверу SSH и туннелирование через него к почтовому серверу.
+
+[source,bash]
+....
+% ssh -2 -N -f -L 2110:mail.example.com:110 user@ssh-server.example.com
+user@ssh-server.example.com's password: ******
+....
+
+Когда туннель включен и работает, вы можете настроить почтовый клиент для отправки запросов POP3 на `localhost`, порт 2110. Соединение будет безопасно переправлено через туннель на `mail.example.com`.
+
+===== Прохождение через Драконовский Брандмауэр
+
+Некоторые сетевые администраторы устанавливают на брандмауэрах драконовские правила, фильтруя не только входящие соединения, но и исходящие. Вам может быть разрешен доступ к удаленным компьютерам только по портам 22 и 80, для SSH и просмотра сайтов.
+
+Вам может потребоваться доступ к другому (возможно, не относящемуся к работе) сервису, такому как Ogg Vorbis для прослушивания музыки. Если этот сервер Ogg Vorbis выдает поток не с портов 22 или 80, вы не сможете получить к нему доступ.
+
+Решение состоит в создании SSH соединения с компьютером вне брандмауэра и использование его для туннелирования сервера Ogg Vorbis.
+
+[source,bash]
+....
+% ssh -2 -N -f -L 8888:music.example.com:8000 user@unfirewalled-system.example.org
+user@unfirewalled-system.example.org's password: *******
+....
+
+Клиентскую программу теперь можно настроить на `localhost` порт 8888, который будет перенаправлен на `music.example.com` порт 8000, успешно обойдя брандмауэр.
+
+=== Параметр ограничения пользователей `AllowUsers`
+
+Зачастую хорошие результаты даёт ограничение того, какие именно пользователи и откуда могут регистрироваться в системе. Задание параметра `AllowUsers` является хорошим способом добиться этого. К примеру, для разрешения регистрации только пользователю `root` с машины `192.168.1.32`, в файле [.filename]#/etc/ssh/sshd_config# нужно указать нечто вроде следующего:
+
+[.programlisting]
+....
+AllowUsers root@192.168.1.32
+....
+
+Для разрешения регистрации пользователя `admin` из любой точки, просто укажите имя пользователя:
+
+[.programlisting]
+....
+AllowUsers admin
+....
+
+Несколько пользователей должны перечислять в одной строке, как здесь:
+
+[.programlisting]
+....
+AllowUsers root@192.168.1.32 admin
+....
+
+[NOTE]
+====
+Важно, чтобы бы перечислили всех пользователей, которые должны регистрироваться на этой машине; в противном случае они будут заблокированы.
+====
+
+После внесения изменений в [.filename]#/etc/ssh/sshd_config# вы должны указать man:sshd[8] на повторную загрузку конфигурационных файлов, выполнив следующую команду:
+
+[source,bash]
+....
+# /etc/rc.d/sshd reload
+....
+
+=== Дополнительная литература
+
+http://www.openssh.com/[OpenSSH]
+
+man:ssh[1] man:scp[1] man:ssh-keygen[1] man:ssh-agent[1] man:ssh-add[1] man:ssh_config[5]
+
+man:sshd[8] man:sftp-server[8] man:sshd_config[5]
+
+[[fs-acl]]
+== Списки контроля доступа файловой системы (ACL)
+
+В дополнение к другим расширениям файловой системы, таким как снимки (snapshots), FreeBSD 5.0 и более поздние версии системы предлагают защиту с помощью списков контроля доступа файловой системы (File System Access Control Lists, ACLs).
+
+Списки контроля доступа расширяют стандартную модель прав UNIX(R) высоко совместимым (POSIX(R).1e) способом. Эта возможность позволяет администратору получить преимущество от использования более интеллектуальной модели безопасности.
+
+Для включения поддержки ACL в файловой системе UFS, следующая строка:
+
+[.programlisting]
+....
+options UFS_ACL
+....
+
+должна быть добавлена в файл настройки ядра. Если параметр не добавлен, при попытке монтирования систем, поддерживающих ACL, появится предупреждающее сообщение. Этот параметр включен в ядро [.filename]#GENERIC#. ACL основывается на дополнительных атрибутах, встроенных в файловую систему. Дополнительные атрибуты поддерживаются по умолчанию следующим поколением файловых систем UNIX(R), UFS2.
+
+[NOTE]
+====
+Для включения дополнительных атрибутов в UFS1 требуется больше усилий по сравнению с UFS2. Производительность дополнительных атрибутов в UFS2 также существенно выше. По этим причинам для работы с списками контроля доступа предпочтительно использование UFS2
+====
+
+ACL включаются во время монтирования флагом `acls`, который добавляется к [.filename]#/etc/fstab#. Этот флаг также можно сделать постоянным с помощью man:tunefs[8], изменив флаг ACL в заголовке файловой системы. Вообще говоря, использование флага в суперблоке предпочтительно по нескольким причинам:
+
+* Постоянный ACL флаг не может быть изменен путем перемонтирования системы (man:mount[8] `-u`), а только через man:umount[8] и man:mount[8]. Это означает, что ACL нельзя включить на корневой файловой системе после загрузки. Это также означает, что вы не можете изменить флаг на используемой файловой системе.
+* Установка флага в суперблоке приводит к постоянному монтированию файловой системы с включенным ACL, даже если нет записи в [.filename]#fstab# или при смене порядка устройств. Это предотвращает случайное монтирование файловой системы без ACL, которое может повлечь за собой проблемы с безопасностью.
+
+[NOTE]
+====
+Мы можем изменить поведение ACL для включения флага без полного перемонтирования, но считаем, что желательно исключить случайное монтирование без ACL, поскольку вы можете попасть в неприятную ситуацию, если включите ACL, затем выключите их, затем опять включите без сброса расширенных атрибутов. Обычно, как только вы включили ACL в файловой системе, они не должны быть выключены, поскольку получающаяся защита файлов может быть не совместима с той, что применяется пользователями системы, и повторное включение ACL может подключить предыдущие списки контроля доступа к файлам, права на которые изменены, что приведет к непредсказуемому поведению.
+====
+
+Файловые системы с включенными ACLs показывают знак `+` при просмотре прав на файлы. Например:
+
+[.programlisting]
+....
+drwx------ 2 robert robert 512 Dec 27 11:54 private
+drwxrwx---+ 2 robert robert 512 Dec 23 10:57 directory1
+drwxrwx---+ 2 robert robert 512 Dec 22 10:20 directory2
+drwxrwx---+ 2 robert robert 512 Dec 27 11:57 directory3
+drwxr-xr-x 2 robert robert 512 Nov 10 11:54 public_html
+....
+
+Здесь мы видим, что каталоги [.filename]#directory1#, [.filename]#directory2#, и [.filename]#directory3# используют преимущества ACL. Каталог [.filename]#public_html# их не использует.
+
+=== Использование ACL
+
+ACL файловой системы можно просмотреть с помощью утилиты man:getfacl[1]. Например, для просмотра настроек ACL файла [.filename]#test#, может использоваться команда:
+
+[source,bash]
+....
+% getfacl test
+ #file:test
+ #owner:1001
+ #group:1001
+ user::rw-
+ group::r--
+ other::r--
+....
+
+Для изменения ACL этого файла, вызовите утилиту man:setfacl[1]. Выполните:
+
+[source,bash]
+....
+% setfacl -k test
+....
+
+Параметр `-k` удалит все установленные на данный момент ACL из файла или файловой системы. Более предпочтительный метод это использование параметра `-b`, который оставит необходимые для работы ACL поля.
+
+[source,bash]
+....
+% setfacl -m u:trhodes:rwx,group:web:r--,o::--- test
+....
+
+В вышеприведенной команде параметр `-m` использован для изменения записей ACL по умолчанию. Поскольку предустановленных записей не было (они были удалены предыдущей командой), эта команда восстановит параметры по умолчанию и задаст приведенные параметры. Имейте ввиду, при добавлении пользователя или группы, которых нет в системе, на [.filename]#stdout# будет выведена ошибка `Invalid argument`.
+
+[[security-portaudit]]
+== Мониторинг вопросов безопасности в ПО сторонних разработчиков
+
+В последние годы в области информационной безопасности произошло много улучшений, касающихся выработки оценки уязвимости. Угроза проникновения в систему увеличивается вместе с установкой и настройкой утилит сторонних разработчиков, какой бы современной операционной системы это ни касалось.
+
+Оценка уязвимости является ключевым фактором обеспечения защиты, и хотя для базового комплекта FreeBSD выпускаются бюллетени безопасности, но делать это для каждой сторонней утилиты выше возможностей участников Проекта FreeBSD. Существует способ смягчения уязвимостей программного обеспечения сторонних разработчиков и предупреждения администраторов об известных проблемах с безопасностью. Во FreeBSD существует утилита под названием Portaudit, которая служит исключительно этой цели.
+
+Порт package:security/portaudit[] обращается к базе данных, обновляемой и поддерживаемой Группой информационной безопасности FreeBSD и разработчиками портов, для получения информации об известных проблемах с защитой.
+
+Для того, чтобы приступить к использованию Portaudit, необходимо установить его из Коллекции Портов:
+
+[source,bash]
+....
+# cd /usr/ports/security/portaudit && make install clean
+....
+
+В процессе установки будут обновлены конфигурационные файлы для man:periodic[8], в которые будет добавлена выдача Portaudit при ежедневном её запуске. Проверьте, что ежедневные сообщения электронной почты, касающиеся безопасности, которые посылаются на адрес `root`, прочитываются. Другой дополнительной настройки больше не понадобится.
+
+После установки администратор может обновить базу данных и посмотреть список известных уязвимостей в установленных пакетах при помощи команды
+
+[source,bash]
+....
+# portaudit -Fda
+....
+
+[NOTE]
+====
+База данных будет автоматически обновлена при запуске man:periodic[8]; таким образом, предыдущая команду можно полностью опустить. Она требуется только для следующих примеров.
+====
+
+Для аудита утилит сторонних разработчиков, установленных как часть Коллекции Портов, администратору достаточно запускать только следующую команду:
+
+[source,bash]
+....
+# portaudit -a
+....
+
+Утилита portaudit выдаст примерно следующее:
+
+[.programlisting]
+....
+Affected package: cups-base-1.1.22.0_1
+Type of problem: cups-base -- HPGL buffer overflow vulnerability.
+Reference: <http://www.FreeBSD.org/ports/portaudit/40a3bca2-6809-11d9-a9e7-0001020eed82.html>
+
+1 problem(s) in your installed packages found.
+
+You are advised to update or deinstall the affected package(s) immediately.
+....
+
+Перейдя в Web-браузере по показанному URL, администратор может получить более подробную информацию о показанной уязвимости. В неё войдёт перечисление версий, затронутых соответствующей версией порта FreeBSD, а также другие Web-сайты, которые могут содержать бюллетени безопасности.
+
+Если описывать вкратце, то Portaudit является мощной и, при использовании вместе с портом Portupgrade, чрезвычайно полезной утилитой.
+
+[[security-advisories]]
+== Сообщения безопасности FreeBSD
+
+Как многие и высококачественные операционные системы, FreeBSD публикует "Сообщения безопасности" ("Security Advisories"). Эти сообщения обычно отправляются по почте в списки рассылки, посвященные безопасности и публикуются в списке проблем только после выхода исправлений к соответствующим релизам. В этом разделе разъясняется, что такое сообщения безопасности, как их читать и какие меры принимать для исправления системы.
+
+=== Как выглядит сообщение?
+
+Сообщение безопасности FreeBSD выглядит подобно сообщению ниже, взятому из списка рассылки {freebsd-security-notifications}.
+
+[.programlisting]
+....
+=============================================================================
+FreeBSD-SA-XX:XX.UTIL Security Advisory
+ The FreeBSD Project
+
+Topic: denial of service due to some problem<.>
+
+Category: core<.>
+Module: sys<.>
+Announced: 2003-09-23<.>
+Credits: Person@EMAIL-ADDRESS<.>
+Affects: All releases of FreeBSD<.>
+ FreeBSD 4-STABLE prior to the correction date
+Corrected: 2003-09-23 16:42:59 UTC (RELENG_4, 4.9-PRERELEASE)
+ 2003-09-23 20:08:42 UTC (RELENG_5_1, 5.1-RELEASE-p6)
+ 2003-09-23 20:07:06 UTC (RELENG_5_0, 5.0-RELEASE-p15)
+ 2003-09-23 16:44:58 UTC (RELENG_4_8, 4.8-RELEASE-p8)
+ 2003-09-23 16:47:34 UTC (RELENG_4_7, 4.7-RELEASE-p18)
+ 2003-09-23 16:49:46 UTC (RELENG_4_6, 4.6-RELEASE-p21)
+ 2003-09-23 16:51:24 UTC (RELENG_4_5, 4.5-RELEASE-p33)
+ 2003-09-23 16:52:45 UTC (RELENG_4_4, 4.4-RELEASE-p43)
+ 2003-09-23 16:54:39 UTC (RELENG_4_3, 4.3-RELEASE-p39)<.>
+CVE Name: CVE-XXXX-XXXX<.>
+
+For general information regarding FreeBSD Security Advisories,
+including descriptions of the fields above, security branches, and the
+following sections, please visit
+http://www.FreeBSD.org/security/.
+
+I. Background<.>
+
+II. Problem Description<.>
+
+III. Impact<.>
+
+IV. Workaround<.>
+
+V. Solution<.>
+
+VI. Correction details<.>
+
+VII. References<.>
+....
+
+<.> Поле `Topic` показывает в чем именно заключается проблема. Это обычно введение в сообщение безопасности, упоминающее утилиту, в которой возникла ошибка.
+<.> Поле `Category` относится к затронутой части системы и может быть выбрана из `core`, `contrib`, или `ports`. Категория `core` означает, что уязвимость затрагивает основной компонент операционной системы FreeBSD. Категория `contrib` означает, что уязвимость затрагивает программы, предоставленные проекту FreeBSD, например sendmail. Наконец, категория `ports` означает, что уязвимость затрагивает программное обеспечение, доступное из Коллекции Портов.
+<.> Поле `Module` указывает на местоположение компонента, например `sys`. В этом примере мы видим, что затронут модуль `sys`, следовательно, эта уязвимость относится к компоненту, используемому в ядре.
+<.> Поле `Announced` отражает дату публикации сообщения безопасности, или его анонсирования. Это означает, что команда обеспечения безопасности убедилась, что проблема существует и что патч помещён в хранилище исходных текстов FreeBSD.
+<.> Поле `Credits` упоминает частное лицо или организацию, обнаружившую уязвимость и сообщившую о ней.
+<.> Поле `Affects` дает информацию о релизах FreeBSD, к которым относится данная уязвимость. Для базовой системы, просмотр вывода команды `ident` для файлов, затронутых уязвимостью, поможет определить ревизию. Номер версии портов приведен после имени порта в каталоге [.filename]#/var/db/pkg#. Если система не синхронизируется с CVS-хранилищем FreeBSD и не пересобирается ежедневно, высок шанс, что она затронута уязвимостью.
+<.> Поле `Corrected` показывает дату, время, смещение во времени и релиз, в котором исправлена ошибка.
+<.> Зарезервировано для идентификации уязвимости в общей базе данных CVD (Common Vulnerabilities Database).
+<.> Поле `Background` дает информацию именно о той утилите, для которой выпущено сообщение. Как правило информация о том, зачем утилита присутствует в FreeBSD, для чего она используется, и немного информации о том, как появилась эта утилита.
+<.> Поле `Problem Description` дает более глубокие разъяснения возникшей проблемы. Оно может включать информацию об ошибочном коде, или даже о том, как утилита может быть использована для создания бреши в системе безопасности.
+<.> Поле `Impact` описывает тип воздействия, который проблема может оказать на систему. Это может быть все, что угодно, от атаки на отказ в обслуживании до получения пользователями дополнительных привилегий, или даже получения атакующим прав суперпользователя.
+<.> Поле `Workaround` предлагает тем, системным администраторам, которые не могут обновить систему, обходной путь решения проблемы. Он может пригодиться при недостатке времени, отсутствии подключения к сети или по массе других причин. В любом случае, к безопасности нельзя относиться несерьезно, и необходимо либо применить указанный обходной путь, либо исправить систему.
+<.> Поле `Solution` предлагает инструкции по исправлению затронутой системы. Это пошаговое руководство, протестированный метод восстановления безопасности системы.
+<.> Поле `Correction Details` показывает ветвь CVS (имя релиза с точками, замененными на символы подчеркивания). Здесь также показан номер ревизии каждого файла из каждой ветви.
+<.> Поле `References` обычно упоминает другие источники информации. Это могут быть Web-страницы, книги, списки рассылки и группы новостей.
+
+[[security-accounting]]
+== Учёт используемых ресурсов
+
+Учёт используемых процессами ресурсов представляет собой метод защиты, при котором администратор может отслеживать использование системных ресурсов и их распределение между пользователями для нужд системного мониторинга и минимального отслеживания команд пользователей.
+
+На самом деле здесь есть свои положительный и отрицательные моменты. Положительной стороной является то, что проникновение может быть отслежено до первоначальной точки входа. Отрицательной стороной является объём протоколов, который генерируется при мониторинге, и соответствующие требования к дисковому пространству. В этом разделе администратору даются основы учёта ресурсов процессов.
+
+=== Активация и использование учёта ресурсов
+
+Прежде чем использовать систему учёта ресурсов, её необходимо активировать. Для этого выполните следующие команды:
+
+[source,bash]
+....
+# touch /var/account/acct
+
+# accton /var/account/acct
+
+# echo 'accounting_enable="YES"' >> /etc/rc.conf
+....
+
+После активации система учёта ресурсов начнёт отслеживать статистику CPU, команд и так далее. Все протоколы учёта ведутся в формате, недоступном для чтения человеком, и могут просматриваться при помощи утилиты man:sa[8]. Запущенная без параметров, `sa` выдаст информацию, относящуюся к количеству вызовов в расчёте на каждого пользователя, общее затраченное время в минутах, общее время CPU и пользователя в минутах, среднее количество операций ввода/вывода и так далее.
+
+Для просмотра информации о запущенных командах, необходимо воспользоваться утилитой man:lastcomm[1]. Команду `lastcomm` можно использовать, например, для выдачи списка директив, выданных пользователями определённого терминала man:ttys[5]:
+
+[source,bash]
+....
+# lastcomm ls trhodes ttyp1
+....
+
+Эта команда выдаст все зафиксированные использования команды `ls` пользователем `trhodes` на терминале ttyp1.
+
+Существует многие другие полезные параметры, которые описаны на соответствующих справочных страницах man:lastcomm[1], man:acct[5] и man:sa[8].
diff --git a/documentation/content/ru/books/handbook/serialcomms/_index.adoc b/documentation/content/ru/books/handbook/serialcomms/_index.adoc
new file mode 100644
index 0000000000..dbcbf0bcf1
--- /dev/null
+++ b/documentation/content/ru/books/handbook/serialcomms/_index.adoc
@@ -0,0 +1,1472 @@
+---
+title: Глава 22. Последовательные соединения
+part: Часть IV. Сетевые коммуникации
+prev: books/handbook/partiv
+next: books/handbook/ppp-and-slip
+---
+
+[[serialcomms]]
+= Последовательные соединения
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 22
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/serialcomms/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/serialcomms/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/serialcomms/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[serial-synopsis]]
+== Краткое описание
+
+В UNIX(R) всегда была поддержка последовательных соединений. Фактически, самые первые UNIX(R) машины использовали последовательные линии для пользовательского ввода/вывода. Многое изменилось с тех пор, когда среднестатистический "терминал" состоял из 10-символов-в-секунду последовательного принтера и клавиатуры. Эта глава рассказывает о некоторых способах, которыми FreeBSD использует последовательные соединения.
+
+Прочитав эту главу, вы узнаете:
+
+* Как подсоединить терминалы к системе FreeBSD.
+* Как использовать модем для дозвона на удаленные хосты.
+* Как разрешить удаленным пользователям входить в вашу систему с помощью модема.
+* Как загрузить систему с последовательной консоли.
+
+Перед прочтением этой главы вам потребуется:
+
+* Узнать как настраивать и устанавливать новое ядро (crossref:kernelconfig[kernelconfig, Настройка ядра FreeBSD]).
+* Понять, что такое права доступа и процессы UNIX(R) (crossref:basics[basics, Основы UNIX]).
+* Кроме этого вам потребуется техническое руководство на последовательное оборудование (модем или мультипортовую карту), которую вы хотите использовать с FreeBSD.
+
+[[serial]]
+== Введение
+
+[[serial-terminology]]
+=== Терминология
+
+bps::
+Бит в секунду (Bits per Second) - скорость передачи данных
+
+DTE::
+Терминальное оборудование (Data Terminal Equipment) - например, ваш компьютер
+
+DCE::
+Оборудование связи (Data Communications Equipment) - ваш модем
+
+RS-232::
+Стандарт EIA для аппаратных последовательных соединений
+
+При упоминании скорости передачи данных, в этой главе не используется термин "бод" ("baud"). Бод означает количество электрических импульсов, которые могут быть переданы за период времени, а "bps" это _корректный_ термин для использования (он хотя бы не создает столько проблем как предыдущий).
+
+[[serial-cables-ports]]
+=== Кабели и порты
+
+Для подсоединения модема или терминала к системе FreeBSD потребуется последовательный порт и подходящий кабель для последовательного устройства. Если вы уже знаете о аппаратном обеспечении и требуемых кабелях, можете пропустить этот раздел.
+
+[[term-cables]]
+==== Кабели
+
+Есть несколько различных видов последовательных кабелей. Два наиболее часто используемых в нашей ситуации типа это нуль-модемный и стандартный ("прямой") RS-232 кабель. Документация на оборудование должна описывать тип требуемого кабеля.
+
+[[term-cables-null]]
+===== Нуль-модемные кабели
+
+Нуль модемный кабель пропускает некоторые сигналы, такие как "Signal Ground", напрямую, а другие "заворачивает". Например, контакт "Transmitted Data" на одном конце соединяется с контактом "Received Data" на другом.
+
+Вы можете сделать собственный кабель для использования с терминалами. Эта таблица показывает названия <<serialcomms-signal-names,сигналов RS-232C>> и номера контактов на разъеме DB-25. Заметим, что стандарт описывает соединение контактов номер 1 как сигнал _Protective Ground_, но его часто не делают. Некоторым терминалам достаточно сигналов на контактах 2, 3 и 7; другим требуется большее число сигналов, как показано на примерах ниже:
+
+.Нуль-модемный кабель DB-25 - DB-25
+[cols="1,1,1,1,1", frame="none", options="header"]
+|===
+<| Сигнал
+<| Контакт
+|
+<| Контакт
+<| Сигнал
+
+|SG
+|7
+|соединен с
+|7
+|SG
+
+|TD
+|2
+|соединен с
+|3
+|RD
+
+|RD
+|3
+|соединен с
+|2
+|TD
+
+|RTS
+|4
+|соединен с
+|5
+|CTS
+
+|CTS
+|5
+|соединен с
+|4
+|RTS
+
+|DTR
+|20
+|соединен с
+|6
+|DSR
+
+|DTR
+|20
+|соединен с
+|8
+|DCD
+
+|DSR
+|6
+|соединен с
+|20
+|DTR
+
+|DCD
+|8
+|соединен с
+|20
+|DTR
+|===
+
+Вот еще две распространенные в настоящее время схемы.
+
+.Нуль-модемный кабель DB-9 - DB-9
+[cols="1,1,1,1,1", frame="none", options="header"]
+|===
+<| Сигнал
+<| Контакт
+|
+<| Контакт
+<| Сигнал
+
+|RD
+|2
+|соединен с
+|3
+|TD
+
+|TD
+|3
+|соединен с
+|2
+|RD
+
+|DTR
+|4
+|соединен с
+|6
+|DSR
+
+|DTR
+|4
+|соединен с
+|1
+|DCD
+
+|SG
+|5
+|соединен с
+|5
+|SG
+
+|DSR
+|6
+|соединен с
+|4
+|DTR
+
+|DCD
+|1
+|соединен с
+|4
+|DTR
+
+|RTS
+|7
+|соединен с
+|8
+|CTS
+
+|CTS
+|8
+|соединен с
+|7
+|RTS
+|===
+
+.Нуль-модемный кабель DB-9 - DB-25
+[cols="1,1,1,1,1", frame="none", options="header"]
+|===
+<| Сигнал
+<| Контакт
+|
+<| Контакт
+<| Сигнал
+
+|RD
+|2
+|соединен с
+|2
+|TD
+
+|TD
+|3
+|соединен с
+|3
+|RD
+
+|DTR
+|4
+|соединен с
+|6
+|DSR
+
+|DTR
+|4
+|соединен с
+|8
+|DCD
+
+|SG
+|5
+|соединен с
+|7
+|SG
+
+|DSR
+|6
+|соединен с
+|20
+|DTR
+
+|DCD
+|1
+|соединен с
+|20
+|DTR
+
+|RTS
+|7
+|соединен с
+|5
+|CTS
+
+|CTS
+|8
+|соединен с
+|4
+|RTS
+|===
+
+[NOTE]
+====
+Для соединения одного контакта с одной стороны с двумя контактами на другой обычно пару контактов на одной стороне соединяют коротким проводом, а затем один из них - длинным с единственным контактом на дальней стороне.
+====
+
+Приведенные диаграммы описывают наиболее популярные схемы распайки. В других вариантах (описанных в книге _RS-232 Made Easy_) SG соединяется с SG, TD соединяется с RD, RTS и CTS соединяются с DCD, DTR соединяется с DSR, и наоборот.
+
+[[term-cables-std]]
+===== Стандартные кабели RS-232C
+
+Стандартный последовательный кабель пропускает все RS-232C сигналы напрямую. Так, "send data" на одном конце кабеля соединяется с контактом "send data" на другом конце. Этот тип кабеля предназначен для подсоединения модема, а также подходит для некоторых терминалов.
+
+[[term-ports]]
+==== Порты
+
+Последовательные порты это устройства, через которые данные передаются между компьютером с FreeBSD и терминалом. Этот раздел описывает типы существующих портов и их адресацию в FreeBSD.
+
+[[term-portkinds]]
+===== Типы портов
+
+Существует несколько типов последовательных портов. Перед изготовлением кабеля, вам потребуется убедиться, что он подходит к портам терминала и системы FreeBSD.
+
+Большинство терминалов используют порты DB25. Персональные компьютеры, включая PC под управлением FreeBSD, используют порты DB25 или DB9. Если у вас есть мультипортовая последовательная карта для PC, там могут быть RJ-12 или RJ-45 порты.
+
+Обратитесь к сопровождающей документации на оборудование за информацией об используемых портах. Можно также определить тип используемых портов по их внешнему виду.
+
+[[term-portnames]]
+===== Имена портов
+
+В FreeBSD доступ к каждому последовательному порту может быть получен через файл в каталоге [.filename]#/dev#. Есть два различных типа файлов:
+
+* Порты входящих соединений (dial-in) называются [.filename]#/dev/ttydN#, где _N_ это номер порта начиная с нуля. Обычно, порты входящих соединений используются для терминалов. Для корректной работы этим портам требуется, чтобы последовательный кабель передавал сигнал data carrier detect (DCD).
+* Порты исходящих соединений (call-out) называются [.filename]#/dev/cuadN#. Они обычно используются не для терминалов, а только для модемов. Вы можете использовать эти порты если последовательный кабель или терминал не поддерживает сигнал DCD.
++
+[NOTE]
+====
+Call-out порты в FreeBSD 5.X и ранее именуются [.filename]#/dev/cuaaN#.
+====
+
+Если вы соединили терминал с первым последовательным портом ([.filename]#COM1# в MS-DOS(R)), используйте [.filename]#/dev/ttyd0# для доступа к терминалу. Если терминал соединен со вторым последовательным портом (известным также как [.filename]#COM2#), используйте [.filename]#/dev/ttyd1#, и так далее.
+
+=== Настройка ядра
+
+FreeBSD c настройками по умолчанию поддерживает последовательные порты. В мире MS-DOS(R) они известны как [.filename]#COM1#, [.filename]#COM2#, [.filename]#COM3#, и [.filename]#COM4#. На данный момент в FreeBSD есть поддержка как "простых" мультипортовых карт с последовательными интерфейсами, таких как BocaBoard 1008 и 2016, так и более "умных" мультипортовых карт, например карт Digiboard и Stallion Technologies. Тем не менее, ядро по умолчанию определяет только стандартные COM порты.
+
+Чтобы увидеть, как ядро определяет последовательные порты, просмотрите сообщения, выводимые во время загрузки ядра, или используйте команду `/sbin/dmesg` для вывода сообщений ядра еще раз. В частности, обратите внимание на сообщения, начинающиеся с символов `sio`.
+
+[TIP]
+====
+
+Для просмотра только тех сообщений, которые содержат слово `sio`, используйте команду:
+
+[source,bash]
+....
+# /sbin/dmesg | grep 'sio'
+....
+
+====
+
+Например, в системе с четырьмя последовательными портами, появятся такие специфичные для последовательных портов сообщения:
+
+[source,bash]
+....
+sio0 at 0x3f8-0x3ff irq 4 on isa
+sio0: type 16550A
+sio1 at 0x2f8-0x2ff irq 3 on isa
+sio1: type 16550A
+sio2 at 0x3e8-0x3ef irq 5 on isa
+sio2: type 16550A
+sio3 at 0x2e8-0x2ef irq 9 on isa
+sio3: type 16550A
+....
+
+Если ядро не распознает все последовательные порты, вам возможно потребуется настроить ядро FreeBSD, изменив файл [.filename]#/boot/device.hints#. Вы можете также закомментировать или вовсе удалить строки, относящиеся к отсутствующим у вас устройствам.
+
+Обратитесь к странице справочника man:sio[4] за дополнительной информацией о настройке последовательных портов и мультипортовых карт. Будьте осторожны при использовании настроек, которые работали в предыдущих версиях FreeBSD, поскольку флаги устройств и синтаксис изменились в новых версиях.
+
+[NOTE]
+====
+`port IO_COM1` это синоним для `port 0x3f8`, `IO_COM2` для `0x2f8`, `IO_COM3` для `0x3e8`, и `IO_COM4` для `0x2e8`. Это наиболее часто используемые для соответствующих последовательных портов адреса. Наиболее часто используемые прерывания 4, 3, 5, и 9. Имейте ввиду, что обычные последовательные порты _не могут_ совместно использовать прерывания на ISA PC (на мультипортовых картах есть электроника, позволяющая всем чипам 16550A на плате совместно использовать одно или два IRQ).
+====
+
+=== Специальные файлы устройств
+
+К большинству устройств ядра можно получить доступ через "специальные файлы устройств", расположенные в каталоге [.filename]#/dev#. К устройствам [.filename]#sio# можно получить доступ через [.filename]#/dev/ttydN# (устройства входящих вызовов, dial-in) и [.filename]#/dev/cuadN# (устройства исходящих вызовов, call-out). FreeBSD предоставляет также устройства инициализации ([.filename]#/dev/ttydN.init# и [.filename]#/dev/cuadN.init# в случае FreeBSD 6.X, [.filename]#/dev/ttyidN# и [.filename]#/dev/cuaiaN# для FreeBSD 5.X), устройства блокировки ([.filename]#/dev/ttydN.lock# и [.filename]#/dev/cuadN.lock# в случае FreeBSD 6.X, [.filename]#/dev/ttyldN# и [.filename]#/dev/cualaN# для FreeBSD 5.X). Первые используются для инициализации параметров порта при каждом его открытии (таких как `crtscts` для модемов, использующих сигналы `RTS/CTS` для управления потоком). Устройства блокировки используются для установки флага блокировки на порт и предотвращения изменения определенных параметров пользователями или программами; обратитесь к страницам справочника man:termios[4], man:sio[4] и man:stty[1] соответственно за информацией о параметрах терминала, блокировании и инициализации устройств и настройке терминала.
+
+[[serial-hw-config]]
+=== Настройка последовательных портов
+
+Устройство [.filename]#ttydN# (или [.filename]#cuadN#) это обычное устройство, которое потребуется открыть для приложений. Когда процесс открывает устройство применяются настройки ввода/вывода терминала по умолчанию. Вы можете посмотреть эти настройки с помощью команды
+
+[source,bash]
+....
+# stty -a -f /dev/ttyd1
+....
+
+Если вы измените настройки устройства, они будут действовать до его закрытия. После повторного открытия, оно вернется к настройкам по умолчанию. Для изменения настроек по умолчанию, вы можете открыть и изменить установки "начального состояния" устройства. Например, для включения по умолчанию режима `CLOCAL`, 8-битного соединения и контроля передачи `XON/XOFF` для [.filename]#ttyd5#, выполните:
+
+[source,bash]
+....
+# stty -f /dev/ttyd5.init clocal cs8 ixon ixoff
+....
+
+Инициализация последовательных устройств контролируется файлом [.filename]#/etc/rc.d/serial#. Этот файл определяет настройки последовательных устройств по умолчанию.
+
+Для предотвращения изменения программами отдельных установок, настройте "состояние блокировки" устройства. Например, для установки значения скорости [.filename]#ttyd5# в 57600 bps, выполните:
+
+[source,bash]
+....
+# stty -f /dev/ttyd5.lock 57600
+....
+
+Теперь приложение, открывающее [.filename]#ttyd5# и пытающееся изменить скорость порта, получит скорость 57600 bps.
+
+И конечно, сделайте запись начальных значений и состояния блокировки устройств доступной только учетной записи `root`.
+
+[[term]]
+== Терминалы
+
+Терминалы предоставляют удобный и дешевый способ доступа к системе FreeBSD, когда вы не сидите за консолью компьютера и не подключены к сети. Этот раздел описывает использование терминалов в FreeBSD.
+
+[[term-uses]]
+=== Пользователи и типы терминалов
+
+В первых системах UNIX(R) не было консолей. Вместо этого, пользователи входили и запускали программы через терминалы, которые были подключены к последовательным портам компьютеров. Это очень похоже на использование модема и программного обеспечения терминала для дозвона до удаленной системы и выполнения только-текстовой работы.
+
+Консоли современных PC поддерживают высококачественную графику, но возможность входа по последовательному порту на сегодняшний день все еще доступна почти в каждой UNIX(R) подобной операционной системе; FreeBSD не исключение. Используя терминал, подключенный к неиспользуемому последовательному порту, вы можете войти и запустить текстовую программу, которую обычно запускаете в текстовой консоли или в окне `xterm` системы X Window.
+
+Для корпоративных пользователей, вы можете подсоединить множество терминалов к системе FreeBSD и поставить их на столы пользователей. Для домашнего пользователя, устаревший IBM PC или Macintosh(R) может быть подключен в качестве терминала к более мощному компьютеру под управлением FreeBSD. Вы можете превратить однопользовательский компьютер в мощную многопользовательскую систему.
+
+В FreeBSD три вида терминалов:
+
+* <<term-dumb,Простые (dumb) терминалы>>
+* <<term-pcs,"PC, работающие в качестве терминалов">>
+* <<term-x,X терминалы>>
+
+В оставшейся части раздела описывается каждый вид.
+
+[[term-dumb]]
+==== Простые терминалы
+
+Простые терминалы это специализированное оборудование, позволяющее соединять компьютеры через последовательные линии. Они называются "простыми", поскольку их вычислительных возможностей хватает только для отображения, отправки и получения текста. Вы не сможете запустить на них никаких программ. Компьютер, к которому подсоединяется терминал, предоставляет все возможности для запуска текстовых редакторов, компиляторов, почтовых программ, игр и так далее.
+
+Есть сотни видов простых терминалов, изготовленных различными производителями, включая DEC VT-100 и Wyse WY-75. Почти любой терминал может работать с FreeBSD. Некоторые high-end терминалы даже могут отображать графику, но только отдельные программные пакеты могут получить преимущество от этих расширенных возможностей.
+
+Простые терминалы популярны в рабочей среде, где не требуется доступ к графическим приложениям, например тем, которые предоставляет система X Window.
+
+[[term-pcs]]
+==== PC, работающие в качестве терминалов
+
+Если <<term-dumb,простые терминалы>> могут только отображать, отправлять и получать текст, возможностей абсолютно любого персонального компьютера хватит для работы в роли простого терминала. Все, что вам потребуется, это подходящий кабель и какая-нибудь программа _эмулятора терминала_.
+
+Это популярная домашняя конфигурация. Например, когда ваша вторая половина занята работой на системной консоли FreeBSD, вы можете одновременно выполнять только-текстовую работу с менее мощного персонального компьютера, подключенного к системе FreeBSD.
+
+[[term-x]]
+==== X терминалы
+
+X терминалы это наиболее сложный тип существующих терминалов. Вместо подключения к последовательному порту, они обычно подключаются к сети, например Ethernet. Вместо работы только с текстовыми приложениями, они могут отображать любое X приложение.
+
+Мы представляем X терминалы только ради полноты описания. Тем не менее, эта глава _не_ охватывает установку, настройку или использование X терминалов.
+
+[[term-config]]
+=== Настройка
+
+Этот раздел описывает, что нужно сделать для настройки системы FreeBSD и включения входа в систему через терминал. Предполагается, что вы уже подключили терминал и настроили ядро для включения поддержки последовательного порта, к которому он подключен.
+
+Обратитесь к главе crossref:boot[boot, Процесс загрузки FreeBSD] за информацией о процессе `init`, отвечающем за контроль над всеми процессами и за инициализацию системы во время загрузки. Одна из задач, выполняемых `init` - чтение файла [.filename]#/etc/ttys# и запуск процесса `getty` на доступных терминалах. Процесс `getty` отвечает за чтение имени пользователя и запуск программы `login`.
+
+Таким образом, для настройки терминалов в системе FreeBSD необходимо выполнить следующие действия под `root`:
+
+[.procedure]
+====
+. Добавить строку к [.filename]#/etc/ttys# для файла из каталога [.filename]#/dev#, представляющего последовательный порт, если этой строки еще нет.
+. Настроить запуск команды `/usr/libexec/getty` на этом порту и указать соответствующий тип _getty_ в файле [.filename]#/etc/gettytab#.
+. Указать тип терминала по умолчанию.
+. Переключить порт в состояние "on" ("включен")
+. Указать, должен ли порт быть "secure" ("безопасным")
+. Заставить `init` перечитать файл [.filename]#/etc/ttys#.
+====
+
+Опционально, вы можете настроить свой тип _getty_ для использования на шаге 2, добавив описание в файл [.filename]#/etc/gettytab#. За описанием обратитесь к страницам справочника man:gettytab[5] и man:getty[8].
+
+[[term-etcttys]]
+==== Добавление строки в [.filename]#/etc/ttys#
+
+В файле [.filename]#/etc/ttys# находится список всех портов системы FreeBSD, на которые возможен вход. Например, там находится первая виртуальная консоль [.filename]#ttyv0#. Вы можете войти на консоль с помощью этой записи. Файл содержит записи и для других виртуальных консолей, последовательных портов, и псевдо-терминалов. Название файла последовательного порта из каталога [.filename]#/dev# приводится без префикса [.filename]#/dev# (например, устройство [.filename]#/dev/ttyv0# будет записано как [.filename]#ttyv0#).
+
+Установка FreeBSD по умолчанию включает файл [.filename]#/etc/ttys# с поддержкой первых четырех последовательных портов: от [.filename]#ttyd0# до [.filename]#ttyd3#. Если вы подключаете терминал к одному из этих портов, добавлять записи терминалов не потребуется.
+
+[[ex-etc-ttys]]
+.Добавление записей терминалов в [.filename]#/etc/ttys#
+[example]
+====
+Предположим, вы хотите подключить два терминала к системе: Wyse-50 и старый 286 IBM PC с эмулятором терминала VT-100. Мы подключаем Wyse к второму последовательному порту и 286 к шестому последовательному порту (порт на мультипортовой карте). Соответствующие строки в [.filename]#/etc/ttys# будут выглядеть так:
+
+[.programlisting]
+....
+ttyd1 "/usr/libexec/getty std.38400" wy50 on insecure
+ttyd5 "/usr/libexec/getty std.19200" vt100 on insecure
+....
+
+* Первое поле, как правило, указывает имя специального файла терминала, в соответствии с его именем в [.filename]#/dev#.
+* Второе поле - это команда, исполняемая для этого терминала, обычно man:getty[8]. `getty` инициализирует и открывает линию, устанавливает ее скорость, приглашает пользователя к вводу имени пользователя, а затем выполняет программу man:login[1].Программа `getty` принимает один (опциональный) параметр в командной строке, тип _getty_. Тип _getty_ определяет характеристики терминальной линии, такие как значение bps и четность. Программа `getty` считывает эти характеристики из файла [.filename]#/etc/gettytab#.Файл [.filename]#/etc/gettytab# содержит множество записей для терминалов, как для старых так и для новых. Почти во всех случаях запись, начинающаяся с текста `std`, предназначена для работы с аппаратными терминалами. Эти записи игнорируют четность. Запись `std` есть для каждого значения bps от 110 до 115200. Конечно, вы можете добавить собственные записи в этот файл. Страница справочника man:gettytab[5] содержит дополнительную информацию.При установке типа _getty_ в файле [.filename]#/etc/ttys# убедитесь в наличии соответствующей записи терминала.Например, Wyse-50 не использует четность и соединяется на 38400 bps. 286 PC не использует четность и соединяется на 19200 bps.
+* Третье поле определяет тип терминала, обычно подключаемого к этой линии tty. Для портов входящих соединений обычно используется значение `unknown` или `dialup`, поскольку пользователь может подключить практически любой тип терминала или программу. Для аппаратных терминалов тип не меняется, поэтому вы можете поместить в это поле определенный тип терминала из базы данных man:termcap[5].Например, Wyse-50 использует реальный тип терминала, а 286 PC, работающий с Procomm, настроен на эмуляцию VT-100.
+* Четвертое поле определяет должен ли порт быть включен. Размещение здесь `on` укажет процессу `init` запустить программу, указанную во втором поле, `getty`. Если вы поместите `off` в это поле, команда `getty` не будет запущена и вход на этот порт станет невозможен.
+* Последнее поле используется, чтобы указать, является ли порт безопасным. Пометка порта безопасным означает, что вы доверяете ему достаточно для того, чтобы разрешить учетной записи `root` (или любой учетной записи с UID 0) входить с этого порта. Небезопасные порты не разрешат вход `root`. На небезопасном порту пользователи должны войти с через непривилегированную учетную запись, а затем использовать man:su[1] или подобный механизм для получения привилегий суперпользователя.Настоятельно рекомендуется использовать "insecure" даже для терминалов, находящихся за закрытыми дверями. Довольно легко использовать `su` после входа, если вам потребуются привилегии суперпользователя.
+====
+
+[[term-hup]]
+==== Заставьте `init` перечитать [.filename]#/etc/ttys#
+
+После выполнения необходимых изменений в файле [.filename]#/etc/ttys#, вам потребуется отправить сигнал SIGHUP (hangup) процессу `init`, чтобы заставить его перечитать его файл настройки. Например:
+
+[source,bash]
+....
+# kill -HUP 1
+....
+
+[NOTE]
+====
+`init` это всегда первый из запущенных в в системе процессов, поэтому его PID всегда 1.
+====
+
+Если все установлено правильно, все кабели на месте и терминалы включены, процесс `getty` должен быть запущен на каждом терминале и вы увидите приглашение ко входу на каждом терминале.
+
+[[term-debug]]
+=== Решение проблем с соединением
+
+Даже при самом внимательном отношении к деталям, при настройке терминала все же могут возникнуть проблемы. В этом разделе приведен список симптомов и предлагается несколько решений.
+
+==== Не появляется приглашение ко входу
+
+Убедитесь, что терминал подключен и его питание включено. Убедитесь, что эмулятор терминала запущен на соответствующем порту.
+
+Убедитесь, что кабель хорошо подключен и к терминалу и к компьютеру с FreeBSD. Убедитесь, что правильно выбран тип кабеля.
+
+Убедитесь, что терминал и FreeBSD имеют одинаковые установки значения bps и четности. Если у вас видео терминал, убедитесь, что контраст и яркость включены. Если это принт-терминал, убедитесь, что бумага и чернила в порядке.
+
+Убедитесь, что процесс `getty` запущен и обслуживает терминал. Например, для получения списка запущенных процессов `getty` с помощью `ps`, выполните:
+
+[source,bash]
+....
+# ps -axww|grep getty
+....
+
+Вы должны увидеть строку для соответствующего терминала. Например, если `getty` запущена на втором последовательном порту `ttyd1` и использует запись `std.38400` из файла [.filename]#/etc/gettytab#, отобразится следующее:
+
+[source,bash]
+....
+22189 d1 Is+ 0:00.03 /usr/libexec/getty std.38400 ttyd1
+....
+
+Если процесс `getty` не запущен, убедитесь, что вы включили порт в [.filename]#/etc/ttys#. Не забудьте также запустить `kill -HUP 1` после изменения файла [.filename]#ttys#.
+
+Если процесс `getty` запущен, но на терминале по-прежнему не отображается приглашение ко входу, или если приглашение отображается, но войти невозможно, терминал или кабель, возможно, не поддерживают квитирование связи. Попробуйте изменить поле в [.filename]#/etc/ttys# с `std.38400` на `3wire.38400`. Запись `3wire` похожа на `std`, но игнорирует квитирование связи. Вам может потребоваться уменьшить скорость соединения или включить программный контроль передачи при использовании `3wire` для предотвращения переполнений буфера.
+
+==== Вместо приглашения ко входу на экране появляется "мусор"
+
+Убедитесь, что терминал и FreeBSD имеют одинаковые установки значения bps и четности. Проверьте процесс `getty`, чтобы убедиться, что используется подходящий тип _getty_. Если это не так, отредактируйте [.filename]#/etc/ttys# и запустите `kill -HUP 1`.
+
+==== Символы появляются дважды, пароль отображается при вводе
+
+Переключите терминал (или программу эмулятора терминала) с "half duplex" или "local echo" на "full duplex".
+
+[[dialup]]
+== Входящие соединения по модему
+
+Настройка системы FreeBSD для поддержки входящих соединений очень похожа на подсоединение терминалов за исключением того, что вы работаете с модемами вместо терминалов.
+
+=== Внешние и внутренние модемы
+
+Внешние модемы более удобны для дозвона, поскольку легко могут быть настроены с помощью параметров, сохраняемых в энергонезависимой памяти. На них обычно есть индикаторы, отображающие состояние основных RS-232 сигналов. Мигающие индикаторы впечатляют, но кроме того они также очень полезны для индикации правильной работы модема.
+
+Внутренние модемы обычно не снабжаются энергонезависимой памятью, поэтому их настройка может ограничиваться установкой DIP переключателей. Если на внутреннем модеме есть индикаторы, их обычно сложно увидеть при закрытой крышке корпуса.
+
+==== Модемы и кабели
+
+Если вы используете внешний модем, несомненно потребуется подходящий кабель. Стандартный RS-232C кабель должен подойти, если подключены все обычные сигналы:
+[[serialcomms-signal-names]]
+.Наименования сигналов
+[cols="1,1,1", frame="none", options="header"]
+|===
+<| Сокращение
+<| Наименование
+<| Назначение
+
+|RD
+|Received Data
+|Принимаемые данные
+
+|TD
+|Transmitted Data
+|Передаваемые данные
+
+|DTR
+|Data Terminal Ready
+|Готовность терминала
+
+|DSR
+|Data Set Ready
+|Готовность данных
+
+|DCD
+|Data Carrier Detect
+|Наличие несущей
+
+|SG
+|Signal Ground
+|Сигнальная земля
+
+|RTS
+|Request to Send
+|Запрос на посылку
+
+|CTS
+|Clear to Send
+|Готовность к приему
+|===
+
+FreeBSD требуются сигналы RTS и CTS для контроля передачи на скоростях выше 2400 bps, сигнал CD для определения, был ли ответ на сигнал или произошло отключение линии, и сигнал DTR для сброса модема после завершения сессии. Некоторые кабели не поддерживают все необходимые сигналы, поэтому, если вы столкнулись с проблемами, например, если сессия не завершается после отсоединения линии, причиной возможно являются проблемы с кабелем.
+
+Как и другие UNIX(R) подобные операционные системы, FreeBSD использует аппаратные сигналы для определения того, был ли ответ на звонок или линия была отключена и требуется завершить работу модема и сбросить его в начальное состояние. FreeBSD избегает отправлять команды модему или просматривать отчеты о статусе от модема. Если вы знакомы с настройкой BBS, это может показаться неудобным.
+
+=== Рекомендации по последовательным интерфейсам
+
+FreeBSD поддерживает интерфейсы, основанные на NS8250, NS16450, NS16550, и NS16550A EIA RS-232C (CCITT V.24). Устройства 8250 и 16450 снабжены односимвольным буфером. Устройство 16550 снабжено 16-ти символьным буфером, который повышает производительность системы. (Ошибки в 16550 делают невозможным использование 16-символьного буфера, поэтому используйте 16550A если возможно). Поскольку устройства с односимвольным буфером предъявляют большие требования к операционной системе, чем с 16-ти символьным буфером, предпочтительны устройства на 16550A. Если в системе много активных последовательных портов или нагрузка велика, устройства на 16550A лучше подходят для поддержки соединений с малым количеством ошибок.
+
+=== Краткий обзор
+
+Как и с терминалами, `init` запускает процесс `getty` на каждом настроенном для входящих звонков последовательном порту. Например, если модем подключен к [.filename]#/dev/ttyd0#, команда `ps ax` может вывести следующее:
+
+[source,bash]
+....
+4850 ?? I 0:00.09 /usr/libexec/getty V19200 ttyd0
+....
+
+Когда пользователь дозванивается на подключенный модем, модем выдает сигнал CD (Carrier Detect). Ядро определяет, что несущая обнаружена и завершает открытие порта командой `getty`. `getty` отправляет приглашение `login:` на указанной скорости. `getty` ожидает в ответ набор символов, и, как правило, получает неправильный набор (обычно это происходит из-за того, что скорость соединения модема отличается от скорости `getty`). `getty` пробует подобрать скорость линии до тех пор, пока не получит правильный набор символов.
+
+После того, как будет введено имя пользователя, `getty` выполняет [.filename]#/usr/bin/login#, которая завершает вход, запрашивая пароль пользователя и запуская оболочку.
+
+=== Файлы настройки
+
+Есть три файла настройки системы в каталоге [.filename]#/etc#, которые возможно потребуется отредактировать для включения удаленного доступа по модему в FreeBSD. Первый, [.filename]#/etc/gettytab#, содержит информацию по настройке даемона [.filename]#/usr/libexec/getty#. Второй, [.filename]#/etc/ttys#, содержит информацию, указывающую [.filename]#/sbin/init# на каких устройствах [.filename]#tty# должны быть запущены процессы `getty`. Наконец, вы можете поместить команды инициализации портов в скрипт /etc/rc.d/serial.
+
+В UNIX(R) есть две школы настройки модемов для входящих соединений. Одна предпочитает настраивать модемы и системы так, что не важно на какой скорости подсоединяется удаленный пользователь. Локальный интерфейс RS-232 компьютер-модем работает на жестко заданной скорости. Преимущество этой настройки в том, что удаленный пользователь всегда сразу видит приглашение ко входу. Обратная сторона в том, что система не знает, какова на самом деле скорость передачи данных, поэтому полноэкранные программы, такие как Emacs, не настраивают свои методы отображения на экране для работы с медленными соединениями.
+
+Другая школа настраивает интерфейс RS-232 для работы с различной скоростью в зависимости от скорости подсоединения удаленного пользователя. Например, соединение модемов по протоколу V.32bis (14.4 Кбит/с) установит скорость порта RS-232 равной 19.2 Кбит/с, а соединение на скорости 2400 бит/с установит скорость RS-232 равной 2400 бит/с. Поскольку `getty` не понимает сообщений модема о скорости соединения, `getty` выдает приглашение `login:` на установленной по умолчанию скорости и считывает символы, полученные в ответе. Если пользователь видит "мусор" вместо приглашения ко входу, это означает, что нужно нажимать Enter до тех пор, пока не появится приглашение ко входу. Если скорости не совпадают, `getty` получает все, что вводит пользователь, в виде "мусора", пробует переключиться на другую скорость и выдает приглашение `login:` опять. Эта процедура может продолжаться до отвращения, но обычно требуется одно или два нажатия клавиши перед появлением нормально выглядящего приглашения. Очевидно, эта последовательность входа не так хороша, как метод с фиксированной скоростью, но при низкой скорости соединения работать с полноэкранными программами станет проще.
+
+В этом разделе делается попытка дать сбалансированную информацию для настройки, но предпочтение будет отдано установке скорости соединения с модемом в соответствие скорости подключения.
+
+==== [.filename]#/etc/gettytab#
+
+[.filename]#/etc/gettytab# это файл в стиле man:termcap[5], содержащей информацию по настройке man:getty[8]. Пожалуйста, обратитесь к странице справочника man:gettytab[5] за полной информацией о формате файла и за списком возможностей `getty`.
+
+===== Настройка фиксированной скорости
+
+Если вы зафиксировали скорость соединения модема на определенной скорости, редактировать файл [.filename]#/etc/gettytab# скорее всего не потребуется.
+
+===== Настройка изменяемой скорости
+
+Вам потребуется сделать запись в [.filename]#/etc/gettytab# для предоставления `getty` информации о скоростях, которые предполагается использовать для модема. Если у вас 2400 бит/с модем, возможно, подойдет существующая запись `D2400`.
+
+[.programlisting]
+....
+#
+# Fast dialup terminals, 2400/1200/300 rotary (can start either way)
+#
+D2400|d2400|Fast-Dial-2400:\
+ :nx=D1200:tc=2400-baud:
+3|D1200|Fast-Dial-1200:\
+ :nx=D300:tc=1200-baud:
+5|D300|Fast-Dial-300:\
+ :nx=D2400:tc=300-baud:
+....
+
+Если у вас более скоростной модем, вам возможно потребуется добавить запись в [.filename]#/etc/gettytab#; вот запись, которую вы можете использовать для 14.4 Кбит/с модема с максимальной скоростью интерфейса 19.2 Кбит/с:
+
+[.programlisting]
+....
+#
+# Additions for a V.32bis Modem
+#
+um|V300|High Speed Modem at 300,8-bit:\
+ :nx=V19200:tc=std.300:
+un|V1200|High Speed Modem at 1200,8-bit:\
+ :nx=V300:tc=std.1200:
+uo|V2400|High Speed Modem at 2400,8-bit:\
+ :nx=V1200:tc=std.2400:
+up|V9600|High Speed Modem at 9600,8-bit:\
+ :nx=V2400:tc=std.9600:
+uq|V19200|High Speed Modem at 19200,8-bit:\
+ :nx=V9600:tc=std.19200:
+....
+
+Эта настройка включает 8-битные соединения без программного контроля четности.
+
+В примере выше скорость порта будет переключаться в цикле начиная с 19.2 Кбит/с (для соединения по V.32bis), затем 9600 бит/с (для V.32), 2400 бит/с, 1200 бит/с, 300 бит/с, и обратно на 19.2 Кбит/с. Переключение скоростей в цикле реализовано с помощью `nx=` ("next table"). Каждая из линий использует `tc=` ("table continuation") для указания "стандартных" (std) настроек на каждой скорости.
+
+Если у вас 28.8 Кбит/с модем и/или вы хотите получить преимущество от сжатия на скорости 14.4 Кбит/с, потребуются скорости выше, чем 19.2 Кбит/с. Вот пример записи из [.filename]#gettytab# для начала соединения на скорости 57.6 Кбит/с:
+
+[.programlisting]
+....
+#
+# Additions for a V.32bis or V.34 Modem
+# Starting at 57.6 Kbps
+#
+vm|VH300|Very High Speed Modem at 300,8-bit:\
+ :nx=VH57600:tc=std.300:
+vn|VH1200|Very High Speed Modem at 1200,8-bit:\
+ :nx=VH300:tc=std.1200:
+vo|VH2400|Very High Speed Modem at 2400,8-bit:\
+ :nx=VH1200:tc=std.2400:
+vp|VH9600|Very High Speed Modem at 9600,8-bit:\
+ :nx=VH2400:tc=std.9600:
+vq|VH57600|Very High Speed Modem at 57600,8-bit:\
+ :nx=VH9600:tc=std.57600:
+....
+
+Если у вас медленный CPU или сильно загруженная система без последовательных портов на базе 16550A, на скорости 57.6 Кбит/с могут возникнуть ошибки `sio` "silo".
+
+[[dialup-ttys]]
+==== [.filename]#/etc/ttys#
+
+Настройка файла [.filename]#/etc/ttys# была описана в <<ex-etc-ttys>>. Настройка модемов похожа, но потребуется передавать `getty` различные аргументы и указывать различные типы терминалов. Общий формат для фиксированной и переменной скорости такой:
+
+[.programlisting]
+....
+ttyd0 "/usr/libexec/getty xxx" dialup on
+....
+
+Первый пункт в строке выше это специальный файл устройства для этой записи - `ttyd0` означает, что `getty` будет запущена на [.filename]#/dev/ttyd0#. Второй пункт, `"/usr/libexec/getty _xxx_"` (_xxx_ будет замещено на запись из [.filename]#gettytab# для начальной скорости), это процесс, который будет запущен на данном устройстве. Третий пункт, `dialup`, это тип терминала по умолчанию. Четвертый параметр, `on`, указывает `init`, что линия включена. Может быть пятый параметр, `secure`, но он должен использоваться только для терминалов, которые физически безопасны (таких как системная консоль).
+
+Тип терминала по умолчанию (`dialup` в примере выше) может зависеть от личных предпочтений. `dialup` это традиционный тип терминала по умолчанию на линиях для дозвона, который позволяет пользователям, зная что тип терминала `dialup`, автоматически настраивать свой тип терминала. Однако, автор находит более легким указание `vt102` в качестве типа терминала по умолчанию, поскольку пользователи работают на своих удаленных системах с эмулятором терминала VT102.
+
+После внесения изменений в [.filename]#/etc/ttys#, вы можете отправить процессу `init` сигнал HUP перечитать файл. Используйте команду
+
+[source,bash]
+....
+# kill -HUP 1
+....
+
+для отправки сигнала. Если вы настраиваете систему в первый раз, то возможно захотите подождать, пока модем(ы) правильно настроятся и соединятся перед отправкой сигнала `init`.
+
+===== Настройка фиксированной скорости
+
+Для настройки соединения с фиксированной скоростью, в файле [.filename]#ttys# должна быть запись с фиксированной скоростью для `getty`. Для модема, скорость порта которого фиксирована на значении 19.2 Кбит/с, строка в [.filename]#ttys# может выглядеть так:
+
+[.programlisting]
+....
+ttyd0 "/usr/libexec/getty std.19200" dialup on
+....
+
+Если скорость модема фиксирована на другом значении, подставьте соответствующее значение в `std._speed_` вместо `std.19200`. Убедитесь, что вы используете тип, описанный в [.filename]#/etc/gettytab#.
+
+===== Настройка переменной скорости
+
+В настройке с переменной скоростью, запись в [.filename]#ttys# должна обращаться к соответствующей "auto-baud" (sic) записи в [.filename]#/etc/gettytab#. Например, если вы добавите предложенную выше запись для подключения модема с переменной скоростью, которая начинается с 19.2 Кбит/с (запись в [.filename]#gettytab# начинается с `V19200`), запись в [.filename]#ttys# может выглядеть так:
+
+[.programlisting]
+....
+ttyd0 "/usr/libexec/getty V19200" dialup on
+....
+
+==== [.filename]#/etc/rc.d/serial#
+
+Для высокоскоростных модемов, таких как V.32, V.32bis и V.34, требуется использование аппаратного контроля передачи (`RTS/CTS`). Вы можете добавить команды `stty` к файлу [.filename]#/etc/rc.d/serial# для установки флага аппаратного контроля передачи в ядре FreeBSD для модемных портов.
+
+Например, для установки флага `termios crtscts` на последовательном порту номер 1 ([.filename]#COM2#) при инициализации устройств для входящей и исходящей связи, в [.filename]##/etc/rc.d/serial##должны быть добавлены следующие строки:
+
+[.programlisting]
+....
+# Serial port initial configuration
+stty -f /dev/ttyd1.init crtscts
+stty -f /dev/cuad1.init crtscts
+....
+
+=== Настройка модема
+
+Если параметры вашего модема могут быть сохранены в энергонезависимой памяти, потребуется использовать терминальную программу (например, Telix под MS-DOS(R) или `tip` под FreeBSD) для установки параметров. Подсоединитесь к модему, используя ту же скорость соединения, которую использует `getty` в качестве начальной скорости, и настройте модем для соответствия следующим требованиям:
+
+* CD включен после соединения
+* DTR включен во время работы; сброс DTR отключает линию и переводит модем в начальное состояние
+* CTS контроль переданных данных
+* Контроль потока XON/XOFF отключен
+* RTS контроль принятых данных
+* "Тихий" режим (без кодов возврата)
+* Эхо команд отключено
+
+Прочтите документацию на модем для определения какие команды и/или DIP переключатели требуются чтобы установить эти настройки.
+
+Например, для установки вышеуказанных параметров на внешнем 14,400 модеме U.S. Robotics(R) Sportster(R), требуется отправить модему следующие команды:
+
+[.programlisting]
+....
+ATZ
+AT&C1&D2&H1&I0&R2&W
+....
+
+Вы, возможно, захотите настроить и другие параметры модема, такие как использование сжатия V.42bis и/или MNP5.
+
+Внешний U.S. Robotics(R) Sportster(R) 14,400 модем также снабжен некоторыми DIP переключателями, которые требуется установить; для других модемов эти настройки могут быть использованы в качестве примера:
+
+* Переключатель 1: вверх - нормальный DTR
+* Переключатель 2: N/A (визуальные коды возврата/числовые коды возврата)
+* Переключатель 3: вверх - подавление кодов возврата
+* Переключатель 4: вниз - без эхо, offline команды
+* Переключатель 5: вверх - авто ответ
+* Переключатель 6: вверх - нормальный контроль несущей
+* Переключатель 7: вверх - загрузить установки по умолчанию из NVRAM
+* Переключатель 8: N/A (Smart/Dumb режимы)
+
+Коды возврата должны быть отключены/подавлены для устранения проблем, которые могут возникнуть, если `getty` ошибочно выдаст приглашение `login:` модему в командном режиме и модем вернет (echo) эту команду или код возврата. Эта последовательность может привести к дополнительному и бессмысленному обмену командами между `getty` и модемом.
+
+==== Настройка фиксированной скорости
+
+Для настройки фиксированной скорости вам потребуется настроить модем с поддержкой постоянной скорости обмена данными модем-компьютер независимо от скорости соединения. На внешнем модеме U.S. Robotics(R) Sportster(R) 14,400 эти команды зафиксируют скорость передачи модем-компьютер на скорости, которая установлена при выполнении команды:
+
+[.programlisting]
+....
+ATZ
+AT&B1&W
+....
+
+==== Настройка переменной скорости
+
+Для настройки переменной скорости вам потребуется настроить модем с поддержкой изменения скорости передачи данных через последовательный порт в соответствии через скоростью соединения. Следующие команды зафиксируют скорость передачи данных с коррекцией ошибок внешнего модема U.S. Robotics(R) Sportster(R) 14,400 на значении, которое установлено при выполнении команды, но сделают возможным изменение скорости последовательного порта для соединений без коррекции ошибок:
+
+[.programlisting]
+....
+ATZ
+AT&B2&W
+....
+
+==== Проверка настроек модема
+
+Большинство высокоскоростных модемов предоставляют команды для просмотра текущих параметров модема в виде, отчасти приспособленном для чтения. Для внешних модемов U.S. Robotics(R) Sportster(R) 14,400 команда `ATI5` отображает установки, сохраненные в энергонезависимой памяти. Для просмотра действующих параметров модема (с учетом положения DIP переключателей), используйте команду `ATZ`, а затем `ATI4`.
+
+Если ваш модем другого производителя, проверьте руководство к модему для аккуратной проверки параметров настройки модема.
+
+=== Решение проблем
+
+Вот несколько шагов, которые нужно выполнить для проверки настроек.
+
+==== Проверьте систему FreeBSD
+
+Подсоедините модем к системе FreeBSD, загрузите систему, и, если на модеме есть индикаторы, посмотрите, загорелся ли индикатор DTR при появлении приглашения `login:` на системной консоли - если он загорелся, это означает, что FreeBSD запустила процесс `getty` на соответствующем коммуникационном порту и модем ожидает входящего звонка.
+
+Если индикатор DTR не загорелся, войдите на консоль системы FreeBSD и выполните команду `ps ax`, чтобы увидеть, пытается ли FreeBSD запустить процесс `getty` на соответствующем порту. Вы должны увидеть строки вроде этих среди показанных процессов:
+
+[source,bash]
+....
+ 114 ?? I 0:00.10 /usr/libexec/getty V19200 ttyd0
+ 115 ?? I 0:00.10 /usr/libexec/getty V19200 ttyd1
+....
+
+Если вы видите что-то другое, вроде этого:
+
+[source,bash]
+....
+ 114 d0 I 0:00.10 /usr/libexec/getty V19200 ttyd0
+....
+
+и модем все еще не принимает звонок, это означает, что `getty` завершила открытие коммуникационного порта. Это может означать проблему с кабелем или неправильную настройку модема, поскольку `getty` не должна открывать коммуникационный порт, пока модем не установит CD (обнаружение несущей).
+
+Если вы не видите процессов `getty`, ожидающих открытия соответствующего порта [.filename]#ttydN#, внимательно проверьте записи в [.filename]#/etc/ttys# и попробуйте найти ошибки, если они есть. Проверьте также лог файл [.filename]#/var/log/messages#, нет ли там сообщений от `init` или `getty`, имеющих отношение к проблеме. Если сообщения есть, проверьте еще раз файлы настройки [.filename]#/etc/ttys# и [.filename]#/etc/gettytab#, как и соответствующие специальные файлы устройств [.filename]#/dev/ttydN#, чтобы обнаружить ошибки, отсутствующие записи или отсутствующие специальные файлы устройств.
+
+==== Попробуйте позвонить на модем
+
+Попробуйте дозвониться до системы; убедитесь, что используете 8 бит без четности и 1 стоп бит на удаленной системе. Если вы не получите приглашение сразу, или получите случайные данные, попробуйте нажимать Enter примерно раз в секунду. Если вы все еще не видите приглашения `login:` после нескольких попыток, попробуйте отправить команду `BREAK`. Если вы используете для дозвона высокоскоростной модем, попробуйте позвонить еще раз после фиксирования скорости интерфейса дозванивающегося модема (например, с помощью команды `AT&B1` для модема U.S. Robotics(R) Sportster(R)).
+
+Если вы все еще не можете получить приглашение `login:`, проверьте [.filename]#/etc/gettytab# еще раз и убедитесь, что
+
+* Имя параметра `getty`, указанного в [.filename]#/etc/ttys#, совпадает с именем параметра в [.filename]#/etc/gettytab#
+* Каждая запись `nx=` соответствует имени другой записи в [.filename]#gettytab#
+* Каждая запись `tc=` соответствует имени другой записи в [.filename]#gettytab#
+
+Если система FreeBSD не отвечает на звонок, убедитесь, что модем настроен для ответа на звонок при включении DTR. Если модем настроен правильно, проверьте, что DTR включается, взглянув на индикаторы модема (если они есть).
+
+Если вы проверили все несколько раз и все еще не добились результата, сделайте перерыв и вернитесь к настройкам позже. Если опять ничего не получилось, возможно вам потребуется отправить письмо в {freebsd-questions}, описав модем и возникшую проблему, участники рассылки попробуют помочь вам.
+
+[[dialout]]
+== Исходящие соединения по модему
+
+Текст, приведенный ниже, это советы, позволяющие настроить ваш хост для доступа к другому компьютеру через модем. Они подходят для установления терминальной сессии с удаленным хостом.
+
+Это подходит для входа на BBS.
+
+Этот вид соединения может очень выручить, если требуется получить файл из интернет и есть проблемы с PPP. Если вам требуется зайти куда-то по FTP, а PPP не работает, используйте терминальную сессию для получения файла по FTP. Затем используйте zmodem для сброса его на свой компьютер.
+
+=== Мой модем Stock Hayes не поддерживается, что я могу сделать?
+
+На самом деле, страница руководства для `tip` устарела. Встроенная поддержка generic Hayes уже есть. Используйте `at=hayes` в файле [.filename]#/etc/remote#.
+
+Драйвер Hayes не умеет работать с некоторыми расширенными возможностями более новых модемов - сообщения вроде `BUSY`, `NO DIALTONE`, или `CONNECT 115200`. Вы должны отключить эти сообщения при использовании `tip` (с помощью `ATX0&W`).
+
+Таймаут дозвона для `tip` составляет 60 секунд. Ваш модем должен использовать меньшее значение, или `tip` решит, что возникли проблемы со связью. Попробуйте `ATS7=45&W`.
+
+[NOTE]
+====
+Оригинальная `tip` не полностью поддерживает модемы Hayes. Решить это проблему можно отредактировав файл [.filename]#tipconf.h# в каталоге [.filename]#/usr/src/usr.bin/tip/tip#. Конечно, для этого вам потребуются исходные тексты.
+
+Замените строку `#define HAYES 0` на `#define HAYES 1`. Затем выполните `make` и `make install`. После этого все должно работать отлично.
+====
+
+[[direct-at]]
+=== Как нужно выполнять команды AT?
+
+Сделайте то, что называется "прямой" записью в файле [.filename]#/etc/remote#. Например, если модем подключен к первому последовательному порту, [.filename]#/dev/cuad0#, добавьте следующую строку:
+
+[.programlisting]
+....
+cuad0:dv=/dev/cuad0:br#19200:pa=none
+....
+
+Используйте для br наибольшее значение bps, поддерживаемое модемом. Для подключения к модему выполните `tip cuad0`.
+
+Или используйте `cu` под `root` так:
+
+[source,bash]
+....
+# cu -lline -sspeed
+....
+
+_line_ это последовательный порт (например [.filename]#/dev/cuad0#), а _speed_ это скорость (например `57600`). После ввода команд AT наберите kbd:[~.] для выхода.
+
+=== Знак `@` не работает для pn!
+
+Знак `@` в телефонном номере указывает `tip` взять телефонный номер из [.filename]#/etc/phones#. Но знак `@` это также специальный символ в таких файлах как [.filename]#/etc/remote#. Экранируйте его с помощью обратной косой черты:
+
+[.programlisting]
+....
+pn=\@
+....
+
+=== Как я могу позвонить по телефонному номеру из командной строки?
+
+Поместите так называемую "generic" запись в файл [.filename]#/etc/remote#. Например:
+
+[.programlisting]
+....
+tip115200|Dial any phone number at 115200 bps:\
+ :dv=/dev/cuad0:br#115200:at=hayes:pa=none:du:
+tip57600|Dial any phone number at 57600 bps:\
+ :dv=/dev/cuad0:br#57600:at=hayes:pa=none:du:
+....
+
+Затем вы можете сделать следующее:
+
+[source,bash]
+....
+# tip -115200 5551234
+....
+
+Если вы предпочитаете `cu` команде `tip`, используйте generic запись для `cu`:
+
+[.programlisting]
+....
+cu115200|Use cu to dial any number at 115200bps:\
+ :dv=/dev/cuad1:br#57600:at=hayes:pa=none:du:
+....
+
+и выполните:
+
+[source,bash]
+....
+# cu 5551234 -s 115200
+....
+
+=== Должен ли я вводить значение bps каждый раз?
+
+Создайте запись `tip1200` или `cu1200`, но используйте то значение bps, которое записано в поле br. `tip` считает, что хорошее значение по умолчанию это 1200 bps, поэтому обращается к записи `tip1200`. Тем не менее, значение bps будет другим.
+
+=== Я получаю доступ ко множеству хостов через терминальный сервер
+
+Вместо ожидания соединения и ввода каждый раз `CONNECT <host>`, используйте возможность `tip cm`. Вот пример записи в [.filename]#/etc/remote#:
+
+[.programlisting]
+....
+pain|pain.deep13.com|Forrester's machine:\
+ :cm=CONNECT pain\n:tc=deep13:
+muffin|muffin.deep13.com|Frank's machine:\
+ :cm=CONNECT muffin\n:tc=deep13:
+deep13:Gizmonics Institute terminal server:\
+ :dv=/dev/cuad2:br#38400:at=hayes:du:pa=none:pn=5551234:
+....
+
+Она позволит вам вводить `tip pain` или `tip muffin` для соединения с хостами pain или muffin, и `tip deep13` для доступа к терминальному серверу.
+
+=== Может ли tip соединяться более через одну линию для каждого сайта?
+
+Эта проблема часто возникает в университете, где несколько модемных линий и несколько тысяч студентов, пытающихся их использовать.
+
+Создайте запись для университета в [.filename]#/etc/remote# и используйте `@` для `pn`:
+
+[.programlisting]
+....
+big-university:\
+ :pn=\@:tc=dialout
+dialout:\
+ :dv=/dev/cuad3:br#9600:at=courier:du:pa=none:
+....
+
+Затем, создайте список телефонов для университета в [.filename]#/etc/phones#:
+
+[.programlisting]
+....
+big-university 5551111
+big-university 5551112
+big-university 5551113
+big-university 5551114
+....
+
+`tip` попробует связаться с каждым в указанном порядке, затем прекратит попытки. Если вы хотите продолжать соединяться, запустите `tip` в цикле.
+
+=== Почему я должен дважды нажать kbd:[Ctrl+P] для отправки kbd:[Ctrl+P] один раз?
+
+kbd:[Ctrl+P] это "управляющий" символ по умолчанию, используемый для указания `tip` того, что далее идут символьные данные. Вы можете сделать любой другой символ управляющим с помощью экранирования `~s`, которое означает "установить переменную".
+
+Введите `~sforce=_single-char_`, завершив ввод новой строкой. _single-char_ это любой одиночный символ. Если вы не введете _single-char_, управляющим символом станет nul, который можно получить, введя kbd:[Ctrl+2] или kbd:[Ctrl+Space]. Хорошее значение для _single-char_ это kbd:[Shift+Ctrl+6], которое используется только на некоторых терминальных серверах.
+
+Вы можете использовать в качестве управляющего символа все, что захотите, поместив его в файл [.filename]#$HOME/.tiprc#:
+
+[.programlisting]
+....
+force=<single-char>
+....
+
+=== Почему все, что я ввожу, вдруг стало отображаться в верхнем регистре??
+
+Вы нажали kbd:[Ctrl+A], "повышающий символ" `tip`, который был специально введен для тех, у кого не работает клавиша caps-lock. Используйте `~s` как в примере выше для установки переменной `raisechar` в подходящее значение. Фактически, вы можете установить ее в то же значение, что и управляющий символ, если не собираетесь использовать ни один из них.
+
+Вот пример .tiprc, отлично подходящий для пользователей Emacs, которым часто требуется вводить kbd:[Ctrl+2] и kbd:[Ctrl+A]:
+
+[.programlisting]
+....
+force=^^
+raisechar=^^
+....
+
+Символ ^^ это kbd:[Shift+Ctrl+6].
+
+=== Могу ли я передавать файлы с помощью `tip`?
+
+Если вы соединяетесь с другой системой UNIX(R), возможны передача и прием файлов с помощью команды `~p` (put) и `~t` (take). Эти команды запускают `cat` и `echo` в удаленной системе для приема и передачи файлов. Синтаксис следующий:
+
+`~p` local-file [ remote-file ]
+
+`~t` remote-file [ local-file ]
+
+Коррекции ошибок нет, поэтому возможно лучше использовать другой протокол, например zmodem.
+
+=== Как мне запустить zmodem с `tip`?
+
+Для получения файла запустите отправляющую программу на удаленной стороне. Затем, наберите `~C rz` для начала локального приема файла.
+
+Для отправки файлов запустите принимающую программу на удаленной стороне. Затем, наберите `~C sz _файлы_` для отправки их на удаленную систему.
+
+[[serialconsole-setup]]
+== Настройка последовательной консоли
+
+[[serialconsole-intro]]
+=== Введение
+
+FreeBSD может загружаться при использовании в качестве консоли текстового терминала на последовательном порту. Такая конфигурация может быть полезна в двух случаях: для системных администраторов, устанавливающих FreeBSD на компьютеры без подключенных клавиатуры или монитора, и для разработчиков, производящих отладку ядра или драйверов устройств.
+
+Как описано в crossref:boot[boot, Процесс загрузки FreeBSD], процесс загрузки FreeBSD состоит из трех стадий. Первые две стадии реализованы в блоке загрузки, находящемся в начале слайса FreeBSD на загрузочном диске. На третей стадии загрузочный блок запускает загрузчик ([.filename]#/boot/loader#).
+
+Для настройки последовательной консоли вам потребуется настроить блок загрузки, загрузчик и ядро.
+
+[[serialconsole-howto-fast]]
+=== Настройка последовательной консоли, краткая версия
+
+В этом разделе предполагается, что вы используете настройки по умолчанию и просто хотите увидеть краткий обзор настройки последовательной консоли.
+
+[.procedure]
+====
+. Соедините кабелем последовательный порт COM1 и управляющий терминал.
+. Для того, чтобы сообщения в процессе загрузки выводились в последовательную консоль, выполните от имени суперпользователя команду
++
+[source,bash]
+....
+# echo 'console="comconsole"' >> /boot/loader.conf
+....
++
+. Отредактируйте [.filename]#/etc/ttys# и измените `off` на `on` и `dialup` на `vt100` для записи `ttyd0`. В противном случае для входа с последовательной консоли не будет требоваться пароль, что может являться проблемой с точки зрения безопасности.
+. Перезагрузите систему и убедитесь, что последовательная консоль активировалась.
+====
+
+Если вам требуется иная конфигурация, обратитесь к более подробному описанию в разделе <<serialconsole-howto>>.
+
+[[serialconsole-howto]]
+=== Настройка последовательной консоли
+
+[.procedure]
+====
+
+. Подготовьте кабель.
++
+Вам потребуется нуль-модемный или стандартный последовательный кабель и нуль-модемный адаптер. Обратитесь к <<serial-cables-ports>>, где рассматриваются последовательные кабели.
+. Отключите клавиатуру.
++
+Большинство систем PC тестируют клавиатуру во время включения (POST) и выдают ошибку если клавиатура не обнаружена. Некоторые системы при отсутствии клавиатуры выдают звуковой сигнал и не загружаются пока клавиатура не будет подключена.
++
+Если компьютер сообщает об ошибке, но все же загружается, вам не потребуется делать что-то еще. (Некоторые компьютеры с Phoenix BIOS просто сообщают `Keyboard failed` и продолжают загрузку).
++
+Если компьютер не загружается без клавиатуры, вам потребуется настроить BIOS так, чтобы отсутствие клавиатуры игнорировалось (если это возможно). Обратитесь к руководству по материнской плате за деталями о том, как это сделать.
++
+[TIP]
+======
+
+Установите параметр клавиатуры в настройках BIOS в значение "Not installed". При этом вы сможете продолжать использовать клавиатуру. Все, что делает этот параметр - указывает BIOS не тестировать клавиатуру во время загрузки, поэтому ее отсутствие не вызывает ошибки. Вы можете оставить клавиатуру подключенной, даже если с флагом "Not installed", и она все еще будет работать.
+======
++
+[NOTE]
+======
+Если в к системе подключена PS/2(R) мышь, отключите ее, как и клавиатуру. Мышь PS/2(R) использует часть оборудования совместно с клавиатурой, поэтому если оставить ее подключенной, тестирование клавиатуры может ошибочно выдать наличие последней. Например, система Gateway 2000 Pentium 90 MHz ведет себя именно так. К тому же, это не проблема, поскольку мышь без клавиатуры как правило не нужна.
+======
++
+. Подключите текстовый терминал к [.filename]#COM1# ([.filename]#sio0#).
++
+Если у вас нет текстового терминала, используйте старый PC/XT с модемной программой, или последовательный порт на другом компьютере UNIX(R). Если порта [.filename]#COM1# ([.filename]#sio0#) нет, подключите его. На данный момент нет способа использовать другой порт вместо [.filename]#COM1# без перекомпиляции загрузочных блоков. Если вы уже используете [.filename]#COM1# для подключения другого устройства, временно удалите это устройство установите новый загрузочный блок и ядро как только FreeBSD заработает. (Предполагается, что [.filename]#COM1# будет доступен на файловом/вычислительном/терминальном сервере в любом случае; если вам действительно требуется [.filename]#COM1# для чего-то другого (и вы не можете переключить это на [.filename]#COM2# ([.filename]#sio1#)), возможно не стоит беспокоиться об этом сейчас.)
+. Убедитесь, что в файле настройки ядра установлены соответствующие флаги для [.filename]#COM1# ([.filename]#sio0#).
++
+Подходящие флаги такие:
++
+`0x10`:::
+Включает поддержку консоли для этого устройства. Если установлен этот флаг, другие игнорируются. На данный момент поддержка консоли может быть включена не более чем на одном устройстве; предпочтительно на первом (в соответствии с порядком в конфигурационном файле) с установкой этого флага. Эта опция сама по себе не сделает последовательный порт консолью. Установите следующий флаг или используйте опцию `-h`, описанную ниже, вместе с этим флагом.
+
+`0x20`:::
+Включает поддержку консоли на устройстве (если нет другой консоли с более высоким приоритетом), независимо от наличия описываемой ниже опции `-h`. Флаг `0x20` должен использоваться вместе с флагом `0x10`.
+
+`0x40`:::
+Резервирует это устройство (совместно с флагом `0x10`) и делает устройство недоступным для обычной работы. Вы не должны использовать этот флаг для устройства последовательного порта, которое будет использоваться в качестве последовательной консоли. Используйте этот флаг только если устройство предназначено для удаленной отладки ядра. Обратитесь к link:{developers-handbook}[Руководству для разработчиков] за дополнительной информацией по удаленной отладке.
++
+Пример:
++
+[.programlisting]
+....
+device sio0 at isa? port IO_COM1 flags 0x10 irq 4
+....
++
+Обратитесь к странице справочника man:sio[4] за подробностями.
++
+Если флаги не были установлены, вам потребуется запустить UserConfig (на другой консоли) или пересобрать ядро.
+. Создайте [.filename]#boot.config# в корневом каталоге раздела `a` на загрузочном диске.
++
+Этот файл сообщит загрузочному блоку способ загрузки системы. Для активации последовательной консоли вам потребуется одна или несколько следующих опций - несколько опций могут быть указаны на одной строке:
++
+`-h`:::
+Переключает внутреннюю и последовательную консоль. Вы можете использовать ее для переключения устройств консоли. Например, при загрузке с внутренней (видео) консоли, вы можете использовать `-h` для запуска загрузчика и ядра с использованием последовательного порта в качестве устройства консоли. При загрузке с последовательной консоли, вы можете использовать опцию `-h` для указания загрузчику и ядру использовать в качестве консоли видео дисплей.
+
+`-D`:::
+Переключает одно- и двухконсольную конфигурации. В одноконсольной конфигурации консоль может быть либо внутренней (видео дисплей), либо последовательным портом, в зависимости от состояния опции `-h`. В двухконсольной конфигурации и видео дисплей и последовательный порт станут консолями одновременно, независимо от состояния опции `-h`. Имейте ввиду, что конфигурация с двумя консолями работает только во время работы загрузочного блока. Как только управление переходит к загрузчику, остается только одна консоль, указанная опцией `-h`.
+
+`-P`:::
+Указывает загрузочному блоку протестировать клавиатуру. Если клавиатура не найдена, автоматически устанавливаются параметры `-D` и `-h`.
++
+[NOTE]
+======
+По причине ограничений на размер в существующей версии загрузочного блока, опция `-P` может протестировать только расширенные клавиатуры. Клавиатуры с менее чем 101 клавишами (и без клавиш F11 и F12) могут быть не обнаружены. Клавиатуры некоторых лэптопов могут быть не найдены из-за этого ограничения. Если это случилось, вы не сможете использовать опцию `-P`. К сожалению, не существует обходного пути решения этой проблемы.
+======
++
+Используйте или опцию `-P` для автоматического выбора консоли, или опцию `-h` для активации последовательной консоли.
++
+Вы можете включить также другие опции, описанные в man:boot[8].
++
+Опции, за исключением `-P`, будут переданы загрузчику ([.filename]#/boot/loader#). Загрузчик определит будет ли консолью внутреннее видео устройство или последовательный порт, проверив только состояние опции `-h`. Это означает, что если вы включите в [.filename]#/boot.config# опцию `-D`, но не `-h`, то сможете использовать консоль только во время работы загрузочного блока; загрузчик будет использовать внутреннее видео устройство в качестве консоли.
+. Загрузите компьютер.
++
+Когда вы включите компьютер FreeBSD, загрузочный блок выведет содержимое [.filename]#/boot.config# на консоль. Например:
++
+[source,bash]
+....
+/boot.config: -P
+Keyboard: no
+....
++
+Вторая строка появится только если вы поместите `-P` в [.filename]#/boot.config# и отражает наличие/отсутствие клавиатуры. Эти сообщения выводятся либо на последовательную, либо на внутреннюю консоль, или на обе, в зависимости от параметров в [.filename]#/boot.config#.
++
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+<| Опции
+<| Сообщения выводятся на
+
+|нет
+|внутренняя консоль
+
+|`-h`
+|последовательная консоль
+
+|`-D`
+|последовательная и внутренняя консоли
+
+|`-Dh`
+|последовательная и внутренняя консоли
+
+|`-P`, клавиатура присутствует
+|внутренняя консоль
+
+|`-P`, клавиатура отсутствует
+|последовательная консоль
+|===
++
+После вывода вышеприведенных сообщений, происходит небольшая пауза перед тем, как запускается загрузчик и на консоли появляются следующие сообщения. В нормальной ситуации вам не потребуется прерывать загрузку в этот момент, но это можно сделать, чтобы убедиться, что все настроено правильно.
++
+Нажмите на консоли любую клавишу кроме Enter для прерывания процесса загрузки. Загрузочный блок выдаст приглашение к дальнейшим действиям. Оно выглядит примерно так:
++
+[source,bash]
+....
+>> FreeBSD/i386 BOOT
+Default: 0:ad(0,a)/boot/loader
+boot:
+....
++
+Убедитесь, что сообщение выше появилось на последовательной, внутренней консоли или на обеих, в зависимости от опций в [.filename]#/boot.config#. Если сообщение появилось там, где должно было появиться, нажмите Enter для продолжения процесса загрузки.
++
+Если вам нужна последовательная консоль, но на терминале не видно приглашения, это означает проблемы с настройками. Введите `-h` и нажмите Enter/Return (если это возможно) для указания загрузочному блоку (а также загрузчику и ядру) выбрать последовательный порт в качестве консоли. Когда система загрузится, проверьте настройки еще раз и определите, что было сделано неправильно.
+====
+
+После запуска загрузчика и перехода в третью стадию процесса загрузки вы все еще можете переключиться между внутренней консолью и последовательной консолью путем установки соответствующих переменных окружения в загрузчике. Обращайтесь к разделу <<serialconsole-loader>>.
+
+[[serialconsole-summary]]
+=== Итоги
+
+Здесь приведены краткие итоги по различным настройкам, рассмотренным в этом разделе и выбираемым в соответствии с ними консолям.
+
+==== Вариант 1: вы устанавливаете для [.filename]#sio0# флаги 0x10
+
+[.programlisting]
+....
+device sio0 at isa? port IO_COM1 flags 0x10 irq 4
+....
+
+[.informaltable]
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+<| Параметры в /boot.config
+<| Консоль для загрузочного блока
+<| Консоль для загрузчика
+<| Консоль для ядра
+
+|нет
+|внутренняя
+|внутренняя
+|внутренняя
+
+|`-h`
+|последовательная
+|последовательная
+|последовательная
+
+|`-D`
+|последовательная и внутренняя
+|внутренняя
+|внутренняя
+
+|`-Dh`
+|последовательная и внутренняя
+|последовательная
+|последовательная
+
+|`-P`, клавиатура присутствует
+|внутренняя
+|внутренняя
+|внутренняя
+
+|`-P`, клавиатура отсутствует
+|последовательная и внутренняя
+|последовательная
+|последовательная
+|===
+
+==== Вариант 2: вы устанавливаете для [.filename]#sio0# флаги 0x30
+
+[.programlisting]
+....
+device sio0 at isa? port IO_COM1 flags 0x30 irq 4
+....
+
+[.informaltable]
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+<| Параметры в /boot.config
+<| Консоль для загрузочного блока
+<| Консоль для загрузчика
+<| Консоль для ядра
+
+|нет
+|внутренняя
+|внутренняя
+|последовательная
+
+|`-h`
+|последовательная
+|последовательная
+|последовательная
+
+|`-D`
+|последовательная и внутренняя
+|внутренняя
+|последовательная
+
+|`-Dh`
+|последовательная и внутренняя
+|последовательная
+|последовательная
+
+|`-P`, клавиатура присутствует
+|внутренняя
+|внутренняя
+|последовательная
+
+|`-P`, клавиатура отсутствует
+|последовательная и внутренняя
+|последовательная
+|последовательная
+|===
+
+[[serialconsole-tips]]
+=== Приемы работы с последовательной консолью
+
+==== Установка более высокой скорости порта
+
+По умолчанию, последовательный порт настроен так: 9600 бит/с, 8 бит, без четности, 1 стоп бит. Если вам необходимо изменить скорость, потребуется перекомпиляция как минимум загрузочных блоков. Добавьте следующую строку к [.filename]#/etc/make.conf# и скомпилируйте новый загрузочный блок:
+
+[.programlisting]
+....
+BOOT_COMCONSOLE_SPEED=19200
+....
+
+Обратитесь к <<serialconsole-com2>> за подробными инструкциями по сборке и установке новых загрузочных блоков.
+
+Если последовательная консоль настраивается не путем установки параметра `-h`, или последовательная консоль, используемая ядром, отличается от той, что используется загрузочным блоком, потребуется добавить следующие опции к файлу настройки ядра и собрать новое ядро:
+
+[.programlisting]
+....
+options CONSPEED=19200
+....
+
+[[serialconsole-com2]]
+==== Использование для консоли другого последовательного порта вместо [.filename]#sio0#
+
+Использование другого последовательного порта вместо [.filename]#sio0# для консоли потребует кое-какой перекомпиляции. Если вы по каким-либо причинам хотите использовать другой последовательный порт, перекомпилируйте загрузочный блок, загрузчик и ядро согласно приведенной ниже инструкции.
+
+[.procedure]
+====
+
+. Получите исходные тексты ядра (глава crossref:cutting-edge[updating-upgrading, Обновление системы и смена версии FreeBSD])
+. Отредактируйте [.filename]#/etc/make.conf# и установите `BOOT_COMCONSOLE_PORT` в соответствии с адресом порта, который вы хотите использовать (0x3F8, 0x2F8, 0x3E8 или 0x2E8). Могут быть использованы только устройства от [.filename]#sio0# до [.filename]#sio3# (от [.filename]#COM1# до [.filename]#COM4#); мультипортовые последовательные карты не будут работать. Установка прерываний не требуется.
+. Создайте файл настройки ядра и добавьте соответствующие флаги для порта, который планируется использовать. Например, если вы хотите использовать для консоли [.filename]#sio1# ([.filename]#COM2#):
++
+[.programlisting]
+....
+device sio1 at isa? port IO_COM2 flags 0x10 irq 3
+....
++
+или
++
+[.programlisting]
+....
+device sio1 at isa? port IO_COM2 flags 0x30 irq 3
+....
++
+Флаги для других последовательных устройств не устанавливайте.
+. Соберите и установите загрузочный блок и загрузчик:
++
+[source,bash]
+....
+# cd /sys/boot
+# make clean
+# make
+# make install
+....
++
+. Соберите и установите ядро.
+. Запишите загрузочный блок на загрузочный диск с помощью man:bsdlabel[8] и загрузитесь с новым ядром.
+====
+
+[[serialconsole-ddb]]
+==== Вход в отладчик DDB с последовательной линии
+
+Если вы хотите войти в отладчик ядра с последовательной консоли (полезно для удаленной диагностики, но опасно если вы введете неправильный BREAK на последовательном порту!), потребуется собрать ядро со следующими параметрами:
+
+[.programlisting]
+....
+options BREAK_TO_DEBUGGER
+options DDB
+....
+
+==== Получение приглашения на последовательной консоли
+
+Хотя это не обязательно, вам может потребоваться приглашение _login_ по последовательной линии, в дополнение к уже доступным загрузочным сообщениям и отладочной сессии ядра. Здесь описано как сделать это.
+
+Откройте файл [.filename]#/etc/ttys# с помощью редактора и найдите строки:
+
+[.programlisting]
+....
+ttyd0 "/usr/libexec/getty std.9600" unknown off secure
+ttyd1 "/usr/libexec/getty std.9600" unknown off secure
+ttyd2 "/usr/libexec/getty std.9600" unknown off secure
+ttyd3 "/usr/libexec/getty std.9600" unknown off secure
+....
+
+Строки от `ttyd0` до `ttyd3` соответствуют портам от [.filename]#COM1# до [.filename]#COM4#. Измените `off` на `on` для требуемого порта. Если вы изменили скорость последовательного порта, может потребоваться изменить `std.9600` для соответствия текущим настройкам, например `std.19200`.
+
+Возможно, вы захотите заменить тип терминала `unknown` на тип реально используемого терминала.
+
+После редактирования файла потребуется выполнить `kill -HUP 1` для включения новых настроек.
+
+[[serialconsole-loader]]
+=== Изменение консоли из загрузчика
+
+Предыдущий раздел описывает настройку последовательной консоли изменением параметров загрузочного блока. Этот раздел показывает, как указать консоль, вводя команды и переменные окружения для загрузчика. Поскольку загрузчик загружается после загрузочного блока, на третьей стадии загрузочного процесса, настройки загрузчика превалируют над настройками загрузочного блока.
+
+==== Настройка последовательной консоли
+
+Вы можете прямо указать загрузчику и ядру использовать последовательную консоль, записав одну строку в [.filename]#/boot/loader.rc#:
+
+[.programlisting]
+....
+set console="comconsole"
+....
+
+Это сработает независимо от настроек загрузочного блока, рассмотренных в предыдущем разделе.
+
+Поместите эту строку в самое начало [.filename]#/boot/loader.rc#, чтобы увидеть на последовательной консоли все загрузочные сообщения.
+
+Вы можете также указать внутреннюю консоль:
+
+[.programlisting]
+....
+set console="vidconsole"
+....
+
+Если вы не установите переменную загрузчика `console`, загрузчик, а затем и ядро будут использовать ту консоль, которая установлена параметром `-h` для загрузочного блока.
+
+В версиях 3.2 или выше, вы можете указать консоль в [.filename]#/boot/loader.conf.local# или [.filename]#/boot/loader.conf# вместо [.filename]#/boot/loader.rc#. С этим методом [.filename]#/boot/loader.rc# должен выглядеть примерно так:
+
+[.programlisting]
+....
+include /boot/loader.4th
+start
+....
+
+Затем, создайте [.filename]#/boot/loader.conf.local# и поместите туда следующую строку.
+
+[.programlisting]
+....
+console=comconsole
+....
+
+или
+
+[.programlisting]
+....
+console=vidconsole
+....
+
+Обращайтесь к man:loader.conf[5] за дополнительной информацией.
+
+[NOTE]
+====
+На данный момент у загрузчика нет параметра, эквивалентного параметру `-P` загрузочного блока и нет способа автоматического выбора внутренней и последовательной консоли в зависимости от наличия клавиатуры.
+====
+
+==== Использование для консоли отличного от [.filename]#sio0# последовательного порта
+
+Вам потребуется перекомпилировать загрузчик для использования отличного от [.filename]#sio0# последовательного порта в качестве консоли. Следуйте процедуре, описанной в разделе <<serialconsole-com2>>.
+
+[[serialconsole-caveats]]
+=== Предостережения
+
+Идея в том, чтобы настроить выделенный сервер, который не требует графического оборудования или подсоединенной клавиатуры. К сожалению, хотя многие системы способны загрузиться без клавиатуры, есть совсем немного систем, способных загрузиться без графического адаптера. Компьютеры с AMI BIOS могут быть настроены для загрузки без графического адаптера простой установкой параметра настройки CMOS "graphics adapter" в значение "Not installed".
+
+Однако, многие компьютеры не поддерживают этот параметр и не смогут загрузиться без графического оборудования. Для этих компьютеров вам потребуется оставить подключенной любую графическую карту (даже если это просто старая моно карта), хотя монитор и не подключен.
diff --git a/documentation/content/ru/books/handbook/x11/_index.adoc b/documentation/content/ru/books/handbook/x11/_index.adoc
new file mode 100644
index 0000000000..0288128e18
--- /dev/null
+++ b/documentation/content/ru/books/handbook/x11/_index.adoc
@@ -0,0 +1,953 @@
+---
+title: Глава 6. X Window System
+part: Часть I. В начале
+prev: books/handbook/ports
+next: books/handbook/partii
+---
+
+[[x11]]
+= Το Σύστημα X Window
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 6
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/x11/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/x11/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/x11/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[x11-synopsis]]
+== Обзор
+
+FreeBSD использует X11 для того, чтобы дать пользователям мощный графический интерфейс. X11 является свободно доступной версией X Window System, реализованной в Xorg и XFree86(TM) (а также других программных пакетах, здесь не рассматриваемых). В версиях FreeBSD до и включая FreeBSD 5.2.1-RELEASE сервером X11 по умолчанию был XFree86(TM), выпускаемый The XFree86(TM) Project, Inc. Начиная с FreeBSD 5.3-RELEASE, официальной версией X11 по умолчанию стал Xorg, разработанный X.Org Foundation под лицензией, очень похожей на ту, которая используется FreeBSD. Под FreeBSD существуют также коммерческие X серверы.
+
+Эта глава посвящена установке и настройке X11 в системе FreeBSD, с акцентом на релиз Xorg 7.7. За информацией о настройке XFree86(TM) (в более старых релизах FreeBSD XFree86(TM) был реализацией X11 по умолчанию), или более старых релизов Xorg, всегда можно обратиться к старым версиям Руководства FreeBSD по адресу http://docs.FreeBSD.org/doc/[http://docs.FreeBSD.org/doc/].
+
+За дополнительной информацией по видео оборудованию, поддерживаемому X11, обратитесь к веб сайту http://www.x.org/[Xorg].
+
+После чтения этой главы вы будете знать:
+
+* Как установить и настроить X11.
+* О различных компонентах X Window System и их взаимодействии.
+* Как установить и использовать различные оконные менеджеры.
+* Как использовать шрифты TrueType(R) в X11.
+* Как настроить вашу систему на графический интерфейс входа (XDM).
+
+Перед чтением этой главы вам потребуется:
+
+* Узнать, как устанавливать дополнительное программное обеспечение сторонних разработчиков (crossref:ports[ports, Установка приложений. порты и пакеты]).
+
+[[x-understanding]]
+== Основы X
+
+Первое знакомство с X может оказаться чем-то вроде шока для тех, кто работал с другими графическими системами, такими, как Microsoft(R) Windows(R) или Mac OS(R).
+
+Хотя нет необходимости вникать во все детали различных компонентов X и их взаимодействия, некоторые базовые знания делают возможным использование сильных сторон X.
+
+=== Почему именно X?
+
+X не является первой оконной системой для UNIX(R), но она самая популярная из них. До работы над X команда ее разработчиков трудилась над другой оконной системой. Та система называлась "W" (от "Window"). X была просто следующей буквой в романском алфавите.
+
+X можно называть "X", "X Window System", "X11" и множеством других терминов. Факт использования названия "X Windows" для X11 может задеть интересы некоторых людей; дополнительную информацию по этому поводу можно найти на странице справочной системы man:X[7].
+
+=== Модель клиент/сервер в X
+
+X изначально разрабатывалась, чтобы быть системой, ориентированной на работу в сети с использованием модели "клиент-сервер".
+
+В модели работы X "X-сервер" работает на компьютере с клавиатурой, монитором и мышью. Область ответственности сервера включает управление дисплеем, обработку ввода с клавиатуры, мыши и других устройств ввода или вывода (например, "планшет" может быть использован в качестве устройства ввода, а видеопроектор в качестве альтернативного устройства вывода). Каждое X-приложение (например, XTerm или man:getenv[3]) является "клиентом". Клиент посылает сообщения серверу, такие, как "Пожалуйста, нарисуй окно со следующими координатами", а сервер посылает в ответ сообщения типа "Пользователь только что щёлкнул мышью на кнопке OK".
+
+В случае использования дома или в офисе, сервер и клиенты X как правило будут работать на том же самом компьютере. Однако реально возможно запускать X-сервер на менее мощном настольном компьютере, а приложения X (клиенты) на, скажем, мощной и дорогой машине, обслуживающей целый офис. В этом сценарии X-клиент и сервер общаются через сеть.
+
+Некоторых это вводит в заблуждение, потому что терминология X в точности обратна тому, что они ожидают. Они полагают, что "X-сервер" будет большой мощной машиной, стоящей на полу, а "X-клиентом" является машина, стоящая на их столах.
+
+Важно помнить, что X-сервером является машина с монитором и клавиатурой, а X-клиенты являются программами, выводящими окна.
+
+В протоколе нет ничего, что заставляет машины клиента и сервера работать под управлением одной и той же операционной системы, или даже быть одним и тем же типом компьютера. Определённо возможно запускать X-сервер в Microsoft(R) Windows(R) или Mac OS(R) от Apple, и есть множество свободно распространяемых и коммерческих приложений, которые это реализуют.
+
+=== Оконный менеджер
+
+Философия построения X очень похожа на философию построения UNIX(R), "инструменты, не политика". Это значит, что X не пытаются диктовать то, как должна быть выполнена работа. Вместо этого пользователю предоставляются инструменты, а за пользователем остается принятие решения о том, как использовать эти инструменты.
+
+Этот подход расширен в X тем, что не задается, как окна должны выглядеть на экране, как их двигать мышью, какие комбинации клавиш должны использоваться для переключения между окнами (то есть kbd:[Alt+Tab], в случае использования Microsoft(R) Windows(R)), как должны выглядеть заголовки окон, должны ли в них быть кнопки для закрытия, и прочее.
+
+Вместо этого X делегирует ответственность за это приложению, которое называется "Window Manager" (Менеджер Окон). Есть десятки оконных менеджеров для X: AfterStep, Blackbox, ctwm, Enlightenment, fvwm, Sawfish, twm, WindowMaker и другие. Каждый из этих оконных менеджеров предоставляет различные внешние виды и удобства; некоторые из них поддерживают "виртуальные рабочие столы"; некоторые из них позволяют изменять назначения комбинаций клавиш, используемых для управления рабочим столом; в некоторых есть кнопка "Start" или нечто подобное; некоторые поддерживают "темы", позволяя изменять внешний вид, поменяв тему. Эти оконные менеджеры, а также множество других, находятся в категории [.filename]#x11-wm# коллекции портов.
+
+Кроме того, оболочки KDE и GNOME имеют собственные оконные менеджеры, которые интегрированы в оболочку.
+
+Каждый оконный менеджер также имеет собственный механизм настройки; некоторые предполагают наличие вручную созданного конфигурационного файла; некоторые предоставляют графические инструменты для выполнения большинства работ по настройке; по крайней мере один (Sawfish) имеет конфигурационный файл, написанный на диалекте языка Lisp.
+
+[NOTE]
+.Политика фокусирования
+====
+Другой особенностью, за которую отвечает оконный менеджер, является "политика фокусирования" мыши. Каждая оконная система должна иметь некоторый способ выбора окна для активации получения нажатий клавиш, а также визуальную индикацию того, какое окно активно.
+
+Широко известная политика фокусировки называется "щелчок-для-фокуса" ("click-to-focus"). Эта модель используется в Microsoft(R) Windows(R), когда окно становится активным после получения щелчка мыши.
+
+X не поддерживает никакой конкретной политики фокусирования. Вместо этого менеджер окон управляет тем, какое окно владеет фокусом в каждый конкретный момент времени. Различные оконные менеджеры поддерживают разные методы фокусирования. Все они поддерживают метод щелчка для фокусирования, и большинство из них поддерживают некоторые другие методы.
+
+Самыми популярными политики фокусирования являются:
+
+фокус следует за мышью (focus-follows-mouse)::
+Фокусом владеет то окно, что находится под указателем мыши. Это не обязательно будет окно, которое находится поверх всех остальных. Фокус меняется при указании на другое окно, при этом также нет нужды щёлкать на нём.
+
+нечеткий фокус (sloppy-focus)::
+С политикой focus-follows-mouse если мышь помещается поверх корневого окна (или заднего фона), то никакое окно фокус не получает, а нажатия клавиш просто пропадают. При использовании политики нечёткого фокуса он меняется только когда курсор попадает на новое окно, но не когда уходит с текущего окна.
+
+щелчок для выбора фокуса (click-to-focus)::
+Активное окно выбирается щелчком мыши. Затем окно может быть "поднято" и появится поверх всех других окон. Все нажатия клавиш теперь будут направляться в это окно, даже если курсор переместится к другому.
+
+Многие оконные менеджеры поддерживают и другие политики, а также вариации перечисленных. Обязательно обращайтесь к документации по оконному менеджеру.
+====
+
+=== Виджеты
+
+Подход X, заключающийся в предоставлении инструментов, а не политики, распространяется и на виджеты, которые располагаются на экране в каждом приложении.
+
+"Виджет" (widget) является термином для всего в пользовательском интерфейсе, на чём можно щёлкать или каким-то образом управлять; кнопки, зависимые (radio buttons) и независимые (check boxes) опции, иконки, списки и так далее. В Microsoft(R) Windows(R) это называется "элементами управления" ("controls").
+
+Microsoft(R) Windows(R) и Mac OS(R) от Apple имеют очень жёсткую политику относительно виджетов. Предполагается, что разрабатываемые приложения обязательно должны иметь похожий внешний вид. Что касается X, то было решено, что не нужно требовать обязательного использования какого-то определённого графического стиля или набора виджетов.
+
+В результате не стоит ожидать от X-приложений похожести во внешнем виде. Существует несколько популярных наборов виджетов и их разновидностей, включая оригинальный набор виджетов Athena от MIT, Motif(R) (по образу которого был разработан набор виджетов в Microsoft(R) Windows(R), все эти скошенные углы и три разновидности серого цвета), OpenLook и другие.
+
+В большинстве появляющихся в настоящее время приложений для X будет использоваться современно выглядящий набор виджетов, либо Qt, используемый в KDE, либо GTK+, используемый проектом GNOME. В этом отношении наблюдается унификация внешнего вида рабочего стола в UNIX(R), что определённо облегчает жизнь начинающему пользователю.
+
+[[x-install]]
+== Установка X11
+
+Версией X11 по умолчанию для FreeBSD является Xorg. Xorg это сервер X дистрибутива открытой реализации X Window System, выпущенной X.Org Foundation. Xorg основан на коде XFree86(TM) 4.4RC2 и X11R6.6. Версия Xorg, доступная на данный момент из коллекции портов FreeBSD: 7.7.
+
+Для сборки и установки Xorg из Коллекции портов, выполните:
+
+[source,bash]
+....
+# cd /usr/ports/x11/xorg
+# make install clean
+....
+
+[NOTE]
+====
+Перед сборкой полной версии Xorg удостоверьтесь в наличии хотя бы 4 GB свободного места.
+====
+
+Кроме того, X11 может быть установлен непосредственно из пакетов. Бинарные пакеты, устанавливаемые man:pkg_add[1], доступны и для X11. Когда man:pkg_add[1] используется для удаленной загрузки пакетов, номер версии пакета необходимо удалить. man:pkg_add[1] автоматически установит последнюю версию приложения.
+
+Таким образом, для загрузки и установки пакета Xorg, просто наберите:
+
+[source,bash]
+....
+# pkg_add -r xorg
+....
+
+[NOTE]
+====
+В примерах выше будет установлен полный дистрибутив X11, включая серверы, клиенты, шрифты и так далее. Также доступны и отдельные пакеты и порты для различных частей X11.
+====
+
+В оставшейся части главы будет рассказано о том, как сконфигурировать X11 и настроить рабочее окружение.
+
+[[x-config]]
+== Конфигурация X11
+
+=== Перед тем, как начать
+
+Перед настройкой X11 необходима следующая информация о конфигурируемой системе:
+
+* Характеристики монитора
+* Набор микросхем, используемый в видеоадаптере
+* Объём видеопамяти
+
+Характеристики монитора используются в X11 для определения рабочего разрешения и частоты. Эти характеристики обычно могут быть получены из документации, которая прилагается к монитору или с сайта производителя. Тут нужны два диапазона значений, для частоты горизонтальной развёртки и для частоты вертикальной синхронизации.
+
+Набор микросхем графического адаптера определяет, модуль какого драйвера использует X11 для работы с графическим оборудованием. Для большинства типов микросхем это может быть определено автоматически, но все же его полезно знать на тот случай, когда автоматическое определение не работает правильно.
+
+Объём видеопамяти графического адаптера определяет разрешение и глубину цвета, с которым может работать система. Это важно, чтобы пользователь знал ограничения системы.
+
+=== Конфигурирование X11
+
+Начиная с версии 7.3, Xorg зачастую может работать без какого-либо файла настройки, для его запуска достаточно просто набрать:
+
+[source,bash]
+....
+% startx
+....
+
+Начиная с версии 7.4, Xorg может использовать HAL для автоматического поиска клавиатуры и мыши. Порты package:sysutils/hal[] и package:devel/dbus[] будут инсталлированы как зависимости package:x11/xorg[], но для их включения необходимо иметь следующие записи в [.filename]#/etc/rc.conf# file:
+
+[.programlisting]
+....
+hald_enable="YES"
+dbus_enable="YES"
+....
+
+Эти сервисы должны быть запущены (вручную или при загрузки системы) до последующей загрузки Xorg конфигурации.
+
+Автоматическая конфигурация не всегда может сработать на некотором оборудовании, либо создать не совсем ту настройку, которая желаема. В этих случаях, необходима ручная настройка конфигурации.
+
+[NOTE]
+====
+Такие оконные менеджеры, как GNOME, KDE или Xfce имеют собственные утилиты, позволяющие пользователю легко устанавливать такие параметры, как разрешение экрана. Поэтому, если конфигурация по-умолчанию не подходящая и вы планируете инсталлировать эти оконные менеджеры, просто можете продолжить настройку рабочей среды, используя их собственные утилиты для установок параметров экрана.
+====
+
+Процесс настройки X11 является многошаговым. Первый шаг заключается в построении начального конфигурационного файла. Работая с правами суперпользователя, просто запустите:
+
+[source,bash]
+....
+# Xorg -configure
+....
+
+При этом в каталоге [.filename]#/root# будет создан скелет конфигурационного файла X11 под именем [.filename]#xorg.conf.new# (там, куда после man:su[1] или непосредственного входа будет указывать переменная `$HOME`). Программа X11 сделает попытку распознать графическое оборудование системы и запишет конфигурационный файл, загружающий правильные драйверы для обнаруженного оборудования в системе.
+
+Следующим шагом является тестирование существующей конфигурации для проверки того, что Xorg может работать с графическим оборудованием в настраиваемой системе. Для этого выполните:
+
+[source,bash]
+....
+# Xorg -config xorg.conf.new
+....
+
+Начиная с Xorg 7.4 и выше, это тестирование покажет лишь черный экран, что делает диагностику не совсем полноценным. Старое поведение будет доступно при использовании опции `retro`
+
+[source,bash]
+....
+# Xorg -config xorg.conf.new -retro
+....
+
+Если появилась чёрно-белая сетка и курсор мыши в виде X, то настройка была выполнена успешно. Для завершения тестирования просто нажмите одновременно kbd:[Ctrl+Alt+Backspace].
+
+[NOTE]
+====
+Данная комбинация включена по-умолчанию до Xorg версии 7.3. Для включения этого в версии 7.4 и выше, вы должны ввести следующую команду в любом эмуляторе X терминала:
+
+[source,bash]
+....
+% setxkbmap -option terminate:ctrl_alt_bksp
+....
+
+или создать конфигурационный файл клавиатуры для hald называемый [.filename]#x11-input.fdi# и сохранить его в [.filename]#/usr/local/etc/hal/fdi/policy# директории. Данный файл должен содержать следующие строчки:
+
+[.programlisting]
+....
+<?xml version="1.0" encoding="utf-8"?>
+<deviceinfo version="0.2">
+ <device>
+ <match key="info.capabilities" contains="input.keyboard">
+ <merge key="input.x11_options.XkbOptions" type="string">terminate:ctrl_alt_bksp</merge>
+ </match>
+ </device>
+</deviceinfo>
+....
+
+Вам может потребоваться перезагрузка системы для вступления параметров hald в силу.
+====
+
+Если мышь не работает, ее необходимо настроить. Обратитесь к crossref:install[mouse,Настройка мыши (Mouse Settings)] в главе об установке FreeBSD. Дополнительно, начиная с версии 7.4, секция `InputDevice` в [.filename]#xorg.conf# игнорируется в пользу автоматического поиска устройств. Для возвращения старого поведения, добавьте следующие строчки в секции `ServerLayout` или `ServerFlags`:
+
+[.programlisting]
+....
+Option "AutoAddDevices" "false"
+....
+
+Устройства ввода могут конфигурированы затем как в предыдущих версиях, вместе с другими необходимыми опциями (такими, как переключение раскладок клавиатуры например).
+
+[NOTE]
+====
+Как ранее уже сообщалось, начиная с версии 7.4, по-умолчанию, hald демон будет пытаться распознать вашу клавиатуру автоматически. Есть возможность, что раскладка вашей клавиатуры или ее модель будут определены некорректно. Такие оконные менеджеры как GNOME, KDE или Xfce содержат свои инструменты для конфигурирования клавиатур. Тем не менее, можно установить параметры клавиатуры непосредственно с помощью утилиты man:setxkbmap[1] или через haldконфигурационные правила.
+
+Например, если вы хотите использовать клавиши PC 102 клавиатуры, идущая с французской раскладкой, мы должны создать конфигурационный файл клавиатуры для hald называемый [.filename]#x11-input.fdi# и сохранить в [.filename]#/usr/local/etc/hal/fdi/policy# директории. Этот файл должен содержать следующие строчки:
+
+[.programlisting]
+....
+<?xml version="1.0" encoding="utf-8"?>
+<deviceinfo version="0.2">
+ <device>
+ <match key="info.capabilities" contains="input.keyboard">
+ <merge key="input.x11_options.XkbModel" type="string">pc102</merge>
+ <merge key="input.x11_options.XkbLayout" type="string">fr</merge>
+ </match>
+ </device>
+</deviceinfo>
+....
+
+Если этот файл уже существует, просто скопируйте и добавьте эти строчки в данный файл.
+
+Вы должны будете перезагрузить систему, чтобы заставить hald применить настройки.
+
+Есть возможность проделать ту же конфигурацию из X терминала или скрипт следующей командой:
+
+[source,bash]
+....
+% setxkbmap -model pc102 -layout fr
+....
+
+Файл [.filename]#/usr/local/shared/X11/xkb/rules/base.lst# содержит список различных клавиатур, доступные опции и раскладки.
+====
+
+Теперь выполните тонкую настройку в файле [.filename]#xorg.conf.new# по своему вкусу. Откройте файл в текстовом редакторе, таком, как man:emacs[1] или man:ee[1]. Сначала задайте частоты для монитора. Они обычно обозначаются как частоты горизонтальной и вертикальной синхронизации. Эти значения добавляются в файл [.filename]#xorg.conf.new# в раздел `"Monitor"`:
+
+[.programlisting]
+....
+Section "Monitor"
+ Identifier "Monitor0"
+ VendorName "Monitor Vendor"
+ ModelName "Monitor Model"
+ HorizSync 30-107
+ VertRefresh 48-120
+EndSection
+....
+
+Ключевых слов `HorizSync` и `VertRefresh` может и не оказаться в файле конфигурации. Если их нет, то они должны быть добавлены, с указанием корректных значений горизонтальной частоты синхронизации после ключевого слова `HorizSync` и вертикальной частоты синхронизации после ключевого слова `VertRefresh`. В примере выше были введены частоты монитора настраиваемой системы.
+
+X позволяет использовать возможности технологии DPMS (Energy Star) с поддерживающими её мониторами. Программа man:xset[1] управляет временными задержками и может явно задавать режимы ожидания, останова и выключения. Если вы хотите включить использование возможностей DPMS вашего монитора, вы должны добавить следующую строку в раздел, описывающий монитор:
+
+[.programlisting]
+....
+Option "DPMS"
+....
+
+Пока файл конфигурации [.filename]#xorg.conf.new# открыт в редакторе, выберите желаемые разрешение и глубину цвета, которые будут использоваться по умолчанию. Они задаются в разделе `"Screen"`:
+
+[.programlisting]
+....
+Section "Screen"
+ Identifier "Screen0"
+ Device "Card0"
+ Monitor "Monitor0"
+ DefaultDepth 24
+ SubSection "Display"
+ Viewport 0 0
+ Depth 24
+ Modes "1024x768"
+ EndSubSection
+EndSection
+....
+
+Ключевое слово `DefaultDepth` описывает глубину цвета, с которой будет работа по умолчанию. Это значение может быть переопределено при помощи параметра командной строки `-depth` для man:Xorg[1]. Ключевое слово `Modes` описывает разрешение, с которым нужно работать при данной глубине цвета. Заметьте, что поддерживаются только те стандартные режимы VESA, что определены графическим оборудованием настраиваемой системы. В примере выше глубина цвета по умолчанию равна двадцати четырём битам на пиксел. При такой глубине цвета принимается разрешение в 1024 на 768 точек.
+
+Наконец, запишите конфигурационный файл и протестируйте его при помощи тестового режима, описанного выше.
+
+[NOTE]
+====
+При решении проблем могут помочь лог файлы X11, в которых находится информация по каждому устройству, к которому подключен сервер X11. Лог файлам Xorg названия даются в формате [.filename]#/var/log/Xorg.0.log#. Имена лог файлам могут даваться от [.filename]#Xorg.0.log# до [.filename]#Xorg.8.log# и так далее.
+====
+
+Если все в порядке, то конфигурационный файл нужно установить в общедоступное место, где его сможет найти man:Xorg[1]. Обычно это [.filename]#/etc/X11/xorg.conf# или [.filename]#/usr/local/etc/X11/xorg.conf#.
+
+[source,bash]
+....
+# cp xorg.conf.new /etc/X11/xorg.conf
+....
+
+Теперь процесс настройки X11 завершен. Xorg теперь можно запустить с помощью man:startx[1]. X11 можно также запустить через man:xdm[1].
+
+=== Тонкие вопросы настройки
+
+==== Конфигурирование при работе с графическими чипсетами Intel(R) i810
+
+Конфигурирование при работе с интегрированными наборами микросхем Intel(R) i810 требует наличия [.filename]#agpgart#, программного интерфейса AGP, посредством которого X11 будет управлять адаптером. Подробности смотрите на странице справочника man:agp[4].
+
+Это позволит конфигурировать графическое оборудование точно так же, как и любой другой графический адаптер. Заметьте, что для систем, у которых драйвер man:agp[4] в ядро не вкомпилирован, попытка погрузить модуль с помощью man:kldload[8] окончится неудачно. Этот драйвер должен оказаться в ядре во время загрузки, либо вкомпилированным, либо подгруженным посредством [.filename]#/boot/loader.conf#.
+
+==== Настройка широкоэкранного режима
+
+Для этого раздела необходимо несколько больше навыков настройки. Если после использования описанных выше инструментов настройки в результате рабочей конфигурации не получается, в лог файлах достаточно информации для доведения конфигурации до рабочего уровня. Для настройки используется текстовый редактор.
+
+Существующие широкоэкранные стандарты (WSXGA, WSXGA+, WUXGA, WXGA, WXGA+, и т.д.) поддерживают форматы изображения 16:10 и 10:9, которые могут быть проблемными. Для формата 16:10, например, возможны следующие разрешения экрана:
+
+* 2560x1600
+* 1920x1200
+* 1680x1050
+* 1440x900
+* 1280x800
+
+Иногда достаточно добавить одно из этих разрешений в качестве параметра `Mode` в раздел `Section "Screen"` вот так:
+
+[.programlisting]
+....
+Section "Screen"
+Identifier "Screen0"
+Device "Card0"
+Monitor "Monitor0"
+DefaultDepth 24
+SubSection "Display"
+ Viewport 0 0
+ Depth 24
+ Modes "1680x1050"
+EndSubSection
+EndSection
+....
+
+Xorg может извлечь информацию о разрешении из монитора посредством I2C/DDC, так что у него есть данные, какие частоты и разрешения может поддерживать монитор.
+
+Если эти `ModeLines` не определены в драйверах, может потребоваться дополнительная настройка Xorg. Используя [.filename]#/var/log/Xorg.0.log#, можно извлечь достаточно информации для создания рабочей строки `ModeLine` вручную. Просто обратитесь к следующей информации:
+
+[.programlisting]
+....
+(II) MGA(0): Supported additional Video Mode:
+(II) MGA(0): clock: 146.2 MHz Image Size: 433 x 271 mm
+(II) MGA(0): h_active: 1680 h_sync: 1784 h_sync_end 1960 h_blank_end 2240 h_border: 0
+(II) MGA(0): v_active: 1050 v_sync: 1053 v_sync_end 1059 v_blanking: 1089 v_border: 0
+(II) MGA(0): Ranges: V min: 48 V max: 85 Hz, H min: 30 H max: 94 kHz, PixClock max 170 MHz
+....
+
+Эта информация называется EDID. Создание `ModeLine` из сводится к расположению номеров в правильном порядке:
+
+[.programlisting]
+....
+ModeLine <name> <clock> <4 horiz. timings> <4 vert. timings>
+....
+
+Для нашего примера `ModeLine` в `Section "Monitor"` будет выглядеть так:
+
+[.programlisting]
+....
+Section "Monitor"
+Identifier "Monitor1"
+VendorName "Bigname"
+ModelName "BestModel"
+ModeLine "1680x1050" 146.2 1680 1784 1960 2240 1050 1053 1059 1089
+Option "DPMS"
+EndSection
+....
+
+После завершения редактирования конфигурации, X должен запуститься в новом широкоэкранном разрешении.
+
+[[x-fonts]]
+== Использование шрифтов в X11
+
+[[type1]]
+=== Шрифты Type1
+
+Шрифты, используемые по умолчанию и распространяемые вместе с X11, вряд ли можно назвать идеально подходящими для применения в обычных издательских приложениях. Большие презентационные шрифты выглядят рвано и непрофессионально, а мелкие шрифты в man:getenv[3] вообще невозможно разобрать. Однако есть некоторое количество свободно распространяемых высококачественных шрифтов Type1 (PostScript(R)), которые можно без изменений использовать с X11. К примеру, в наборе шрифтов URW (package:x11-fonts/urwfonts[]) имеются высококачественные версии стандартных шрифтов type1 (Times Roman(TM), Helvetica(TM), Palatino(TM) и другие). В набор Freefonts (package:x11-fonts/freefonts[]) включено ещё больше шрифтов, однако большинство из них предназначено для использования в программном обеспечении для работы с графикой, например, Gimp, и они не вполне пригодны для использования в качестве экранных шрифтов. Кроме того, X11 с минимальными усилиями может быть настроена на использование шрифтов TrueType(R). Более детальная информация находится на странице справочной системы man:X[7] и в <<truetype,разделе о шрифтах TrueType(R)>> ниже.
+
+Для установки вышеупомянутых коллекций шрифтов Type1 из коллекции портов выполните следующие команды:
+
+[source,bash]
+....
+# cd /usr/ports/x11-fonts/urwfonts
+# make install clean
+....
+
+То же самое нужно будет сделать для коллекции freefont и других. Чтобы X-сервер обнаруживал этих шрифты, добавьте соответствующую строку в файл настройки X сервера ([.filename]#/etc/X11/xorg.conf#), которая должна выглядеть так:
+
+[.programlisting]
+....
+FontPath "/usr/local/lib/X11/fonts/URW/"
+....
+
+Либо из командной строки при работе с X выполните:
+
+[source,bash]
+....
+% xset fp+ /usr/local/lib/X11/fonts/URW
+% xset fp rehash
+....
+
+Это сработает, но будет потеряно, когда сеанс работы с X будет закрыт, если эта команда не будет добавлена в начальный файл ([.filename]#~/.xinitrc# в случае обычного сеанса через `startx` или [.filename]#~/.xsession# при входе через графический менеджер типа XDM). Третий способ заключается в использовании нового файла [.filename]#/usr/local/etc/fonts/local.conf#: посмотрите раздел об <<antialias,антиалиасинге>>.
+
+[[truetype]]
+=== Шрифты TrueType(R)
+
+В Xorg имеется встроенная поддержка шрифтов TrueType(R). Имеются два модуля, которые могут обеспечить эту функциональность. В нашем примере используется модуль freetype, потому что он в большей степени похож на другие механизмы для работы с шрифтами. Для включения модуля freetype достаточно в раздел `"Module"` файла [.filename]#/etc/X11/xorg.conf# добавить следующую строчку.
+
+[.programlisting]
+....
+Load "freetype"
+....
+
+Теперь создайте каталог для шрифтов TrueType(R) (к примеру, [.filename]#/usr/local/lib/X11/fonts/TrueType#) и скопируйте все шрифты TrueType(R) в этот каталог. Имейте в виду, что напрямую использовать шрифты TrueType(R) с Macintosh(R) нельзя; для использования с X11 они должны быть в формате UNIX(R)/MS-DOS(R)/Windows(R). После того, как файлы будут скопированы в этот каталог, воспользуйтесь утилитой ttmkfdir для создания файла [.filename]#fonts.dir#, который укажет подсистеме вывода шрифтов X на местоположение этих новых файлов. `ttmkfdir` имеется в Коллекции Портов FreeBSD: package:x11-fonts/ttmkfdir[].
+
+[source,bash]
+....
+# cd /usr/local/lib/X11/fonts/TrueType
+# ttmkfdir -o fonts.dir
+....
+
+После этого добавьте каталог со шрифтами TrueType(R) к маршруту поиска шрифтов. Это делается точно также, как описано выше для шрифтов <<type1,Type1>>, то есть выполните
+
+[source,bash]
+....
+% xset fp+ /usr/local/lib/X11/fonts/TrueType
+% xset fp rehash
+....
+
+или добавьте строку `FontPath` в файл [.filename]#xorg.conf#.
+
+Это всё. Теперь man:getenv[3], Gimp, StarOffice(TM) и все остальные X-приложения должны увидеть установленные шрифты TrueType(R). Очень маленькие (как текст веб-страницы на дисплее с высоким разрешением) и очень большие (в StarOffice(TM)) шрифты будут теперь выглядеть гораздо лучше.
+
+[[antialias]]
+=== Антиалиасинг шрифтов
+
+Антиалиасинг присутствует в X11 начиная с XFree86(TM), версии 4.0.2. Однако настройка шрифтов была довольно громоздка вплоть до появления XFree86(TM) 4.3.0. Начиная с версии XFree86(TM) 4.3.0, все шрифты, расположенные в каталогах [.filename]#/usr/local/lib/X11/fonts/# и [.filename]#~/.fonts/#, автоматически становятся доступными для применения антиалиасинга в приложениях, использующих Xft. Не все приложения могут использовать Xft, но во многих его поддержка присутствует. Примерами приложений, использующих Xft, является Qt версий 2.3 и более поздних (это инструментальный пакет для оболочки KDE), GTK+ версий 2.0 и более поздних (это инструментальный пакет для оболочки GNOME), а также Mozilla версий 1.2 и более поздних.
+
+Для применения к шрифтам антиалиасинга, а также для настройки параметров антиалиасинга, создайте (или отредактируйте, если он уже существует) файл [.filename]#/usr/local/etc/fonts/local.conf#. Некоторые мощные возможности системы шрифтов Xft могут быть настроены при помощи этого файла; в этом разделе описаны лишь некоторые простые возможности. Для выяснения всех деталей, пожалуйста, обратитесь к man:fonts-conf[5].
+
+Этот файл должен быть сформирован в формате XML. Обратите особое внимание на регистр символов, и удостоверьтесь, что все тэги корректно закрыты. Файл начинается обычным заголовком XML, за которым следуют DOCTYPE и тэг `<fontconfig>`:
+
+[.programlisting]
+....
+
+ <?xml version="1.0"?>
+ <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
+ <fontconfig>
+....
+
+Как и говорилось ранее, все шрифты из каталога [.filename]#/usr/local/lib/X11/fonts/#, а также [.filename]#~/.fonts/# уже доступны для приложений, использующих Xft. Если вы хотите добавить каталог, отличный от этих двух, добавьте строчку, подобную следующей, в файл [.filename]#/usr/local/etc/fonts/local.conf#:
+
+[.programlisting]
+....
+<dir>/path/to/my/fonts</dir>
+....
+
+После добавления новых шрифтов, и особенно новых каталогов со шрифтами, вы должны выполнить следующую команду для перестроения кэшей шрифтов:
+
+[source,bash]
+....
+# fc-cache -f
+....
+
+Антиалиасинг делает границы несколько размытыми, что делает очень мелкий текст более читабельным и удаляет "лесенки" из текста большого размера, но может вызвать нечёткость при применении к тексту обычного размера. Для исключения размеров шрифтов, меньших 14, из антиалиасинга, добавьте такие строки:
+
+[.programlisting]
+....
+ <match target="font">
+ <test name="size" compare="less">
+ <double>14</double>
+ </test>
+ <edit name="antialias" mode="assign">
+ <bool>false</bool>
+ </edit>
+ </match>
+ <match target="font">
+ <test name="pixelsize" compare="less" qual="any">
+ <double>14</double>
+ </test>
+ <edit mode="assign" name="antialias">
+ <bool>false</bool>
+ </edit>
+ </match>
+....
+
+Для некоторых моноширинных шрифтов антиалиасинг может также оказаться неприменимым при определении межсимвольного интервала. В частности, эта проблема возникает с KDE. Одним из возможных решений для этого является жесткое задание межсимвольного интервала в 100. Добавьте следующие строки:
+
+[.programlisting]
+....
+ <match target="pattern" name="family">
+ <test qual="any" name="family">
+ <string>fixed</string>
+ </test>
+ <edit name="family" mode="assign">
+ <string>mono</string>
+ </edit>
+ </match>
+ <match target="pattern" name="family">
+ <test qual="any" name="family">
+ <string>console</string>
+ </test>
+ <edit name="family" mode="assign">
+ <string>mono</string>
+ </edit>
+ </match>
+....
+
+(это создаст алиасы `"mono"` для других общеупотребительных имён шрифтов фиксированного размера), а затем добавьте:
+
+[.programlisting]
+....
+ <match target="pattern" name="family">
+ <test qual="any" name="family">
+ <string>mono</string>
+ </test>
+ <edit name="spacing" mode="assign">
+ <int>100</int>
+ </edit>
+ </match>
+....
+
+С некоторыми шрифтами, такими, как Helvetica, при антиалиасинге могут возникнуть проблемы . Обычно это проявляется в виде шрифта, который наполовину вертикально обрезан. Хуже того, это может привести к сбоям таких приложений, как Mozilla. Во избежание этого следует добавить следующее в файл [.filename]#local.conf#:
+
+[.programlisting]
+....
+ <match target="pattern" name="family">
+ <test qual="any" name="family">
+ <string>Helvetica</string>
+ </test>
+ <edit name="family" mode="assign">
+ <string>sans-serif</string>
+ </edit>
+ </match>
+....
+
+После того, как вы закончите редактирование [.filename]#local.conf#, удостоверьтесь, что файл завершен тэгом `</fontconfig>`. Если этого не сделать, ваши изменения будут проигнорированы.
+
+Набор шрифтов по умолчанию, поставляемый с X11, не очень подходит, если включается антиалиасинг. Гораздо лучший набор шрифтов, используемых по умолчанию, можно найти в порте package:x11-fonts/bitstream-vera[]. Этот порт установит файл [.filename]#/usr/local/etc/fonts/local.conf#, если такого ещё не существует. Если файл существует, то порт создаст файл [.filename]#/usr/local/etc/fonts/local.conf-vera#. Перенесите содержимое этого файла в [.filename]#/usr/local/etc/fonts/local.conf#, и шрифты Bitstream автоматически заменят используемые по умолчанию в X11 шрифты Serif, Sans Serif и Monospaced.
+
+Наконец, пользователи могут добавлять собственные наборы посредством персональных файлов [.filename]#.fonts.conf#. Для этого каждый пользователь должен просто создать файл [.filename]#~/.fonts.conf#. Этот файл также должен быть в формате XML.
+
+И последнее замечание: при использовании дисплея LCD может понадобиться включение разбиения точек. При этом компоненты красного, зелёного и голубого цветов (разделяемые по горизонтали), рассматриваются как отдельные точки для улучшения разрешения экрана по горизонтали; результат может оказаться потрясающим. Для включения этого механизма добавьте такую строчку где-нибудь в файле [.filename]#local.conf#:
+
+[.programlisting]
+....
+
+ <match target="font">
+ <test qual="all" name="rgba">
+ <const>unknown</const>
+ </test>
+ <edit name="rgba" mode="assign">
+ <const>rgb</const>
+ </edit>
+ </match>
+....
+
+[NOTE]
+====
+В зависимости от типа дисплея, `rgb` может потребоваться заменить на `bgr`, `vrgb` или `vbgr`: пробуйте и смотрите, что работает лучше.
+====
+
+Антиалиасинг должен быть включен при следующем запуске X-сервера. Однако программы должны знать, как использовать его преимущества. В настоящее время инструментальный пакет Qt умеет ими пользоваться, так что вся оболочка KDE может использовать шрифты с антиалиасингом. GTK+ и GNOME также можно заставить использовать антиалиасинг посредством капплета "Font" (обратитесь к <<x11-wm-gnome-antialias>> для выяснения всех подробностей). По умолчанию Mozilla версий 1.2 и выше будет автоматически использовать антиалиасинг. Для отмены использования антиалиасинга перестройте Mozilla с флагом `-DWITHOUT_XFT`.
+
+[[x-xdm]]
+== Менеджеры экранов (Display Managers) X
+
+=== Вступление
+
+Менеджер Экранов X (XDM) это необязательный компонент X Window System, который используется для управления входом пользователей в систему. Это полезно в ряде ситуаций, например для минимальных "X Терминалов", десктопов, больших сетевых серверов экранов. Так как X Window System не зависит от сетей и протоколов, то существует множество различных конфигураций для X клиентов и серверов, запущенных на различных компьютерах, подключенных к сети. XDM предоставляет графический интерфейс для выбора сервера, к которому вы желаете подключится, и введения информации, авторизующей пользователя, например комбинации логина и пароля.
+
+XDM можно рассматривать как аналог программы man:getty[8], предоставляющий такие же возможности для пользователей (смотрите crossref:serialcomms[term-config,Настройка] для подробной информации). И это именно так, XDM производит вход в систему для подключенного пользователя и запускает управляющую сессию для пользователя (обычно это менеджер окон X). После этого XDM ожидает завершения приложения, означающее завершение пользователем работы и отключает управляющую сессию. Затем XDM может снова вывести приглашение к входу в систему и ожидать входа другого пользователя.
+
+=== Использование XDM
+
+Программой даемона XDM является [.filename]#/usr/local/bin/xdm#. Эта программа может быть запущена от пользователя `root` в любой момент, и она начнёт управлять дисплеем X на локальной машине. Если XDM нужно запускать в фоновом режиме каждый раз при запуске компьютера, то наиболее правильный способ - это добавить новую запись в [.filename]#/etc/ttys#. Для более подробной информации о формате и использовании этого файла смотрите crossref:serialcomms[term-etcttys,Добавление строки в /etc/ttys]. Вот строка, которую необходимо добавить в файл [.filename]#/etc/ttys# для того, чтобы запустить даемон XDM на виртуальном терминале:
+
+[source,bash]
+....
+ttyv8 "/usr/local/bin/xdm -nodaemon" xterm off secure
+....
+
+По умолчанию эта запись отключена; для её включения нужно заменить пятое поле с `off` на `on` и перезапустить man:init[8], используя метод, описанный в crossref:serialcomms[term-hup,Добавление строки в /etc/ttys]. Первое поле это название терминала, которым будет управлять программа, `ttyv8`. Это означает, что XDM будет запущен на 9ом виртуальном терминале.
+
+=== Конфигурирование XDM
+
+Конфигурационные файлы XDM находятся в каталоге [.filename]#/usr/local/lib/X11/xdm#. В нём размещаются несколько файлов, которые используются для изменения поведения и внешнего вида XDM. Обычно это следующие файлы:
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Файл
+| Описание
+
+|[.filename]#Xaccess#
+|Правила авторизации клиентов.
+
+|[.filename]#Xresources#
+|Значения ресурсов X по умолчанию.
+
+|[.filename]#Xservers#
+|Список локальных и удаленных экранов.
+
+|[.filename]#Xsession#
+|Сценарий сессии по умолчанию.
+
+|[.filename]#Xsetup_#*
+|Скрипт для запуска приложений до появления приглашения к входу в систему.
+
+|[.filename]#xdm-config#
+|Глобальный конфигурационный файл для всех экранов запущенных на локальной машине
+
+|[.filename]#xdm-errors#
+|Ошибки сгенерированные серверной программой.
+
+|[.filename]#xdm-pid#
+|ID процесса запущенного XDM.
+|===
+
+В этом каталоге также находятся несколько командных сценариев и программ, используемых для настройки рабочего стола (desktop) при запуске XDM. Назначение каждого из этих файлов будет вкратце описано. Точный синтаксис и информация по их использованию находятся в man:xdm[1].
+
+В конфигурации по умолчанию выводится простое прямоугольное окно приглашения ко входу в систему с именем компьютера, написанным сверху большим шрифтом, и строками ввода "Login:" и "Password:" внизу. Это хорошая отправная точка для изменения внешнего вида экранов XDM.
+
+==== Xaccess
+
+Протокол, по которому происходит подключение дисплеев, управляемых XDM, называется X Display Manager Connection Protocol (XDMCP). Этот файл представляет собой набор правил для управления XDMCP соединениями с удалёнными машинами. Он игнорируется, пока стандартный файл [.filename]#xdm-config# не содержит указаний по обслуживанию удалённых соединений.
+
+==== Xresources
+
+Это файл содержит установки по умолчанию для приложений, запущенных в экране выбора серверов и экране приглашения к входу в систему. В нем может быть изменён вид программы входа в систему. Формат этого файла идентичен файлу app-defaults, описанному в документации к X11.
+
+==== Xservers
+
+Это список удаленных экранов, которые XDM должен предоставить как варианты для входа в систему.
+
+==== Xsession
+
+Этот файл представляет из себя командный сценарий по умолчанию для пользователей, вошедших в систему с использованием XDM. Обычно каждый пользователь имеет собственный сценарий входа в файле [.filename]#~/.xsession#, который используется вместо этого сценария.
+
+==== Xsetup_*
+
+Они запускаются автоматически перед тем, как показывается экран выбора сервера или экран входа в систему. Для каждого экрана (display) есть свой сценарий с именем [.filename]#Xsetup_#, за которым следует локальный номер экрана (например, [.filename]#Xsetup_0#). Обычно эти сценарии запускают одну или две программы в фоновом режиме, например `xconsole`.
+
+==== xdm-config
+
+Здесь содержатся настройки в формате app-defaults, которые применимы ко всем экранам данного компьютера.
+
+==== xdm-errors
+
+Здесь находится выдача X серверов, которые XDM пытается запустить. Если экран, который XDM пытается открыть, отключается по некоторым причинам, то это хорошее место для поиска сообщений об ошибках. Эти сообщения также записываются в пользовательский файл [.filename]#~/.xsession-errors# для каждого сеанса.
+
+=== Использование сетевого сервера дисплеев
+
+Для того, чтобы позволить другим клиентам подключаться к серверу дисплеев, необходимо отредактировать правила контроля доступа и включить обслуживание сетевых соединений. По умолчанию они выключены, что является хорошим решением с точки зрения обеспечения безопасности. Для того, чтобы позволить XDM принимать сетевые соединения, в первую очередь закомментируйте строку в файле [.filename]#xdm-config#:
+
+[source,bash]
+....
+! БЕЗОПАСНОСТЬ: do not listen for XDMCP or Chooser requests
+! Закомментируйте эти линии, если вы хотите управлять X терминалами с xdm
+DisplayManager.requestPort: 0
+....
+
+и потом перезапустите XDM. Помните, что комментарии в файлах app-defaults начинаются с символа "!", а не как обычно, "\#". Может потребоваться более жёсткий контроль доступа - взгляните на примеры из [.filename]##Xaccess## и обратитесь к странице справочника man:xdm[1] за дальнейшей информацией.
+
+=== Замены для XDM
+
+Существует несколько программ, заменяющих XDM. Одна из них, kdm (поставляемая вместе с KDE), описана далее в этой главе. В kdm имеется много визуальных и косметических улучшений, а также функциональность, позволяющая пользователям выбирать собственные оконные менеджеры во время входа в систему.
+
+[[x11-wm]]
+== Графические оболочки
+
+В этом разделе описываются различные графические оболочки, доступные в X для FreeBSD. Термин "графическая оболочка" может использоваться для чего угодно, от простого менеджера окон до полнофункционального набора приложений для рабочего стола, типа KDE или GNOME.
+
+[[x11-wm-gnome]]
+=== GNOME
+
+[[x11-wm-gnome-about]]
+==== О GNOME
+
+GNOME является дружественной к пользователю графической оболочкой, позволяющей пользователям легко использовать и настраивать свои компьютеры. В GNOME имеется панель (для запуска приложений и отображения их состояния), рабочий стол (где могут быть размещены данные и приложения), набор стандартных инструментов и приложений для рабочего стола, а также набор соглашений, облегчающих совместную работу и согласованность приложений. Пользователи других операционных систем или оболочек при использовании такой мощной графической оболочки, какую обеспечивает GNOME, должны чувствовать себя в родной среде. Дополнительную информацию относительно GNOME во FreeBSD можно найти на сайте http://www.FreeBSD.org/gnome[FreeBSD GNOME Project]. Web сайт также содержит достаточно исчерпывающие FAQ'и, касающиеся установки, конфигурирования и управления GNOME.
+
+[[x11-wm-gnome-install]]
+==== Установка GNOME
+
+Программу проще всего установить из пакета или коллекции портов:
+
+Для установки пакета GNOME из сети, просто наберите:
+
+[source,bash]
+....
+# pkg_add -r gnome2
+....
+
+Для построения GNOME из исходных текстов используйте дерево портов:
+
+[source,bash]
+....
+# cd /usr/ports/x11/gnome2
+# make install clean
+....
+
+После установки GNOME нужно указать X-серверу на запуск GNOME вместо стандартного оконного менеджера.
+
+Самый простой путь запустить GNOME - это использовать GDM (GNOME Display Manager). GDM, который устанавливается, как часть GNOME (но отключен по умолчанию), может быть включён путём добавления `gdm_enable="YES"` в [.filename]#/etc/rc.conf#. После перезагрузки, GNOME запустится автоматически после того, как вы зарегистрируйтесь в системе. Никакой дополнительной конфигурации не требуется.
+
+GNOME может также быть запущен из командной строки с помощью конфигурирования файла [.filename]#.xinitrc#. Если файл [.filename]#.xinitrc# уже откорректирован, то просто замените строку, в которой запускается используемый менеджер окон, на ту, что вызовет /usr/local/bin/gnome-session. Если в конфигурационном файле нет ничего особенного, то будет достаточно просто набрать:
+
+[source,bash]
+....
+% echo "/usr/local/bin/gnome-session" > ~/.xinitrc
+....
+
+Теперь наберите `startx`, и будет запущена графическая оболочка GNOME.
+
+[NOTE]
+====
+Если используется более старый менеджер дисплеев типа XDM, то это не сработает. Вместо этого создайте выполнимый файл [.filename]#.xsession# с той же самой командой в нём. Для этого отредактируйте файл, заменив существующую команду запуска оконного менеджера на /usr/local/bin/gnome-session:
+====
+
+[source,bash]
+....
+% echo "#!/bin/sh" > ~/.xsession
+% echo "/usr/local/bin/gnome-session" >> ~/.xsession
+% chmod +x ~/.xsession
+....
+
+Ещё одним вариантом является настройка менеджера дисплеев таким образом, чтобы он позволял выбирать оконный менеджер во время входа в систему; в разделе о <<x11-wm-kde-details,KDE в подробностях>> описывается, как сделать это для kdm, менеджера дисплеев из KDE.
+
+[[x11-wm-gnome-antialias]]
+==== Шрифты с антиалиасингом и GNOME
+
+X11 поддерживает антиалиасинг посредством своего расширения "RENDER". GTK+ 2.0 и более поздние версии (это инструментальный пакет, используемый GNOME) могут использовать такую функциональность. Настройка антиалиасинга описана в <<antialias>>. Таким образом, при наличии современного GNOME, возможно использование антиалиасинга. Просто перейдите в menu:Applications[Desktop Preferences > Font] и выберите либо btn:[Best shapes], btn:[Best contrast], либо btn:[Subpixel smoothing (LCDs)]. Для приложений GTK+, которые не являются частью оболочки GNOME, задайте в качестве значения переменной окружения `GDK_USE_XFT``1` перед запуском программы.
+
+[[x11-wm-kde]]
+=== KDE
+
+[[x11-wm-kde-about]]
+==== О KDE
+
+KDE является простой в использовании современной графической оболочкой. Вот лишь некоторые из преимуществ, которые даёт пользователю KDE:
+
+* Прекрасный современный рабочий стол
+* Рабочий стол, полностью прозрачный для работы в сети
+* Интегрированная система помощи, обеспечивающая удобный и согласованный доступ к системе помощи по использованию рабочего стола KDE и его приложений
+* Единообразный внешний вид и управление во всех приложениях KDE
+* Стандартизированные меню и панели инструментов, комбинации клавиш, цветовые схемы и так далее.
+* Интернационализация: в KDE поддерживается более 40 языков
+* Централизованное единообразное конфигурирование рабочего стола в диалоговом режиме
+* Большое количество полезных приложений для KDE
+
+Совместно с KDE поставляется веб-браузер под названием Konqueror, который является серьезным соперником другим браузерам для UNIX(R)-систем. Дополнительную информацию о KDE можно найти на веб-сайте http://www.kde.org/[KDE в FreeBSD]. Для получения информации и информационных ресурсов, специфичных для KDE во FreeBSD, обратитесь к сайту команды http://freebsd.kde.org/[FreeBSD-KDE team].
+
+Имеется две версии KDE доступные на FreeBSD. Версия 3 была доступна очень долгое время и она является очень зрелой. Версия 4 - это следующее поколение, также доступное через Коллекцию Портов. Обе версии могут быть инсталлированы одновременно.
+
+[[x11-wm-kde-install]]
+==== Установка KDE
+
+Как и в случае с GNOME или любой другой графической оболочкой, программное обеспечение можно легко установить из пакета или из Коллекции Портов:
+
+Для установки пакета KDE3 из сети, просто наберите:
+
+[source,bash]
+....
+# pkg_add -r kde
+....
+
+Для установки пакета KDE4 из сети, просто наберите:
+
+[source,bash]
+....
+# pkg_add -r kde4
+....
+
+man:pkg_add[1] автоматически загрузит самую последнюю версию приложения.
+
+Для построения KDE3 из исходных текстов, воспользуйтесь деревом портов:
+
+[source,bash]
+....
+# cd /usr/ports/x11/kde3
+# make install clean
+....
+
+Для построения KDE4 из исходных текстов, воспользуйтесь деревом портов:
+
+[source,bash]
+....
+# cd /usr/ports/x11/kde4
+# make install clean
+....
+
+После установки KDE нужно указать X-серверу на запуск этого приложения вместо оконного менеджера, используемого по умолчанию. Это достигается редактированием файла [.filename]#.xinitrc#:
+
+Для KDE3:
+
+[source,bash]
+....
+% echo "exec startkde" > ~/.xinitrc
+....
+
+Для KDE4:
+
+[source,bash]
+....
+% echo "exec /usr/local/kde4/bin/startkde" > ~/.xinitrc
+....
+
+Теперь при вызове X Window System по команде `startx` в качестве оболочки будет использоваться KDE.
+
+При использовании менеджера дисплеев типа XDM настройка несколько отличается. Вместо этого нужно отредактировать файл [.filename]#.xsession#. Указания для kdm описаны далее в этой главе.
+
+[[x11-wm-kde-details]]
+=== Более подробно о KDE
+
+Теперь, когда KDE установлена в системе, можно узнать много нового из её справочных страниц или просто указанием и щелканьем по различным меню. Пользователи Windows(R) или Mac(R) будут чувствовать себя как дома.
+
+Лучшим справочником по KDE является онлайновая документация. KDE поставляется с собственным веб-браузером, который называется Konqueror, десятками полезных приложений и подробной документацией. В оставшейся части этого раздела обсуждаются технические вопросы, трудные для понимания при случайном исследовании.
+
+[[x11-wm-kde-kdm]]
+==== Менеджер дисплеев KDE
+
+Администратору многопользовательской системы может потребоваться графический экран для входа пользователей в систему. Вы можете использовать <<x-xdm,XDM>>, как это описано ранее. Однако в KDE имеется альтернативный менеджер kdm, который был разработан более привлекательным и с большим количеством настраиваемых опций для входа в систему. В частности, пользователи могут легко выбирать (посредством меню), какую оболочку (KDE, GNOME или что-то ещё) запускать после входа в систему.
+
+Для того, чтобы разрешить запуск kdm, измените в файле [.filename]#/etc/ttys# строку, относящуюся к консоли `ttyv8`:
+
+Для KDE3:
+
+[.programlisting]
+....
+ttyv8 "/usr/local/bin/kdm -nodaemon" xterm on secure
+....
+
+Для KDE4:
+
+[.programlisting]
+....
+ttyv8 "/usr/local/kde4/bin/kdm -nodaemon" xterm on secure
+....
+
+[[x11-wm-xfce]]
+=== XFce
+
+[[x11-wm-xfce-about]]
+==== О XFce
+
+XFce является графической оболочкой, построенной на основе инструментального пакета GTK+, используемого в GNOME, но она гораздо легче и предназначена для тех, кому нужен простой, эффективно работающий рабочий стол, который легко использовать и настраивать. Визуально он выглядит очень похоже на CDE, который есть в коммерческих UNIX(R)-системах. Вот некоторые из достоинств XFce:
+
+* Простой, лёгкий в обращении рабочий стол
+* Полностью настраиваемый при помощи мыши, с интерфейсом drag and drop и так далее
+* Главная панель похожа на CDE, с меню, апплетами и возможностями по быстрому запуску приложений
+* Интегрированный оконный менеджер, менеджер файлов, управление звуком, модуль совместимости с GNOME и прочее
+* Возможность использования тем (так как использует GTK+)
+* Быстрый, легкий и эффективный: идеален для устаревших/слабых машин или для машин с ограниченной памятью
+
+Дополнительную информацию о XFce можно найти на http://www.xfce.org/[сайте XFce].
+
+[[x11-wm-xfce-install]]
+==== Установка XFce
+
+Для XFce имеется (на момент написания этого текста) бинарный пакет. Для его установки просто наберите:
+
+[source,bash]
+....
+# pkg_add -r xfce4
+....
+
+Либо, в случае построения из исходных текстов, используйте Коллекцию Портов:
+
+[source,bash]
+....
+# cd /usr/ports/x11-wm/xfce4
+# make install clean
+....
+
+Теперь укажите X-серверу на запуск XFce при следующем запуске X. Просто наберите:
+
+[source,bash]
+....
+% echo "/usr/local/bin/startxfce4" > ~/.xinitrc
+....
+
+При следующем запуске X в качестве рабочего стола будет использоваться XFce. Как сказано выше, если используется менеджер дисплеев, такой, как [.filename]#XDM#, создайте файл [.filename]#.xsession# так, как это описано в разделе о <<x11-wm-gnome,GNOME>>, но с командой [.filename]#/usr/local/bin/startxfce4#, либо настройте менеджер дисплеев так, чтобы он разрешил выбор рабочего стола во время входа в систему, как это описано в разделе о <<x11-wm-kde-kdm,kdm>>.
diff --git a/documentation/content/ru/books/porters-handbook/_index.adoc b/documentation/content/ru/books/porters-handbook/_index.adoc
new file mode 100644
index 0000000000..4469e6ad49
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/_index.adoc
@@ -0,0 +1,85 @@
+---
+title: Руководство FreeBSD по созданию портов
+authors:
+ - author: The FreeBSD Documentation Project
+copyright: 2000-2020 The FreeBSD Documentation Project
+releaseinfo: "$FreeBSD$"
+trademarks: ["freebsd", "sun", "unix", "general"]
+---
+
+= Руководство FreeBSD по созданию портов
+:doctype: book
+:toc: macro
+:toclevels: 2
+:icons: font
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnums:
+:sectnumlevels: 6
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:part-signifier: Часть
+:chapter-signifier: Глава
+:appendix-caption: Приложение
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+
+ifeval::["{backend}" == "html5"]
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+:chapters-path: content/ru/books/porters-handbook/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+include::../../../../shared/mirrors.adoc[]
+include::../../../../shared/authors.adoc[]
+include::../../../../shared/releases.adoc[]
+include::../../../../shared/ru/mailing-lists.adoc[]
+include::../../../../shared/ru/teams.adoc[]
+include::../../../../shared/ru/urls.adoc[]
+:chapters-path:
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+include::../../../../shared/mirrors.adoc[]
+include::../../../../shared/authors.adoc[]
+include::../../../../shared/releases.adoc[]
+include::../../../../shared/ru/mailing-lists.adoc[]
+include::../../../../shared/ru/teams.adoc[]
+include::../../../../shared/ru/urls.adoc[]
+:chapters-path:
+endif::[]
+
+'''
+
+toc::[]
+
+include::{chapters-path}toc-tables.adoc[]
+
+include::{chapters-path}toc-examples.adoc[]
+
+include::{chapters-path}porting-why/chapter.adoc[leveloffset=+1, lines=7..24;35..-1]
+include::{chapters-path}new-port/chapter.adoc[leveloffset=+1, lines=7..24;35..-1]
+include::{chapters-path}quick-porting/chapter.adoc[leveloffset=+1, lines=7..24;35..-1]
+include::{chapters-path}slow-porting/chapter.adoc[leveloffset=+1, lines=7..24;35..-1]
+include::{chapters-path}makefiles/chapter.adoc[leveloffset=+1, lines=7..25;36..-1]
+include::{chapters-path}special/chapter.adoc[leveloffset=+1, lines=7..24;35..-1]
+include::{chapters-path}plist/chapter.adoc[leveloffset=+1, lines=7..24;35..-1]
+include::{chapters-path}pkg-files/chapter.adoc[leveloffset=+1, lines=7..24;35..-1]
+include::{chapters-path}testing/chapter.adoc[leveloffset=+1, lines=7..24;35..-1]
+include::{chapters-path}upgrading/chapter.adoc[leveloffset=+1, lines=7..24;35..-1]
+include::{chapters-path}security/chapter.adoc[leveloffset=+1, lines=7..24;35..-1]
+include::{chapters-path}porting-dads/chapter.adoc[leveloffset=+1, lines=7..26;37..-1]
+include::{chapters-path}porting-samplem/chapter.adoc[leveloffset=+1, lines=7..24;35..-1]
+include::{chapters-path}keeping-up/chapter.adoc[leveloffset=+1, lines=7..24;35..-1]
+include::{chapters-path}uses/chapter.adoc[leveloffset=+1, lines=7..25;36..-1]
+include::{chapters-path}versions/chapter.adoc[leveloffset=+1, lines=6..23;34..-1]
diff --git a/documentation/content/ru/books/porters-handbook/chapters-order.adoc b/documentation/content/ru/books/porters-handbook/chapters-order.adoc
new file mode 100644
index 0000000000..f7a766c744
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/chapters-order.adoc
@@ -0,0 +1,16 @@
+porting-why/chapter.adoc
+new-port/chapter.adoc
+quick-porting/chapter.adoc
+slow-porting/chapter.adoc
+makefiles/chapter.adoc
+special/chapter.adoc
+plist/chapter.adoc
+pkg-files/chapter.adoc
+testing/chapter.adoc
+upgrading/chapter.adoc
+security/chapter.adoc
+porting-dads/chapter.adoc
+porting-samplem/chapter.adoc
+keeping-up/chapter.adoc
+uses/chapter.adoc
+versions/chapter.adoc
diff --git a/documentation/content/ru/books/porters-handbook/keeping-up/chapter.adoc b/documentation/content/ru/books/porters-handbook/keeping-up/chapter.adoc
new file mode 100644
index 0000000000..b01dc6c3e1
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/keeping-up/chapter.adoc
@@ -0,0 +1,83 @@
+---
+title: Глава 14. Актуализация
+prev: books/porters-handbook/porting-samplem
+next: books/porters-handbook/uses
+---
+
+[[keeping-up]]
+= Актуализация
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 14
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+Коллекция Портов FreeBSD постоянно изменяется. Здесь находится некоторая информация о том, как поддерживать её в актуальном состоянии.
+
+[[freshports]]
+== FreshPorts
+
+Самым простым способом отслеживать уже произошедшие обновления является подписка на http://www.FreshPorts.org/[FreshPorts]. Для мониторинга вы можете выбрать несколько портов. Мейнтейнерам настоятельно рекомендуется подписаться здесь, потому что они будут получать уведомления не только о собственных изменениях, но и об изменениях, сделанных любым другим коммиттером FreeBSD. (Это часто необходимо для синхронизации с изменениями на более низком технологическом уровне-хотя более корректным было бы получение предупреждений от тех, кто вносит подобные изменения, иногда этот этап пропускается или он просто непрактичен. Кроме того, в некоторых случаях изменения по своей природе весьма незначительны. Мы полагаем, что любой разработчик в таких ситуациях будет руководствоваться здравым смыслом).
+
+Если вы хотите использовать FreshPorts, то вам нужна только учётная запись. Если регистрационный адрес вашей электронной почты будет иметь вид `@FreeBSD.org`, то справа на Web-страницах вы увидите дополнительную ссылку. Для тех из вас, кто уже получил учётную запись FreshPorts, но не использовал собственный адрес электронной почты `@FreeBSD.org`, достаточно сменить адрес на `@FreeBSD.org`, подписаться, а затем сменить его обратно.
+
+Во FreshPorts имеется также функция проверки правильности, которая автоматически проверяет каждое изменение, внесённое в дерево портов FreeBSD. Если вы подпишетесь на эту услугу, то будете оповещаться обо всех ошибках, обнаруженных FreshPorts при проверке внесённых вами изменений.
+
+[[svnweb]]
+== Web-интерфейс к хранилищу исходных текстов
+
+Файлы в хранилище исходных текстов можно просматривать при помощи Web-интерфейса. Изменения, которые касаются в целом всей системы портов, теперь документируются в файле http://svnweb.FreeBSD.org/ports/head/CHANGES[CHANGES]. Изменения, касающиеся отдельных портов, отражаются теперь в файле http://svnweb.FreeBSD.org/ports/head/UPDATING[UPDATING]. Однако однозначный ответ на любой вопрос можно найти, только прочитав исходных код http://svnweb.FreeBSD.org/ports/head/Mk/bsd.port.mk[bsd.port.mk] и связанных с ним файлов.
+
+[[ports-mailing-list]]
+== Список рассылки FreeBSD, посвящённый портам
+
+Если вы поддерживаете порты, то должны следить за {freebsd-ports}. О важных изменениях, отражающихся на работе портов, будет сообщаться здесь, а затем они переносятся в [.filename]#CHANGES#.
+
+Если данный список рассылки слишком загружен сообщениями, вы можете отслеживать link:{freebsd-ports-announce-url}[freebsd-ports-announce], который модерируется и не является местом для дискуссий.
+
+[[build-cluster]]
+== Кластер построения портов FreeBSD
+
+Одной из наименее известных сильных сторон FreeBSD является тот факт, что для непрерывного построения Коллекции Портов для каждого из основных релизов ОС для каждой архитектуры уровня поддержки Tier-1 выделен целый кластер машин.
+
+Отдельные порты собираются, если они специально не помечены как `IGNORE`. Для портов, помеченных как `BROKEN`, попытки будут продолжены для того, чтобы увидеть, если основная проблема была решена. (Это сделано через использование переменной `TRYBROKEN` для [.filename]#Makefile# порта.)
+
+[[distfile-survey]]
+== Portscout: сканер дистрибутивных файлов портов FreeBSD
+
+Кластер построения выделен для выполнения самого последнего релиза каждого из портов, дистрибутивные файлы которых уже были сгружены. Однако из-за постоянных изменений в Internet дистрибутивные файлы могут быстро исчезать. http://portscout.FreeBSD.org[Portscout], средство сканирования дистрибутивных файлов FreeBSD пытается опросить каждый из сайтов, доступных для сгрузки каждого из портов, для определения того, доступны ли ещё дистрибутивные файлы. Portscout может готовить отчёты в HTML и рассылать электронные письма об имеющихся обновлениях для портов тем, кто это запрашивает. Мейнтейнеры периодически запрашивают наличие изменений, либо вручную, либо используя ленту RSS.
+
+Главная страница Portscout отображает email мейнтейнера порта, количество портов, за которые ответственен мейнтейнер, количество портов с новыми дистрибутивными файлами и процент устаревших портов. Функция поиска выполняет поиск мейнтейнера по адресу электронной почты и позволяет выбирать между всеми портами или только устаревшими.
+
+При щелчке по адресу электронной почты мейнтейнера отображается список всех его портов, разделённых по категориям, вместе с текущим номером версии, информацией о наличии новой версии, временем последнего обновления порта и временем его последней проверки. Функция поиска на этой странице позволяет пользователю выполнять поиск конкретного порта.
+
+По щелчку на название порта в списке отображается информация о порте http://freshports.org[FreshPorts].
+
+[[portsmon]]
+== Система мониторинга портов FreeBSD
+
+Другим полезным ресурсом является http://portsmon.FreeBSD.org[Система мониторинга портов FreeBSD] (известная также как `portsmon`). Система представляет собой базу данных, обрабатывающую информацию из нескольких источников и позволяющую просматривать их при помощи Web-интерфейса. На данный момент задействованы база сообщений об ошибках (PR), протоколы ошибок кластера построения и отдельные файлы из коллекции портов. В будущем в этот список будет добавлена система проверки дистрибутивных файлов и другие ресурсы.
+
+Для начала вы можете просмотреть всю информацию о некотором порте при помощи средства http://portsmon.FreeBSD.org/portoverview.py[Обзор отдельного порта].
+
+На момент написания это единственный доступный ресурс, который для имени порта ставит в соответствие записи PR GNATS. (Отправители PR не всегда добавляют в название имя порта, хотя мы предпочитаем, чтобы они это делали.) Таким образом, `portsmon` это хорошее место для начала, если вы хотите найти присланные PR и/или ошибки построения для существующего порта; либо поискать, был ли уже прислан новый порт, который вы подумывали создать сами.
diff --git a/documentation/content/ru/books/porters-handbook/makefiles/chapter.adoc b/documentation/content/ru/books/porters-handbook/makefiles/chapter.adoc
new file mode 100644
index 0000000000..1fd47a6fe4
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/makefiles/chapter.adoc
@@ -0,0 +1,2365 @@
+---
+title: Глава 5. Настройка файла Makefile
+prev: books/porters-handbook/slow-porting
+next: books/porters-handbook/special
+---
+
+[[makefiles]]
+= Настройка файла Makefile
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:gcc-plus-plus: g++
+:sectnumoffset: 5
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+Настройка файла [.filename]#Makefile# достаточно проста, и мы снова предполагаем, что перед тем, как начать, вы посмотрите на существующие примеры. К тому же в этом руководстве имеется <<porting-samplem,примерный Makefile>>, так что взгляните на него и, пожалуйста, следуйте порядку переменных и разделов в этом образце, чтобы облегчить чтение вашего порта другими людьми.
+
+Итак, расположим решаемые задачи в порядке их возникновения при создании вашего нового файла [.filename]#Makefile#:
+
+[[makefile-source]]
+== Оригинальные исходный код
+
+Находится ли он в каталоге `DISTDIR` в виде стандартного упакованного архиватором `gzip` tar-архива с именем типа [.filename]#foozolix-1.2.tar.gz#? Если это так, можно перейти к следующему шагу. Если нет, то вы должны попытаться переопределить некоторые из переменных `DISTVERSION`, `DISTNAME`, `EXTRACT_CMD`, `EXTRACT_BEFORE_ARGS`, `EXTRACT_AFTER_ARGS`, `EXTRACT_SUFX` или `DISTFILES` в зависимости от того, насколько необычен формат дистрибутивного файла.
+
+В худшем случае вы можете просто определить свою собственную цель `do-extract` для переопределения действий по умолчанию, хотя к этому нужно будет прибегать в очень редких случаях, если вообще придётся.
+
+[[makefile-naming]]
+== Именование
+
+В первой части [.filename]#Makefile# порта ему даётся название, указывается его номер версии и принадлежность к правильной категории.
+
+=== `PORTNAME` и `PORTVERSION`
+
+В переменной `PORTNAME` вы должны указать основную часть имени вашего порта, а в переменной `PORTVERSION` - номер версии.
+
+[[makefile-naming-revepoch]]
+=== `PORTREVISION` и `PORTEPOCH`
+
+==== `PORTREVISION`
+
+Переменная `PORTREVISION` представляет собой монотонно увеличивающееся число, которое обнуляется при каждом увеличении значения переменной `PORTVERSION` (то есть каждый раз, когда создателями выпускается новый официальный релиз), и добавляется к имени пакета, если оно не равно нулю. Изменения в `PORTREVISION` используются автоматизированными инструментами (например, `pkg version`, см. man:pkg-version[8]) для определения факта появления нового пакета.
+
+Значение `PORTREVISION` должно увеличиваться каждый раз, когда в порте FreeBSD делаются изменения, которые как-либо меняют получаемый пакет. Сюда относятся только изменения, затрагивающие построение пакета с <<makefile-options,параметрами>> по умолчанию.
+
+Примеры случаев, когда значение `PORTREVISION` должно быть увеличено:
+
+* Добавление патчей для исправления уязвимостей, ошибок, или добавления новой функциональности в порт.
+* Изменения в файле [.filename]#Makefile# порта для включения и выключения параметров, определяемых при компиляции пакета.
+* Изменения в списке упаковки или в поведении пакета во время его установки (например, изменение скрипта, генерирующего начальные данные для пакета, такие, как ssh-ключи для хоста).
+* Увеличение версии динамической библиотеки, от которой зависит порт (в этом случае тот, кто попытается установить старый пакет после установки более новой версии библиотеки, не сможет этого сделать, потому что при этом будет делаться поиск старой библиотеки libfoo.x, а не libfoo.(x+1)).
+* Большие функциональные изменения в дистрибутивном файле порта, происходящие без объявлений, и приводящие к большим изменениям, то есть изменения в дистрибутиве требуют корректировки файла [.filename]#distinfo# без соответствующего изменения `PORTVERSION`, когда как команда `diff -ru` между новой и старой версиями показывает нетривиальные изменения в коде.
+
+Примеры изменений, которые не требуют увеличения переменной `PORTREVISION`:
+
+* Изменения стиля в скелете порта без функциональных изменений в пакете.
+* Изменения в переменной `MASTER_SITES` или другие функциональные изменения порта, которые не затрагивают получающегося пакета.
+* Тривиальные патчи к дистрибутивному файлу, такие, как исправления опечаток, которые не так уж важны, что пользователи пакета должны озаботиться обновлением.
+* Исправления, касающиеся этапа построения, которые делают возможным построение пакета, если ранее это было невозможно сделать (пока изменения не приводят к изменению работы на любых других платформах, на которых порт ранее строился). Так как `PORTREVISION` отражает содержимое пакета, то, если ранее пакет не строился, то нет нужды увеличивать `PORTREVISION` для отметки изменения.
+
+Правило, которому нужно приблизительно следовать, заключается в том, что нужно спрашивать себя, является ли вносимое в порт изменение таким, что от него выиграют все (в виде усовершенствования, исправления или благодаря тому, что новый пакет будет вообще работоспособным), и примите во внимание тот факт, что при этом все, кто регулярно обновляют своё дерево портов, будут обязаны это сделать. Если это так, то переменная `PORTREVISION` должна быть увеличена.
+
+==== `PORTEPOCH`
+
+Время от времени разработчик программного обеспечения или создатель порта FreeBSD делают что-то не так и выпускают версию программы, номер которой меньше предыдущей версии. Примером этого является порт, название которого меняется с foo-20000801 на foo-1.0 (изначально это не считалось бы более новой версией, так как 20000801 численно больше, чем 1).
+
+[TIP]
+====
+
+Результат сравнения номера версии не всегда очевиден. Для выполнения сравнения двух строк с номером версии можно использовать `pkg version` (см. man:pkg-version[8]). Например:
+
+[source,bash]
+....
+% pkg version -t 0.031 0.29
+>
+....
+
+Строка `>` в выводе команды означает, что версия 0.031 считается выше, чем версия 0.29, что может быть не очевидно для того, кто выполняет портирование.
+====
+
+В ситуациях, подобных этой, должно быть увеличено значение `PORTEPOCH`. Если значение `PORTEPOCH` не равно нулю, то оно добавляется к имени пакета, как описано в разделе выше. Значение `PORTEPOCH` никогда не должно уменьшаться или сбрасываться в ноль, потому что это приведёт к ошибке сравнения с пакетом с меньшим номером эпохи (то есть то, что пакет устарел, обнаружено не будет): номер новой версии (например, `1.0,1` в примере выше) останется меньше, чем номер предыдущей версии (20000801), однако суффикс `,1` интерпретируется различными автоматизированными утилитами особым образом, и окажется больше, чем предполагаемый суффикс `,0` более раннего пакета).
+
+Некорректное уменьшение или сброс `PORTEPOCH` приводит к печальным последствиям; если вы не поняли, о чём шла речь ранее, пожалуйста, всё же разберитесь с этим, либо спросите в списках рассылки.
+
+Предполагается, что в большинстве портов переменная `PORTEPOCH` использоваться не будет, но при корректном использовании `PORTVERSION` может появиться необходимость её иметь, если в будущих релизах программное обеспечение должно изменить структуру номера версии. Однако создателям портов для FreeBSD нужно быть внимательными, когда разработчик выпускает релиз без официального номера версии - эдакие "промежуточные" релизы. Имеется соблазн пометить релиз датой его выхода, что может вызвать проблемы, как и в примере выше, когда будет выпущен новый "официальный" релиз.
+
+Например, если промежуточный релиз помечен датой 20000917, а предыдущая версия программного обеспечения имела номер 1.2, то промежуточному релизу должно быть поставлено в соответствие значение `PORTVERSION`, равное 1.2.20000917 или что-то похожее, но не 20000917, так как последующий релиз, скажем, 1.3, должен иметь численно большее значение.
+
+==== Пример использования переменных `PORTREVISION` и `PORTEPOCH`
+
+Выполнен коммит порта `gtkmumble`, версии `0.10`, в коллекцию портов.
+
+[.programlisting]
+....
+PORTNAME= gtkmumble
+PORTVERSION= 0.10
+....
+
+Значение `PKGNAME` станет равным `gtkmumble-0.10`.
+
+Обнаружена брешь в безопасности, исправление которой потребовало создания локального патча для FreeBSD. Соответственно было увеличено значение переменной `PORTREVISION`.
+
+[.programlisting]
+....
+PORTNAME= gtkmumble
+PORTVERSION= 0.10
+PORTREVISION= 1
+....
+
+`PKGNAME` принимает значение `gtkmumble-0.10_1`
+
+Разработчиком выпущена новая версия с номером `0.2` (оказалось, что под номером `0.10` автор имел в виду `0.1.0`, а не "то, что будет выпущено после версии 0.9" - извините, теперь уже поздно). Так как новый младший номер версии `2` по значению меньше, чем номер предыдущей версии `10`, то должно быть увеличено значение `PORTEPOCH` для того, чтобы заставить распознавать вновь создаваемый пакет как "более новый". Так как это новый релиз программы, то `PORTREVISION` обнуляется (или удаляется из файла [.filename]#Makefile#).
+
+[.programlisting]
+....
+PORTNAME= gtkmumble
+PORTVERSION= 0.2
+PORTEPOCH= 1
+....
+
+`PKGNAME` принимает значение `gtkmumble-0.2,1`
+
+Следующий релиз имеет номер версии 0.3. Так как значение переменной `PORTEPOCH` никогда не уменьшается, что переменные, определяющие версии, теперь выглядят так:
+
+[.programlisting]
+....
+PORTNAME= gtkmumble
+PORTVERSION= 0.3
+PORTEPOCH= 1
+....
+
+`PKGNAME` принимает значение `gtkmumble-0.3,1`
+
+[NOTE]
+====
+Если значение `PORTEPOCH` этим обновлением было бы сброшено в `0`, то кто-нибудь, имеющий установленный пакет `gtkmumble-0.10_1`, не смог бы опознать пакет `gtkmumble-0.3` как более новый, так как `3` было бы меньше, чем `10`. Помните, что в первую очередь это касается `PORTEPOCH`.
+====
+
+=== Переменные `PKGNAMEPREFIX` и `PKGNAMESUFFIX`
+
+Две необязательные переменные, `PKGNAMEPREFIX` и `PKGNAMESUFFIX`, объединяются со значениями `PORTNAME` и `PORTVERSION` для формирования `PKGNAME` в форме `${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}`. Добейтесь того, чтобы это соответствовало нашим <<porting-pkgname,рекомендациям по правильному выбору названий для пакетов>>. В частности, в переменной `PORTVERSION` _не разрешается_ использование дефиса (`-`). Кроме того, если в имени пакета присутствует часть _language-_ или _-compiled.specifics_ (смотрите ниже), то используйте переменные `PKGNAMEPREFIX` и `PKGNAMESUFFIX`, соответственно. Не делайте их частью значения переменной `PORTNAME`.
+
+[[porting-pkgname]]
+=== Соглашения по именованию пакетов
+
+Далее описаны некоторые соглашения, которым вы должны следовать в именовании ваших пакетов. Они были разработаны для облегчения просмотра каталога, так как имеется уже тысячи пакетов, а пользователи отвернутся от нас, если список не понравится их взору!
+
+Имя пакета должно иметь вид [.filename]#language_region-name-compiled.specifics-version.numbers#.
+
+Имя пакета определяется как `${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}`. Вы должны задавать значения переменных в соответствии с этим форматом.
+
+. FreeBSD пытается поддерживать языки, на которых разговаривают её пользователи. Часть _language-_ должна быть двухсимвольным сокращением от названия языка по стандарту ISO-639, если порт специфичен для конкретного языка. Примерами являются `ja` для японского, `ru` для русского, `vi` для вьетнамского, `zh` для китайского, `ko` для корейского и `de` для немецкого языков.
++
+Если ваш порт специфичен для конкретного региона внутри области использования языка, добавьте также двухсимвольный код страны. Примерами являются `en_US` для US English и `fr_CH` для Swiss French.
++
+Часть _language-_ должна задаваться в переменной `PKGNAMEPREFIX`.
+. Первая буква части [.filename]#name# должна быть в нижнем регистре. (Оставшаяся часть названия может содержать буквы в верхнем регистре, так что принимайте решение сами, когда преобразуете имя программного пакета, содержащего в имени некоторое количество заглавных букв.) Существует традиция именовать модули для `Perl 5`, добавляя впереди `p5-` и преобразуя пару двоеточий в дефис; например, модуль `Data::Dumper` будет именоваться `p5-Data-Dumper`.
+. Убедитесь, что имя порта и версия четко отделены и размещаются в переменных `PORTNAME` и `PORTVERSION`. Единственная причина, по которой `PORTNAME` содержит версионную часть, это если полученный дистрибутив сам назван таким образом, как это сделано для портов [.filename]#textproc/libxml2# или [.filename]#japanese/kinput2-freewnn#. В противном случае `PORTNAME` не должен содержать никакой информации, указывающей на версию. То, что некоторые порты имеют одинаковый `PORTNAME`, является вполне нормальным, как для портов [.filename]#www/apache*#; в этом случае различные версии (и различные записи в индексе) отличаются по значениям `PKGNAMEPREFIX` и `PKGNAMESUFFIX`.
+. Если порт может быть построен с различными <<makefile-masterdir,статически заданными значениями по умолчанию>> (обычно это часть имени каталога в семействе портов), то часть _-compiled.specifics_ должна определять вкомпилированные значения по умолчанию (дефис не обязателен). Примерами являются размеры бумаги и шрифтов.
++
+Часть _-compiled.specifics_ должна задаваться в переменной `PKGNAMESUFFIX`.
+. Строка с номером версии должна следовать за дефисом (`-`) и являться списком разделенных двоеточием чисел и букв в нижнем регистре. В частности, не разрешается иметь еще один дефис внутри строки с обозначением номера версии. Единственным исключением является строчка `pl` (означающая "patchlevel"), которая может использоваться _только_ тогда, когда у программного обеспечения нет старшего и младшего номера версии. Если в номер версии программного обеспечения включена строчка типа "alpha", "beta", "rc" или "pre", возьмите из неё первую букву и поставьте её непосредственно после точки. Если после таких строк номер версии ещё продолжается, то после буквы должно следовать число без дополнительной разделяющей точки.
++
+Смысл такого формата заключается в удобстве сортировки портов по номеру версии. В частности, следите за тем, чтобы компоненты номера версии разделялись точкой, и если там присутствует дата, то используйте формат `0.0.yyyy.mm.dd`, но не `dd.mm.yyyy` или не совместимый с проблемой Y2K `yy.mm.dd`. Добавление к версии префикса `0.0.` является важным, в случае если выпущен релиз с присвоением настоящей версии, которая в числовом представлении, конечно же, будет ниже, чем `yyyy`.
+
+Вот несколько (реальных) примеров того, как преобразовать имя из оригинального, придуманного авторами, к подходящему для имени пакета:
+
+[.informaltable]
+[cols="1,1,1,1,1,1", frame="none", options="header"]
+|===
+| Имя дистрибутива
+| PKGNAMEPREFIX
+| PORTNAME
+| PKGNAMESUFFIX
+| PORTVERSION
+| Обоснование
+
+|mule-2.2.2
+|(пусто)
+|mule
+|(пусто)
+|2.2.2
+|Изменений не потребовалось
+
+|EmiClock-1.0.2
+|(пусто)
+|emiclock
+|(пусто)
+|1.0.2
+|Для отдельных программ имена с заглавными буквами запрещены
+
+|rdist-1.3alpha
+|(пусто)
+|rdist
+|(пусто)
+|1.3.a
+|Строчки типа `alpha` запрещены
+
+|es-0.9-beta1
+|(пусто)
+|es
+|(пусто)
+|0.9.b1
+|Строчки типа `beta` запрещены
+
+|mailman-2.0rc3
+|(пусто)
+|mailman
+|(пусто)
+|2.0.r3
+|Строчки типа `rc` запрещены
+
+|v3.3beta021.src
+|(пусто)
+|tiff
+|(пусто)
+|3.3
+|Что это такое было вообще?
+
+|tvtwm
+|(пусто)
+|tvtwm
+|(пусто)
+|pl11
+|Всегда требуется указание номера версии
+
+|piewm
+|(пусто)
+|piewm
+|(пусто)
+|1.0
+|Всегда требуется указание номера версии
+
+|xvgr-2.10pl1
+|(пусто)
+|xvgr
+|(пусто)
+|2.10.1
+|`pl` разрешено только при отсутствии старшего/младшего номера версии
+
+|gawk-2.15.6
+|ja-
+|gawk
+|(пусто)
+|2.15.6
+|Версия на японском языке
+
+|psutils-1.13
+|(пусто)
+|psutils
+|-letter
+|1.13
+|Размер бумаги задается статически во время построения пакета
+
+|pkfonts
+|(пусто)
+|pkfonts
+|300
+|1.0
+|пакет для шрифтов 300dpi
+|===
+
+Если в исходном коде абсолютно нет информации о номере версии и не похоже, что автор собирается выпускать другую версию, то в качестве номера версии задайте просто `1.0` (как в примере с `piewm` выше). В противном случае спросите автора программы или используйте дату (`0.0.yyyy.mm.dd`) в качестве номера версии.
+
+[[makefile-categories]]
+== Разделение по категориям
+
+=== `CATEGORIES`
+
+В процессе создания пакета он помещается в каталог [.filename]#/usr/ports/packages/All#, а в одном или более подкаталогов из [.filename]#/usr/ports/packages# создаются на него ссылки. Имена этих подкаталогов определяются переменной `CATEGORIES`. Такая схема нужна для облегчения жизни пользователя, когда он сталкивается с массой пакетов на FTP-сервере или компакт-диске. Пожалуйста, посмотрите на <<porting-categories,текущий список категорий>> и выберите те из них, которые более всего подходят к вашему порту.
+
+Этот список также определяет, куда в дереве портов будет помещен порт. Если вы укажете здесь более одной категории, то предполагается, что файлы порта будут помещены в подкаталог с именем первой категории. Посмотрите <<choosing-categories,ниже>> для получения подробной информации о том, как правильно выбрать категории.
+
+[[porting-categories]]
+=== Текущий список категорий
+
+Вот текущий список категорий. Те, которые отмечены звёздочкой (`*`), являются _виртуальными_ категориями-они не имеют собственного подкаталога в дереве портов. Они используются только в качестве вторичных категорий, и только для поиска.
+
+[NOTE]
+====
+Для невиртуальных категорий имеется однострочное описание в `COMMENT` в [.filename]#Makefile# соответствующего подкаталога.
+====
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Категория
+| Описание
+| Примечания
+
+|[.filename]#accessibility#
+|Порты для помощи пользователям с ограниченными возможностями.
+|
+
+|[.filename]#afterstep*#
+|Порты, поддерживающие менеджер окон http://www.afterstep.org[AfterStep].
+|
+
+|[.filename]#arabic#
+|Поддержка арабского языка.
+|
+
+|[.filename]#archivers#
+|Инструменты для работы с архивами.
+|
+
+|[.filename]#astro#
+|Приложения, связанные с астрономией.
+|
+
+|[.filename]#audio#
+|Поддержка работы со звуком.
+|
+
+|[.filename]#benchmarks#
+|Утилиты для измерения производительности системы.
+|
+
+|[.filename]#biology#
+|Программное обеспечение, связанное с биологией.
+|
+
+|[.filename]#cad#
+|Инструменты Систем Автоматизированного Проектирования.
+|
+
+|[.filename]#chinese#
+|Поддержка китайского языка.
+|
+
+|[.filename]#comms#
+|Коммуникационное программное обеспечение.
+|В основном программы для работы с последовательным портом.
+
+|[.filename]#converters#
+|Утилиты для преобразования символьных форматов.
+|
+
+|[.filename]#databases#
+|Базы данных.
+|
+
+|[.filename]#deskutils#
+|То, что было на столе до изобретения компьютеров.
+|
+
+|[.filename]#devel#
+|Утилиты для разработки программного обеспечения.
+|Не помещайте сюда библиотеки просто потому, что это библиотеки-если они подпадают под какую-то другую категорию, то их быть здесь не должно.
+
+|[.filename]#dns#
+|Программное обеспечение для работы DNS.
+|
+
+|[.filename]#docs*#
+|Мета-порты для документации FreeBSD.
+|
+
+|[.filename]#editors#
+|Редакторы общего назначения.
+|Специализированные редакторы относят к разделу для соответствующих инструментов (например, редактор математических формул попадает в категорию [.filename]#math#).
+
+|[.filename]#elisp*#
+|Порты для Emacs lisp.
+|
+
+|[.filename]#emulators#
+|Эмуляторы других операционных систем.
+|Эмуляторы терминалов сюда _не_ относятся-те, которые разработаны для X, должны быть в категории [.filename]#x11#, а текстовые в [.filename]#comms# или [.filename]#misc#, в зависимости от конкретного их предназначения.
+
+|[.filename]#finance#
+|Приложения для работы с деньгами, финансами и всем, что с этим связано.
+|
+
+|[.filename]#french#
+|Поддержка французского языка.
+|
+
+|[.filename]#ftp#
+|Клиенты и серверы FTP.
+|Если ваш порт понимает как FTP, так и HTTP, поместите его в категорию [.filename]#ftp# и укажите вторичную категорию [.filename]#www#.
+
+|[.filename]#games#
+|Игры.
+|
+
+|[.filename]#geography*#
+|Программное обеспечение, связанное с географией.
+|
+
+|[.filename]#german#
+|Поддержка немецкого языка.
+|
+
+|[.filename]#gnome*#
+|Порты Проекта http://www.gnome.org[GNOME].
+|
+
+|[.filename]#gnustep*#
+|Программное обеспечение для окружения рабочего стола GNUstep.
+|
+
+|[.filename]#graphics#
+|Графические утилиты.
+|
+
+|[.filename]#hamradio*#
+|Программное обеспечение для любительского радио
+|
+
+|[.filename]#haskell*#
+|Программное обеспечение, связанное с языком Haskell.
+|
+
+|[.filename]#hebrew#
+|Поддержка иврита.
+|
+
+|[.filename]#hungarian#
+|Поддержка венгерского языка.
+|
+
+|[.filename]#ipv6*#
+|Программное обеспечение, связанное с IPv6.
+|
+
+|[.filename]#irc#
+|Утилиты для Internet Relay Chat.
+|
+
+|[.filename]#japanese#
+|Поддержка японского языка.
+|
+
+|[.filename]#java#
+|Программное обеспечение, связанное с языком Java(TM).
+|Категория [.filename]#java# ни в коем случае не должна быть единственной для порта. Оставьте для портов, непосредственно имеющих отношение к языку Java, портерам также рекомендуется не использовать [.filename]#java# как основную категорию порта.
+
+|[.filename]#kde*#
+|Порты проекта http://www.kde.org[KDE].
+|
+
+|[.filename]#kld*#
+|Загружаемые модули ядра.
+|
+
+|[.filename]#korean#
+|Поддержка корейского языка.
+|
+
+|[.filename]#lang#
+|Языки программирования.
+|
+
+|[.filename]#linux*#
+|Linux приложения и утилиты.
+|
+
+|[.filename]#lisp*#
+|Программное обеспечение, связанное с языком Lisp.
+|
+
+|[.filename]#mail#
+|Программы для работы с почтой.
+|
+
+|[.filename]#math#
+|Программное обеспечение для численных вычислений и другие утилиты, связанные с математикой.
+|
+
+|[.filename]#mbone*#
+|Приложения для MBone.
+|
+
+|[.filename]#misc#
+|Различные утилиты
+|В общем, то, что не попадает в другие категории. Если это возможно, попробуйте найти более подходящую, чем `misc`, категорию для вашего порта, так как здесь порты теряются.
+
+|[.filename]#multimedia#
+|Программное обеспечение для работы с мультимедиа.
+|
+
+|[.filename]#net#
+|Различное сетевое программное обеспечение.
+|
+
+|[.filename]#net-im#
+|Программы мгновенного обмена сообщениями.
+|
+
+|[.filename]#net-mgmt#
+|Программное обеспечение для сетевого управления.
+|
+
+|[.filename]#net-p2p#
+|Приложения для пиринговых сетей.
+|
+
+|[.filename]#news#
+|Программное обеспечение для работы с конференциями USENET.
+|
+
+|[.filename]#palm#
+|Программная поддержка http://www.palm.com/[Palm(TM)].
+|
+
+|[.filename]#parallel*#
+|Приложения, связанные с параллельными вычислениями.
+|
+
+|[.filename]#pear*#
+|Порты, относящиеся к технологии Pear PHP.
+|
+
+|[.filename]#perl5*#
+|Порты, которым для работы требуется Perl версии 5.
+|
+
+|[.filename]#plan9*#
+|Различные программы из http://www.cs.bell-labs.com/plan9dist/[Plan9].
+|
+
+|[.filename]#polish#
+|Поддержка польского языка.
+|
+
+|[.filename]#ports-mgmt#
+|Порты для управления, установки и разработки портов и пакетов FreeBSD.
+|
+
+|[.filename]#portuguese#
+|Поддержка португальского языка.
+|
+
+|[.filename]#print#
+|Программное обеспечение для печати.
+|Инструменты для вёрстки (просмотрщики и тому подобное) тоже относятся сюда.
+
+|[.filename]#python*#
+|Программное обеспечение, связанное с языком http://www.python.org/[Python].
+|
+
+|[.filename]#ruby*#
+|Программное обеспечение, связанное с языком http://www.ruby-lang.org/[Ruby].
+|
+
+|[.filename]#rubygems*#
+|Порты для пакетов http://www.rubygems.org/[RubyGems].
+|
+
+|[.filename]#russian#
+|Поддержка русского языка.
+|
+
+|[.filename]#scheme*#
+|Программное обеспечение, связанное с языком Scheme.
+|
+
+|[.filename]#science#
+|Научные программы, которые не подпадают под другие категории, скажем, [.filename]#astro#, [.filename]#biology# или [.filename]#math#.
+|
+
+|[.filename]#security#
+|Программы, обеспечивающие безопасность системы.
+|
+
+|[.filename]#shells#
+|Различные командные процессоры.
+|
+
+|[.filename]#sysutils#
+|Системные утилиты.
+|
+
+|[.filename]#spanish*#
+|Поддержка испанского языка.
+|
+
+|[.filename]#tcl*#
+|Порты, для работы которых нужен Tcl.
+|
+
+|[.filename]#textproc#
+|Утилиты для обработки текстов.
+|Инструменты для вёрстки помещаются в категорию [.filename]#print#, а не сюда.
+
+|[.filename]#tk*#
+|Порты, для работы которых нужен Tk.
+|
+
+|[.filename]#ukrainian#
+|Поддержка украинского языка.
+|
+
+|[.filename]#vietnamese#
+|Поддержка вьетнамского языка.
+|
+
+|[.filename]#windowmaker*#
+|Порты для поддержки менеджера окон WindowMaker.
+|
+
+|[.filename]#www#
+|Программное обеспечение, связанное со всемирной паутиной.
+|Поддержка языка HTML относится сюда же.
+
+|[.filename]#x11#
+|X Window System и иже с ними.
+|Эта категория предназначена только для программного обеспечения, которое поддерживает саму оконную систему. Не помещайте сюда обычные приложения для X: большинство из них должны быть перенесены в другие категории [.filename]#x11-*# (смотрите ниже).
+
+|[.filename]#x11-clocks#
+|Часы для X11.
+|
+
+|[.filename]#x11-drivers#
+|Драйверы X11.
+|
+
+|[.filename]#x11-fm#
+|Менеджеры файлов для X11.
+|
+
+|[.filename]#x11-fonts#
+|Шрифты для X11 и утилиты для работы с ними.
+|
+
+|[.filename]#x11-servers#
+|Серверы для X11.
+|
+
+|[.filename]#x11-themes#
+|Темы для X11.
+|
+
+|[.filename]#x11-toolkits#
+|Пакеты разработчика для X11.
+|
+
+|[.filename]#x11-wm#
+|Оконные менеджеры для X11.
+|
+
+|[.filename]#xfce*#
+|Порты, связанные с окружением рабочего стола http://www.xfce.org/[Xfce].
+|
+
+|[.filename]#zope*#
+|Поддержка http://www.zope.org/[Zope].
+|
+|===
+
+[[choosing-categories]]
+=== Выбор правильной категории
+
+Так как многие категории перекрываются, вам часто необходимо будет выбирать, какая их них должна быть основной для вашего порта. Есть несколько правил, по которым можно решить этот вопрос. Вот список приоритетов, в уменьшающейся степени предпочтения:
+
+* Первая категория должна быть физической категорий (смотрите <<porting-categories,выше>>). Это необходимо для создания пакетов. После этого виртуальные и физические категории могут смешиваться.
+* Сначала всегда идут категории, специфичные для языков. Например, если ваш порт устанавливает японские шрифты для X11, то строчка `CATEGORIES` должна иметь вид [.filename]#japanese x11-fonts#.
+* Более конкретные категории идут первыми перед более общими. В частности, редактор HTML должен быть описан как [.filename]#www editors#, а не наоборот. Кроме того, вы не должны указывать категорию [.filename]#net#, если порт относится к одной из категорий [.filename]#irc#, [.filename]#mail#, [.filename]#news#, [.filename]#security# или [.filename]#www#, так как [.filename]#net# включается автоматически.
+* [.filename]#x11# используется как вторичная категория только в случае, если в качестве основной категории указан естественный язык. В частности, вам не нужно указывать [.filename]#x11# в качестве категории для приложений X.
+* Режимы для редактора Emacs должны помещаться в ту же категорию, что и приложение, которое поддерживается этим режимом, а не в [.filename]#editors#. Например, режим Emacs для редактирования исходного кода некоторого языка программирования должен быть помещен в категорию [.filename]#lang#.
+* Порты, устанавливающие загружаемые модули ядра, должны содержать виртуальную категорию [.filename]#kld# в строке `CATEGORIES`. Это одно из действий, выполняемых автоматически с добавлением `kmod` в строке `USES`.
+* [.filename]#misc# не должна указываться вместе с любой другой невиртуальной категорией. Если вы указываете `misc` вместе с чем-то ещё в строке `CATEGORIES`, это значит, что вы можете спокойно удалить `misc` и просто поместить порт в этот другой подкаталог!
+* Если ваш порт решительным образом не подпадает ни под какую категорию, поместите его в [.filename]#misc#.
+
+Если вы не уверены в правильности выбора категории, пожалуйста, отметьте это в вашем сообщении man:send-pr[1], чтобы мы могли обсудить это до того, как включить порт в Коллекцию. Если вы являетесь коммиттером, пошлите замечание на адрес {freebsd-ports}, чтобы мы могли обсудить это. Зачастую новые порты помещаются не в ту категорию только для того, чтобы их оттуда сразу же удалили. Это приводит к излишнему и ненужному росту основного хранилища исходных текстов.
+
+[[proposing-categories]]
+=== Предложение новой категории
+
+Поскольку со временем Коллекция Портов увеличилась, то в связи с этим были добавлены различные новые категории. Новые категории могут быть или _виртуальными_ категориями-которые не имеют соответствующего подкаталога в дереве портов-или _физическими_ категориями-у которых он есть. Следующий текст содержит обсуждение вопросов, возникающих при создании новой физической категории, чтобы вы могли понимать их, когда предложите новую категорию.
+
+В соответствие с существующей практикой мы избегаем создания новой физической категории, пока достаточно большое число портов логически ей не принадлежит или же порты, которые могли бы ей принадлежать, не являются логически обособленной группой, представляющей для всех ограниченный интерес (в частности, категории, относящиеся к естественным языкам); предпочтительно выполнение обоих условий.
+
+Основной причиной для этого является то, что такое изменение создает link:{committers-guide}#ports[изрядное количество работы] и для коммиттеров, и для всех тех пользователей, которые отслеживают изменения в Коллекции Портов. В дополнение, предложенная категория создает естественное разногласие. (Пожалуй, потому что не существует четкого соглашения, является ли категория "слишком большой", или должны ли категории предоставлять себя для просмотра (и, таким образом, какое количество категорий было бы идеальным значением), и так далее.)
+
+Процедура:
+
+[.procedure]
+====
+. Предложите новую категорию на {freebsd-ports}. Вам следует включить для новой категории детальное обоснование, в том числе почему вы считаете, что существующие категории не являются достаточными, и список существующих портов, предложенных для перемещения. (Если есть новые порты, ожидающие в GNATS и попадающие в эту категорию, то укажите их тоже.) Если вы являетесь сопровождающим и/или отправителем, то укажите это соответственно, так как это может помочь вам в вашем деле.
+. Принимайте участие в обсуждении.
+. Если кажется, что для вашей идеи появилась поддержка, отправьте PR, который будет включать обоснование и список существующих портов, которые надо переместить. В идеале этот PR должен также включать патчи для следующего:
+
+** [.filename]#Makefile#'ы для новых портов в результате репозиторного копирования
+** [.filename]#Makefile# для категорий старых портов
+** [.filename]#Makefile#'ы для портов, зависящих от старых портов
+** (в дополнение, вы можете включить другие файлы, требующие изменений, согласно процедуре из Руководства Коммиттера.)
+
+. Поскольку это затрагивает инфраструктуру портов и охватывает не только выполнение репозиторного копирования, но также, возможно, и выполнение регрессивных тестов на кластере построения, то PR должна назначать себе {portmgr}.
+. Если этот PR одобрен, то коммиттеру нужно продолжить остальную часть процедуры, которая link:{committers-guide}#PORTS[изложена в Руководстве Коммиттера].
+====
+
+Предложение новой виртуальной категории должно быть схожим с вышеизложенным, но при этом затрагивать намного меньше, поскольку ни один из портов не будет перемещен в действительности. В этом случае единственными патчами, включенными в PR, будут те, что добавляют новую категорию в `CATEGORIES` каждого из затрагиваемых портов.
+
+[[proposing-reorg]]
+=== Предложение реорганизации всех категорий
+
+Время от времени кто-нибудь предлагает произвести реорганизацию категорий либо до двухуровневой, либо другого типа на основе ключевых слов. На данный момент из этих предложений ничего не получилось, потому что, хотя они просты в реализации, но предполагаемая переделка всей коллекции портов по меньшей мере приводит в уныние. Пожалуйста, прочтите историю этих предложений в архивах рассылок перед тем, как присылать свои соображения; более того, вы должны быть готовы представить работающий прототип.
+
+[[makefile-distfiles]]
+== Дистрибутивные файлы
+
+Во второй части [.filename]#Makefile# задаётся, какие файлы и откуда должны быть сгружены для того, чтобы построить порт.
+
+=== `DISTVERSION/DISTNAME`
+
+В переменной `DISTNAME` указывается имя порта так, как назвали его создатели программного обеспечения. Значение `DISTNAME` по умолчанию совпадает с `${PORTNAME}-${PORTVERSION}`, так что переопределяете её значение только в случае необходимости. `DISTNAME` используется только в двух местах. Во-первых, список дистрибутивных файлов (`DISTFILES`) по умолчанию состоит из `${DISTNAME}${EXTRACT_SUFX}`. И во-вторых, предполагается, что дистрибутивный файл будет распакован в подкаталог с именем `WRKSRC`, значение которого по умолчанию есть не что иное, как [.filename]#work/${DISTNAME}#.
+
+Названия некоторых дистрибутивов, которые не укладываются в `${PORTNAME}-${PORTVERSION}`-схему, могут быть автоматически обработаны посредством установки переменной `DISTVERSION`. `PORTVERSION` и `DISTNAME` будут унаследованы автоматически, но конечно же могут быть переопределены. Следующая таблица демонстрирует некоторые примеры:
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| DISTVERSION
+| PORTVERSION
+
+|0.7.1d
+|0.7.1.d
+
+|10Alpha3
+|10.a3
+
+|3Beta7-pre2
+|3.b7.p2
+
+|8:f_17
+|8f.17
+|===
+
+[NOTE]
+====
+Значения переменных `PKGNAMEPREFIX` и `PKGNAMESUFFIX` не влияют на значение `DISTNAME`. Заметьте также, что если значение `WRKSRC` равно [.filename]#work/${PORTNAME}-${PORTVERSION}#, и в случае, когда оригинальный архив называется по имени, отличном от `${PORTNAME}-${PORTVERSION}${EXTRACT_SUFX}`, скорее всего, вы должны оставить `DISTNAME` как есть- лучше переопределить `DISTFILES`, чем задавать значения как `DISTNAME`, так и `WRKSRC` (и, возможно, ещё и `EXTRACT_SUFX`).
+====
+
+=== `MASTER_SITES`
+
+Содержит часть с каталогом FTP/HTTP-URL, которая указывает на оригинальный архив на сервере `MASTER_SITES`. Не забудьте лидирующий слэш ([.filename]#/#)!
+
+Макрос команды `make` будет пытаться воспользоваться этой переменной для получения дистрибутивного файла с помощью программы `FETCH`, если он не будет найден в системе.
+
+Рекомендуется помещать в список много сайтов, предпочтительно с разных континентов. Это поможет при наличии проблем с мировой сетью. Мы даже планируем добавить поддержку автоматического определения ближайшего сайта и сгрузки файлов оттуда; наличие нескольких сайтов будет способствовать этому начинанию.
+
+Если оригинальный архив находится на одном из таких популярных серверов, как SourceForge, GNU или Perl CPAN, то указывайте эти сайты в простой форме при помощи `MASTER_SITE_*` (к примеру, `MASTER_SITE_SOURCEFORGE`, `MASTER_SITE_GNU` или `MASTER_SITE_PERL_CPAN`. Просто укажите в переменной `MASTER_SITES` одно из этих значений, а в переменной `MASTER_SITE_SUBDIR` задайте путь к архиву. Вот пример:
+
+[.programlisting]
+....
+MASTER_SITES= ${MASTER_SITE_GNU}
+MASTER_SITE_SUBDIR= make
+....
+
+Или можно использовать сокращенный формат:
+
+[.programlisting]
+....
+MASTER_SITES= GNU/make
+....
+
+Эти переменные определены в файле [.filename]#/usr/ports/Mk/bsd.sites.mk#. Всё время добавляются новые записи, так что обращайтесь к последней версии этого файла перед тем, как послать нам свой порт.
+
+Для популярных сайтов существует несколько _магических_ макросов с заранее известной структурой каталогов. Используйте для них сокращения, и система попытается угадать для вас правильный подкаталог.
+
+[.programlisting]
+....
+MASTER_SITES= SF
+....
+
+Если попытка угадать не удалась, то это может быть переписано следующим образом.
+
+[.programlisting]
+....
+MASTER_SITES= SF/stardict/WyabdcRealPeopleTTS/${PORTVERSION}
+....
+
+Что также можно записать в таком виде:
+
+[.programlisting]
+....
+MASTER_SITES= SF
+MASTER_SITE_SUBDIR= stardict/WyabdcRealPeopleTTS/${PORTVERSION}
+....
+
+.Популярные магические макросы для `MASTER_SITES`
+[cols="1,1", frame="none", options="header"]
+|===
+| Макрос
+| Предполагаемый подкаталог
+
+|`APACHE_JAKARTA`
+|`/dist/jakarta/${PORTNAME:S,-,,/,}/source`
+
+|`BERLIOS`
+|`/${PORTNAME:L}`
+
+|`CHEESESHOP`
+|`/packages/source/source/${DISTNAME:C/(.).\*/\1/}/${DISTNAME:C/(.*)-[0-9].*/\1/}`
+
+|`DEBIAN`
+|`/debian/pool/main/${PORTNAME:C/^((lib)?.).*$/\1/}/${PORTNAME}`
+
+|`GCC`
+|`/pub/gcc/releases/${DISTNAME}`
+
+|`GNOME`
+|`/pub/GNOME/sources/${PORTNAME}/${PORTVERSION:C/^([0-9]+\.[0-9]+).*/\1/}`
+
+|`GNU`
+|`/gnu/${PORTNAME}`
+
+|`MOZDEV`
+|`/pub/mozdev/${PORTNAME:L}`
+
+|`PERL_CPAN`
+|`/pub/CPAN/modules/by-module/${PORTNAME:C/-.*//}`
+
+|`PYTHON`
+|`/ftp/python/${PYTHON_PORTVERSION:C/rc[0-9]//}`
+
+|`RUBYFORGE`
+|`/${PORTNAME:L}`
+
+|`SAVANNAH`
+|`/${PORTNAME:L}`
+
+|`SF`
+|`/project/${PORTNAME:L}/${PORTNAME:L}/${PORTVERSION}`
+|===
+
+=== `EXTRACT_SUFX`
+
+Если у вас имеется один дистрибутивный файл, и в его имени используется странное окончание для указания типа сжатия, задайте переменную `EXTRACT_SUFX`.
+
+К примеру, если дистрибутивный файл носит имя [.filename]#foo.tgz#, а не более привычное [.filename]#foo.tar.gz#, вы должны написать:
+
+[.programlisting]
+....
+DISTNAME= foo
+EXTRACT_SUFX= .tgz
+....
+
+Переменные `USE_BZIP2`, `USE_XZ` и `USE_ZIP` при необходимости автоматически устанавливают значение `EXTRACT_SUFX` в `.tar.bz2`, `.tar.xz` или `.zip`. Если ни одна из этих переменных не задана, то значение `EXTRACT_SUFX` по умолчанию устанавливается в `.tar.gz`.
+
+[NOTE]
+====
+Вам не нужно задавать значения `EXTRACT_SUFX` и `DISTFILES` одновременно.
+====
+
+=== `DISTFILES`
+
+Иногда имена сгружаемых файлов не соответствуют имени порта. К примеру, файл может называться [.filename]#source.tar.gz# или подобным образом. В других случаях исходный код приложения может располагаться в нескольких отличающихся архивах, и все они должны быть сгружены.
+
+Если это ваш случай, то задайте в переменной `DISTFILES` список разделённых пробелами имён файлов, которые нужно сгрузить.
+
+[.programlisting]
+....
+DISTFILES= source1.tar.gz source2.tar.gz
+....
+
+Если переменная `DISTFILES` не задана явно, то её значением по умолчанию будет `${DISTNAME}${EXTRACT_SUFX}`.
+
+=== `EXTRACT_ONLY`
+
+Если только некоторые из `DISTFILES` должны быть распакованы-к примеру, часть из них является исходным кодом, а другие представляют собой неупакованную документацию-перечислите имена файлов, которые должны быть распакованы, в `EXTRACT_ONLY`.
+
+[.programlisting]
+....
+DISTFILES= source.tar.gz manual.html
+EXTRACT_ONLY= source.tar.gz
+....
+
+Если _ни один_ из `DISTFILES` не должен распаковываться, то установите пустое значение переменной `EXTRACT_ONLY`.
+
+[.programlisting]
+....
+EXTRACT_ONLY=
+....
+
+[[porting-patchfiles]]
+=== `PATCHFILES`
+
+Если вашему порту требуются некоторых дополнительные патчи, которые доступны по FTP или HTTP, задайте имена этих файлов в переменной `PATCHFILES`, а в переменной `PATCH_SITES` укажите URL того каталога, в котором они содержатся (формат такой же, как для `MASTER_SITES`).
+
+Если патч не относится к самому верху дерева исходных текстов (то есть `WRKSRC`), потому что он содержит некоторые дополнительные пути, установите соответственно значение переменной `PATCH_DIST_STRIP`. В частности, если все имена путей в патче имеют дополнительный путь `foozolix-1.0/` перед именем файла, то задайте `PATCH_DIST_STRIP=-p1`.
+
+Не волнуйтесь, если патчи упакованы; они будут распакованы автоматически, если имена файлов оканчиваются на [.filename]#.gz# или [.filename]#.Z#.
+
+Если патч распространяется вместе с какими-то другими файлами, такими, как документация, в виде tar-архива `gzip`, вы не можете просто использовать `PATCHFILES`. Если это ваш случай, добавьте имя и местоположение архива с патчем к `DISTFILES` и `MASTER_SITES`. Затем воспользуйтесь переменной `EXTRA_PATCHES` для указания этих файлов, и [.filename]#bsd.port.mk# автоматически применит эти патчи. В частности, _не копируйте_ файлы с патчами в каталог `PATCHDIR`-этот каталог может быть недоступным для записи.
+
+[NOTE]
+====
+Архив будет распакован вне исходного кода, как обычно, и к тому же его не нужно явно распаковывать, если это обычный архив `gzip` или `compress`. Если вы сделаете последнее, приложите дополнительные усилия для того, чтобы не перезаписать что-либо, уже существующее в этом каталоге. Также не забудьте добавить команду для удаления скопированного патча в цели `pre-clean`.
+====
+
+[[porting-master-sites-n]]
+=== Несколько дистрибутивных файлов или патчей с различных серверов и подкаталогов (`MASTER_SITES:n`)
+
+(Этот раздел можно считать немного "повышенной трудности"; те, кто впервые знакомятся с этим текстом, могут пропустить этот раздел).
+
+В этом разделе находится информация о механизме сгрузки, известном как `MASTER_SITES:n` и `MASTER_SITES_NN`. Далее мы будем называть этот механизм `MASTER_SITES:n`.
+
+Сначала немного общей информации. В OpenBSD имеется полезная возможность, используемая в переменных `DISTFILES` и `PATCHFILES`, которая позволяет закреплять после имен файлов и патчей идентификаторы типа `:n`. Здесь `n` может быть из диапазона `[0-9]` и обозначать закреплённую группу. К примеру:
+
+[.programlisting]
+....
+DISTFILES= alpha:0 beta:1
+....
+
+В OpenBSD дистрибутивный файл [.filename]#alpha# будет связан с переменной `MASTER_SITES0`, но не с нашей общей переменной `MASTER_SITES`, а файл [.filename]#beta# с переменной `MASTER_SITES1`.
+
+Этот очень интересная возможность, которая может уменьшить этот бесконечный поиск работающего сайта для сгрузки.
+
+Просто представьте себе 2 файла в `DISTFILES` и 20 сайтов в `MASTER_SITES`; сайты очень медленные, причём [.filename]#beta# находится на всех сайтах из `MASTER_SITES`, а [.filename]#alpha# может быть найден только на 20-м сайте. Будет неправильно проверять их все, если создатель знает об этом, не правда ли? Неподходящее начало для таких прекрасных выходных!
+
+Теперь, когда вы получили общее представление, просто представьте ещё большее количество `DISTFILES` и `MASTER_SITES`. Конечно, наш "магистр доступности дистрибутивов" представляет масштабы нагрузки на сеть, которую это даёт.
+
+В последующих разделах информация будет даваться вместе с реализацией этой идеи во FreeBSD. Мы несколько улучшили концепцию OpenBSD.
+
+==== Упрощённая информация
+
+В этом разделе рассказывается, как быстро подготовить точную сгрузку нескольких дистрибутивных файлов и патчей с разных сайтов и каталогов. Мы описываем здесь случай упрощённого использования `MASTER_SITES:n`. Для большинства сценариев этого будет достаточно. Однако, если вам нужна дополнительная информация, обратитесь к следующему разделу.
+
+Некоторые приложения состоят из многих дистрибутивных файлов, которые должны быть сгружены с нескольких различных сайтов. К примеру, Ghostscript состоит из основной программы и большого числа файлов драйверов, которые используются в зависимости от принтера пользователя. Некоторые из этих файлов драйверов поставляются с основной программой, но при этом многие другие должны быть сгружены с множества различных сайтов.
+
+Чтобы это поддерживать, за каждой записью в `DISTFILES` может следовать символ двоеточия и "имя метки". За каждым сайтом, перечисленным в `MASTER_SITES`, тоже следует двоеточие и метка, которая указывает, какие файлы дистрибутива должны быть сгружены с этого сайта.
+
+Например, рассмотрим приложение, исходный код которого разделён на две части, [.filename]#source1.tar.gz# и [.filename]#source2.tar.gz#, которые должны быть сгружены с двух различных источников. Файл [.filename]#Makefile# порта будет содержать строчки типа <<ports-master-sites-n-example-simple-use-one-file-per-site>>.
+
+[[ports-master-sites-n-example-simple-use-one-file-per-site]]
+.Упрощённое использование `MASTER_SITES:n` с 1 файлом на каждом сайте
+[example]
+====
+[.programlisting]
+....
+MASTER_SITES= ftp://ftp.example1.com/:source1 \
+ ftp://ftp.example2.com/:source2
+DISTFILES= source1.tar.gz:source1 \
+ source2.tar.gz:source2
+....
+
+====
+
+Несколько дистрибутивных файлов могут иметь одну и ту же метку. Продолжая предыдущий пример, положим, что имеется и третий дистрибутивный файл, [.filename]#source3.tar.gz#, который должен быть сгружен с `ftp.example2.com`. Тогда файл [.filename]#Makefile# будет написан как <<ports-master-sites-n-example-simple-use-more-than-one-file-per-site>>.
+
+[[ports-master-sites-n-example-simple-use-more-than-one-file-per-site]]
+.Упрощённое использование `MASTER_SITES:n` с более чем 1 файлом на каждом сервере
+[example]
+====
+[.programlisting]
+....
+MASTER_SITES= ftp://ftp.example1.com/:source1 \
+ ftp://ftp.example2.com/:source2
+DISTFILES= source1.tar.gz:source1 \
+ source2.tar.gz:source2 \
+ source3.tar.gz:source2
+....
+
+====
+
+==== Подробная информация
+
+Прекрасно, но пример из предыдущего раздела не показал вам всё, что вам нужно? В этом разделе мы подробно опишем, как работает механизм `MASTER_SITES:n` точной сгрузки и как вы можете изменить ваши порты, чтобы это использовать.
+
+. За элементами могут следовать символы `:n`, где _n_ это `[^:,]+`, то есть _n_ может теоретически быть любой алфавитно-цифровой строкой, но пока мы будем ограничивать их `[a-zA-Z_][0-9a-zA-Z_]+`.
++
+Более того, совпадение строк чувствительно к регистру; другими словами, `n` отличается от `N`.
++
+Однако следующие слова не могут использоваться для этих нужд, так как они имеют особое значение: `default`, `all` и `ALL` (они используются для своих нужд в <<porting-master-sites-n-what-changes-in-port-targets,ii>>). Кроме того, `DEFAULT` является специальным ключевым словом (посмотрите <<porting-master-sites-n-DEFAULT-group,3>>).
+. Элементы, за которыми следуют `:n`, принадлежат группе `n`, `:m` относится к группе `m` и так далее.
+[[porting-master-sites-n-DEFAULT-group]]
+. Элементы без таких суффиксов не относятся ни к какой группе, то есть они принадлежат к особой группе `DEFAULT`. Если вы укажете суффиксом любого элемента `DEFAULT`, вы просто выполните излишнюю работу, если только вы не хотите отнесения элемента как к группе `DEFAULT`, так и какой-то другой в одно и то же время (посмотрите на пункт <<porting-master-sites-n-comma-operator,5>>).
++
+Следующие примеры равнозначны, но первый более предпочтителен:
++
+[.programlisting]
+....
+MASTER_SITES= alpha
+....
+
++
+[.programlisting]
+....
+MASTER_SITES= alpha:DEFAULT
+....
+
+. Группы не являются эксклюзивными, элемент может принадлежать к нескольким отличающимся группам одновременно, а группа может либо иметь несколько различных элементов, либо не иметь их вовсе. Повторяющиеся элементы в одной и той же группе будут являться просто повторяющимися элементами.
+[[porting-master-sites-n-comma-operator]]
+. Если в хотите, чтобы элемент принадлежал к нескольким группам одновременно, вы можете использовать запятую (`,`).
++
+Вместо того, чтобы повторять их несколько раз, каждый раз с разным постфиксом, мы можем перечислить несколько групп за раз в одном постфиксе. Например, `:m,n,o` определяет элемент, принадлежащий группам `m`, `n` и `o`.
++
+Все следующие примеры имеют один смысл, но последний является предпочтительным:
++
+[.programlisting]
+....
+MASTER_SITES= alpha alpha:SOME_SITE
+....
+
++
+[.programlisting]
+....
+MASTER_SITES= alpha:DEFAULT alpha:SOME_SITE
+....
+
++
+[.programlisting]
+....
+MASTER_SITES= alpha:SOME_SITE,DEFAULT
+....
+
++
+[.programlisting]
+....
+MASTER_SITES= alpha:DEFAULT,SOME_SITE
+....
+
+. Все серверы внутри определённой группы сортируются в соответствии с `MASTER_SORT_AWK`. Все группы в `MASTER_SITES` и `PATCH_SITES` тоже сортируются.
+[[porting-master-sites-n-group-semantics]]
+. Семантика групп может использоваться в любой из следующих переменных `MASTER_SITES`, `PATCH_SITES`, `MASTER_SITE_SUBDIR`, `PATCH_SITE_SUBDIR`, `DISTFILES` и `PATCHFILES` в соответствии со следующим синтаксисом:
+.. Все элементы `MASTER_SITES`, `PATCH_SITES`, `MASTER_SITE_SUBDIR` и `PATCH_SITE_SUBDIR` должны заканчиваться символом прямого слэша `/`. Если какие-то элементы принадлежат каким-то группам, постфикс группы `:n` должен следовать сразу после завершающего символа `/`. Механизм `MASTER_SITES:n` опирается на наличие завершающего символа `/` во избежание совпадающих элементов, где `:n` является корректной частью элемента с вхождениями, где `:n` обозначает группу `n`. Для целей совместимости, так как завершающий символ `/` ранее не требовался в элементах `MASTER_SITE_SUBDIR` и `PATCH_SITE_SUBDIR`, если символ, сразу предшествующий постфиксу, не является символом `/`, то `:n` будет считаться корректной частью элемента, а не постфиксом группы, даже если за элементом следует `:n`. Посмотрите <<ports-master-sites-n-example-detailed-use-master-site-subdir>> и <<ports-master-sites-n-example-detailed-use-complete-example-master-sites>>.
++
+[[ports-master-sites-n-example-detailed-use-master-site-subdir]]
+.Подробное использование `MASTER_SITES:n` в `MASTER_SITE_SUBDIR`
+[example]
+====
+[.programlisting]
+....
+MASTER_SITE_SUBDIR= old:n new/:NEW
+....
+
+*** Каталоги внутри группы `DEFAULT` -> old:n
+*** Каталоги внутри группы `NEW` -> new
+
+====
++
+[[ports-master-sites-n-example-detailed-use-complete-example-master-sites]]
+.Подробное использование `MASTER_SITES:n` с запятыми, несколькими файлами, несколькими серверами и несколькими подкаталогами
+[example]
+====
+[.programlisting]
+....
+MASTER_SITES= http://site1/%SUBDIR%/ http://site2/:DEFAULT \
+ http://site3/:group3 http://site4/:group4 \
+ http://site5/:group5 http://site6/:group6 \
+ http://site7/:DEFAULT,group6 \
+ http://site8/%SUBDIR%/:group6,group7 \
+ http://site9/:group8
+DISTFILES= file1 file2:DEFAULT file3:group3 \
+ file4:group4,group5,group6 file5:grouping \
+ file6:group7
+MASTER_SITE_SUBDIR= directory-trial:1 directory-n/:groupn \
+ directory-one/:group6,DEFAULT \
+ directory
+....
+
+Предыдущий пример приводит к следующей точной сгрузке. Серверы перечислены в точном порядке их использования.
+
+*** [.filename]#file1# будет сгружаться с
+
+**** `MASTER_SITE_OVERRIDE`
+**** http://site1/directory-trial:1/
+**** http://site1/directory-one/
+**** http://site1/directory/
+**** http://site2/
+**** http://site7/
+**** `MASTER_SITE_BACKUP`
+
+*** [.filename]#file2# будет сгружаться точно также, как [.filename]#file1#, так как они оба относятся к одной и той же группе
+
+**** `MASTER_SITE_OVERRIDE`
+**** http://site1/directory-trial:1/
+**** http://site1/directory-one/
+**** http://site1/directory/
+**** http://site2/
+**** http://site7/
+**** `MASTER_SITE_BACKUP`
+
+*** [.filename]#file3# будет сгружен с
+
+**** `MASTER_SITE_OVERRIDE`
+**** http://site3/
+**** `MASTER_SITE_BACKUP`
+
+*** [.filename]#file4# будет сгружаться с
+
+**** `MASTER_SITE_OVERRIDE`
+**** http://site4/
+**** http://site5/
+**** http://site6/
+**** http://site7/
+**** http://site8/directory-one/
+**** `MASTER_SITE_BACKUP`
+
+*** [.filename]#file5# будет сгружен с
+
+**** `MASTER_SITE_OVERRIDE`
+**** `MASTER_SITE_BACKUP`
+
+*** [.filename]#file6# будет сгружаться с
+
+**** `MASTER_SITE_OVERRIDE`
+**** http://site8/
+**** `MASTER_SITE_BACKUP`
+
+====
+
+. Как мне группировать одну из специальных переменных из [.filename]#bsd.sites.mk#, например, `MASTER_SITE_SOURCEFORGE`?
++
+Посмотрите <<ports-master-sites-n-example-detailed-use-master-site-sourceforge>>.
++
+[[ports-master-sites-n-example-detailed-use-master-site-sourceforge]]
+.Подробное использование `MASTER_SITES:n` с `MASTER_SITE_SOURCEFORGE`
+[example]
+====
+[.programlisting]
+....
+MASTER_SITES= http://site1/ ${MASTER_SITE_SOURCEFORGE:S/$/:sourceforge,TEST/}
+DISTFILES= something.tar.gz:sourceforge
+....
+
+====
++
+[.filename]#something.tar.gz# будет сгружаться со всех сайтов из `MASTER_SITE_SOURCEFORGE`.
+. Как мне использовать это с переменными `PATCH*`?
++
+Все примеры выполнялись с переменными `MASTER*`, и они работают точно так же и для `PATCH*`, как это можно видеть в <<ports-master-sites-n-example-detailed-use-patch-sites>>.
++
+[[ports-master-sites-n-example-detailed-use-patch-sites]]
+.Упрощённое использование `MASTER_SITES:n` с `PATCH_SITES`.
+[example]
+====
+[.programlisting]
+....
+PATCH_SITES= http://site1/ http://site2/:test
+PATCHFILES= patch1:test
+....
+
+====
+
+==== Что изменится для портов? А что не изменится?
+
+[lowerroman]
+. Все имеющиеся порты остаются без изменений. Код для механизма `MASTER_SITES:n` активируется, если только есть элементы, которые заканчиваются на `:n`, как и элементы в соответствии с вышеописанным синтаксисом, особенно как это показано в пункте <<porting-master-sites-n-group-semantics,7>>.
+[[porting-master-sites-n-what-changes-in-port-targets]]
+. Цели порт остаются теми же самыми: `checksum`, `makesum`, `patch`, `configure`, `build` и так далее. С обычными исключениями для `do-fetch`, `fetch-list`, `master-sites` и `patch-sites`.
+
+** `do-fetch`: использует новую группировку с постфиксами в `DISTFILES` и `PATCHFILES` с соответствующими элементами групп в `MASTER_SITES` и `PATCH_SITES`, которые используют группы из `MASTER_SITE_SUBDIR` и `PATCH_SITE_SUBDIR`. Посмотрите <<ports-master-sites-n-example-detailed-use-complete-example-master-sites>>.
+** `fetch-list`: работает так же, как старая цель `fetch-list` с тем исключением, что она группирует, как и `do-fetch`.
+** `master-sites` и `patch-sites`: (несовместимы со старыми версиями) только возвращают элементы группы `DEFAULT`; на самом деле они выполняют цели `master-sites-default` и `patch-sites-default` соответственно.
++
+Более того, использование целей `master-sites-all` или `patch-sites-all` предпочтительно для непосредственной проверки `MASTER_SITES` или `PATCH_SITES`. Также работа прямой проверки в последующих версиях не гарантируется. Посмотрите <<porting-master-sites-n-new-port-targets-master-sites-all>> для получения более дополнительной информации об этих новых целях.
+
+. Новые цели построения портов
+.. Имеются цели `master-sites-_n_` и `patch-sites-_n_`, которые будут перечислять элементы соответствующей группы _n_ из `MASTER_SITES` и `PATCH_SITES` соответственно. К примеру, `master-sites-DEFAULT` и `patch-sites-DEFAULT` обе будут возвращать элементы группы `DEFAULT`, `master-sites-test` и `patch-sites-test` группы `test` и так далее.
+[[porting-master-sites-n-new-port-targets-master-sites-all]]
+.. Имеются новые цели `master-sites-all` и `patch-sites-all`, которые выполняют работу старых `master-sites` и `patch-sites`. Они возвращают элементы всех групп, как если бы они все принадлежали одной и той же группе с тем, что она перечисляет ровно столько `MASTER_SITE_BACKUP` и `MASTER_SITE_OVERRIDE`, как и группы, определённые в `DISTFILES` или `PATCHFILES`; соответственно для `master-sites-all` и `patch-sites-all`.
+
+=== `DIST_SUBDIR`
+
+Не позволяйте вашему порту засорять [.filename]#/usr/ports/distfiles#. Если вашему порту требуется сгрузить много файлов, или он содержит имя файла, могущее вызвать конфликты с другими портами (например, [.filename]#Makefile#), то укажите в переменной `DIST_SUBDIR` имя порта (должны подойти `${PORTNAME}` или `${PKGNAMEPREFIX}${PORTNAME}`). Это изменит значение переменной `DISTDIR` со значения по умолчанию [.filename]#/usr/ports/distfiles# к значению [.filename]#/usr/ports/distfiles/DIST_SUBDIR#, и в результате всё, что требуется для порта, будет помещено в этот подкаталог.
+
+Он заглянет также в подкаталог с тем же именем на основном резервном сервере [.filename]#ftp.FreeBSD.org#. (Явное задание переменной `DISTDIR` в вашем файле `Makefile` этого не сделает, так что, пожалуйста, воспользуйтесь `DIST_SUBDIR`.)
+
+[NOTE]
+====
+Это не коснётся тех сайтов `MASTER_SITES`, которые вы указали в вашем файле [.filename]#Makefile#.
+====
+
+=== `ALWAYS_KEEP_DISTFILES`
+
+Если ваш порт использует двоичные дистрибутивные файлы и обладает лицензией, требующей, чтобы исходный код предоставлялся вместе с пакетами, распространяемыми в двоичной форме, например GPL, то `ALWAYS_KEEP_DISTFILES` даст кластеру построения FreeBSD указание сохранять копию файлов, указанных в `DISTFILES`. Пользователям таких портов эти файлы в основном не нужны, поэтому хорошей идеей является добавление в `DISTFILES` исходных дистрибутивных файлов, только когда определена переменная `PACKAGE_BUILDING`.
+
+[[ports-master-sites-n-example-always-keep-distfiles]]
+.Использование `ALWAYS_KEEP_DISTFILES`.
+[example]
+====
+[.programlisting]
+....
+.if defined(PACKAGE_BUILDING)
+DISTFILES+= foo.tar.gz
+ALWAYS_KEEP_DISTFILES= yes
+.endif
+....
+
+====
+
+При добавлении дополнительных файлов в `DISTFILES` убедитесь, что вы их также добавляете в [.filename]#distinfo#. Кроме того, дополнительные файлы обычно распаковываются также в `WRKDIR`, что для некоторых портов может вызывать нежелательные подобные эффекты и требовать особую обработку.
+
+[[makefile-maintainer]]
+== `MAINTAINER`
+
+Укажите здесь ваш адрес электронной почты. Пожалуйста. _:-)_
+
+Заметьте, что в качестве значения для `MAINTAINER` допустимо использование только одного адреса без поля комментария. Должен использоваться формат `user@hostname.domain`. Пожалуйста, не включайте никакого описательного текста, например, вашего настоящего имени в эту строку-это несколько сбивает с толку [.filename]#bsd.port.mk#.
+
+Сопровождающий ответственен за поддержание порта в актуальном состоянии и обеспечение правильной работы порта. За подробным описанием обязанностей сопровождающего порт обращайтесь к главе link:{contributing}#maintain-port/[The challenge for port maintainers].
+
+Перед фиксацией в репозитории изменения в порте будут отправлены сопровождающему для просмотра и одобрения. Если сопровождающий порта не ответил на запрос пользователя об обновлении в течение двух недель (исключая большие праздники), то это можно считать тайм-аутом сопровождающего, и обновление может быть выполнено без явного подтверждения от сопровождающего. Если сопровождающий не отвечает в течение трёх месяцев, то считается, что он отсутствует, и как сопровождающий порта, о котором идёт речь, может быть заменён. Исключениями из этого правила является всё, что сопровождает {portmgr} или {security-officer}. Запрещено делать любые несанкционированные изменения в портах, которые ведут эти группы.
+
+Мы оставляем за собой право изменять сообщение сопровождающего для лучшего соответствия существующим политикам и стилю Коллекции Портов без явного одобрения со стороны отправителя. Также, крупные изменения в инфраструктуре могут повлечь изменения в порте без согласия сопровождающего. Такой вид изменений никогда не будет затрагивать функциональность порта.
+
+За {portmgr} оставляется право снять или назначить кого-либо сопровождающим по любой причине, а за {security-officer} оставляется право лишать или назначать права на сопровождение порта по соображениям информационной безопасности.
+
+[[makefile-comment]]
+== `COMMENT`
+
+Содержит однострочное описание порта. Пожалуйста, соблюдайте следующие правила:
+
+. Старайтесь делать строку COMMENT длиной не больше, чем 70 символов, так как эта строка будет использована командой `pkg info` (см. man:pkg-info[8]) для отображения однострочного описания порта;
+. _Не_ включайте сюда название пакета (или номер версии программного обеспечения);
+. Комментарий должен начинаться с заглавной буквы и не заканчиваться точкой;
+. Не начинайте комментарий с неопределённого артикля (A или An);
+. Имена пишутся с заглавной буквы (например, Apache, JavaScript, Perl);
+. Для перечислений используйте английскую Оксфордскую запятую (англ. Oxford comma) (например, green, red, and blue);
+. Используйте программу проверки орфографии.
+
+Вот пример:
+
+[.programlisting]
+....
+COMMENT= Cat chasing a mouse all over the screen
+....
+
+В файле [.filename]#Makefile# переменная COMMENT должна следовать сразу за переменной MAINTAINER.
+
+[[makefile-portscout]]
+== `PORTSCOUT`
+
+Portscout являет собой автоматизированное средство проверки доступности дистрибутивных файлов для Коллекции Портов FreeBSD, подробное описание которого предоставляет <<distfile-survey>>.
+
+Переменная `PORTSCOUT` задаёт специальные условия, ограничивающие работу Portscout - сканера дистрибутивных файлов.
+
+Ситуации, при которых следует указывать переменную `PORTSCOUT`:
+
+* Когда должны игнорироваться дистрибутивные файлы для конкретных версий или младших ревизий. Например, чтобы исключить из проверок новых версий дистрибутивных файлов версию _8.2_ по причине того, что она является поломанной, добавьте следующее:
++
+[.programlisting]
+....
+PORTSCOUT= ignore:8.2
+....
+
+* Когда должны проверяться конкретные версии или старшие и младшие ревизии дистрибутивных файлов. Например, если следует ограничиться проверкой версии _0.6.4_, потому что более новые версии имеют проблемы совместимости с FreeBSD, добавьте:
++
+[.programlisting]
+....
+PORTSCOUT= limit:^0\.6\.4
+....
+
+* Когда URL, в которых указаны доступные версии, отличаются от URL их загрузки. Например, чтобы привязать проверку новых версий дистрибутивных файлов к странице загрузки для порта package:databases/pgtune[], добавьте:
++
+[.programlisting]
+....
+PORTSCOUT= site:http://pgfoundry.org/frs/?group_id=1000416
+....
+
+[[makefile-depend]]
+== Зависимости
+
+Многие порты зависят от других портов. Это очень удобная замечательная особенность большинства Unix-подобных операционных систем, включая FreeBSD. Множество портов могут использовать общую зависимость совместно, а не включать её в состав каждого порта или пакета, который в ней нуждается. Имеется семь переменных, которые вы можете использовать для обеспечения того, что всё требуемое находится на машине пользователя. Имеется также несколько предопределённых переменных, отражающих зависимости для общих случаев, плюс ещё несколько для управления поведением зависимостей.
+
+=== `LIB_DEPENDS`
+
+Эта переменная указывает, от каких совместно используемых библиотек зависит порт. Это список пар lib:dir, где _lib_ - это имя библиотеки, _dir_ - это каталог, в котором можно ее найти в случае, если ее нет на машине. Например,
+
+[.programlisting]
+....
+LIB_DEPENDS= libjpeg.so:${PORTSDIR}/graphics/jpeg
+....
+
+проверит наличие библиотеки jpeg с любым номером версии и перейдет в подкаталог [.filename]#graphics/jpeg# вашего дерева портов для ее построения и установки, если библиотека отсутствует.
+
+Зависимость проверяется дважды, один раз внутри цели `build`, а затем из цели `install`. Кроме того, имя зависимости помещается в пакет, так что `pkg install` (см. man:pkg-install[8]) будет автоматически её устанавливать, если её нет на пользовательской системе.
+
+=== `RUN_DEPENDS`
+
+В этой переменной перечисляются выполнимые файлы или файлы, от которых зависит работа порта. Это список пар вида path:dir:target, где _path_ - это имя программы или файла, а _dir_ - каталог, в котором можно найти порт в случае, если его нет в системе, и _target_ - это цель, которую нужно вызвать в этом каталоге. Если _path_ начинается со слэша (`/`), он воспринимается как файл и его существование проверяется командой `test -e`; в противном случае предполагается, что это выполнимый файл, и для определения того, имеется ли программа в пути поиска, используется команда `which -s`.
+
+Например,
+
+[.programlisting]
+....
+RUN_DEPENDS= ${LOCALBASE}/news/bin/innd:${PORTSDIR}/news/inn \
+ xmlcatmgr:${PORTSDIR}/textproc/xmlcatmgr
+....
+
+проверит существование файла или каталога [.filename]#/usr/local/news/bin/innd#, и если ничего не будет найдено, то построит и установит порт из подкаталога [.filename]#news/inn# дерева портов. Также будет выполнена проверка, присутствует ли в пути поиска исполняемый файл с именем `xmlcatmgr`, и перейдет в подкаталог [.filename]#textproc/xmlcatmgr# вашего дерева портов для его построения и установки, если он не будет найден.
+
+[NOTE]
+====
+В приведенном примере `innd` является выполнимым файлом; если выполнимый файл находится в месте, которое отсутствует в списке путей файлов, то вы должны указать полный путь к файлу.
+====
+
+[NOTE]
+====
+Официальным значением переменной поиска `PATH`, используемым в кластере построения портов является
+
+[.programlisting]
+....
+/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
+....
+
+====
+
+Зависимость проверяется внутри цели `install`. Кроме того, имя зависимости помещается в пакет, так что `pkg install` (см. man:pkg-install[8]) будет автоматически его устанавливать, если он не будет найден в пользовательской системе. Часть _target_ может быть опущена, если она совпадает с `DEPENDS_TARGET`.
+
+Довольно распространенной является ситуация, когда `RUN_DEPENDS` буквально такая же как `BUILD_DEPENDS`, особенно если переносимое программное обеспечение написано на языке сценариев, или если оно требует такое же окружение для исполнения, как и используемое во время построения. В этом случае, очень заманчивым или довольно естественным является присвоение одного другому:
+
+[.programlisting]
+....
+RUN_DEPENDS= ${BUILD_DEPENDS}
+....
+
+Тем не менее, подобные присвоения могут загрязнять зависимости времени исполнения содержимым, не заданным в `BUILD_DEPENDS` исходного порта. Такое случается из-за ленивого вычисления в man:make[1] присваиваемых переменных. Представьте [.filename]#Makefile# с переменными `USE_*`, которые обрабатываются в [.filename]#ports/Mk/bsd.*.mk# для пополнения первоначальных зависимостей построения. Например, `USES= gmake` добавляет package:devel/gmake[] в `BUILD_DEPENDS`. Для предотвращения загрязнения `RUN_DEPENDS` подобными дополнительными зависимостями проявляйте осторожность с присвоением с раскрытием, т.е. с раскрытием значения перед его присвоением переменной:
+
+[.programlisting]
+....
+RUN_DEPENDS:= ${BUILD_DEPENDS}
+....
+
+=== `BUILD_DEPENDS`
+
+В этой переменной перечисляются выполнимые или обычные файлы, которые требуются порту для его построения. Как и `RUN_DEPENDS`, это список пар path:dir:target. Например,
+
+[.programlisting]
+....
+BUILD_DEPENDS= unzip:${PORTSDIR}/archivers/unzip
+....
+
+будет проверять наличие выполнимого фала с именем `unzip` и перейдет в подкаталог [.filename]#archivers/unzip# вашего дерева портов для его построения и установки, если последний не будет найден.
+
+[NOTE]
+====
+Под "построением" здесь понимается всё, от распаковки до компиляции. Зависимость проверяется из цели `extract`. Часть _target_ может быть опущена, если она совпадает с `DEPENDS_TARGET`.
+====
+
+=== `FETCH_DEPENDS`
+
+В этой переменной перечисляются выполняемые файлы или просто файлы, которые требуются порту для сгрузки. Как и предыдущие две переменные, это список пар path:dir:target. Например,
+
+[.programlisting]
+....
+FETCH_DEPENDS= ncftp2:${PORTSDIR}/net/ncftp2
+....
+
+будет проверять наличие выполняемого файла с именем `ncftp2` и перейдет в каталог [.filename]#net/ncftp2# вашего дерева портов для его построения и установки, если тот не будет найден.
+
+Зависимость проверяется при выполнении цели `fetch`. Часть _target_ может быть опущена, если она совпадает с `DEPENDS_TARGET`.
+
+=== `EXTRACT_DEPENDS`
+
+В этой переменной указываются программы или файлы, которые требуются для распаковки порта. Как и в предыдущих случаях, это список пар вида path:dir:target. Например,
+
+[.programlisting]
+....
+EXTRACT_DEPENDS= unzip:${PORTSDIR}/archivers/unzip
+....
+
+будет проверять наличие программы с именем `unzip`, и перейдёт в подкаталог [.filename]#archivers/unzip# вашего дерева портов для её построения и установки, если такой программы не будет найдено.
+
+Зависимость проверяется внутри цели `extract`. Часть _target_ может быть опущена, если она совпадает с `DEPENDS_TARGET`.
+
+[NOTE]
+====
+Используйте эту переменную, только если распаковка не работает (по умолчанию предполагается использование `gzip`) и это не исправляется при помощи `USE_ZIP` или `USE_BZIP2`, которые описаны в <<use-vars>>.
+====
+
+=== `PATCH_DEPENDS`
+
+Эта переменная указывает на программы или файлы, которые нужны порту для применения патчей. Как и в предыдущих случаях, это список пар вида path:dir:target. Например,
+
+[.programlisting]
+....
+PATCH_DEPENDS= ${NONEXISTENT}:${PORTSDIR}/java/jfc:extract
+....
+
+будет переходить в подкаталог [.filename]#java/jfc# вашего дерева портов для распаковки.
+
+Зависимость проверяется внутри цели `patch`. Часть _target_ может быть опущена, если она совпадает с `DEPENDS_TARGET`.
+
+[[uses-makefiles]]
+=== `USES`
+
+Могут быть добавлены параметры для определения различных характерных особенностей и зависимостей, которыми обладает данный порт. Они указываются путём добавления в [.filename]#Makefile# этой строки:
+
+[.programlisting]
+....
+USES= feature[:arguments]
+....
+
+Для получения полного списка значений смотрите <<uses-makefiles>>.
+
+[WARNING]
+====
+
+Значение `USES` нельзя присваивать после подключения [.filename]#bsd.port.pre.mk#.
+====
+
+[[use-vars]]
+=== `USE_*`
+
+Для определения общих зависимостей, совместно используемых многими портами, предназначено несколько переменных. Их использование является необязательным, но помогает упростить избыточность файлов [.filename]#Makefile# порта. Каждый из них оформляется как `USE_*`. Эти переменные можно использовать только в [.filename]#Makefile# порта и [.filename]#ports/Mk/bsd.*.mk#. Они не предназначены для установки пользователями параметров - используйте для этих целей `PORT_OPTIONS`.
+
+[NOTE]
+====
+Установка любых `USE_*` в [.filename]#/etc/make.conf# _всегда_ является ошибочным действием. В частности, установка
+
+[.programlisting]
+....
+USE_GCC=X.Y
+....
+
+(где X.Y соответствует версии) добавит зависимость от gccXY к каждому порту, включая и сам `lang/gccXY`!
+====
+
+.Переменные `USE_*`
+[cols="1,1", frame="none", options="header"]
+|===
+| Переменная
+| Значение
+
+|`USE_BZIP2`
+|tar-архивы порта упакованы при помощи `bzip2`.
+
+|`USE_ZIP`
+|tar-архивы порта упакованы при помощи `zip`.
+
+|`USE_GCC`
+|Для сборки порта требуется GCC (gcc или {gcc-plus-plus}). Некоторым портам подходит любая версия, для других требуются последние современные версии. Обычно используется со значением `any` (в этом случае используется встроенный GCC в тех версиях FreeBSD, в состав которых он всё ещё входит, или устанавливается порт `lang/gcc`, когда Clang является компилятором C/C++ по умолчанию) или `yes` (всегда используется стабильная современная версия GCC из порта `lang/gcc`). Также в значении переменной можно указать точную версию, например `4.7`. Минимально допустимую версию можно указать как `4.6+`. GCC из основной системы используется в случае, если его версия удовлетворяет запрошенной, иначе собирается подходящая версии компилятора из порта с соответствующей коррекцией переменных `CC` и `CXX`.
+|===
+
+Переменные, относящиеся к gmake и сценарию [.filename]#configure#, описаны в <<building>>, а autoconf, automake и libtool описаны в <<using-autotools>>. Переменные, связанные с Perl, описаны в <<using-perl>>. Переменные X11 перечислены в <<using-x11>>. <<using-gnome>> работает с переменными GNOME и <<using-kde>> с KDE. <<using-java>> описывает переменные Java, а <<using-php>> содержит информацию об Apache, PHP и модулях PEAR. Python обсуждается в <<using-python>>, а Ruby в <<using-ruby>>. <<using-sdl>> предоставляет переменные, используемые для приложений SDL, и, наконец, <<using-xfce>> содержит информацию о приложении Xfce.
+
+=== Минимальная версия зависимости
+
+Минимальная версия зависимости может быть указана в любой переменной `*_DEPENDS`, за исключением `LIB_DEPENDS`, с использованием следующего синтаксиса:
+
+[.programlisting]
+....
+p5-Spiffy>=0.26:${PORTSDIR}/devel/p5-Spiffy
+....
+
+Первое поле содержит название зависимого пакета, которое обязано совпадать с записью в базе данные пакетов, знак сравнения и версию пакета. Зависимость удовлетворяется, если на машине установлен p5-Spiffy-0.26 или новее.
+
+=== Замечания касательно зависимостей
+
+Как уже отмечено выше, целью, которая вызывается по умолчанию в случае, когда это требует зависимость, является `DEPENDS_TARGET`. Она по умолчанию есть `install`. Это пользовательская переменная; она нигде не определена в файле [.filename]#Makefile# порта. Если вашему порту требуется особый метод обработки зависимости, воспользуйтесь частью `:target` переменной `*_DEPENDS` вместо того, чтобы переопределять `DEPENDS_TARGET`.
+
+Когда вы набираете команду `make clean`, эта операция также выполняется и над зависимостями этого порта. Если вы не хотите, чтобы это случилось, определите переменную `NOCLEANDEPENDS` в вашем окружении. Это может быть особенно нужным, если порт имеет нечто, что занимает много времени на построение, в своём списке зависимостей, например, KDE, GNOME или Mozilla.
+
+Чтобы безусловно зависеть от другого порта, укажите переменную `${NONEXISTENT}` в качестве первого поля переменной `BUILD_DEPENDS` или `RUN_DEPENDS`. Пользуйтесь этим, только когда вам нужно иметь исходный код другого порта. Вы можете сэкономить время на компиляции, указав также и цель. Например,
+
+[.programlisting]
+....
+BUILD_DEPENDS= ${NONEXISTENT}:${PORTSDIR}/graphics/jpeg:extract
+....
+
+всегда будет переходить в каталог с портом `jpeg` и распаковывать его.
+
+=== Зацикленные зависимости фатальны
+
+[IMPORTANT]
+====
+Не помещайте зацикливающиеся зависимости в дерево портов!
+====
+
+Технология построения портов не защищена от зацикленных зависимостей. Если вы создадите такую, то у кого-нибудь и где-нибудь установка FreeBSD будет немедленно сломана, а у остальных сломается несколько позже. Это на самом деле очень трудно распознать; если вы сомневаетесь, то перед внесением изменений проверьте, что выполнили следующее: `cd /usr/ports; make index`. Этот процесс может быть достаточно медленным на старых машинах, хотя вы сможете спасти большое количество людей-включая себя-от грядущих бед.
+
+=== Автоматические зависимости и проблемы, которые они вызывают
+
+Зависимости должны быть указаны либо явно, либо с использованием <<makefile-options,фреймворка OPTIONS>>. Использование прочих методов, таких как автоматическое обнаружение зависимостей, усложняет индексирование, что вызывает проблемы в управлении портами и пакетами.
+
+.Некорректное объявление необязательной зависимости
+[example]
+====
+[.programlisting]
+....
+.include <bsd.port.pre.mk>
+
+.if exists(${LOCALBASE}/bin/foo)
+LIB_DEPENDS= libbar.so:${PORTSDIR}/foo/bar
+.endif
+....
+
+====
+
+Проблема автоматического добавления зависимостей заключается в том, что файлы и настройки за пределами порта могут произвольно меняться. Пример: после построения индекса устанавливается набор портов. При этом один из них устанавливает проверяемый файл. На этом этапе индекс будет неправильным, потому что установленный порт неожиданно получит новую зависимость. Индекс может быть по прежнему неправильным даже после его перестроения, в случае если другие порты также определят дополнительные зависимости, основываясь на существовании других файлов.
+
+.Корректное объявление необязательной зависимости
+[example]
+====
+[.programlisting]
+....
+OPTIONS_DEFINE= BAR
+BAR_DESC= Bar support
+
+.include <bsd.port.options.mk>
+
+.if ${PORT_OPTIONS:MBAR}
+LIB_DEPENDS= libbar.so:${PORTSDIR}/foo/bar
+.endif
+....
+
+====
+
+Правильным способом является проверка переменных параметров. Этот способ не приводит к несоответствиям в индексе набора портов, поскольку параметры определены до построения индекса. При этом можно использовать простые скрипты для автоматизации построения, установки и обновления этих портов и соответствующих им пакетов.
+
+[[use-want]]
+=== `USE_` и `WANT_`
+
+Переменные `USE_` задаются мейнтейнером порта для определения программного обеспечения, от которого этот порт зависит. Порт, для которого нужен Firefox, укажет
+
+[.programlisting]
+....
+USE_FIREFOX= yes
+....
+
+Некоторые переменные `USE_` могут принимать номера версий или другие параметры. Например, порт, который требует Apache 2.2, укажет
+
+[.programlisting]
+....
+USE_APACHE= 22
+....
+
+В некоторых случаях для большего контроля над зависимостями используются переменные `WANT_`, которые позволяют указывать требования в более точной форме. Например, взгляните на порт package:mail/squirrelmail[]. Этому порту нужны несколько модулей PHP, которые перечислены в переменной `USE_PHP`:
+
+[.programlisting]
+....
+USE_PHP= session mhash gettext mbstring pcre openssl xml
+....
+
+Эти модули доступны в версиях CLI и web, поэтому версия web выбрана с переменной `WANT_`:
+
+[.programlisting]
+....
+WANT_PHP_WEB= yes
+....
+
+Имеющиеся переменные `USE_` и `WANT_` определены в файлах в [.filename]#/usr/ports/Mk#.
+
+[[makefile-masterdir]]
+== `MASTERDIR`
+
+Если вашему порту требуется построение довольно различающихся версий пакетов через переменную (задающую, например, разрешение, или размер бумаги), которая принимает различные значения, создайте для каждого пакета отдельный подкаталог, чтобы пользователям было легче определить, каким пакетом воспользоваться, но попробуйте использовать совместно между портами как можно больше файлов. В типичном случае вам потребуются только очень короткие файлы [.filename]#Makefile# во всех каталогах, кроме одного, если вы будете использовать переменные с умом. В отдельных файлах [.filename]#Makefile# вы можете использовать переменную `MASTERDIR` для указания каталога, в котором находятся все остальные файлы. Также используйте переменную как часть <<porting-pkgname,`PKGNAMESUFFIX`>>, чтобы пакеты имели разные имена.
+
+Продемонстрируем это на примере. Вот часть файла [.filename]#japanese/xdvi300/Makefile#:
+
+[.programlisting]
+....
+PORTNAME= xdvi
+PORTVERSION= 17
+PKGNAMEPREFIX= ja-
+PKGNAMESUFFIX= ${RESOLUTION}
+ :
+# default
+RESOLUTION?= 300
+.if ${RESOLUTION} != 118 && ${RESOLUTION} != 240 && \
+ ${RESOLUTION} != 300 && ${RESOLUTION} != 400
+ @${ECHO_MSG} "Error: invalid value for RESOLUTION: \"${RESOLUTION}\""
+ @${ECHO_MSG} "Possible values are: 118, 240, 300 (default) and 400."
+ @${FALSE}
+.endif
+....
+
+Порт package:japanese/xdvi300[] содержит также все обычные патчи, файлы для пакета и так далее. Если вы введете здесь команду `make`, она возьмет в качестве разрешения значение по умолчанию (300) и построит порт обычным образом.
+
+Для другого разрешения приведем _полный_[.filename]#xdvi118/Makefile#:
+
+[.programlisting]
+....
+RESOLUTION= 118
+MASTERDIR= ${.CURDIR}/../xdvi300
+
+.include "${MASTERDIR}/Makefile"
+....
+
+([.filename]#xdvi240/Makefile# и [.filename]#xdvi400/Makefile# похожи). Задание `MASTERDIR` говорит [.filename]#bsd.port.mk#, что обычный набор подкаталогов типа `FILESDIR` и `SCRIPTDIR` находится в каталоге [.filename]#xdvi300#. Строчка `RESOLUTION=118` переопределят строку `RESOLUTION=300` в файле [.filename]#xdvi300/Makefile# и порт будет построен с разрешением 118.
+
+[[makefile-manpages]]
+== Страницы Справочника
+
+Если ваш порт определяет корнем для файлов Справочника каталог, отличный от `PREFIX`, вы можете использовать переменную `MANDIRS`, чтобы указать эти каталоги. Обратите внимание, что файлы страниц справочника следует размещать в [.filename]#pkg-plist# наряду с остальными файлами. `MANDIRS` предназначена для автоматического сжатия страниц справочника, так чтобы имена файлов оканчивались на [.filename]#.gz#.
+
+[[makefile-info]]
+== Файлы в формате info
+
+Если в вашем пакете нужна установка файлов GNU info, они должны быть перечислены в переменной `INFO` (без окончания `.info`), по записи на документ. Предполагается, что эти файлы устанавливаются в [.filename]#PREFIX/INFO_PATH#. Вы можете изменить `INFO_PATH`, если ваш пакет использует другое место для размещения. Однако, это не рекомендуется делать. Эти записи всего лишь содержат путь относительно [.filename]#PREFIX/INFO_PATH#. Например, package:lang/gcc34[] устанавливает файлы info в [.filename]#PREFIX/INFO_PATH/gcc34#, и в `INFO` будет что-то вроде этого:
+
+[.programlisting]
+....
+INFO= gcc34/cpp gcc34/cppinternals gcc34/g77 ...
+....
+
+Перед регистрацией пакета соответствующий код установки/удаления будет автоматически добавлен во временный [.filename]#pkg-plist#.
+
+[[makefile-options]]
+== Опции для Makefile
+
+Многие приложения могут быть построены в различных конфигурациях и с дополнительной функциональностью. Например, выбор естественного (человеческого) языка, GUI против командной строки или типа используемой базы данных. Пользователи могут нуждаться в различных конфигурациях, отличных от используемой по умолчанию, поэтому в системе портов предусмотрен механизм, позволяющий автору порта управлять сборкой того или иного варианта конфигурации. Правильная поддержка этих необязательных параметров облегчает пользователям жизнь и даёт два или более порта по цене одного.
+
+=== Knobs
+
+==== `WITH__*_` и `WITHOUT__*_`
+
+Эти переменные предназначены для установки системным администратором. Многие из них стандартизованы в файле http://svnweb.FreeBSD.org/ports/head/KNOBS?view=markup[ports/KNOBS].
+
+При создании порта не давайте имя для knob, специфичное для данного приложения. На примере порта Avahi, используйте `WITHOUT_MDNS` вместо `WITHOUT_AVAHI_MDNS`.
+
+[NOTE]
+====
+Не стоит рассчитывать, что `WITH__*_` обязательно имеет соответствующую переменную `WITHOUT__*_`, и наоборот. В общем случае, предполагается значение по умолчанию.
+====
+
+[NOTE]
+====
+Если обратное не указано, то проверяется только факт установки самих переменных, но не их конкретное значение типа `YES` или `NO`.
+====
+
+.Основные переменные `WITH__*_` и `WITHOUT__*_`
+[cols="1,1", frame="none", options="header"]
+|===
+| Переменная
+| Значение
+
+|`WITH_OPENSSL_BASE`
+|Использовать версию OpenSSL из базовой системы.
+
+|`WITH_OPENSSL_PORT`
+|Устанавливает версию OpenSSL из package:security/openssl[], даже если в базовой системе последняя версия.
+|===
+
+==== Наименование KNOBS
+
+Портеры должны использовать так называемые knobs для помощи конечным пользователям и для поддержания количества наименований knobs в небольшом количестве. Список популярных названий knobs можно найти в файле http://svnweb.FreeBSD.org/ports/head/KNOBS?view=markup[KNOBS]
+
+Названия knobs должны отражать, что это такое и что выполняет. Если у порта имеется библиотечный префикс в `PORTNAME`, то он должен присутствовать в названии knobs.
+
+=== `OPTIONS`
+
+==== Описание
+
+При установке порта переменные `OPTIONS_*` предоставляют пользователю окно диалога с отображением доступных параметров, с записью выбранных параметров в файл [.filename]#/var/db/ports/${UNIQUENAME}/options#. Эти опции повторно используются при следующем построении порта.
+
+Когда пользователь запускает `make config` (или запускает впервые `make build`), инфраструктура выполняет проверку существования файла [.filename]#/var/db/ports/${UNIQUENAME}/options#. Если этот файл не существует, то используются значения `OPTIONS_*` и отображается диалоговое окно, в котором эти параметры можно включить или выключить. Затем сохраняется файл опций [.filename]#options#, и выбранные переменные используются при построении порта.
+
+Если новая версия порта добавляет новые значения `OPTIONS`, то пользователю будет представлено окно диалога с сохраненными заполненными значениями старых `OPTIONS.`
+
+`make showconfig` отображает сохраненную конфигурацию. Для удаления сохраненной конфигурации используйте `make rmconfig`.
+
+==== Синтаксис
+
+`OPTIONS_DEFINE` содержит список используемых `OPTIONS`. Они независимы друг от друга и не сгруппированы:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1 OPT2
+....
+
+Далее после определения следует описание `OPTIONS` (не является обязательным, но настоятельно рекомендуется):
+
+[.programlisting]
+....
+OPT1_DESC= Describe OPT1
+OPT2_DESC= Describe OPT2
+OPT3_DESC= Describe OPT3
+OPT4_DESC= Describe OPT4
+OPT5_DESC= Describe OPT5
+OPT6_DESC= Describe OPT6
+....
+
+[TIP]
+====
+
+[.filename]#ports/Mk/bsd.options.desc.mk# содержит описание множества наиболее используемых `OPTIONS`; переопределять их, как правило, не нужно.
+====
+
+[TIP]
+====
+
+При описании параметров старайтесь представить себя на месте пользователя: "Что это делает?" и "Для чего бы я захотел включить это?" Не делайте простое повторение названия. Например, описание параметра `NLS` как "include NLS support" ("включить поддержку NLS") не поможет пользователю, который уже видит название параметра, но может не знать, что это означает. Описав его как "Native Language Support via gettext utilities" ("Поддержка национального языка через утилиты gettext"), вы поможете пользователю гораздо больше.
+====
+
+`OPTIONS` можно группировать в виде переключателей, для которых разрешен выбор единственного варианта в каждой группе:
+
+[.programlisting]
+....
+OPTIONS_SINGLE= SG1
+OPTIONS_SINGLE_SG1= OPT3 OPT4
+....
+
+`OPTIONS` можно группировать в виде переключателей, для которых разрешен выбор единственного варианта (или ни одного) в каждой группе:
+
+[.programlisting]
+....
+OPTIONS_RADIO= RG1
+OPTIONS_RADIO_RG1= OPT7 OPT8
+....
+
+`OPTIONS` также можно группировать в виде списков со множественным выбором, для которых обязан быть включен _по крайней мере один_ из параметров:
+
+[.programlisting]
+....
+OPTIONS_MULTI= MG1
+OPTIONS_MULTI_MG1= OPT5 OPT6
+....
+
+`OPTIONS` также можно группировать в виде списков со множественным выбором, для которых могут быть включены любые параметры, включая отсутствие выбора:
+
+[.programlisting]
+....
+OPTIONS_GROUP= GG1
+OPTIONS_GROUP_GG1= OPT9 OPT10
+....
+
+По умолчанию `OPTIONS` находится в выключенном положении, если при этом оно также отсутствует в списке `OPTIONS_DEFAULT`:
+
+[.programlisting]
+....
+OPTIONS_DEFAULT= OPT1 OPT3 OPT6
+....
+
+Определения `OPTIONS` обязаны быть до подключения [.filename]#bsd.port.options.mk#. Переменные `PORT_OPTIONS` могут быть проверены только после подключения [.filename]#bsd.port.options.mk#. Вместо этого также можно использовать подключение [.filename]#bsd.port.pre.mk#, что все еще широко используется в портах, написанных до появления [.filename]#bsd.port.options.mk#. Но имейте в виду, что некоторые переменные, обычно, это некоторые флаги `USE_*`, после подключения [.filename]#bsd.port.pre.mk# будут работать не так, как этого от них ожидают.
+
+[[ports-options-simple-use]]
+.Простое использование `OPTIONS`
+[example]
+====
+[.programlisting]
+....
+OPTIONS_DEFINE= FOO BAR
+FOO_DESC= Enable option foo
+BAR_DESC= Support feature bar
+
+.include <bsd.port.options.mk>
+
+.if ${PORT_OPTIONS:MFOO}
+CONFIGURE_ARGS+=--with-foo
+.else
+CONFIGURE_ARGS+=--without-foo
+.endif
+
+.if ${PORT_OPTIONS:MBAR}
+RUN_DEPENDS+= bar:${PORTSDIR}/bar/bar
+.endif
+
+.include <bsd.port.mk>
+....
+
+====
+
+[[ports-options-check-unset]]
+.Проверка незаданных значений `OPTIONS`
+[example]
+====
+[.programlisting]
+....
+.if ! ${PORT_OPTIONS:MEXAMPLES}
+CONFIGURE_ARGS+=--without-examples
+.endif
+....
+
+====
+
+[[ports-options-practical-use]]
+.Пример реального использования `OPTIONS`
+[example]
+====
+[.programlisting]
+....
+OPTIONS_DEFINE= EXAMPLES
+
+OPTIONS_SINGLE= BACKEND
+OPTIONS_SINGLE_BACKEND= MYSQL PGSQL BDB
+
+OPTIONS_MULTI= AUTH
+OPTIONS_MULTI_AUTH= LDAP PAM SSL
+
+EXAMPLES_DESC= Install extra examples
+MYSQL_DESC= Use MySQL as backend
+PGSQL_DESC= Use PostgreSQL as backend
+BDB_DESC= Use Berkeley DB as backend
+LDAP_DESC= Build with LDAP authentication support
+PAM_DESC= Build with PAM support
+SSL_DESC= Build with OpenSSL support
+
+OPTIONS_DEFAULT= PGSQL LDAP SSL
+
+.include <bsd.port.options.mk>
+
+.if ${PORT_OPTIONS:MPGSQL}
+USE_PGSQL= yes
+CONFIGURE_ARGS+= --with-postgres
+.else
+CONFIGURE_ARGS+= --without-postgres
+.endif
+
+.if ${PORT_OPTIONS:MICU}
+LIB_DEPENDS+= libicuuc.so:${PORTSDIR}/devel/icu
+.endif
+
+.if ! ${PORT_OPTIONS:MEXAMPLES}
+CONFIGURE_ARGS+= --without-examples
+.endif
+
+# Проверка других параметров OPTIONS
+
+.include <bsd.port.mk>
+....
+
+====
+
+==== Параметры по умолчанию
+
+Следующие параметры по умолчанию всегда включены.
+
+* `DOCS` - построение и установка документации.
+* `NLS` - интернационализация.
+* `EXAMPLES` - построение и установка примеров использования.
+* `IPV6` - поддержка протокола IPv6.
+
+[NOTE]
+====
+Нет необходимости добавлять эти параметры в `OPTIONS_DEFAULT`. Тем не менее, чтобы отобразить их в окне диалога выбора параметров, они должны быть добавлены в `OPTIONS_DEFINE`.
+====
+
+=== Функция автоматической активации
+
+При использовании сценария GNU configure, следите за тем, какие необязательные функции задействуются посредством автоматической активации. Отключайте явным образом те необязательные функции, которые вы не хотели бы использовать, через передачу соответствующих `--without-xxx` или `--disable-xxx` в переменной `CONFIGURE_ARGS`.
+
+.Неправильное управление опцией
+[example]
+====
+[.programlisting]
+....
+.if ${PORT_OPTIONS:MFOO}
+LIB_DEPENDS+= libfoo.so:${PORTSDIR}/devel/foo
+CONFIGURE_ARGS+= --enable-foo
+.endif
+....
+
+====
+
+В приведенном выше примере представьте себе библиотеку libfoo, установленную в системе. Пользователь не желает, чтобы приложение использовало libfoo, и поэтому он выключает соответствующую опцию в диалоге `make config`. Но сценарий configure приложения определяет наличие библиотеки в системе и включает ее поддержку в итоговый исполняемый файл. Теперь, когда пользователь решит удалить libfoo из системы, система портов позволит это сделать (т.к. зависимость от libfoo не была записана), но приложение перестанет работать.
+
+.Правильное управление опцией
+[example]
+====
+[.programlisting]
+....
+.if ${PORT_OPTIONS:MFOO}
+LIB_DEPENDS+= libfoo.so:${PORTSDIR}/devel/foo
+CONFIGURE_ARGS+= --enable-foo
+.else
+CONFIGURE_ARGS+= --disable-foo
+.endif
+....
+
+====
+
+Во втором примере библиотека libfoo отключена явным образом. Сценарий configure не включает соответствующие функции в приложении, несмотря на присутствие библиотеки в системе.
+
+[NOTE]
+====
+При определенных условиях сокращенный синтаксис записи условий может вызывать проблемы со сложными конструкциями. Если вы получаете ошибки, такие как `Malformed conditional`, то может быть использован альтернативный синтаксис.
+
+[.programlisting]
+....
+.if !empty(VARIABLE:MVALUE)
+# as an alternative to
+.if ${VARIABLE:MVALUE}
+....
+
+====
+
+=== Вспомогательные макросы
+
+Существует несколько макросов, упрощающих запись условных значений, которые отличаются в зависимости от набора параметров.
+
+Если переменная `OPTIONS_SUB` имеет значение `yes`, то каждый из указанных в `OPTIONS_DEFINE` параметров будет добавлен в `PLIST_SUB`. Следующая запись:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1
+OPTIONS_SUB= yes
+....
+
+соответствует:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1
+
+.include <bsd.port.options.mk>
+
+.if ${PORT_OPTIONS:MOPT1}
+PLIST_SUB+= OPT1=""
+.else
+PLIST_SUB+= OPT1="@comment "
+.endif
+....
+
+`X_CONFIGURE_ENABLE` дописывает в `CONFIGURE_ARGS` строку `--enable-${X_CONFIGURE_ENABLE}` или `--disable-${X_CONFIGURE_ENABLE}` в соответствии с состоянием `X`. Следующая запись:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1
+OPT1_CONFIGURE_ENABLE= test
+....
+
+соответствует:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1
+
+.include <bsd.port.options.mk>
+
+.if ${PORT_OPTIONS:MOPT1}
+CONFIGURE_ARGS+= --enable-test
+.else
+CONFIGURE_ARGS+= --disable-test
+.endif
+....
+
+`X_CONFIGURE_WITH` дописывает в `CONFIGURE_ARGS` строку `--with-${X_CONFIGURE_WITH}` или `--without-${X_CONFIGURE_WITH}` в соответствии с состоянием `X`. Следующая запись:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1
+OPT1_CONFIGURE_WITH= test
+....
+
+соответствует:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1
+
+.include <bsd.port.options.mk>
+
+.if ${PORT_OPTIONS:MOPT1}
+CONFIGURE_ARGS+= --with-test
+.else
+CONFIGURE_ARGS+= --without-test
+.endif
+....
+
+Значение переменной `X_CONFIGURE_ON` будет дописано в `CONFIGURE_ARGS` в соответствии с состоянием `X`. Следующая запись:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1
+OPT1_CONFIGURE_ON= --add-test
+....
+
+соответствует:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1
+
+.include <bsd.port.options.mk>
+
+.if ${PORT_OPTIONS:MOPT1}
+CONFIGURE_ARGS+= --add-test
+.endif
+....
+
+Значение переменной `X_CONFIGURE_OFF` будет дописано в `CONFIGURE_ARGS` в соответствии с состоянием `X`. Следующая запись:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1
+OPT1_CONFIGURE_OFF= --no-test
+....
+
+соответствует:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1
+.include <bsd.port.options.mk>
+.if ! ${PORT_OPTIONS:MOPT1}
+CONFIGURE_ARGS+= --no-test
+.endif
+....
+
+Значение переменной `X_CMAKE_ON` будет дописано в `CMAKE_ARGS` в соответствии с состоянием `X`. Следующая запись:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1
+OPT1_CMAKE_ON= -DTEST:BOOL=true
+....
+
+соответствует:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1
+
+.include <bsd.port.options.mk>
+
+.if ${PORT_OPTIONS:MOPT1}
+CMAKE_ARGS+= -DTEST:BOOL=true
+.endif
+....
+
+Значение переменной `X_CMAKE_OFF` будет дописано в `CMAKE_ARGS` в соответствии с состоянием `X`. Следующая запись:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1
+OPT1_CMAKE_OFF= -DTEST:BOOL=false
+....
+
+соответствует:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1
+
+.include <bsd.port.options.mk>
+
+.if ! ${PORT_OPTIONS:MOPT1}
+CMAKE_ARGS+= -DTEST:BOOL=false
+.endif
+....
+
+Для любой из следующих переменных:
+
+* `ALL_TARGET`
+* `CATEGORIES`
+* `CFLAGS`
+* `CPPFLAGS`
+* `CXXFLAGS`
+* `CONFIGURE_ENV`
+* `DISTFILES`
+* `EXTRA_PATCHES`
+* `INSTALL_TARGET`
+* `LDFLAGS`
+* `MAKE_ARGS`
+* `MAKE_ENV`
+* `PATCH_SITES`
+* `PATCHFILES`
+* `PLIST_FILES`
+* `PLIST_DIRS`
+* `PLIST_DIRSTRY`
+* `USES`
+
+Значение переменной `X_ABOVEVARIABLE` будет дописано в `ABOVEVARIABLE` в соответствии с состоянием `X`. Следующая запись:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1
+OPT1_USES= gmake
+OPT1_CFLAGS= -DTEST
+....
+
+соответствует:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1
+
+.include <bsd.port.options.mk>
+
+.if ${PORT_OPTIONS:MOPT1}
+USES+= gmake
+CFLAGS+= -DTEST
+.endif
+....
+
+Если установлена `X_ABOVEVARIABLE_OFF`, то флаг `ABOVEVARIABLE` будет автоматически выставлен при выключенном параметре `X`. Например:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1
+OPT1_USES_OFF=gmake
+....
+
+соответствует:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1
+
+.include <bsd.port.options.mk>
+
+.if ! ${PORT_OPTIONS:MOPT1}
+USES+= gmake
+.endif
+....
+
+Для любого из следующих типов зависимости:
+
+* `PKG_DEPENDS`
+* `EXTRACT_DEPENDS`
+* `PATCH_DEPENDS`
+* `FETCH_DEPENDS`
+* `BUILD_DEPENDS`
+* `LIB_DEPENDS`
+* `RUN_DEPENDS`
+
+Значение переменной `X_ABOVEVARIABLE` будет дописано в `ABOVEVARIABLE` в соответствии с состоянием `X`. Следующая запись:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1
+OPT1_LIB_DEPENDS= liba.so:${PORTSDIR}/devel/a
+....
+
+соответствует:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1
+
+.include <bsd.port.options.mk>
+
+.if ${PORT_OPTIONS:MOPT1}
+LIB_DEPENDS+= liba.so:${PORTSDIR}/devel/a
+.endif
+....
+
+Если установлена `X_ABOVEVARIABLE_OFF`, то зависимость типа `ABOVEVARIABLE` будет добавлена при выключенном параметре `X`. Например:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1
+OPT1_LIB_DEPENDS_OFF= liba.so:${PORTSDIR}/devel/a
+....
+
+соответствует:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1
+
+.include <bsd.port.options.mk>
+
+. if ! ${PORT_OPTIONS:MOPT1}
+LIB_DEPENDS+= liba.so:${PORTSDIR}/devel/a
+.endif
+....
+
+[[makefile-wrkdir]]
+== Задание рабочего каталога
+
+Каждый порт распаковывается в рабочий каталог, который должен быть доступным для записи. В системе портов по умолчанию `DISTFILES` распаковываются в каталог с именем `${DISTNAME}`. Другими словами, если вы задали:
+
+[.programlisting]
+....
+PORTNAME= foo
+PORTVERSION= 1.0
+....
+
+то дистрибутивные файлы порта содержат каталог верхнего уровня, [.filename]#foo-1.0#, и все файлы расположены в этом каталоге.
+
+Если это не ваш случай, то имеется несколько переменных, которые вы можете переопределить.
+
+=== `WRKSRC`
+
+Эта переменная задаёт имя каталога, который создаётся при распаковке исходных файлов приложения. В нашем предыдущем примере если бы распаковка происходила в каталог с именем [.filename]#foo# (а не [.filename]#foo-1.0#), то вы должны написать:
+
+[.programlisting]
+....
+WRKSRC= ${WRKDIR}/foo
+....
+
+или, как вариант
+
+[.programlisting]
+....
+WRKSRC= ${WRKDIR}/${PORTNAME}
+....
+
+=== `NO_WRKSUBDIR`
+
+Если порт вообще не распаковывается ни в какой каталог, то вы должны задать для этого переменную `NO_WRKSUBDIR`.
+
+[.programlisting]
+....
+NO_WRKSUBDIR= yes
+....
+
+[[conflicts]]
+== Разрешение конфликтов
+
+Для регистрации конфликта между пакетами и портами используются три различные переменные: `CONFLICTS`, `CONFLICTS_INSTALL` и `CONFLICTS_BUILD`.
+
+[NOTE]
+====
+Переменные регистрации конфликта автоматически определяют переменную `IGNORE`, которая более подробно описана в <<dads-noinstall>>.
+====
+
+При удалении одного из конфликтующих портов целесообразно сохранить записи `CONFLICTS` в тех других портах в течении нескольких месяцев, чтобы позаботиться о тех пользователей, которые обновляются от случая к случаю.
+
+=== `CONFLICTS_INSTALL`
+
+Если ваш пакет не может существовать вместе с другими (из-за конфликта файлов, несовместимости времени выполнения и так далее), перечислите имена остальных пакетов в переменной `CONFLICTS_INSTALL`. Здесь вы можете использовать шаблоны командного интерпретатора, такие как `*` и `?`. Имена пакетов должны выглядеть так же, как в [.filename]#/var/db/pkg#. Пожалуйста, убедитесь, что `CONFLICTS_INSTALL` не содержит пакет самого этого порта. В противном случае не будет работать установка с использованием переменной `FORCE_PKG_REGISTER`. Проверка CONFLICTS_INSTALL выполняется после процесса сборки и до процесса установки.
+
+=== `CONFLICTS_BUILD`
+
+Если ваш порт не может быть собран, когда уже установлен другой, перечислите имена остальных портов в переменной `CONFLICTS_BUILD`. Здесь вы можете использовать шаблоны командного интерпретатора, такие как `*` и `?`. Имена пакетов должны выглядеть так же, как в [.filename]#/var/db/pkg#. Проверка CONFLICTS_BUILD выполняется до процесса сборки. Конфликты сборки в получаемом пакете не записываются.
+
+=== `CONFLICTS`
+
+Если ваш порт не может быть собран, когда уже установлен другой, а получаемый пакет не может существовать вместе с другими, перечислите имена остальных пакетов в переменной `CONFLICTS`. Здесь вы можете использовать шаблоны командного интерпретатора, такие как `*` и `?`. Имена пакетов должны выглядеть так же, как в [.filename]#/var/db/pkg#. Пожалуйста, убедитесь, что `CONFLICTS` не содержит пакет самого этого порта. В противном случае не будет работать установка с использованием переменной `FORCE_PKG_REGISTER`. Проверка CONFLICTS выполняется до процессов сборки и установки.
+
+[[install]]
+== Установка файлов
+
+[[install-macros]]
+=== Макросы `INSTALL_*`
+
+Используйте макросы, которые есть в файле [.filename]#bsd.port.mk# для обеспечения правильных прав доступа файлов в целях `*-install` порта. Устанавливайте права владения напрямую в [.filename]#pkg-plist# через соответствующие записи `@owner owner` и `@group group`. Эти операторы работают до момента их переопределения или до конца [.filename]#pkg-plist#, поэтому не забывайте их сбрасывать, когда они больше не нужны. По умолчанию владение устанавливается для `root:wheel`.
+
+* `INSTALL_PROGRAM` - это команда для установки бинарных выполнимых файлов.
+* `INSTALL_SCRIPT` - это команда для установки выполнимых скриптов.
+* `INSTALL_LIB` - это команда для установки динамических библиотек.
+* `INSTALL_KLD` - это команда для установки загружаемых модулей ядра. Некоторые архитектуры предпочитают, чтобы для модулей сохранялись отладочные сведения, по этой причине используйте эту команду вместо `INSTALL_PROGRAM`.
+* `INSTALL_DATA` - это команда для установки совместно используемых файлов данных.
+* `INSTALL_MAN` - это команда для установки страниц Справочника и другой документации (никаких файлов она не сжимает).
+
+В основе работы этих макросов лежит команда `install` со всеми соответствующими флагами. Смотрите пример их использования ниже.
+
+[[install-strip]]
+=== Удаление отладочной информации в бинарных файлах и динамических библиотеках
+
+Не удаляйте отладочную информацию из бинарных файлов вручную, если вы это делали. Во всех двоичных файлах отладочная информация должна быть удалена, и макрос `INSTALL_PROGRAM` выполнит установку и удаление отладочной информации одновременно (обратитесь к следующему разделу). Макрос `INSTALL_LIB` делает то же самое для динамических библиотек.
+
+Если вам нужно удалить отладочную информацию из файла без использования макросов `INSTALL_PROGRAM` и `INSTALL_LIB`, то это можно сделать при помощи `${STRIP_CMD}`. Обычно это делается внутри цели `post-install`. К примеру:
+
+[.programlisting]
+....
+post-install:
+ ${STRIP_CMD} ${STAGEDIR}${PREFIX}/bin/xdl
+....
+
+Удаление отладочной информации из нескольких файлов:
+
+[.programlisting]
+....
+post-install:
+ .for l in geometry media body track world
+ ${STRIP_CMD} ${STAGEDIR}${PREFIX}/lib/lib${PORTNAME}-${l}.so.0
+ .endfor
+....
+
+Для проверки того, удалена ли отладочная информация из файла, используйте man:file[1]. Для двоичных файлов man:file[1] печатает `stripped` или `not stripped`. Кроме того, man:strip[1] определяет, была ли уже удалена из программы отладочная информация, и в этом случае просто завершает свою работу.
+
+[[install-copytree]]
+=== Установка целого дерева файлов
+
+Иногда должно быть установлено большое количество файлов с сохранением их иерархической организации. Например, копирование дерева каталогов целиком из `WRKSRC` в целевой каталог внутри `PREFIX`. Обратите внимание, что `PREFIX`, `EXAMPLESDIR`, `DATADIR` и другие переменные пути всегда должны предваряться `STAGEDIR`, чтобы не ломать staging (смотрите <<staging>>).
+
+Для этой ситуации существует два макроса. Преимущество от использования этих макросов вместо команды `cp` в том, что они гарантируют установку правильного владельца и прав на конечные файлы. Первый макрос, `COPYTREE_BIN`, делает все устанавливаемые файлы исполняемыми, что подходит для установки в [.filename]#PREFIX/bin#. Второй макрос, `COPYTREE_SHARE`, не устанавливает на файлы права исполнения, и, таким образом, подходит для установки файлов внутри каталога [.filename]#PREFIX/share#.
+
+[.programlisting]
+....
+post-install:
+ ${MKDIR} ${STAGEDIR}${EXAMPLESDIR}
+ (cd ${WRKSRC}/examples && ${COPYTREE_SHARE} . ${STAGEDIR}${EXAMPLESDIR})
+....
+
+В этом примере устанавливается содержимое каталога [.filename]#examples# из установочных файлов производителя в надлежащее место для примеров вашего порта.
+
+[.programlisting]
+....
+post-install:
+ ${MKDIR} ${STAGEDIR}${DATADIR}/summer
+ (cd ${WRKSRC}/temperatures && ${COPYTREE_SHARE} "June July August" ${STAGEDIR}${DATADIR}/summer)
+....
+
+А в этом примере будут установлены данные летних месяцев в подкаталог [.filename]#summer# каталога [.filename]#DATADIR#.
+
+В качестве третьего параметра в макросе `COPYTREE_*` можно передать дополнительные параметры `find`. Например, чтобы в первом примере установить все файлы кроме файлов Makefile, можно использовать следующую команду.
+
+[.programlisting]
+....
+post-install:
+ ${MKDIR} ${STAGEDIR}${EXAMPLESDIR}
+ (cd ${WRKSRC}/examples && \
+ ${COPYTREE_SHARE} . ${STAGEDIR}${EXAMPLESDIR} "! -name Makefile")
+....
+
+Эти макросы не производят добавление устанавливаемых файлов в [.filename]#pkg-plist#. Они должны быть добавлены туда вручную. Необязательные файлы документации (`PORTDOCS`, смотрите <<install-documentation>>) и примеров (`PORTEXAMPLES`) всегда должны предваряться в [.filename]#pkg-plist# префиксами `%%PORTDOCS%%` или `%%PORTEXAMPLES%%`.
+
+[[install-documentation]]
+=== Установка дополнительной документации
+
+Если с вашим программным обеспечением поставляется некоторая документация, отличающаяся от стандартных страниц Справочника и файлов info, которая, как вы думаете, будет полезна пользователям, установите ее в каталог [.filename]#PREFIX/shared/doc#. Это может быть сделано, как и в предыдущем разделе, в цели `post-install`.
+
+Создайте для вашего порта новый каталог. Имя каталога должно соответствовать тому, что представляет из себя порт. Обычно это означает `PORTNAME`. Однако, если вы думаете, что пользователь захочет иметь разные версии порта, установленные одновременно, то вы можете использовать полное имя `PKGNAME`.
+
+Поскольку устанавливаются только файлы, перечисленные в [.filename]#pkg-plist#, безопасным способом будет устанавливать документацию в `STAGEDIR` всегда (смотрите <<staging>>). Следовательно, блоки `.if` нужны только для файлов достаточно большого размера, установка которых влечёт значительные накладные расходы на операции ввода/вывода.
+
+[.programlisting]
+....
+post-install:
+ ${MKDIR} ${STAGEDIR}${DOCSDIR}
+ ${INSTALL_MAN} ${WRKSRC}/docs/xvdocs.ps ${STAGEDIR}${DOCSDIR}
+....
+
+Вот несколько полезных переменных и то, как они преобразуются по умолчанию при использовании в [.filename]#Makefile#:
+
+* `DATADIR` преобразуется в [.filename]#PREFIX/shared/PORTNAME#.
+* `DATADIR_REL` преобразуется в [.filename]#share/PORTNAME#.
+* `DOCSDIR` преобразуется в [.filename]#PREFIX/shared/doc/PORTNAME#.
+* `DOCSDIR_REL` преобразуется в [.filename]#share/doc/PORTNAME#.
+* `EXAMPLESDIR` преобразуется в [.filename]#PREFIX/shared/examples/PORTNAME#.
+* `EXAMPLESDIR_REL` преобразуется в [.filename]#share/examples/PORTNAME#.
+
+[NOTE]
+====
+Параметр `DOCS` управляет установкой дополнительной документации в `DOCSDIR`. Это не относится к стандартным страницам справочника и страницам info. Все, что устанавливается в `DATADIR` и `EXAMPLESDIR`, соответственно управляется через параметры `DATA` и `EXAMPLES`.
+====
+
+Эти переменные экспортируются в `PLIST_SUB`. Их значения появятся там в виде имён путей относительно [.filename]#PREFIX#, если это возможно. То есть [.filename]#share/doc/PORTNAME# в списке сборки по умолчанию будет заменен на `%%DOCSDIR%%`, и так далее. (Дополнительную информацию о подстановке в [.filename]#pkg-plist# можно найти <<plist-sub,здесь>>.)
+
+Все условно устанавливаемые файлы и каталоги с документацией должны быть перечислены в файле [.filename]#pkg-plist# с префиксом `%%PORTDOCS%%`, например:
+
+[.programlisting]
+....
+%%PORTDOCS%%%%DOCSDIR%%/AUTHORS
+%%PORTDOCS%%%%DOCSDIR%%/CONTACT
+%%PORTDOCS%%@dirrm %%DOCSDIR%%
+....
+
+В качестве альтернативы перечислению файлов документации в файле [.filename]#pkg-plist#, порт может указать в переменной `PORTDOCS` список имён файлов и глобальных шаблонов командного процессора для добавления в окончательный список сборки. Имена будут задаваться относительно `DOCSDIR`. Таким образом, порт, использующий `PORTDOCS` и нестандартное местоположение документации, должен задавать соответствующим образом и `DOCSDIR`. Если каталог указан в `PORTDOCS` или соответствует шаблону для этой переменной, то полное поддерево с входящими в него файлами и каталогами будет регистрироваться в окончательном списке сборки. Если параметр `DOCS` не задан, то файлы и каталоги, перечисленные в `PORTDOCS`, не будут установлены и добавлены в список сборки порта. Установка документации в `PORTDOCS`, как это показано выше, остаётся за самим портом. Типичный пример использования `PORTDOCS` выглядит следующим образом:
+
+[.programlisting]
+....
+PORTDOCS= README.* ChangeLog docs/*
+....
+
+[NOTE]
+====
+Эквивалентами `PORTDOCS` для файлов, устанавливаемых в `DATADIR` и `EXAMPLESDIR` являются `PORTDATA` и `PORTEXAMPLES` соответственно.
+
+Во время установки выводится содержимое [.filename]#pkg-message#. За подробной информацией обратитесь к <<porting-message,разделу об использовании [.filename]#pkg-message#>>. Файл [.filename]#pkg-message# не нужно добавлять в [.filename]#pkg-plist#.
+====
+
+[[install-subdirs]]
+=== Подкаталоги внутри PREFIX
+
+Попробуйте поместить все файлы порта в правильных подкаталогах каталога `PREFIX`. Некоторые порты игнорируют все установки и помещают все в подкаталог с именем порта, что неправильно. Также многие порты помещают все, кроме бинарных файлов, файлов заголовков и страниц Справочника, в подкаталог каталога [.filename]#lib#, что не очень хорошо работает с подходом BSD. Многие файлы должны быть перемещены в одно из следующих местоположений: [.filename]#etc# (настроечные/конфигурационные файлы), [.filename]#libexec# (выполнимые файлы, запускаемые из других программ), [.filename]#sbin# (исполнимые файлы для администраторов/менеджеров системы), [.filename]#info# (документация в формате info для просмотрщика info) или [.filename]#share# (независимые от архитектуры файлы). Обратитесь к man:hier[7] для прояснения деталей; правила, покрывающие [.filename]#/usr#, достаточно хорошо подходят также и к [.filename]#/usr/local#. Исключением являются порты, имеющие дело с "новостями" USENET. Они могут использовать каталог [.filename]#PREFIX/news# для установки своих файлов.
diff --git a/documentation/content/ru/books/porters-handbook/new-port/chapter.adoc b/documentation/content/ru/books/porters-handbook/new-port/chapter.adoc
new file mode 100644
index 0000000000..316d15a4f6
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/new-port/chapter.adoc
@@ -0,0 +1,46 @@
+---
+title: Глава 2. Как самому сделать новый порт
+prev: books/porters-handbook/porting-why
+next: books/porters-handbook/quick-porting
+---
+
+[[own-port]]
+= Making a New Port
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 2
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+Итак, вы интересуетесь, как создать собственный порт или обновить существующий? Великолепно!
+
+Ниже находятся некоторые указания по созданию нового порта для FreeBSD. Если вы хотите обновить существующий порт, вы должны прочесть их, а затем <<port-upgrading>>.
+
+Если этот документ недостаточно подробен, вы должны обратиться к файлу [.filename]#/usr/ports/Mk/bsd.port.mk#, который включается в make-файл каждого порта. Он хорошо прокомментирован, и даже если вы не занимаетесь хакингом make-файлов каждодневно, из него вы сможете узнать много нового. Кроме того, конкретные вопросы можно задать, послав письмо на адрес {freebsd-ports}.
+
+[NOTE]
+====
+Только часть переменных (`_VAR_`), которые могут быть переопределены, описаны в этом документе. Большинство (если не все) описаны в начале файла [.filename]#/usr/ports/Mk/bsd.port.mk#; остальные, скорее всего, тоже там описаны. Заметьте, что в этом файле используется нестандартная настройка шага табуляции: Emacs и Vim должны распознать это при загрузке файла. Как man:vi[1], так и man:ex[1] могут быть настроены на использование правильного значения выдачей команды `:set tabstop=4` после загрузки файла.
+====
+
+Ищете, с чего бы начать попроще? Посмотрите на http://wiki.freebsd.org/WantedPorts[перечень запрошенных портов], есть ли там такие, над которыми вы можете работать.
diff --git a/documentation/content/ru/books/porters-handbook/pkg-files/chapter.adoc b/documentation/content/ru/books/porters-handbook/pkg-files/chapter.adoc
new file mode 100644
index 0000000000..d24b172a7d
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/pkg-files/chapter.adoc
@@ -0,0 +1,133 @@
+---
+title: Глава 8. Файлы pkg-*
+prev: books/porters-handbook/plist
+next: books/porters-handbook/testing
+---
+
+[[pkg-files]]
+= Файлы [.filename]#pkg-*#
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 8
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+Есть несколько приёмов работы с файлами [.filename]#pkg-*#, которые мы ещё не описали, но они иногда могут быть очень кстати.
+
+[[porting-message]]
+== [.filename]#pkg-message#
+
+Если вам нужно вывести сообщение для человека, устанавливающего приложение, то вы можете поместить сообщение в файл [.filename]#pkg-message#. Эта возможность часто оказывается полезной для вывода дополнительных шагов установки, которые нужно предпринять после выполнения команды `pkg install`, или для вывода информации о лицензировании.
+
+Если должны выводиться некоторые строки о knobs времени построения или предупреждения, используйте `ECHO_MSG`. Файл [.filename]#pkg-message# только для послеустановочных шагов. Также следует иметь в виду различие между `ECHO_MSG` и `ECHO_CMD`. Первое предназначено для вывода на экран информационного текста, а второе для конвейера команд:
+
+[.programlisting]
+....
+update-etc-shells:
+ @${ECHO_MSG} "updating /etc/shells"
+ @${CP} /etc/shells /etc/shells.bak
+ @( ${GREP} -v ${PREFIX}/bin/bash /etc/shells.bak; \
+ ${ECHO_CMD} ${PREFIX}/bin/bash) >/etc/shells
+ @${RM} /etc/shells.bak
+....
+
+[NOTE]
+====
+Файл [.filename]#pkg-message# не нужно добавлять в [.filename]#pkg-plist#.
+====
+
+[[pkg-install]]
+== [.filename]#pkg-install#
+
+Если при установке бинарного пакета по команде `pkg add` или `pkg install` вашему порту нужно выполнить какие-то команды, то вы можете это сделать с помощью скрипта [.filename]#pkg-install#. Этот скрипт будет автоматически добавлен к пакету и будет дважды запускаться командой `pkg`: первый раз в виде `${SH} pkg-install ${PKGNAME} PRE-INSTALL`, а второй раз как `${SH} {PKGNAME} POST-INSTALL`. Для распознавания того, в каком режиме запущен скрипт, можно использовать параметр `$2`. Переменная окружения `PKG_PREFIX` будет принимать значение, соответствующее каталогу, в который устанавливается пакет.
+
+[NOTE]
+====
+Этот скрипт не запускается автоматически, если вы устанавливаете порт командой `make install`. Если же вам действительно необходимо его запустить, то запустите его явно из файла [.filename]#Makefile# порта строкой вида `PKG_PREFIX=${PREFIX} ${SH} $ {PKGINSTALL}${PKGNAME} PRE-INSTALL`.
+====
+
+[[pkg-deinstall]]
+== [.filename]#pkg-deinstall#
+
+Этот скрипт вызывается при удалении пакета.
+
+Этот скрипт будет дважды запускаться командой `pkg delete`. Первый раз как `${SH} pkg-deinstall ${PKGNAME} DEINSTALL`, а второй раз как `${SH} pkg-deinstall ${PKGNAME} POST-DEINSTALL`.
+
+[[pkg-names]]
+== Изменение имён файлов [.filename]#pkg-*#
+
+Все имена файлов [.filename]#pkg-\*# определяются с помощью переменных, так что вы можете изменить их, если это нужно, в вашем файле [.filename]#Makefile#. Это особенно полезно, если вы используете одни и те же файлы [.filename]#pkg-*# совместно между несколькими портами или пишете в один из вышеперечисленных файлов (в главе о <<porting-wrkdir,"записи в каталоги, отличные от ``WRKDIR``">> объяснено, почему не рекомендуется осуществлять запись непосредственно в файлы [.filename]#pkg-*#.
+
+Вот список имён переменных и их значений по умолчанию. (Значение `PKGDIR` по умолчанию равно `${MASTERDIR}`.)
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Переменная
+| Значение по умолчанию
+
+|`DESCR`
+|`${PKGDIR}/pkg-descr`
+
+|`PLIST`
+|`${PKGDIR}/pkg-plist`
+
+|`PKGINSTALL`
+|`${PKGDIR}/pkg-install`
+
+|`PKGDEINSTALL`
+|`${PKGDIR}/pkg-deinstall`
+
+|`PKGMESSAGE`
+|`${PKGDIR}/pkg-message`
+|===
+
+Пожалуйста, изменяйте значения этих переменных, а не переопределяйте `PKG_ARGS`. Если вы измените значение переменных `PKG_ARGS`, то эти файлы при установке из порта будут установлены в каталог [.filename]#/var/db/pkg# некорректно.
+
+[[using-sub-files]]
+== Использование `SUB_FILES` и `SUB_LIST`
+
+Переменные `SUB_FILES` и `SUB_LIST` подходят для задания в файлах порта динамических значений, таких как `PREFIX` установки в [.filename]#pkg-message#.
+
+В переменной `SUB_FILES` указывается перечень файлов для автоматического изменения. Каждый _file_ из перечня `SUB_FILES` обязан иметь соответствующий [.filename]#file.in#, присутствующий в `FILESDIR`. Измененная версия будет создана в `WRKDIR`. Файлы, определенные в качестве значения `USE_RC_SUBR` (или устаревшего `USE_RCORDER`), автоматически добавляются в `SUB_FILES`. Для файлов [.filename]#pkg-message#, [.filename]#pkg-install# и [.filename]#pkg-deinstall# устанавливается соответствующая переменная Makefile, указывающая на обработанную версию.
+
+Переменная `SUB_LIST` содержит перечень пар `VAR=VALUE`. В каждом файле из `SUB_FILES` для каждой пары будет произведена замена `%%VAR%%` на `VALUE`. Некоторые общие пары определяются автоматически: `PREFIX`, `LOCALBASE`, `DATADIR`, `DOCSDIR`, `EXAMPLESDIR`, `WWWDIR` и `ETCDIR`. Любая строка, начинающаяся с `@comment`, будет удалена из конечного файла после подстановки переменной.
+
+В следующем примере в [.filename]#pkg-message# будет сделана замена `%%ARCH%%` на системную архитектуру:
+
+[.programlisting]
+....
+SUB_FILES= pkg-message
+SUB_LIST= ARCH=${ARCH}
+....
+
+Обратите внимание, что в этом примере в `FILESDIR` обязательно существование файла [.filename]#pkg-message.in#.
+
+Пример хорошего [.filename]#pkg-message.in#:
+
+[.programlisting]
+....
+Now it is time to configure this package.
+Copy %%PREFIX%%/shared/examples/putsy/%%ARCH%%.conf into your home directory
+as .putsy.conf and edit it.
+....
diff --git a/documentation/content/ru/books/porters-handbook/plist/chapter.adoc b/documentation/content/ru/books/porters-handbook/plist/chapter.adoc
new file mode 100644
index 0000000000..86369ed7cb
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/plist/chapter.adoc
@@ -0,0 +1,160 @@
+---
+title: Глава 7. Продвинутые практики [.filename]#pkg-plist#
+prev: books/porters-handbook/special
+next: books/porters-handbook/pkg-files
+---
+
+[[plist]]
+= Продвинутые практики [.filename]#pkg-plist#
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 7
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[plist-sub]]
+== Изменение содержимого [.filename]#pkg-plist# в зависимости от make-переменных
+
+Некоторые порты, в частности, порты `p5-`, должны менять содержимое своих файлов [.filename]#pkg-plist# в зависимости от того, с какими параметрами они были отконфигурированы (или в зависимости от версии языка `perl` в случае портов `p5-`). Чтобы облегчить этот процесс, любые вхождения ключевых слов `%%OSREL%%`, `%%PERL_VER%%` и `%%PERL_VERSION%%` в файле [.filename]#pkg-plist# будут заменяться соответствующими значениями. Значением `%%OSREL%%` является номер версии операционной системы (например, `4.9`). `%%PERL_VERSION%%` и `%%PERL_VER%%` обозначают полный номер версии `perl` (например, `5.8.9`). Некоторые другие `%%VARS%%`, имеющие отношение к файлам документации порта, описаны в <<install-documentation,соответствующем разделе>>.
+
+Если вам нужно сделать другие подстановки, вы можете указать в переменной `PLIST_SUB` список пар `VAR=VALUE`, и все вхождения `%%VAR%%` в файле [.filename]#pkg-plist# будут заменяться на значение _VALUE_.
+
+Например, если у вас имеется порт, который устанавливает много файлов в каталог, зависящий от версии, вы можете задать нечто типа
+
+[.programlisting]
+....
+OCTAVE_VERSION= 2.0.13
+PLIST_SUB= OCTAVE_VERSION=${OCTAVE_VERSION}
+....
+
+в файле [.filename]#Makefile# и использовать `%%OCTAVE_VERSION%%` везде, где нужно указать номер версии в файле [.filename]#pkg-plist#. Таким образом, при обновлении порта вам не нужно будет менять десятки (а в некоторых случаях и сотни) строк в файле [.filename]#pkg-plist#.
+
+Если ваш порт устанавливает файлы в соответствии с установленными в порту опциями, то обычным способом управления является добавление префиксов `%%TAG%%` для строк [.filename]#pkg-plist# с добавлением этого `TAG` в переменную `PLIST_SUB` внутри [.filename]#Makefile# со специальным значением `@comment`, которое указывает пакетным инструментам игнорировать эти строки:
+
+[.programlisting]
+....
+.if defined(WITH_X11)
+PLIST_SUB+= X11=""
+.else
+PLIST_SUB+= X11="@comment "
+.endif
+....
+
+и в самом [.filename]#pkg-plist#:
+
+[.programlisting]
+....
+%%X11%%bin/foo-gui
+....
+
+Эта подстановка будет сделана между выполнением целей `pre-install` и `do-install`, посредством чтения файла [.filename]#PLIST# и записью в файл [.filename]#TMPPLIST# (по умолчанию это файл [.filename]#WRKDIR/.PLIST.mktmp#). Так что если ваш порт строит [.filename]#PLIST# на лету, делайте это во время или до выполнения цели `pre-install`. Кроме того, если вашему порту требуется отредактировать получающийся файл, делайте это в цели `post-install` изменением файла [.filename]#TMPPLIST#.
+
+Другой способ изменения списка сборки порта основан на определении значений переменных `PLIST_FILES`, `PLIST_DIRS` и `PLIST_DIRSTRY`. Каждое из них рассматривается как перечень путей для записи в [.filename]#TMPPLIST# содержимого [.filename]#PLIST#. Имена, перечисленные в `PLIST_FILES`, `PLIST_DIRS` и `PLIST_DIRSTRY` подвергаются подстановке `%%VAR%%`, как описано выше. За исключением этого, имена из `PLIST_FILES` будут появляться в окончательном варианте перечня сборки без изменений, тогда как `@dirrm` и `@dirrmtry` будут соответственно предшествовать именам из `PLIST_DIRS` и `PLIST_DIRSTRY`. Для того чтобы изменения вступили в силу, `PLIST_FILES`, `PLIST_DIRS` и `PLIST_DIRSTRY` должны задаваться до того, как будет записываться [.filename]#TMPPLIST#, то есть в цели `pre-install` или ещё раньше.
+
+[[plist-cleaning]]
+== Пустые каталоги
+
+[[plist-dir-cleaning]]
+=== Очистка пустых каталогов
+
+Заставьте ваш порты удалять пустые каталоги при удалении. Обычно это достигается добавлением строк `@dirrm` для всех каталогов, которые создаются этим портом. Вам нужно удалить подкаталоги до того, как вы сможете удалить родительские каталоги.
+
+[.programlisting]
+....
+ :
+lib/X11/oneko/pixmaps/cat.xpm
+lib/X11/oneko/sounds/cat.au
+ :
+@dirrm lib/X11/oneko/pixmaps
+@dirrm lib/X11/oneko/sounds
+@dirrm lib/X11/oneko
+....
+
+Однако, иногда `@dirrm` будет выдавать ошибки, потому что другие порты используют тот же самый подкаталог. Вы можете использовать `@dirrmtry` для удаления только пустых каталогов без выдачи предупреждений.
+
+[.programlisting]
+....
+@dirrmtry share/doc/gimp
+....
+
+Эта команда не выведет никаких сообщений об ошибках и не вызовет аварийного завершения работы `pkg delete` (см. man:pkg-delete[8]), даже если каталог [.filename]#${PREFIX}/shared/doc/gimp# не пуст из-за того, что другие порты установили сюда какие-то файлы.
+
+[[plist-dir-empty]]
+=== Создание пустых каталогов
+
+Пустым каталогам, создаваемым во время установки порта, нужно особое внимание. Они не будут созданы при установке пакета, потому что пакеты содержат только файлы, а `pkg add` и `pkg install` создают для них каталоги по мере надобности. Чтобы убедиться, что пустой каталог создается при установке пакета, добавьте эту строку в [.filename]#pkg-plist# перед соответствующей строкой `@dirrm`:
+
+[.programlisting]
+....
+@exec mkdir -p %D/shared/foo/templates
+....
+
+[[plist-config]]
+== Конфигурационные файлы
+
+Если ваш порт устанавливает конфигурационные файлы в каталог [.filename]#PREFIX/etc# (или куда-то еще), _не_ делайте их простого перечисления в файле [.filename]#pkg-plist#. Это приведёт к тому, что по команде `pkg delete` или при новой установке файлы, тщательно отредактированные и настроенные пользователем, будут уничтожены.
+
+Вместо этого установите файл(ы) с примерами с расширением [.filename]#filename.sample#. Затем скопируйте файл с примером на место настоящего файла конфигурации, если таковой ещё не существует. При деинсталляции удаляйте файл конфигурации только в том случае, если он идентичен файлу с расширением [.filename]#.sample#. Вам нужно управлять этим в [.filename]#Makefile# и в [.filename]#pkg-plist# (для установки из пакета).
+
+Пример части [.filename]#Makefile#:
+
+[.programlisting]
+....
+post-install:
+ @if [ ! -f ${PREFIX}/etc/orbit.conf ]; then \
+ ${CP} -p ${PREFIX}/etc/orbit.conf.sample ${STAGEDIR}${PREFIX}/etc/orbit.conf ; \
+ fi
+....
+
+Добавьте по три строки в [.filename]#pkg-plist# для каждого конфигурационного файла, как показано ниже:
+
+[.programlisting]
+....
+@unexec if cmp -s %D/etc/orbit.conf.sample %D/etc/orbit.conf; then rm -f %D/etc/orbit.conf; fi
+etc/orbit.conf.sample
+@exec if [ ! -f %D/etc/orbit.conf ] ; then cp -p %D/%F %B/orbit.conf; fi
+....
+
+Данные строки являются упорядоченными. На этапе удаления файл с примером сравнивается с рабочим конфигурационным файлом. Полное совпадение означает отсутствие каких-либо изменений в рабочем файле со стороны пользователя, и следовательно этот файл может быть безопасно удалён. Так как файл с примером всё ещё должен существовать для сравнения, строка `@unexec` следует перед именем файла с примером конфигурации. На этапе установки, если рабочий файл конфигурации отсутствует, он копируется из файла с примером. Файл с примером обязательно должен быть установлен до операции копирования, поэтому строка `@exec` следует после имени файла с примером конфигурации.
+
+Для получения дополнительного отладочного вывода на экран можно временно удалить параметр `-s` из команды man:cmp[1].
+
+Для получения дополнительной инфорации по использованию `%D` и прочих маркеров подстановки обратитесь к странице Справочника man:pkg-create[8].
+
+Если существует действительно стоящая причина не устанавливать рабочий файл конфигурации по умолчанию, уберите строку `@exec` из [.filename]#pkg-plist# и добавьте <<porting-message,сообщение>>, указывающее на то, что пользователь обязан скопировать и отредактировать этот файл перед тем, как программное обеспечение начнёт работать.
+
+[[plist-dynamic]]
+== Динамический или статический список упаковки
+
+_Статический список упаковки_ - это список упаковки, который доступен в Коллекции Портов или как файл [.filename]#pkg-plist# (с подстановкой переменных или без неё), или как встроенный в [.filename]#Makefile# посредством `PLIST_FILES`, `PLIST_DIRS` и `PLIST_DIRSTRY`. Даже если содержимое является автоматически порождаемым при помощи инструмента или в результате выполнения цели в Makefile _до_ включения в Коллекцию Портов коммиттером, то список всё ещё будет считаться статическим, поскольку его можно узнать без необходимости скачивания или компиляции дистрибутива.
+
+_Динамический список упаковки_ это список упаковки, который получается во время компиляции порта и строится на основе устанавливаемых файлов и каталогов. Узнать такой список невозможно до того, как исходный код портируемого приложения будет скачен и скомпилирован, или после запуска `make clean`.
+
+Хотя использование динамических список упаковки не запрещено, сопровождающие должны использовать статические списки упаковки везде, где это возможно, поскольку это позволяет пользователям выполнять man:grep[1] по доступным портам для обнаружения, например, который порт устанавливает определенный файл. Динамические списки должны быть использованы в основном для сложных портов, для которых изменения в списке упаковки кардинальным образом основаны на необязательных возможностях порта (и, таким образом, делая сопровождение статических списков упаковки невозможным), или портов, которые изменяют список упаковки на основе версии используемого им программного обеспечения (например, порты, которые порождают документы при помощи Javadoc).
+
+[[plist-autoplist]]
+== Автоматическое создание списка упаковки
+
+Первым делом убедитесь, что ваш порт практически полностью завершён и осталось создать только [.filename]#pkg-plist#. После этого вы можете запустить `make makeplist` для автоматического создания [.filename]#pkg-plist#. Содержимое этого файла должно быть дважды перепроверено.
+
+Пользовательские конфигурационные файлы должны быть удалены или быть установлены как [.filename]#filename.sample#. Файл [.filename]#info/dir# включать в список не нужно, но должны быть добавлены соответствующие строчки [.filename]#install-info#, так, как это описано в разделе о <<makefile-info,файлах в формате info>>. Все библиотеки, устанавливаемые портом, должны быть перечислены так, как это описано в разделе о <<porting-shlibs,динамических библиотеках>>.
diff --git a/documentation/content/ru/books/porters-handbook/porting-dads/chapter.adoc b/documentation/content/ru/books/porters-handbook/porting-dads/chapter.adoc
new file mode 100644
index 0000000000..d9e73bd5b7
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/porting-dads/chapter.adoc
@@ -0,0 +1,409 @@
+---
+title: Глава 12. Что делать нужно, и что делать нельзя
+prev: books/porters-handbook/security
+next: books/porters-handbook/porting-samplem
+---
+
+[[porting-dads]]
+= Что делать нужно, и что делать нельзя
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:freebsd-version: __FreeBSD_version
+:freebsd: __FreeBSD__
+:sectnumoffset: 12
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[dads-intro]]
+== Введение
+
+Вот список часто встречающихся действий, которые нужно и которые нельзя делать во время процесса портирования. Проверьте порт по этому списку, и также проверьте порты в http://www.FreeBSD.org/cgi/query-pr-summary.cgi?query[базе сообщений PR], которые присланы другими людьми. Присылайте любые комментарии о портах, которые вы проверили, так, как это описано в статье о link:{contributing}#CONTRIB-GENERAL[ Сообщениях об ошибках и общих замечаниях]. Проверка портов в базе сообщений PR позволит нам быстрее коммиттить их и удостовериться, что вы знаете, что делаете.
+
+[[porting-wrkdir]]
+== `WRKDIR`
+
+Не пишите ничего в файлы вне каталога `WRKDIR`. Каталог `WRKDIR` является единственным местом, которое гарантированно будет доступно для записи во время построения порта (обратитесь к главе об link:{handbook}#PORTS-CD[установке портов с CDROM] за примером построения портов из дерева, доступного только для чтения). Если вам нужно изменить какой-либо из файлов [.filename]##pkg-*##, сделайте это, <<porting-pkgfiles,переопределив переменную>>, но не перезаписывая их.
+
+[[porting-wrkdirprefix]]
+== `WRKDIRPREFIX`
+
+Добейтесь того, чтобы ваш порт принимал во внимание значение переменной `WRKDIRPREFIX`. Большинство портов об этом не заботятся. В частности, если вы обращаетесь к каталогу `WRKDIR` другого порта, заметьте, что его правильным местоположением является [.filename]#WRKDIRPREFIXPORTSDIR/subdir/name/work#, а не [.filename]#PORTSDIR/subdir/work# или [.filename]#.CURDIR/../../subdir/name/work# мли что-то подобное.
+
+Кроме того, если вы сами задаете `WRKDIR`, то должны поставить перед ним знак `${WRKDIRPREFIX}${.CURDIR}`.
+
+[[porting-versions]]
+== Различение операционных систем и версий ОС
+
+Вы можете встретиться с кодом, который требует модификаций или условной компиляции в зависимости от того, с какой версией FreeBSD Unix он работает. Предпочтительным способом отделения кода для версий FreeBSD является использование макросов {freebsd-version} и {freebsd}, определённых в http://svnweb.freebsd.org/base/head/sys/sys/param.h?view=markup[sys/param.h]. Если этот файл не подключен, добавьте код
+
+[.programlisting]
+....
+#include <sys/param.h>
+....
+
+в нужном месте файла [.filename]#.c#.
+
+{freebsd} определён во всех версиях FreeBSD в качестве старшего номера версии системы. Например, в FreeBSD 9.x {freebsd} определён со значением `9`.
+
+[.programlisting]
+....
+#if __FreeBSD__ >= 9
+# if __FreeBSD_version >= 901000
+ /* здесь особый код для версий 9.1+ */
+# endif
+#endif
+....
+
+[[dads-after-port-mk]]
+== Написание чего-либо после [.filename]#bsd.port.mk#
+
+Не пишите ничего после строки `.include <bsd.port.mk>`. Этой строки можно избежать, включив в где-то в середину вашего файла [.filename]#Makefile# файл [.filename]#bsd.port.pre.mk#, и файл [.filename]#bsd.port.post.mk# в конец.
+
+[NOTE]
+====
+Вам нужно включить либо пару файлов [.filename]#bsd.port.pre.mk#/[.filename]#bsd.port.post.mk#, либо только [.filename]#bsd.port.mk#; не используйте оба этих метода одновременно.
+====
+
+В файле [.filename]#bsd.port.pre.mk# определяются лишь несколько переменных, которые могут быть использованы в тестах из файла [.filename]#Makefile#, в файле [.filename]#bsd.port.post.mk# заданы остальные.
+
+Вот некоторые важные переменные, определенные в файле [.filename]#bsd.port.pre.mk# (это не полный список, для выяснения полного списка прочтите, пожалуйста, сам файл [.filename]#bsd.port.mk#).
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Переменная
+| Описание
+
+|`ARCH`
+|Архитектура машины в виде, получаемом по команде `uname -m` (например, `i386`)
+
+|`OPSYS`
+|Тип операционной системы, получаемый по команде `uname -s` (например, `FreeBSD`)
+
+|`OSREL`
+|Версия релиза операционной системы (например, `2.1.5` или `2.2.7`)
+
+|`OSVERSION`
+|Версия операционной системы в виде числа, та же, что и <<freebsd-versions,`__FreeBSD_version`>>.
+
+|`LOCALBASE`
+|Корень дерева "local" (например, `/usr/local`)
+
+|`PREFIX`
+|Куда, собственно, устанавливается порт (обратитесь к <<porting-prefix,подробной информации о `PREFIX`>>).
+|===
+
+[NOTE]
+====
+Если вы задаете переменную `MASTERDIR`, делайте это до подключения [.filename]#bsd.port.pre.mk#.
+====
+
+Вот несколько примеров того, что вы можете написать после [.filename]#bsd.port.pre.mk#:
+
+[.programlisting]
+....
+# no need to compile lang/perl5 if perl5 is already in system
+.if ${OSVERSION} > 300003
+BROKEN= perl is in system
+.endif
+....
+
+Вы не забываете об использовании табуляции вместо пробелов после `BROKEN=`:-).
+
+[[dads-sh-exec]]
+== Использование выражения `exec` в сценариях обёртках
+
+Если порт устанавливает сценарий на языке shell, который служит для запуска другой программы, и если запуск этой программы является последним действием сценария, убедитесь, что запуск программы производится с использованием выражения `exec`, например:
+
+[.programlisting]
+....
+#!/bin/sh
+exec %%LOCALBASE%%/bin/java -jar %%DATADIR%%/foo.jar "$@"
+....
+
+Выражение `exec` заменяет процесс сценария на указанную программу. Если `exec` опущен, то процесс сценария во время работы программы остается в памяти, бесполезно потребляя системные ресурсы.
+
+[[dads-rational]]
+== Поступайте разумно
+
+Файл [.filename]#Makefile# должен выполнять действия просто и небеспричинно. Если вы можете сделать что-то на несколько строк короче или более читабельно, сделайте это. В качестве примеров можно привести использование конструкций `.if` утилиты make вместо соответствующей конструкции `if` командного процессора, ненужность переопределения цели `do-extract` при возможности переопределения `EXTRACT*` и использование `GNU_CONFIGURE` вместо `CONFIGURE_ARGS += --prefix=${PREFIX}`.
+
+Если вы обнаружите, что для выполнения чего-то приходится писать много нового кода, то, пожалуйста, просмотрите файл [.filename]#bsd.port.mk# на предмет того, не содержит ли он решение именно вашей проблемы. Хотя его трудно читать, имеется много проблем, выглядящих сложными, для которых файл [.filename]#bsd.port.mk# уже содержит быстрое решение.
+
+[[dads-cc]]
+== Работа как с `CC`, так и `CXX`
+
+Порт должен принимать во внимание как переменную `CC`, так и `CXX`. Под этим мы подразумеваем, что порт ни в коем случае не должен устанавливать значения этих переменных, переопределяя имеющиеся значения; вместо этого можно добавлять нужные значения к уже имеющимся. Это связано с тем, что параметры построения, относящиеся ко всем портам, могут быть заданы глобально.
+
+Если порты не учитывают значения этих переменных, добавьте строку `NO_PACKAGE=ignores either cc or cxx` в файл [.filename]#Makefile#.
+
+Далее следует пример файла [.filename]#Makefile#, использующего как переменную `CC`, так и `CXX`. Обратите внимание на использование символов `?=`:
+
+[.programlisting]
+....
+CC?= gcc
+....
+
+[.programlisting]
+....
+CXX?= g++
+....
+
+Вот пример, в котором не принимаются во внимание ни `CC`, ни `CXX`:
+
+[.programlisting]
+....
+CC= gcc
+....
+
+[.programlisting]
+....
+CXX= g++
+....
+
+В системах FreeBSD обе переменные `CC` и `CXX` могут быть определены в файле [.filename]#/etc/make.conf#. В первом примере задаётся значение, если оно ранее не было определено в [.filename]#/etc/make.conf#, что сохраняет любые определения, данные на уровне системы в целом. Второй пример переопределяет всё, что было задано ранее.
+
+[[dads-cflags]]
+== Использование `CFLAGS`
+
+Порт должен учитывать переменную `CFLAGS`. Под этим мы подразумеваем, что порт ни в коем случае не должен устанавливать значения этой переменной, переопределяя имеющиеся значения; вместо этого можно добавлять нужные значения к уже имеющимся. Это связано с тем, что параметры построения, относящиеся ко всем портам, могут быть заданы глобально.
+
+Если порты не учитывают значения этой переменной, добавьте строку `NO_PACKAGE=ignores cflags` в файл [.filename]#Makefile#.
+
+Далее следует пример файла [.filename]#Makefile#, использующего переменную `CFLAGS`. Обратите внимание на использование символов `+=`:
+
+[.programlisting]
+....
+CFLAGS+= -Wall -Werror
+....
+
+А вот пример, в котором не учитывается значение переменной `CFLAGS`:
+
+[.programlisting]
+....
+CFLAGS= -Wall -Werror
+....
+
+В системе FreeBSD переменная `CFLAGS` определена в файле [.filename]#/etc/make.conf#. В первом примере к переменной `CFLAGS` добавляются дополнительные флаги, при этом сохраняются все определения, данные ранее на уровне системы. Во втором примере всё, что было задано ранее, игнорируется.
+
+Из сторонних файлов [.filename]#Makefile# следует удалить флаги оптимизации. Общесистемные флаги оптимизации находятся в системной переменной `CFLAGS`. Пример из немодифицированного [.filename]#Makefile#:
+
+[.programlisting]
+....
+CFLAGS= -O3 -funroll-loops -DHAVE_SOUND
+....
+
+При использовании системных флагов оптимизации [.filename]#Makefile# станет похожим на следующий пример:
+
+[.programlisting]
+....
+CFLAGS+= -DHAVE_SOUND
+....
+
+[[dads-pthread]]
+== Библиотеки потоков
+
+Во FreeBSD библиотека потоков обязана быть скомпонована с исполняемыми файлами с использованием специального флага `-pthread`. Если порт настаивает на прямой компоновке с `-lpthread`, создайте патч для использования `-pthread`.
+
+[NOTE]
+====
+Если построение порта заканчивается ошибкой `unrecognized option '-pthread'`, то может быть желательно использование `cc` в качестве компоновщика через установку `CONFIGURE_ENV` в `LD=${CC}`. Параметр `-pthread` напрямую командой `ld` не поддерживается.
+====
+
+[[dads-feedback]]
+== Пожелания
+
+Посылайте подходящие изменения/патчи автору/сопровождающему для включения в следующий релиз. Это только сделает вашу работу гораздо легче при выходе следующего релиза.
+
+[[dads-readme]]
+== [.filename]#README.html#
+
+[.filename]#README.html# не является частью порта и генерируется при помощи `make readme`. Не включайте этот файл в патчи или коммиты.
+
+[NOTE]
+====
+Если не удается выполнить `make readme`, убедитесь, что значение по умолчанию `ECHO_MSG` не изменено внутри порта.
+====
+
+[[dads-noinstall]]
+== Пометка неустанавливаемого порта как `BROKEN`, `FORBIDDEN` или `IGNORE`
+
+В некоторых случаях пользователи не должны допускаться к установке порта. Для того, чтобы сообщить пользователю, что порт не следует устанавливать, имеется несколько `make`-переменных, которые могут быть использованы в файле [.filename]#Makefile# порта. Значения следующих `make`-переменных будут причиной, возвращаемой пользователям, по которой порт отказывает в установке. Пожалуйста, используйте корректные `make`-переменные, так как каждая переменная make передает абсолютно различный смысл как для пользователей, так и для автоматизированных систем, которые полагаются на файлы [.filename]#Makefile#, таких как <<build-cluster,кластер построения портов>>, <<freshports,FreshPorts>> и <<portsmon,portsmon>>.
+
+[[dads-noinstall-variables]]
+=== Переменные
+
+* `BROKEN` предназначена для портов, которые в настоящее время не компилируются, не устанавливаются или не удаляются правильно. Следует использовать, когда проблема считается временной.
++
+В особых случаях кластер построения будет продолжать попытки собрать их, чтобы показать, решена ли основная проблема. (Однако, как правило, кластер запускается без этой возможности.)
++
+В частности, используйте `BROKEN`, когда порт:
+
+** не компилируется
+** не выполняет процесс своей конфигурации или установки
+** устанавливает файлы вовне [.filename]#${LOCALBASE}#
+** не удаляет полностью все свои файлы при деинсталляции (тем не менее, это может быть допустимо, и подходит для портов, оставляющих после себя файлы, измененные пользователем)
+
+* `FORBIDDEN` используется для портов, которые содержат уязвимости в информационной безопасности или являются потенциально вредными в плане обеспечения информационной безопасности системы FreeBSD при установке данного порта (например: заведомо небезопасная программа или программа, которая предоставляет легко взламываемые сервисы). Порты должны помечаться как `FORBIDDEN`, как только в конкретном программном обеспечении обнаружилась уязвимость, но обновление выпущено не было. В идеальном случае порты должны обновляться максимально быстро после обнаружения уязвимости, чтобы уменьшить число уязвимых хостов FreeBSD (нам нравится иметь репутацию безопасной системы), однако иногда случается значительный временной разрыв между обнаружением уязвимости и выходом обновлённого релиза уязвимого программного обеспечения. Не помечайте порт как `FORBIDDEN`, если причина не вызвана соображениями информационной безопасности.
+* `IGNORE` предназначена для портов, которые не должны строиться по какой-либо другой причине. Следует использовать для портов, в случае когда проблема считается структурной. Кластер построения ни при каких условиях не будет строить порты, помеченные как `IGNORE`. В частности, используйте `IGNORE`, когда порт:
+
+** компилируется, но работает неправильно
+** не работает на установленной версии FreeBSD
+** имеет дистрибутивный файл, который не может быть автоматически извлечен из-за лицензионных ограничений
+** не работает с каким-либо другим портом, установленным в настоящее время (например, порт зависит от package:www/apache20[], но установлен package:www/apache22[])
+
++
+[NOTE]
+====
+Если порт будет конфликтовать с уже установленным портом (например, если они устанавливают файл в то же место, но с иным функциональным назначением), то <<conflicts,используйте вместо этого `CONFLICTS`>>. `CONFLICTS` сам установит значение `IGNORE`.
+====
+
+* Если порт нужно пометить как `IGNORE` только на некоторых архитектурах, для этого есть две другие удобные переменные, которые автоматически установят для вас значения: `ONLY_FOR_ARCHS` и `NOT_FOR_ARCHS`. Примеры:
++
+[.programlisting]
+....
+ONLY_FOR_ARCHS= i386 amd64
+....
+
++
+[.programlisting]
+....
+NOT_FOR_ARCHS= ia64 sparc64
+....
+
++
+Собственное сообщение `IGNORE` можно задать с использованием `ONLY_FOR_ARCHS_REASON` и `NOT_FOR_ARCHS_REASON`. Отдельно для каждой архитектуры это возможно с использованием `ONLY_FOR_ARCHS_REASON_ARCH` и `NOT_FOR_ARCHS_REASON_ARCH`.
+* Если порт загружает и устанавливает исполняемые файлы i386, то следует установить `IA32_BINARY_PORT`. Если эта переменная установлена, будет выполнена проверка доступности каталога [.filename]#/usr/lib32# для библиотек версии IA32 и поддержки IA32 в ядре. При невыполнении любого из этих условий будет автоматически установлена переменная `IGNORE`.
+
+[[dads-noinstall-notes]]
+=== Замечания по реализации
+
+Строки не следует брать в кавычки. Также построение строки должно несколько различаться из-за способа отображения информации пользователю. Примеры:
+
+[.programlisting]
+....
+BROKEN= fails to link with base -lcrypto
+....
+
+[.programlisting]
+....
+IGNORE= unsupported on recent versions
+....
+
+получаемые в результате следующего вывода `make describe`:
+
+[.programlisting]
+....
+===> foobar-0.1 is marked as broken: fails to link with base -lcrypto.
+....
+
+[.programlisting]
+....
+===> foobar-0.1 is unsupported on recent versions.
+....
+
+[[dads-deprecated]]
+== Пометка порта на удаление с `DEPRECATED` или `EXPIRATION_DATE`
+
+Помните, что `BROKEN` и `FORBIDDEN` будут использованы как временное средство, если порт не является работающим. Постоянно неработоспособные порты должны полностью удаляться из дерева.
+
+В подходящих ситуациях пользователи могут быть оповещены о предстоящем удалении через переменные `DEPRECATED` и `EXPIRATION_DATE`. Первое - это просто строка, сообщающая причину запланированного удаления порта; вторая является строкой в формате ISO 8601 (YYYY-MM-DD). Обе будут показаны пользователю.
+
+Переменную `DEPRECATED` можно установить без использования `EXPIRATION_DATE` (в частности, при рекомендации новой версии порта), но обратный порядок не имеет никакого смысла.
+
+Не существует устоявшейся политики, как долго следует продолжать уведомления. Текущая практика дает около месяца для решения проблем безопасности и два месяца для проблем построения. Это также дает немного времени на исправление проблем любым заинтересованным коммиттерам.
+
+[[dads-dot-error]]
+== Избегайте использования конструкции `.error`
+
+Правильным способом подать сигнал для [.filename]#Makefile# о том, что порт не может быть установлен из-за какого-то внешнего фактора (например, пользователь указал недопустимую комбинацию опций построения), является установка непустого значения для `IGNORE`. Это значение будет сформатировано и показано пользователю во время `make install`.
+
+Использование для этих целей `.error` является распространенной ошибкой. Проблема в том, что в этой ситуации будут повреждены многие инструменты автоматизации, работающие с деревом портов. Наибольшим образом это распространено при попытке построить [.filename]#/usr/ports/INDEX# (смотрите <<make-describe>>). Тем не менее, даже более простые команды, такие как `make maintainer`, в этом случае также вернут ошибку. Это не является приемлемым.
+
+[[dot-error-breaks-index]]
+.Как избегать использования `.error`
+[example]
+====
+Из следующих двух вариантов строки файла [.filename]#Makefile# первый приведёт к неудачному завершению работы `make index`, а второй - нет:
+
+[.programlisting]
+....
+.error "option is not supported"
+....
+
+[.programlisting]
+....
+IGNORE=option is not supported
+....
+
+====
+
+[[dads-sysctl]]
+== Использование [.filename]#sysctl#
+
+Использование [.filename]#sysctl# не рекомендуется, кроме как при выполнении целей. Это вызвано тем, что вычисление любых `makevar`, таких как во время команды `make index`, с необходимостью запуска этой команды, еще больше замедляет весь процесс.
+
+man:sysctl[8] следует всегда использовать через переменную `SYSCTL`, поскольку она содержит полностью заданный путь, и при необходимости может быть переопределена.
+
+[[dads-rerolling-distfiles]]
+== Меняющиеся дистрибутивные файлы
+
+Иногда авторы программного обеспечения меняют содержимое выпущенных дистрибутивных файлов без смены названия. Вы должны проверять, что изменения являются официальными и произведены автором. В прошлом бывало, что дистрибутивный файл молча изменялся на сайтах загрузки с намерением нанести вред или скомпрометировать безопасность конечного пользователя.
+
+Отложите старый файл с дистрибутивом в сторону, загрузите новый, распакуйте его и сравните содержимое при помощи man:diff[1]. Если вы не видите ничего подозрительного, то можете обновить файл [.filename]#distinfo#. Убедитесь, что вы подытожили различия в вашем PR или описании коммита, чтобы другие люди были в курсе, что вы позаботились о том, что ничего плохого не случилось.
+
+Возможно вы также захотите связаться с автором этого программного обеспечения для подтверждения изменений.
+
+[[dads-avoiding-linuxisms]]
+== Избегание линуксизмов
+
+Не используйте [.filename]#/proc#, если доступны любые другие источники получения информации, например, `setprogname(argv[0])` в `main()` и man:getprogname[3], в случае если вы хотите "знать своё имя".
+
+Не полагайтесь на поведение, не регламентированное POSIX.
+
+Не выполняйте запись временных меток в критических путях выполнения приложения, если можно обойтись без этого. Получение временных меток может быть медленным, в зависимости от степени точности используемых часов в операционной системе. Если временные метки действительно нужны, определите степень требуемой точности и используйте тот API, в котором документируется получение достаточной точности.
+
+Ряд простых системных вызовов (например, man:gettimeofday[2], man:getpid[2]) работают намного быстрее в Linux(R) по сравнению с любой другой операционной системой из-за кеширования и используемой оптимизации vsyscall. Не полагайтесь на их дешевизну в критичных к производительности приложениях. В целом, старайтесь избегать системных вызовов там, где это возможно.
+
+Не полагайтесь на специфичное для Linux(R) поведение сокета. В частности, отличаются размеры буфера сокета по умолчанию (выполните вызов man:setsockopt[2] с `SO_SNDBUF` и `SO_RCVBUF`, и в то время как в Linux(R) при заполнении буфера сокета man:send[2] блокируется, FreeBSD возвращает ошибку и устанавливает `ENOBUFS` в качестве значения errno.
+
+Если требуется рассчитывать на нестандартное поведение, инкапсулируйте это должным образом в общий для всех API с проверкой поведения на этапе конфигурации, и если требуемое поведение не найдено, прекращайте выполнение.
+
+Используйте http://www.freebsd.org/cgi/man.cgi[страницы справочника] для проверки, относится ли функция к интерфейсу POSIX (ищите раздел "STANDARDS" на странице справочника).
+
+Не рассчитывайте на то, что в качестве [.filename]#/bin/sh# используется bash. Убедитесь, что командная строка, переданная в man:system[3], будет работать в POSIX-совместимой оболочке.
+
+Список основных bash-измов расположен https://wiki.ubuntu.com/DashAsBinSh[здесь].
+
+Проверьте, что используемые заголовочные файлы включены в POSIX или список, рекомендуемый страницей справочника, т.к. например, забыть подключить [.filename]#sys/types.h# - не такая уж проблема в Linux(R), однако это не так во FreeBSD.
+
+Компилируйте многопоточные приложения с ключом "-pthread", а не "-lpthread" или как-либо ещё.
+
+[[dads-misc]]
+== Разное
+
+Файлы [.filename]#pkg-descr# и [.filename]#pkg-plist# должны проверяться дважды. Если вы пересматриваете порт и думаете, что его можно описать иначе, сделайте это.
+
+Пожалуйста, не создавайте дополнительных копий лицензии GNU General Public License в нашей системе.
+
+Будьте внимательны с юридическими вопросами! Не делайте из нас нелегальных распространителей ПО!
diff --git a/documentation/content/ru/books/porters-handbook/porting-samplem/chapter.adoc b/documentation/content/ru/books/porters-handbook/porting-samplem/chapter.adoc
new file mode 100644
index 0000000000..d6c984a099
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/porting-samplem/chapter.adoc
@@ -0,0 +1,125 @@
+---
+title: Глава 13. Примерный Makefile
+prev: books/porters-handbook/porting-dads
+next: books/porters-handbook/keeping-up
+---
+
+[[porting-samplem]]
+= Примерный [.filename]#Makefile#
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 13
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+Вот примерный [.filename]#Makefile#, который можно использовать при создании нового порта. Обязательно удалите все дополнительные комментарии (те, которые в скобках)!
+
+Вам рекомендуется следовать этому формату (соблюдая порядок следования переменных, пустые строки между разделами, и так далее). Этот формат разработан для того, чтобы важная информация была легко найдена. Мы рекомендуем вам воспользоваться утилитой <<porting-portlint,portlint>> для проверки файла [.filename]#Makefile#.
+
+[.programlisting]
+....
+[заголовок...просто чтобы нам было легче идентифицировать порт.]
+# Created by: Satoshi Asami <asami@FreeBSD.org>
+[Необязательная строка Created by: содержит имя
+человека, создавшего первоначальную версию порта. Следует отметить,
+что за : следует пробел, но не символ табуляции. Если
+эта строка присутствует, будущие сопровождающие не должны её менять
+или удалять, кроме как по запросу первоначального автора.]
+
+# $FreeBSD$
+[ ^^^^^^^^^ Эта строка будет автоматически заменена на строчку RCS ID
+системой SVN при выполнении операции коммита в наше хранилище. При
+обновлении порта не приводите эту строку обратно к виду
+"$FreeBSD$". SVN сделает это автоматически.]
+
+[секция описания собственно порта и основного сервера - сначала всегда
+ PORTNAME и PORTVERSION, за ним следует CATEGORIES, а затем
+ MASTER_SITES, за которым может идти MASTER_SITE_SUBDIR.
+ PKGNAMEPREFIX и PKGNAMESUFFIX, если они нужны, следуют за ними.
+ Затем следует DISTNAME, EXTRACT_SUFX и/или DISTFILES, а потом, если это нужно,
+ EXTRACT_ONLY.]
+PORTNAME= xdvi
+PORTVERSION= 18.2
+CATEGORIES= print
+[не забывайте про завершающую косую черту ("/")!
+ если вы не используете макросы MASTER_SITE_*]
+MASTER_SITES= ${MASTER_SITE_XCONTRIB}
+MASTER_SITE_SUBDIR= applications
+PKGNAMEPREFIX= ja-
+DISTNAME= xdvi-pl18
+[задайте это, если исходный код поставляется не в виде
+ стандартного файла ".tar.gz"]
+EXTRACT_SUFX= .tar.Z
+
+[секция патчей -- может быть пустой]
+PATCH_SITES= ftp://ftp.sra.co.jp/pub/X11/japanese/
+PATCHFILES= xdvi-18.patch1.gz xdvi-18.patch2.gz
+
+[сопровождающий; *обязательное поле*! Это человек, который добровольно
+ занимается обновлениями порта и неисправностями при построении, и которому
+ пользователь может направлять вопросы и сообщения об ошибках. Для
+ сохранения как можно более высокого качества Коллекции Портов мы больше
+ не принимаем новые порты, назначенные на "ports@FreeBSD.org".]
+MAINTAINER= asami@FreeBSD.org
+COMMENT= DVI Previewer for the X Window System
+
+[зависимости -- могут быть пустыми]
+RUN_DEPENDS= gs:${PORTSDIR}/print/ghostscript
+
+[этот раздел для остальных стандартных переменных из bsd.port.mk, кроме
+ тех, что перечислены выше]
+[Если порт задает вопросы во время этапов настройки, построения,
+ установки...]
+IS_INTERACTIVE= yes
+[Если распаковка происходит в каталог, отличных от ${DISTNAME}...]
+WRKSRC= ${WRKDIR}/xdvi-new
+[Если патчи делались не относительно ${WRKSRC}, вам, может быть, не
+ придется изменять эту переменную]
+PATCH_DIST_STRIP= -p1
+[Если порт требует скрипта "configure", генерируемого GNU-версией программы
+ autoconf]
+GNU_CONFIGURE= yes
+[Если для построения порту требуется GNU-версия утилиты make, а не
+ /usr/bin/make...]
+USES= gmake
+[Если это приложение X и требует запуска "xmkmf -a"...]
+USES= imake
+[и так далее]
+
+[В правилах ниже используются нестандартные переменные]
+MY_FAVORITE_RESPONSE= "yeah, right"
+
+[теперь специальные правила, в порядке их вызова]
+pre-fetch:
+ я что-то выкачиваю, точно
+
+post-patch:
+ мне кое-что сделать после применения патча, великолепно
+
+pre-install:
+ и потом еще кое-что перед установкой, ого
+
+[и, наконец, эпилог]
+
+.include <bsd.port.mk>
+....
diff --git a/documentation/content/ru/books/porters-handbook/porting-why/chapter.adoc b/documentation/content/ru/books/porters-handbook/porting-why/chapter.adoc
new file mode 100644
index 0000000000..3826351cc4
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/porting-why/chapter.adoc
@@ -0,0 +1,37 @@
+---
+title: Глава 1. Введение
+prev: books/porters-handbook/
+next: books/porters-handbook/new-port
+---
+
+[[why-port]]
+= Введение
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 1
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+Коллекция портов FreeBSD является способом, используемым практически каждым для установки приложений ("портов") на FreeBSD. Как и почти всё остальное во FreeBSD, эта система в основном является добровольно поддерживаемым начинанием. Важно иметь это в виду при чтении данного документа.
+
+Во FreeBSD каждый может прислать новый порт либо изъявить желание поддерживать существующий порт, если его никто ещё никто не поддерживает-вам не нужно иметь никаких особых привилегий на внесение изменений, чтобы это делать.
diff --git a/documentation/content/ru/books/porters-handbook/quick-porting/chapter.adoc b/documentation/content/ru/books/porters-handbook/quick-porting/chapter.adoc
new file mode 100644
index 0000000000..a74168da4d
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/quick-porting/chapter.adoc
@@ -0,0 +1,233 @@
+---
+title: Глава 3. Быстрое портирование
+prev: books/porters-handbook/new-port
+next: books/porters-handbook/slow-porting
+---
+
+[[quick-porting]]
+= Быстрое портирование
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 3
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+В этом разделе описано, как создать новый порт на скорую руку. Во многих случаях этого бывает не достаточно, так что вам нужно будет прочитать документ дальше.
+
+Во-первых, скачайте оригинальный tar-файл и поместите его в каталог `DISTDIR`, который по умолчанию есть не что иное, как [.filename]#/usr/ports/distfiles#.
+
+[NOTE]
+====
+Здесь предполагается, что программное обеспечение компилируется без проблем как есть, то есть для работы приложения на вашей системе FreeBSD не потребовалось абсолютно никаких изменений. Если требовалось что-то изменить, то вам придется обратиться также и к следующему разделу.
+====
+
+[NOTE]
+====
+Перед началом портирования рекомендуется установить переменную man:make[1] `DEVELOPER` в [.filename]#/etc/make.conf#.
+
+[source,bash]
+....
+# echo DEVELOPER=yes >> /etc/make.conf
+....
+
+Эта настройка включает "режим разработчика", в котором отображаются предупреждения при использовании устаревших конструкций и задействуются некоторые дополнительные проверки при вызове команды `make`.
+====
+
+[[porting-makefile]]
+== Создание файла [.filename]#Makefile#
+
+Минимальный [.filename]#Makefile# будет выглядеть примерно так:
+
+[.programlisting]
+....
+# $FreeBSD$
+
+PORTNAME= oneko
+PORTVERSION= 1.1b
+CATEGORIES= games
+MASTER_SITES= ftp://ftp.cs.columbia.edu/archives/X11R5/contrib/
+
+MAINTAINER= youremail@example.com
+COMMENT= Cat chasing a mouse all over the screen
+
+.include <bsd.port.mk>
+....
+
+[NOTE]
+====
+В некоторых случаях в заголовке [.filename]#Makefile# существующего порта могут содержаться дополнительные строки, такие как название порта и дата его создания. Эта дополнительная информация была объявлена устаревшей и находится в процессе удаления.
+====
+
+Посмотрим, сможете ли вы его понять. Не обращайте внимание на содержимое строчки `$FreeBSD$`, она будет заполнена автоматически системой Subversion, когда порт будет импортирован в наше дерево портов. Вы можете найти более подробный пример в разделе <<porting-samplem,пример Makefile>>.
+
+[[porting-desc]]
+== Создание информационных файлов
+
+Имеется два информационных файла, которые требуются для любого порта, вне зависимости от того, является ли он пакетом или нет. Это [.filename]#pkg-descr# и [.filename]#pkg-plist#. Префикс [.filename]#pkg-# отличает их от других файлов.
+
+=== [.filename]#pkg-descr#
+
+Это более подробное краткое описание порта. От одного до нескольких абзацев, кратко описывающих, что представляет собой порт, будет достаточно.
+
+[NOTE]
+====
+Это _не_ руководство и не подробнейшее описание того, как использовать или компилировать порт! _Пожалуйста, будьте внимательны при копировании текста из [.filename]#README# или страниц справочника_; слишком часто они не являются кратким описанием порта или имеют неудобный формат (например, страницы справочника выровнены пробелами, что особенно плохо смотрится с моноширинными шрифтами).
+====
+
+Хорошо составленный [.filename]#pkg-descr# описывает порт достаточно полно, чтобы пользователю не приходилось сверяться с документацией или посещать вебсайт для понимания того, что делает данное программное обеспечение, чем оно может быть полезно или какие хорошие функции у него имеются. Упоминание про определённые требования, такие как используемый графический инструментарий, тяжёлые зависимости, окружение для запуска или используемый язык программирования помогут пользователям определиться, будет ли этот порт для них работать.
+
+Включите сюда URL официальной домашней страницы Интернет. Перед _одним_ из сайтов (выберите основной) добавьте `WWW:` (с последующим единичным пробелом) для того, чтобы вспомогательные утилиты работали правильно. Если URI является корнем сайта или каталогом, то значение должно быть дополнено косой чертой.
+
+[NOTE]
+====
+Если указанная для порта веб-страница не доступна, попытайтесь сперва поискать, был ли официальный сайт перемещён, переименован или размещён в другом месте.
+====
+
+Следующий пример показывает, как должен выглядеть ваш [.filename]#pkg-descr#:
+
+[.programlisting]
+....
+This is a port of oneko, in which a cat chases a poor mouse all over
+the screen.
+ :
+(etc.)
+
+WWW: http://www.oneko.org/
+....
+
+=== [.filename]#pkg-plist#
+
+Здесь перечисляются все файлы, устанавливаемые портом. Его также называют "списком для упаковки", потому что пакет генерируется упаковкой файлов, которые здесь указаны. Имена путей указываются относительно установочного префикса (обычно [.filename]#/usr/local#). Если порт во время установки создает каталоги, убедитесь, что добавлены строки `@dirrm` для удаления каталогов при удалении пакета.
+
+Вот маленький пример:
+
+[.programlisting]
+....
+bin/oneko
+man/man1/oneko.1.gz
+lib/X11/app-defaults/Oneko
+lib/X11/oneko/cat1.xpm
+lib/X11/oneko/cat2.xpm
+lib/X11/oneko/mouse.xpm
+@dirrm lib/X11/oneko
+....
+
+Обратитесь к странице справочной системы по команде man:pkg-create[8] с подробным описанием формата списка упаковки.
+
+[NOTE]
+====
+Рекомендуется, чтобы имена файлов в этом списке были отсортированы в алфавитном порядке. Это позволит значительно облегчить сверку изменений при обновлении порта.
+====
+
+[NOTE]
+====
+Создание списка упаковки вручную может оказаться весьма трудоёмкой задачей. Если порт устанавливает большое количество файлов, раздел об <<plist-autoplist,автоматическом построении списка упаковки>> может помочь сэкономить время.
+====
+
+Существует только одно исключение, когда у порта может отсутствовать [.filename]#pkg-plist#. Если порт устанавливает лишь несколько файлов, а возможно, и каталогов, то они могут быть перечислены в переменных `PLIST_FILES` и `PLIST_DIRS`, соответственно, внутри файла [.filename]#Makefile# порта. К примеру, мы можем обойтись без файла [.filename]#pkg-plist# у приведённого выше порта [.filename]#oneko#, добавив следующие строки в [.filename]#Makefile#:
+
+[.programlisting]
+....
+PLIST_FILES= bin/oneko \
+ man/man1/oneko.1.gz \
+ lib/X11/app-defaults/Oneko \
+ lib/X11/oneko/cat1.xpm \
+ lib/X11/oneko/cat2.xpm \
+ lib/X11/oneko/mouse.xpm
+PLIST_DIRS= lib/X11/oneko
+....
+
+Конечно, переменная `PLIST_DIRS` не должна задаваться, если порт не устанавливает никаких каталогов.
+
+[NOTE]
+====
+Несколько портов могут совместно использовать общий каталог. В этом случае `PLIST_DIRS` следует заменить на `PLIST_DIRSTRY`, так чтобы каталог удалялся только если он пуст, а иначе игнорировался. Использование `PLIST_DIRS` и `PLIST_DIRSTRY` аналогично `@dirrm` и `@dirrmtry` в [.filename]#pkg-plist#, описание которых входит в <<plist-dir-cleaning>>.
+====
+
+Обратной стороной такого способа перечисления файлов и каталогов порта является невозможность использования последовательностей команд, описанных в man:pkg-create[8]. Поэтому он подходит для простых портов, что делает их ещё более простыми. Одновременно с этим положительным моментом является уменьшение количества файлов в коллекции портов. Пожалуйста, подумайте над использованием этой техники, прежде чем создавать [.filename]#pkg-plist#.
+
+Далее мы увидим, как можно использовать файлы [.filename]#pkg-plist# и `PLIST_FILES` выполнения <<plist,более сложных задач>>.
+
+[[porting-checksum]]
+== Создание файла с контрольной суммой
+
+Просто введите команду `make makesum`. Правила утилиты make автоматически сгенерируют файл [.filename]#distinfo#.
+
+Если у извлекаемого файла регулярно меняется контрольная сумма и вы не сомневаетесь в надежности источника (т.е. он получен из CD производителя, либо ежедневно обновляется документация), то вы должны указать эти файлы в переменной `IGNOREFILES`. Тогда контрольная сумма при выполнении `make makesum` для этого файла создаваться не будет, а вместо этого для него будет установлено значение `IGNORE`.
+
+[[porting-testing]]
+== Тестирование порта
+
+Вы должны удостовериться, что правила построения порта выполняют именно то, что вы хотите, включая создание пакета для порта. Вот те важные вещи, которые вы должны проверить.
+
+* [.filename]#pkg-plist# не содержит ничего сверх того, что устанавливается портом
+* [.filename]#pkg-plist# содержит абсолютно все, что устанавливается портом
+* Порт может быть установлен с помощью указания цели `install`. Это позволяет убедиться в правильной работе сценария установки.
+* Порт может быть правильным образом удалён с помощью указания цели `deinstall`. Это позволяет убедиться в правильной работе сценария удаления.
+* Следует убедиться, что `make package` можно запустить из-под обычного пользователя (то есть, не из-под `root`). Если это не так, в [.filename]#Makefile# порта должно быть добавлено `NEED_ROOT=yes`.
+
+[.procedure]
+====
+*Procedure: Рекомендуемый порядок проверки*
+
+. `make stage`
+. `make check-orphans`
+. `make package`
+. `make install`
+. `make deinstall`
+. `pkg add package-filename`
+. `make package` (из-под пользователя)
+====
+
+Убедитесь, что на любом из этапов не выдается никаких предупреждений.
+
+Основательное автоматизированное тестирование может быть выполнено при помощи package:ports-mgmt/tinderbox[] или package:ports-mgmt/poudriere[] из Коллекции Портов. Эти приложения используют `jails`, в которых проверяются все перечисленные выше этапы без изменения состояния основной системы.
+
+[[porting-portlint]]
+== Проверка вашего порта утилитой `portlint`
+
+Будьте добры, пользуйтесь утилитой `portlint` для проверки того, что ваш порт соответствует нашим рекомендациям. Программа package:ports-mgmt/portlint[] является частью Коллекции Портов. В частности, вы можете захотеть проверить, правильно ли сформирован файл <<porting-samplem,Makefile>> и соответствующим ли образом именован <<porting-pkgname,пакет>>.
+
+[[porting-submitting]]
+== Посылка нового порта
+
+Перед посылкой нового порта прочитайте раздел о том, что <<porting-dads,можно и нельзя>> делать.
+
+Когда вы наконец довольны своим первым портом, единственное, что осталось сделать, это включить его в основное дерево портов FreeBSD и осчастливить этим всех остальных. Нам не нужен ни каталог [.filename]#work#, ни пакет [.filename]#pkgname.tgz#, так что удалите их прямо сейчас.
+
+Затем получите файл man:shar[1]. Предполагая, что порт называется oneko, перейдите в каталог выше, где находится каталог `oneko`, и наберите: `shar find oneko > oneko.shar`
+
+Включите [.filename]#oneko.shar# в сообщение об ошибке и пошлите его с помощью man:send-pr[1]. Обратитесь к разделу link:{contributing}#CONTRIB-GENERAL[Сообщения об ошибках и общие замечания] для получения подробной информации о man:send-pr[1]).
+
+Укажите в сообщении категорию `ports` и класс `change-request`. _Не_ указывайте, что сообщение имеет статус `confidential`! Добавьте краткое описание программы в поле "Description" отправляемого PR (например, содержимое `COMMENT` в сокращённом варианте) и сам файл в виде архива [.filename]#.shar# в поле "Fix".
+
+[NOTE]
+====
+Хорошее описание в заголовке сообщения о проблеме значительно облегчает работу коммиттеров портов. Для новых портов мы предпочитаем нечто вроде "New port: <категория>/<название порта> <краткое описание порта>". Следование этой схеме упрощает и ускоряет начало работы по добавлению нового порта.
+====
+
+Повторим ещё раз, что __не нужно включать ни оригинальный файл с дистрибутивом, ни каталог [.filename]#work#, ни пакет, построенный вами командой ``make package``__; для новых портов используйте man:shar[1], но не man:diff[1].
+
+После отправки порта, пожалуйста, потерпите. Время, необходимое для включения нового порта во FreeBSD, может занимать от нескольких дней до нескольких месяцев. http://www.FreeBSD.org/cgi/query-pr-summary.cgi?category=ports[ Здесь] можно увидеть список ожидающих PR для портов.
+
+После рассмотрения нового порта мы при необходимости вам ответим, а затем включим порт в наше дерево. Ваше имя также будет добавлено в список link:{contributors}#contrib-additional/[Дополнительных контрибуторов проекта FreeBSD] и другие файлы.
diff --git a/documentation/content/ru/books/porters-handbook/security/chapter.adoc b/documentation/content/ru/books/porters-handbook/security/chapter.adoc
new file mode 100644
index 0000000000..dd1684151a
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/security/chapter.adoc
@@ -0,0 +1,255 @@
+---
+title: Глава 11. Безопасность портов
+prev: books/porters-handbook/upgrading
+next: books/porters-handbook/porting-dads
+---
+
+[[security]]
+= Безопасность портов
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 11
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[security-intro]]
+== Почему безопасность так важна
+
+Ошибки в программном обеспечении появляются случайно. Возможно, самые опасные из них те, что создают уязвимости безопасности. С технической точки зрения подобные уязвимости должны быть закрыты путем исправления вызывающих их ошибок. Тем не менее, политики обработки несущественных ошибок и уязвимостей очень различаются.
+
+Обычная небольшая ошибка затрагивает только тех пользователей, которые задействуют некоторые комбинации настроек, активирующие эту ошибку. Разработчик в конечном счете выпустит патч, а зачтем новую версию программного обеспечения, свободного от ошибки, но большинство пользователей не посчитают нужным сразу же произвести обновление, поскольку эта ошибка никогда у них не проявлялась. Критическая ошибка, которая может приводить к потере данных, представляет серьезную проблему. Тем не менее, предусмотрительные пользователи знают, что большинство возможных происшествий, и среди них программные ошибки, скорее всего приводят к потере данных, поэтому они выполняют резервное копирование важных данных; дополнительно, критическая ошибка будет обнаружена очень скоро.
+
+С уязвимостью безопасности всё иначе. Во-первых, она может сохраняться необнаруженной целые годы, потому что чаще всего не вызывает ошибок в работе. Во-вторых, компания злоумышленников может использовать ее для получения неавторизованного доступа к уязвимой системе, уничтожить или подменить важные данные; в худшем случае пользователь даже не заметит нанесенный урон. В-третьих, взлом уязвимой системы часто упрощает задачу проникновения атакующих в другие системы, которые не могут быть скомпрометированы иначе. Таким образом, устранение уязвимости как таковой недостаточно: следует разослать всем заинтересованным уведомления в наиболее понятной и исчерпывающей форме, что позволит оценить риск и предпринять подходящие меры.
+
+[[security-fix]]
+== Исправление уязвимостей безопасности
+
+Что касается портов и пакетов, уязвимость безопасности изначально может появиться в исходном дистрибутиве или файлах порта. В первом случае, разработчик исходного программного обеспечения скорее всего сразу же выпустит патч или новую версию, и вам лишь понадобится сразу обновить порт в соответствии с исправлением автора. Если исправление по какой-то причине задерживается, вам следует либо <<dads-noinstall,пометить порт как `FORBIDDEN`>>, либо добавить в порт ваш собственный патч. В случае уязвимости порта просто исправьте этот порт как можно скорее. В любом случае нужно следовать <<port-upgrading,стандартной процедуре отправки вашего изменения>>, если вы не обладаете правами на коммит изменения непосредственно в дерево портов.
+
+[IMPORTANT]
+====
+Быть коммиттером портов недостаточно для коммита произвольного порта. Помните, что обычно у портов есть сопровождающие, мнение которых вы должны учитывать.
+====
+
+Пожалуйста, убедитесь, что ревизия порта после закрытия уязвимости увеличена. Вот как пользователи, обновляющие установленные пакеты на постоянной основе, увидят, что им нужно запустить обновление. Кроме того, новый пакет будет собран и распространен через FTP и WWW зеркала, замещая уязвимый. Если в процессе исправления уязвимости не было изменено значение `PORTVERSION`, то должно быть увеличено значение `PORTREVISION`. Вам следует увеличить значение `PORTREVISION` после добавления в порт файла с патчем, но не когда вы обновили порт до последней версии программного обеспечения, попутно затронув при этом `PORTVERSION`. За дальнейшей информацией обращайтесь к <<makefile-naming-revepoch,соответствующему разделу>>.
+
+[[security-notify]]
+== Обеспечение сообщества информацией
+
+[[security-notify-vuxml-db]]
+=== База данных VuXML
+
+Очень важным и первостепенным шагом при действии как можно раньше после раскрытия уязвимости является уведомление сообщества пользователей порта об опасности. Такие уведомления служат двум целям. Во-первых, в случае действительно серьезной угрозы, будет посоветовано применить мгновенное воздействие. Например, остановить затрагиваемый сетевой сервис или даже удалить порт целиком, пока уязвимость не будет устранена. Во-вторых, масса пользователей имеет тенденцию обновлять установленные пакеты только от случая к случаю. Из уведомления они узнают, что _должны_ обновить пакет без промедления сразу же после появления исправленной версии.
+
+Учитывая огромное число портов в дереве, невозможно по каждому случаю выпускать бюллетень безопасности без создания флуда и потери внимания сообщества к моменту появления действительно серьезных причин. Поэтому уязвимости безопасности, обнаруженные в портах, записываются в http://vuxml.freebsd.org/[базу данных FreeBSD VuXML]. Члены Команды Офицеров Безопасности также отслеживают её на предмет появления вопросов, требующих их вмешательства.
+
+Если вы обладаете правами коммиттера, вы можете сам обновить базу данных VuXML. Так вы поможете Команде Офицеров Безопасности и своевременно пошлете ценную информацию сообществу. Тем не менее, если вы не являетесь коммиттером или верите, что нашли исключительно серьезную уязвимость, то не задумываясь свяжитесь с Командой Офицеров Безопасности напрямую как это описано на странице http://www.freebsd.org/security/#how[информационной безопасности FreeBSD].
+
+База данных VuXML является документом XML. Его исходный файл [.filename]#vuln.xml# содержится прямо внутри порта package:security/vuxml[]. Следовательно, полное имя пути к файлу будет [.filename]#PORTSDIR/security/vuxml/vuln.xml#. Каждый раз, при обнаружении вами в порте уязвимости безопасности добавьте об этом запись в этот файл. Пока вы не знакомы с VuXML, лучшее, что вы можете сделать, это найти существующую запись, подпадающую под ваш случай, затем скопировать ее и использовать в качестве шаблона.
+
+[[security-notify-vuxml-intro]]
+=== Короткое вступление в VuXML
+
+В совокупности XML является очень сложным форматом, и его описание выходит далеко за рамки этой книги. Тем не менее, для достижения основного понимания структуры записи VuXML вам понадобится всего лишь понять теги. Имена тегов XML обрамляются в угловые скобки. Каждый открывающий <tag> должен иметь совпадающий закрывающий </tag>. Теги могут быть вложенными. При вложенности внутренние теги должны быть закрыты до закрытия внешних. Существует иерархия тегов, т.е. более сложные правила вкладывания тегов. Это похоже на HTML. Основное отличие в расширяемости XML, т.е. в определении собственных тегов. Из-за своей характерной структуры XML придает форму разрозненным данным. В частности, XML подходит для разметки описаний уязвимостей безопасности.
+
+Теперь рассмотрим настоящую запись VuXML:
+
+[.programlisting]
+....
+<vuln vid="f4bc80f4-da62-11d8-90ea-0004ac98a7b9"> <.>
+ <topic>Several vulnerabilities found in Foo</topic> <.>
+ <affects>
+ <package>
+ <name>foo</name> <.>
+ <name>foo-devel</name>
+ <name>ja-foo</name>
+ <range><ge>1.6</ge><lt>1.9</lt></range> <.>
+ <range><ge>2.*</ge><lt>2.4_1</lt></range>
+ <range><eq>3.0b1</eq></range>
+ </package>
+ <package>
+ <name>openfoo</name> <.>
+ <range><lt>1.10_7</lt></range> <.>
+ <range><ge>1.2,1</ge><lt>1.3_1,1</lt></range>
+ </package>
+ </affects>
+ <description>
+ <body xmlns="http://www.w3.org/1999/xhtml">
+ <p>J. Random Hacker reports:</p> <.>
+ <blockquote
+ cite="http://j.r.hacker.com/advisories/1">
+ <p>Several issues in the Foo software may be exploited
+ via carefully crafted QUUX requests. These requests will
+ permit the injection of Bar code, mumble theft, and the
+ readability of the Foo administrator account.</p>
+ </blockquote>
+ </body>
+ </description>
+ <references> <.>
+ <freebsdsa>SA-10:75.foo</freebsdsa> <.>
+ <freebsdpr>ports/987654</freebsdpr> <.>
+ <cvename>CAN-2010-0201</cvename> <.>
+ <cvename>CAN-2010-0466</cvename>
+ <bid>96298</bid> <.>
+ <certsa>CA-2010-99</certsa> <.>
+ <certvu>740169</certvu> <.>
+ <uscertsa>SA10-99A</uscertsa> <.>
+ <uscertta>SA10-99A</uscertta> <.>
+ <mlist msgid="201075606@hacker.com">http://marc.theaimsgroup.com/?l=bugtraq&amp;m=203886607825605</mlist> <.>
+ <url>http://j.r.hacker.com/advisories/1</url> <.>
+ </references>
+ <dates>
+ <discovery>2010-05-25</discovery> <.>
+ <entry>2010-07-13</entry> <.>
+ <modified>2010-09-17</modified> <.>
+ </dates>
+</vuln>
+....
+
+Имена тегов должны быть самодокументируемыми, чтобы мы сфокусировались только на полях, нужных нам для заполнения:
+
+<.> Это тег верхнего уровня записи VuXML. У него есть обязательный атрибут `vid`, указывающий на универсальный уникальный идентификатор (UUID) для этой записи (в кавычках). Вы должны формировать UUID для каждой новой записи VuXML (и не забудьте заменить ее для шаблона UUID, если вы не пишете запись с нуля). Для получения VuXML UUID вы можете использовать man:uuidgen[1].
+
+<.> Однострочное описание найденной проблемы.
+
+<.> Здесь перечислены имена затронутых пакетов. Может быть дано несколько имен, поскольку некоторые пакеты могут быть основаны на одном главном порте или программном продукте. Сюда можно включить стабильную ветвь и ветвь разработки, локализованные версии и подчиненные порты, зависящие от различного выбора важных вариантов конфигурации, указанных на этапе построения.
+
+<.> Здесь указаны затронутые версии пакета(-ов) как один или более диапазонов с использованием комбинации элементов `<lt>`, `<le>`, `<eq>`, `<ge>`, и `<gt>`. Диапазоны внесённых версий не должны пересекаться.В спецификации диапазонов `\*` (звёздочка) означает наименьший номер версии. В частности, `2.*` меньше, чем `2.a`. Поэтому звездочка может быть использована в диапазоне для совпадения со всеми возможными `alpha`, `beta` и `RC` версиями. Как вариант, `<ge>2.*</ge><lt>3.*</lt>` выборочно совпадет с версией `2.x`, а `<ge>2.0</ge><lt>3.0</lt>` - нет, поскольку последнее не включает `2.r3` и совпадает с `3.b`.Пример выше указывает, что к затронутым относятся версии с `1.6` до `1.9` включительно, версии `2.x` до `2.4_1` и версия `3.0b1`.
+
+<.> Некоторые связанные группы пакетов (в конечном счете, порты) могут быть указаны в разделе `<affected>`. Это можно использовать, если некоторые программные продукты (скажем, FooBar, FreeBar and OpenBar) являются производными от общей кодовой базы и всё еще совместно используют её ошибки и уязвимости. Имейте в виду отличие от перечисления множественных имён в одном разделе <package>.
+
+<.> Диапазоны версий должны учитывать `PORTEPOCH` и `PORTREVISION`, если это применимо. Пожалуйста, помните, что в соответствии с правилами сравнения строк версия с ненулевым значением `PORTEPOCH` выше, чем любая версия без `PORTEPOCH`, например, `3.0,1` выше, чем `3.1` или даже `8.9`.
+
+<.> Сводная информация о проблеме. В этом поле используется XHTML. По крайней мере, должны быть обрамляющие `<p>` и `</p>`. Может быть использована более сложная разметка, но только в целях аккуратности и ясности: без эстетства, пожалуйста.
+
+<.> Этот раздел содержит ссылки на имеющие отношение документы. Приветствуется как можно большее количество ссылок.
+
+<.> Это http://www.freebsd.org/security/#adv[бюллетень безопасности FreeBSD].
+
+<.> Это http://www.freebsd.org/support/#gnats[сообщение об ошибке FreeBSD].
+
+<.> Идентификатор http://www.cve.mitre.org/[MITRE CVE].
+
+<.> Это http://www.securityfocus.com/bid[SecurityFocus Bug ID].
+
+<.> Бюллетень безопасности http://www.cert.org/[US-CERT].
+
+<.> Примечание к уязвимости http://www.cert.org/[US-CERT].
+
+<.> Уведомление системы Cyber Security Alert http://www.cert.org/[US-CERT].
+
+<.> Уведомление системы Technical Cyber Security Alert http://www.cert.org/[US-CERT].
+
+<.> URL к архивному сообщению в списке рассылки. Атрибут `msgid` является необязательным и может указывать на message ID сообщения.
+
+<.> Основной URL. Должен быть использован в случае, если не подходит ни одна из категорий источника.
+
+<.> Дата последнего изменения любой информации данной записи (_YYYY-MM-DD_). Новые записи не должны включать это поле. Поле должно быть добавлено после редактирования существующей записи.
+
+[[security-notify-vuxml-testing]]
+=== Тестирование ваших изменений в базе данных VuXML
+
+Предположим, что вы только что написали или заполнили запись об уязвимости в пакете `clamav`, которая была исправлена в версии `0.65_7`.
+
+Прежде всего, вам нужно _установить_ последние версии портов package:ports-mgmt/portaudit[], package:ports-mgmt/portaudit-db[] и package:security/vuxml[].
+
+[NOTE]
+====
+Для запуска `packaudit` вы должны обладать правами на запись в [.filename]#DATABASEDIR#; как правило, это [.filename]#/var/db/portaudit#.
+
+Для использования другого каталога присвойте переменной окружения [.filename]#DATABASEDIR# другой путь.
+
+Если вы работаете в каталоге, отличном от [.filename]#${PORTSDIR}/security/vuxml#, присвойте переменной окружения [.filename]#VUXMLDIR# путь к каталогу, в котором находится [.filename]#vuln.xml#.
+====
+
+Во-первых, проверьте, нет ли уже записи об этой уязвимости. Если такая запись есть, она совпадёт с предыдущей версией пакета `0.65_6`:
+
+[source,bash]
+....
+% packaudit
+% portaudit clamav-0.65_6
+....
+
+Если ничего не найдено, значит вы получили зеленый свет для добавления новой записи для этой уязвимости.
+
+[source,bash]
+....
+% cd ${PORTSDIR}/security/vuxml
+% make newentry
+....
+
+Когда вы закончите, проверьте синтаксис и форматирование.
+
+[source,bash]
+....
+% make validate
+....
+
+[NOTE]
+====
+Вам понадобится установить по крайней мере один из следующих пакетов: package:textproc/libxml2[], package:textproc/jade[].
+====
+
+Теперь выполните перепостроение базы данных `portaudit` из файла VuXML:
+
+[source,bash]
+....
+% packaudit
+....
+
+Чтобы убедиться, что раздел `<affected>` в вашей записи совпадает с правильными пакетами, выполните следующую команду:
+
+[source,bash]
+....
+% portaudit -f /usr/ports/INDEX -r uuid
+....
+
+[NOTE]
+====
+Для лучшего понимания синтаксиса этой команды обращайтесь к man:portaudit[1].
+====
+
+Убедитесь, что ваша запись не производит ложных совпадений в выводе.
+
+Теперь проверьте, совпадает ли ваша запись с нужными версиями пакета:
+
+[source,bash]
+....
+% portaudit clamav-0.65_6 clamav-0.65_7
+Affected package: clamav-0.65_6 (matched by clamav<0.65_7)
+Type of problem: clamav remote denial-of-service.
+Reference: <http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-0020ed76ef5a.html>
+
+1 problem(s) found.
+....
+
+Первая версия должна совпасть, а последняя нет.
+
+В заключение проверьте, что веб-страница, сформированная из базы данных VuXML, выглядит как положено:
+
+[source,bash]
+....
+% mkdir -p ~/public_html/portaudit
+% packaudit
+% lynx ~/public_html/portaudit/74a9541d-5d6c-11d8-80e3-0020ed76ef5a.html
+....
diff --git a/documentation/content/ru/books/porters-handbook/slow-porting/chapter.adoc b/documentation/content/ru/books/porters-handbook/slow-porting/chapter.adoc
new file mode 100644
index 0000000000..05cf00fba6
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/slow-porting/chapter.adoc
@@ -0,0 +1,187 @@
+---
+title: Глава 4. Медленное портирование
+prev: books/porters-handbook/quick-porting
+next: books/porters-handbook/makefiles
+---
+
+[[slow-porting]]
+= Медленное портирование
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 4
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+Итак, все оказалось не так уж и просто, и порт потребовал некоторых модификаций для того, чтобы заставить его работать. В этом разделе мы расскажем, шаг за шагом, как его модифицировать, чтобы он работал с нашей системой портов.
+
+[[slow-work]]
+== Как всё это работает
+
+Во-первых, когда пользователь дает в своем каталоге с портом команду `make`, происходит целая череда событий. Во время чтения этого текста может оказаться полезным иметь файл [.filename]#bsd.port.mk# открытым в другом окне, что сильно поможет в их понимании.
+
+Но не волнуйтесь сильно, если вы не до конца понимаете, что делается в [.filename]#bsd.port.mk#, не так уж много людей его понимает... _:->_
+
+[.procedure]
+====
+. Запускается цель `fetch`. Цель `fetch` отвечает за то, что архив исходных текстов имеется в наличии локально в каталоге `DISTDIR`. Если цель `fetch` не может найти требуемые файлы в каталоге `DISTDIR`, то они будут искаться по указателю URL `MASTER_SITES`, который устанавливается в Makefile, а также на наших FTP зеркалах, куда мы по возможности помещаем дистрибутивные файлы для архива. Затем она попытается сгрузить указанный файл с помощью `FETCH`, полагая, что запрашивающая машина имеет прямое подключение к Интернет. Если файл скачается удачно, то он будет помещен в каталог `DISTDIR` для последующего использования и обработки.
+. Выполняется цель `extract`. Она ищет дистрибутивный файл порта (как правило, tar-архив `gzip`) в каталоге `DISTDIR` и распаковывает его во временный каталог, задаваемый переменной `WRKDIR` (по умолчанию [.filename]#work#).
+. Выполняется цель `patch`. Во-первых, применяются все патчи, заданные переменной `PATCHFILES`. Во-вторых, если какие-либо файлы с патчами, носящие имена [.filename]#patch-*#, имеются в подкаталоге `PATCHDIR` (по умолчанию это каталог [.filename]#files#), то они применяются в этот момент в алфавитном порядке.
+. Запускается цель `configure`. Здесь может выполняться любая из многих различных вещей.
+.. Если существует скрипт [.filename]#scripts/configure#, то он запускается.
+.. Если задана переменная `HAS_CONFIGURE` или `GNU_CONFIGURE`, то запускается скрипт [.filename]#WRKSRC/configure#.
+
+. Выполняется цель `build`. Она отвечает за переход в собственный рабочий каталог порта (`WRKSRC`) и его построение.
+. Выполняется цель `stage`. Конечный набор построенных файлов помещается во временный каталог (`STAGEDIR`, смотрите <<staging>>). Иерархия этого каталога отражает иерархию каталогов системы, в которую данный пакет будет устанавливаться.
+. Выполняется цель `install`. В систему копируются файлы, перечисленные в pkg-plist порта.
+====
+
+Выше перечислены стандартные действия. Кроме того, вы сами можете определить цели `pre-_что-то_` или `post-_что-то_`, или создать скрипты с такими именами в подкаталоге [.filename]#scripts#, и они будут запущены до или после выполнения действий по умолчанию.
+
+Например, если у вас есть цель `post-extract`, определённая в вашем файле [.filename]#Makefile# и файл [.filename]#pre-build# в подкаталоге [.filename]#scripts#, то после выполнения обычных действий по распаковке, будет вызвана цель `post-extract` а скрипт [.filename]#pre-build# будет выполнен перед запуском стандартных правил построения. Рекомендуется использовать цели из [.filename]#Makefile#, если действия достаточно просты, потому что в дальнейшем будет проще определить, какие нестандартные действия требует порт.
+
+Действия по умолчанию выполняются целями `do-_что-то_` из [.filename]#bsd.port.mk#. Например, команды для распаковки порта находятся в цели `do-extract`. Если вам не хватает цели по умолчанию, вы можете ее исправить, переопределив цель `do-_something_` в вашем файле [.filename]#Makefile#.
+
+[NOTE]
+====
+"Основные" цели (к примеру, `extract`, `configure` и так далее) не делают ничего больше, чем проверяют успешность завершения всех предыдущих шагов и вызывают настоящие цели или скрипты, и их не нужно менять. Если вам нужно изменить распаковку, исправляйте `do-extract`, но никогда не меняйте способ работы `extract`! Кроме того, цель `post-deinstall` является недействительной и не выполняется инфраструктурой портов.
+====
+
+Теперь, когда вы представляете, что происходит, когда пользователь набирает команду `make install`, давайте пройдемся через шаги, рекомендуемые для создания настоящего порта.
+
+[[slow-sources]]
+== Получение исходного кода
+
+Получите оригинальные исходные тексты (обычно) в виде упакованного tar-архива ([.filename]#foo.tar.gz# или [.filename]#foo.tar.bz2#) и скопируйте его в каталог `DISTDIR`. Всегда используйте исходные тексты _основной ветки разработки_ везде, где это возможно.
+
+Вам потребуется задать значение переменной `MASTER_SITES` так, чтобы оно указывало на местоположение оригинального tar-архива. В файле [.filename]#bsd.sites.mk# вы найдёте краткие обозначения для большинства популярных сайтов. Пожалуйста, используйте эти сайты-и соответствующие определения-везде, где это возможно, чтобы избежать проблем повторения одной и той же информации в базе источников. Так как эти сайты со временем меняются, для всех причастных поддержка становится настоящим кошмаром.
+
+Если вы не можете найти FTP/HTTP сайт с хорошим подключением к сети, или находите только сайты, которые имеют раздражающе нестандартные форматы, то можете захотеть поместить копию на надежный сервер FTP или HTTP, который вам доступен (например, ваша домашняя страница).
+
+Если вы не можете найти доступного и надёжного места для помещения дистрибутивного файла, то мы сами сможем разместить его на сервере `ftp.FreeBSD.org`; однако это наименее рекомендуемое решение. Дистрибутивный файл должен быть помещён в каталог [.filename]#~/public_distfiles/# одного из пользователей машины `freefall`. Попросите того, кто коммиттил ваш порт, сделать это. Этот человек также задаст переменной `MASTER_SITES` значение `MASTER_SITE_LOCAL`, а в переменной `MASTER_SITE_SUBDIR` укажет своё имя пользователя с машины `freefall`.
+
+Если дистрибутивные файлы вашего порта постоянно меняются по неизвестным причинам без изменения версий со стороны автора, остаётся только поместить дистрибутив на вашу домашнюю Web-страницу и указать её первой в списке `MASTER_SITES`. Если можете, попытайтесь договориться с автором порта об этом; это действительно помогает в достижении некоторого управления исходным кодом. Размещение собственной версии поможет избежать появления ошибок у пользователей типа `checksum mismatch`, а также уменьшит нагрузку на людей, сопровождающих наш FTP-сервер. Также, если у порта имеется только один основной сервер, то рекомендуется поместить архивную копию на свой сайт и указать его в списке `MASTER_SITES` вторым.
+
+Если вашему порту требуются дополнительные `патчи`, доступные в Интернет, скачайте также и их, поместив в каталог `DISTDIR`. Не волнуйтесь, если они находятся не на том же сайте, откуда взят дистрибутивный архив, мы умеем обрабатывать такие ситуации (смотрите описание <<porting-patchfiles,PATCHFILES>> ниже).
+
+[[slow-modifying]]
+== Модификация порта
+
+Распакуйте копию дистрибутивного файла в отдельный каталог и внесите изменения, которые необходимы для того, чтобы порт компилировался нормально в текущей версии FreeBSD. _Тщательно отслеживайте_ все, что вы делаете, этот процесс вам предстоит автоматизировать. Все, включая удаление, добавление или модификацию в файлах должны будут выполняться автоматически с помощью скриптов или файлов патчей, когда вы завершите работу над портом.
+
+Если вашему порту во время компиляции, установки и настройки требуется довольно много взаимодействовать с пользователем, то посмотрите на один из классических скриптов Configure Лэрри Уолла (Larry Wall) и сделайте сами что-либо подобное. Предназначение новой коллекции портов - это сделать каждое приложение в стиле "plug-and-play" настолько, насколько это вообще возможно для конечного пользователя при минимальном использовании дискового пространства.
+
+[NOTE]
+====
+Если явно не указано обратное, то патчи, скрипты и другие файлы, которые вы создали и предоставили для Коллекции Портов FreeBSD, неявно подпадают под стандартные условия лицензии BSD.
+====
+
+[[slow-patch]]
+== Создание патчей
+
+Файлы, которые добавлялись или изменялись в процессе создания порта, могут быть выявлены программой man:diff[1], а результат работы этой программы может быть в дальнейшем передан программе man:patch[1]. Такое действие с обычным файлом подразумевает сохранение копии файла с первоначальным содержимым перед внесением каких-либо изменений.
+
+[source,bash]
+....
+% cp file file.orig
+....
+
+Патчи сохраняются в виде файлов с именем [.filename]#patch-*#, где _*_ обозначает путь к файлу, к которому применяется патч, такой как [.filename]#patch-Imakefile# или [.filename]#patch-src-config.h#.
+
+После того как файл был изменён, используется man:diff[1] для получения разницы между первоначальной и изменённой версиями. Параметр `-u` указывает man:diff[1] выводить разницу в "унифицированном" формате, который также является предпочтительным.
+
+[source,bash]
+....
+% diff -u file.orig file > patch-pathname-file
+....
+
+Для порождении патчей для новых добавляемых файлов используется параметр `-N`, который заставляет man:diff[1] трактовать несуществующие прежде файлы как если бы они существовали, но имели пустое содержимое:
+
+[source,bash]
+....
+% diff -u -N newfile.orig newfile > patch-pathname-newfile
+....
+
+Файлы с патчами помещаются в каталоге `PATCHDIR` (как правило, это [.filename]#files/#), откуда они будут взяты автоматически. Все патчи обязаны быть сделаны относительно каталога `WRKSRC` (как правило, это каталог, в который распаковывается исходный архив и где будет выполняться построение). Для упрощения внесения изменений и обновлений избегайте наличия более чем одного патча для одного и того же файла (например, патчей [.filename]#patch-file# и [.filename]#patch-file2#, оба меняющих файл [.filename]#WRKSRC/foobar.c#). Обратите внимание, что если путь к изменяемому файлу содержит символ подчеркивания (`_`), то патч должен содержать в своем имени два подчеркивания вместо одного. Например, для применения патча на файл с именем [.filename]#src/freeglut_joystick.c# соответствующий патч следует назвать [.filename]#patch-src-freeglut__joystick.c#.
+
+Пожалуйста, используйте для именования патчей только символы `[-+._a-zA-Z0-9]`. Не используйте любые другие символы, кроме этих. Не называйте патчи как [.filename]#patch-aa# или [.filename]#patch-ab#, всегда ссылайтесь на путь и название файла в названиях самих патчей.
+
+Существует альтернативный упрощённый способ создания патчей для существующих файлов. Первые шаги те же самые: создание копии неизменённого файла с расширением [.filename]#.orig# и внесение изменений. После этого используйте `make makepatch`, чтобы обновить файлы с патчами в каталоге [.filename]#files# данного порта.
+
+Не помещайте строки RCS в патчи. Subversion будет изменять их при помещении файлов в дерево портов, и когда мы будем их оттуда извлекать, они будут уже другие, поэтому применение патчей окончится неудачей. Строчки RCS предваряются знаком доллара (`$`), и обычно начинаются с `$Id` или `$RCS`.
+
+Использование параметра рекурсии (`-r`) с командой man:diff[1] для генерации патчей - это хорошо, но всё же, пожалуйста, смотрите на получающиеся патчи, чтобы убедиться в отсутствии ненужного мусора. В частности, diff-разниц между двумя резервными копиями файлов, файлы [.filename]#Makefile#, когда как порт использует `Imake` или GNU-версию программы `configure`, и так далее, не нужны, и должны быть удалены. Если было необходимо отредактировать файл [.filename]#configure.in# и запустить `autoconf` для перегенерации `configure`, не нужно включать файлы diff для `configure` (они частенько вырастают до нескольких тысяч строк!). Вместо этого задайте `USE_AUTOTOOLS=autoconf:261` и включите diff-файл для [.filename]#configure.in#.
+
+Старайтесь минимизировать в патчах объём нефункциональных изменений с пустыми символами. В мире Открытого Исходного Кода является распространенным совместное использование проектами больших объемов кодовой базы, но с различными стилями и правилами отступов. При копировании работающей функциональной части из одного проекта для исправления похожей области в другом, будьте аккуратны, пожалуйста: получаемый однострочный патч может указаться полон нефункциональных изменений. Это не только увеличивает размер репозитория Subversion, но также усложняет поиск того, что конкретно вызвало проблему и что вообще поменялось.
+
+Если нужно удалить файл, сделайте это при выполнении цели `post-extract`, вместо того чтобы оформлять это как часть патча.
+
+Простые перемещения могут быть выполнены непосредственно из [.filename]#Makefile# порта с использованием man:sed[1] в режиме in-place. Это удобно, когда при изменении используется значение переменной:
+
+[.programlisting]
+....
+post-patch:
+ @${REINPLACE_CMD} -e 's|for Linux|for FreeBSD|g' ${WRKSRC}/README
+....
+
+Довольно часто в исходных файлах портируемого программного обеспечения используется конвенция CR/LF. Это может стать причиной проблем с дальнейшей упаковкой, предупреждениями компилятора или выполнением скриптов (таких как `/bin/sh^M not found`). Для быстрого преобразования всех файлов из CR/LF просто в LF добавьте в [.filename]#Makefile# порта эту запись:
+
+[.programlisting]
+....
+USES= dos2unix
+....
+
+Может быть задан точный список преобразуемых файлов:
+
+[.programlisting]
+....
+USES= dos2unix
+DOS2UNIX_FILES= util.c util.h
+....
+
+Используйте `DOS2UNIX_REGEX`, чтобы преобразовать группу файлов в разных подкаталогах. Его параметром является регулярное выражение, совместимое с man:find[1]. Подробнее о формате в man:re_format[7]. Такой вариант удобен для преобразования всех файлов заданного расширения. Для примера, преобразуем все исходные файлы, не затрагивая двоичные файлы:
+
+[.programlisting]
+....
+USES= dos2unix
+DOS2UNIX_REGEX= .*\.([ch]|cpp)
+....
+
+Другим вариантом является использование `DOS2UNIX_GLOB`, который вызывает `find` для каждого из перечисленных в нём элементов.
+
+[.programlisting]
+....
+USES= dos2unix
+DOS2UNIX_GLOB= *.c *.cpp *.h
+....
+
+[[slow-configure]]
+== Конфигурирование
+
+Поместите все дополнительные команды, требуемые для настройки, в ваш скрипт [.filename]#configure# и сохраните его в подкаталоге [.filename]#scripts#. Как отмечено выше, вы можете сделать это целями в файле [.filename]#Makefile# и/или скриптами с именами [.filename]#pre-configure# или [.filename]#post-configure#.
+
+[[slow-user-input]]
+== Обработка пользовательского ввода
+
+Если для построения, конфигурации или установки вашего порта требуется некоторый ввод со стороны пользователя, то вы должны задать переменную `IS_INTERACTIVE` в вашем файле [.filename]#Makefile#. В случае "ночного построения" это позволит пропустить ваш порт, если пользователь в своем окружении задал переменную `BATCH` (и если пользователь установил переменную `INTERACTIVE`, то будут строиться _только_ порты, которые требуют взаимодействия с пользователем. Это сэкономит значительное количество времени на части машин, которые постоянно строят порты (смотрите ниже).
+
+При наличии разумных ответов на задаваемые вопросы, подходящих по умолчанию, также рекомендуется проверять переменную `PACKAGE_BUILDING` и выключать интерактивный скрипт, если он есть. Это позволит нам строить пакеты для помещения на компакт-диски и FTP-серверы.
diff --git a/documentation/content/ru/books/porters-handbook/special/chapter.adoc b/documentation/content/ru/books/porters-handbook/special/chapter.adoc
new file mode 100644
index 0000000000..b81e054c41
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/special/chapter.adoc
@@ -0,0 +1,2521 @@
+---
+title: Глава 6. Особые соглашения
+prev: books/porters-handbook/makefiles
+next: books/porters-handbook/plist
+---
+
+[[special]]
+= Особые соглашения
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 6
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+Имеется ещё несколько вещей, которые вы должны иметь в виду при создании порта. Этот раздел описывает наиболее часто встречающиеся из них.
+
+[[staging]]
+== Staging
+
+[.filename]#bsd.port.mk# ожидает от портов работу с "каталогом сборки". Это означает, что порт должен устанавливать файлы не напрямую в назначенные каталоги (то есть, например, под `PREFIX`), а в отдельный каталог, из которого затем собирается пакет. Во многих случаях привилегии root для этого не требуются, что делает возможным сборку пакетов из-под непривилегированного пользователя. В режиме staging порт собирается и устанавливается в каталог сборки `STAGEDIR`. Пакет создается из каталога сборки и затем устанавливается в систему. В инструментарии automake такая концепция именуется `DESTDIR`; в прочем, в FreeBSD `DESTDIR` имеет собственное значение (смотрите <<porting-prefix>>).
+
+Если для порта всё ещё требуются системные привилегии при выполнении цели `package`, то в [.filename]#Makefile# должна быть добавлена следующая строка:
+
+[.programlisting]
+....
+NEED_ROOT= yes
+....
+
+Метапорты, то есть порты, которые не устанавливают файлы непосредственно, а только зависят от других портов, должны по возможности избегать распаковки man:mtree[8] в каталог сборки. Это основная иерархия каталогов пакета, и эти пустые каталоги будут выглядеть лишними. Для предотвращения распаковки man:mtree[8] добавьте эту строку:
+
+[.programlisting]
+....
+NO_MTREE= yes
+....
+
+Staging задействуется посредством добавления переменной `STAGEDIR` слева от путей, которые используются в целях `pre-install`, `do-install` и `post-install` (смотрите примеры в книге). Обычно сюда относятся `PREFIX`, `ETCDIR`, `DATADIR`, `EXAMPLESDIR`, `MANPREFIX`, `DOCSDIR` и так далее. Каталоги должны создаваться при выполнении цели `post-install`. Избегайте использования абсолютных путей, когда это возможно.
+
+При создании символический ссылки `STAGEDIR` должен ставиться только для пути назначения. Например:
+
+[.programlisting]
+....
+${LN} -sf libfoo.so.42 ${STAGEDIR}${PREFIX}/lib/libfoo.so
+....
+
+Первоначальный путь [.filename]#${PREFIX}/lib/libfoo.so.42# выглядит нормально, но по факту может быть неправильным. Абсолютные пути могут указывать на неподходящее место, например, когда удалённая файловая система смонтирована по NFS как непривилегированная точка монтирования. Относительные пути реже подвержены проблемам и часто намного короче.
+
+Порты, устанавливающие модули ядра, должны предварять путь установки (по умолчанию [.filename]#/boot/modules#) переменной `STAGEDIR`.
+
+[[porting-shlibs]]
+== Динамические библиотеки
+
+Если ваш порт устанавливает одну или несколько динамических библиотек, определите переменную `USE_LDCONFIG`, которая приведёт к запуску из [.filename]#bsd.port.mk# команды `${LDCONFIG} -m` относительно каталога, в который устанавливается новая библиотека (как правило, это [.filename]#PREFIX/lib#), во время выполнения цели `post-install` для её регистрации в кэше динамических библиотек. Эта переменная, если она определена, также приведёт к добавлению соответствующей пары команд `@exec /sbin/ldconfig -m` и `@unexec /sbin/ldconfig -R` в ваш файл [.filename]#pkg-plist#, так что пользователь, устанавливающий пакет, сможет сразу же использовать динамическую библиотеку, а удаление пакета не приведёт к тому, что система будет предполагать, что библиотека всё ещё имеется в наличии.
+
+[.programlisting]
+....
+USE_LDCONFIG= yes
+....
+
+Если нужно, вы можете переопределить каталог по умолчанию, задав значение `USE_LDCONFIG`, в котором должны быть перечислены каталоги, в которые устанавливаются динамические библиотеки. Например, если ваш порт устанавливает динамические библиотеки в каталоги [.filename]#PREFIX/lib/foo# и [.filename]#PREFIX/lib/bar#, то вы можете в файле [.filename]#Makefile# указать следующее:
+
+[.programlisting]
+....
+USE_LDCONFIG= ${PREFIX}/lib/foo ${PREFIX}/lib/bar
+....
+
+Будьте добры перепроверить, т.к. часто это вовсе не является необходимым и может быть решено иначе с помощью `-rpath` или установки `LD_RUN_PATH` во время компоновки (для примера смотрите package:lang/moscow_ml[]), или с помощью сценария-обёртки, который выставляет `LD_LIBRARY_PATH` перед запуском исполняемого файла как это делает package:www/seamonkey[].
+
+При установке 32-разрядных библиотек на 64-разрядной системе используйте вместо этого `USE_LDCONFIG32`.
+
+Постарайтесь сохранять номера версий динамических библиотек в формате [.filename]#libfoo.so.0#. Наш компоновщик позаботится только о старшем (первом) номере.
+
+Если при обновлении порта увеличивается старший номер версии библиотеки, то для всех портов, компонуемых с затронутой библиотекой, следует увеличить значение `PORTREVISION` для форсирования перекомпиляции с новой версией библиотеки.
+
+[[porting-restrictions]]
+== Порты с ограничениями на распространение или с правовым обременением
+
+Лицензии бывают разных видов, и некоторые накладывают ограничение на то, как приложение может быть оформлено в виде пакета, может ли оно продаваться для извлечения коммерческой выгоды, и так далее.
+
+[IMPORTANT]
+====
+На вас, как на человека, портирующего приложение, ложится обязанность прочесть лицензионные соглашения на программное обеспечение и удостовериться, что проект FreeBSD не будет являться их нарушителем, если будет заниматься распространением исходного кода или в бинарном виде по FTP/HTTP или на CD-ROM. Если у вас возникли сомнения, то, пожалуйста, обратитесь в {freebsd-ports}.
+====
+
+В подобных ситуациях можно использовать переменные, описываемые в последующих разделах.
+
+=== `NO_PACKAGE`
+
+Эта переменная указывает, что мы не можем создавать для приложения двоичный пакет. К примеру, лицензия не позволяет бинарное распространение или она может запрещать распространение пакетов, созданных из изменённых исходников.
+
+Однако файлы `DISTFILES` могут свободно зеркалироваться по FTP/HTTP. Они также могут распространяться, используя CD-ROM (или на похожих носителях), если не установлена переменная `NO_CDROM`.
+
+`NO_PACKAGE` должна также использоваться, если двоичный пакет, как правило, бесполезен, а приложение должно всегда компилироваться из исходного кода. К примеру, если в приложение во время компиляции жёстко включается конфигурационная информация, привязанная к конкретной системе, то задайте переменную `NO_PACKAGE`.
+
+Значением переменной `NO_PACKAGE` должна быть строка, описывающая причину, по которой пакет не должен создаваться.
+
+=== `NO_CDROM`
+
+Эта переменная указывает на то, что, хотя мы имеем право создавать бинарные пакеты, мы не можем помещать эти пакеты или файлы `DISTFILES` порта на CD-ROM (или на похожие носители) для перепродажи. Однако бинарные пакеты и файлы `DISTFILES` порта будут оставаться доступными посредством FTP/HTTP.
+
+Если эта переменная устанавливается вместе с `NO_PACKAGE`, то только файлы порта `DISTFILES` будут доступны, и только посредством FTP/HTTP.
+
+В качестве значения `NO_CDROM` должна указываться строка, описывающая причины, по которым порт не может распространяться на CD-ROM. К примеру, это применяется, если лицензионное соглашение приложения предполагает только его "некоммерческое" использование.
+
+=== `NOFETCHFILES`
+
+Файлы, определенные в переменной `NOFETCHFILES`, не будут извлекаться ни из одного из `MASTER_SITES`. Примером такого файла является файл, поставляемый на CD-ROM.
+
+Инструменты, проверяющие доступность этих файлов на `MASTER_SITES`, должны игнорировать эти файлы и не сообщать о них.
+
+=== `RESTRICTED`
+
+Задайте эту переменную, если лицензия на приложение не позволяет ни зеркалировать файлы `DISTFILES`, ни распространять бинарный пакет через FTP/HTTP или на CD-ROM.
+
+Ни `NO_CDROM`, ни `NO_PACKAGE` не стоит устанавливать вместе с `RESTRICTED`, так как последняя переменная подразумевает первые две.
+
+В качестве значения `RESTRICTED` должна указываться строка, описывающая причины, по которым порт нельзя распространять. Обычно это означает, что порт использует закрытое программное обеспечение, а пользователь должен вручную сгрузить файлы `DISTFILES`, возможно, после заполнения регистрационной формы или подтверждения соглашения с условиями EULA.
+
+=== `RESTRICTED_FILES`
+
+Если заданы `RESTRICTED` или `NO_CDROM`, то значение этой переменной по умолчанию соответствует `${DISTFILES} ${PATCHFILES}`, в противном случае она пуста. Если ограничены в распространении лишь некоторые из дистрибутивных файлов, то в этой переменной задаётся их список.
+
+=== `LEGAL_TEXT`
+
+Если порт имеет правовое обременение, которое не покрывается перечисленными выше переменными, то переменной `LEGAL_TEXT` следует присвоить строку с описанием данного обременения. Например, если было получено особое разрешение для FreeBSD на распространение двоичного файла, то эта переменная должна содержать соответствующее указание.
+
+=== [.filename]#/usr/ports/LEGAL# и `LEGAL`
+
+Порт, содержащий любую из перечисленных выше переменных, также должен быть добавлен в [.filename]#/usr/ports/LEGAL#. Первый столбец содержит шаблон совпадения с дистрибутивными файлами, имеющими ограничения на распространение. Второй столбец содержит корень порта. Третий столбец содержит вывод `make -VLEGAL`.
+
+=== Примеры использования
+
+Предпочтительным способом реализации утверждения "архивы исходных текстов для этого порта должны загружаться самостоятельно" является следующее:
+
+[.programlisting]
+....
+.if !exists(${DISTDIR}/${DISTNAME}${EXTRACT_SUFX})
+IGNORE= may not be redistributed because of licensing reasons. Please visit some-website to accept their license and download ${DISTFILES} into ${DISTDIR}
+.endif
+....
+
+Это одновременно и информирует пользователя, и устанавливает нужные метаданные на пользовательской машине для использования автоматическими программами.
+
+Обратите внимание, что данная кляуза должна предшествовать подключению файла [.filename]#bsd.port.pre.mk#.
+
+[[building]]
+== Механизмы построения
+
+[[parallel-builds]]
+=== Параллельное построение портов
+
+Инфраструктура портов FreeBSD поддерживает параллельное построение с использованием множественных подпроцессов `make`, что позволяет системам SMP задействовать всю доступную мощность CPU, тем самым делая построение портов более быстрым и эффективным.
+
+Это достигается путём передачи флага `-jX` команде man:make[1]. Такое построение портов является поведением по умолчанию. К сожалению, не все порты поддерживают параллельную сборку достаточно хорошо, и поэтому может потребоваться выключить этот механизм явным образом путём добавления переменной `MAKE_JOBS_UNSAFE=yes`. Эта переменная используется в случае, когда известно, что порт ломается с `-jX`.
+
+[[using-make]]
+=== `make`, `gmake` и `imake`
+
+Если ваш порт использует GNU make, то установите `USES= gmake`.
+
+.Переменные для портов, использующих gmake
+[cols="1,1", frame="none", options="header"]
+|===
+| Переменная
+| Значение
+
+|`USES= gmake`
+|Для сборки порта требуется `gmake`.
+
+|`GMAKE`
+|Полный путь к команде `gmake`, если отсутствует в `PATH`.
+|===
+
+Если ваш порт является приложением X, которое создает файлы [.filename]#Makefile# из [.filename]#Imakefile#, используя imake, то установите `USES= imake`. Это заставит стадию конфигурирования автоматически выполнить `xmkmf -a`. Если флаг `-a` представляет для вашего порта проблему, то установите `XMKMF=xmkmf`. Если порт использует imake, но не понимает цель `install.man`, то следует установить `NO_INSTALL_MANPAGES=yes`.
+
+Если исходный [.filename]#Makefile# вашего порта имеет что-нибудь помимо `all` в качестве основной цели построения, то задайте соответствующее значение `ALL_TARGET`. То же касается `install` и `INSTALL_TARGET`.
+
+[[using-configure]]
+=== Сценарий `configure`
+
+Если ваш порт использует сценарий `configure` для получения файлов [.filename]#Makefile# из файлов [.filename]#Makefile.in#, то установите `GNU_CONFIGURE=yes`. Если вы хотите дать дополнительные параметры сценарию `configure` (аргументом по умолчанию является `--prefix=${PREFIX} --infodir=${PREFIX}/${INFO_PATH} --mandir=${MANPREFIX}/man --build=${CONFIGURE_TARGET}`), установите эти параметры в `CONFIGURE_ARGS`. Дополнительные переменные окружения можно передать, используя переменную `CONFIGURE_ENV`.
+
+.Переменные для портов, использующих `configure`
+[cols="1,1", frame="none", options="header"]
+|===
+| Переменная
+| Значение
+
+|`GNU_CONFIGURE`
+|Порт использует сценарий `configure` для подготовки построения.
+
+|`HAS_CONFIGURE`
+|То же, что и `GNU_CONFIGURE`, кроме того, что цель configure по умолчанию не добавляется в `CONFIGURE_ARGS`.
+
+|`CONFIGURE_ARGS`
+|Дополнительные параметры, передаваемые сценарию `configure`.
+
+|`CONFIGURE_ENV`
+|Дополнительные переменные окружения, задаваемые для запуска сценария `configure`.
+
+|`CONFIGURE_TARGET`
+|Переопределить цель configure по умолчанию. Значением по умолчанию является `${MACHINE_ARCH}-portbld-freebsd${OSREL}`.
+|===
+
+[[using-cmake]]
+=== Использование `cmake`
+
+Если порт использует CMake, определите `USES= cmake` или `USES= cmake:outsource` для построения во внешнем каталоге (см. ниже).
+
+.Переменные для портов, использующих `cmake`
+[cols="1,1", frame="none", options="header"]
+|===
+| Переменная
+| Значение
+
+|`CMAKE_ARGS`
+|Специфичные для порта флаги CMake, передаваемые `cmake`.
+
+|`CMAKE_BUILD_TYPE`
+|Тип построения (предопределённые профили построения CMake). По умолчанию `Release`, `Debug` при использовании `WITH_DEBUG`.
+
+|`CMAKE_ENV`
+|Переменные окружения для передачи `cmake`. По умолчанию `${CONFIGURE_ENV}`.
+
+|`CMAKE_SOURCE_PATH`
+|Путь к каталогу с исходным кодом. По умолчанию `${WRKSRC}`.
+|===
+
+.Переменные построения `cmake`, устанавливаемые пользователем
+[cols="1,1", frame="none", options="header"]
+|===
+| Переменная
+| Значение
+
+|`CMAKE_VERBOSE`
+|Разрешает подробный вывод сообщений при построении. Значение по умолчанию не задано, если не заданы `BATCH` или `PACKAGE_BUILDING`.
+
+|`CMAKE_NOCOLOR`
+|Запрещает цветной вывод сообщений при построении. Значение по умолчанию не задано, если не заданы `BATCH` или `PACKAGE_BUILDING`.
+|===
+
+CMake поддерживает следующие профили построения: `Debug`, `Release`, `RelWithDebInfo` и `MinSizeRel`. Профили `Debug` и `Release` учитывают системные флаги `\*FLAGS`; `RelWithDebInfo` и `MinSizeRel` соответственно определяют `CFLAGS` со значением `-O2 -g` и `-Os -DNDEBUG`. Значение `CMAKE_BUILD_TYPE` экспортируется в нижнем регистре в `PLIST_SUB` и должно использоваться, если порт устанавливает файлы `*.cmake` в зависимости от типа построения (для примера посмотрите на package:deskutils/strigi[]). Следует учитывать, что некоторые проекты могут определять собственные профили построения и/или форсировать конкретный тип построения через установку `CMAKE_BUILD_TYPE` в файлах [.filename]#CMakeLists.txt#. Для того чтобы порт для такого проекта учитывал `CFLAGS` и `WITH_DEBUG`, из этих файлов должны быть удалены значения `CMAKE_BUILD_TYPE`.
+
+Большинство проектов, основанных на CMake, поддерживают метод внешнего (out-of-source) построения. Для порта внешнее построение можно запросить с использованием суффикса `:outsource`. В этом случае `CONFIGURE_WRKSRC`, `BUILD_WRKSRC` и `INSTALL_WRKSRC` будут иметь значение `${WRKDIR}/.build` для каталога, содержащего файлы, получаемые на этапах конфигурации и построения; при этом каталог с исходным кодом будет оставаться без изменений.
+
+[[using-cmake-example]]
+.Пример для `USES= cmake`
+[example]
+====
+Следующий отрывок демонстрирует использование CMake для порта. `CMAKE_SOURCE_PATH` обычно не требуется, но может быть установлен, когда исходный код не находится в верхнем каталоге или если порт используется для построения части проекта.
+
+[.programlisting]
+....
+USES= cmake:outsource
+CMAKE_SOURCE_PATH= ${WRKSRC}/subproject
+....
+
+====
+
+[[using-scons]]
+=== Использование `scons`
+
+Если ваш порт использует SCons, определите `USE_SCONS=yes`.
+
+.Переменные для портов, использующих `scons`
+[cols="1,1", frame="none", options="header"]
+|===
+| Переменная
+| Значение
+
+|`SCONS_ARGS`
+|Специфичные для порта флаги SCons, передаваемые окружению SCons.
+
+|`SCONS_BUILDENV`
+|Переменные для установки в системном окружении.
+
+|`SCONS_ENV`
+|Переменные для установки в окружении SCons.
+
+|`SCONS_TARGET`
+|Последний параметр для передачи SCons, похожий на `MAKE_TARGET`.
+|===
+
+Для того, чтобы сторонний [.filename]#SConstruct# соответствовал всему, что передается SCons в переменной `SCONS_ENV` (самое главное, это `CC/CXX/CFLAGS/CXXFLAGS`), примените патч к [.filename]#SConstruct#, так чтобы переменная построения `Environment` выглядела следующим образом:
+
+[.programlisting]
+....
+env = Environment(**ARGUMENTS)
+....
+
+В дальнейшем ее можно изменить при помощи `env.Append` и `env.Replace`.
+
+[[using-autotools]]
+== Использование GNU Autotools
+
+[[using-autotools-introduction]]
+=== Введение
+
+Различные инструменты GNU autotools предоставляют механизм абстракции для построения частей программного обеспечения на широком наборе операционных систем и аппаратных архитектур. Внутри Коллекции Портов отдельный порт может использовать эти инструменты при помощи простых конструкций:
+
+[.programlisting]
+....
+USE_AUTOTOOLS= tool:version[:operation] ...
+....
+
+К моменту написания _tool_ может быть одним из `libtool`, `libltdl`, `autoconf`, `autoheader`, `automake` или `aclocal`.
+
+_version_ указывает конкретную версию используемого инструмента (смотрите `devel/{automake,autoconf,libtool}[0-9]+` для получения действительных версий).
+
+_operation_ является необязательным расширением и указывает на способ использования инструмента.
+
+Одновременно может быть указано несколько инструментов, добавляя их все на одной строке или используя конструкцию Makefile `+=`.
+
+В заключение, существует специальный инструмент по называнию `autotools`, который является удобной функцией при установке всех доступных версий autotools для возможности проведения кросс-разработки. Это также может быть достигнуто путем установки порта `devel/autotools`.
+
+[[using-libtool]]
+=== `libtool`
+
+Динамические библиотеки, использующие инфраструктуру построения GNU, обычно используют libtool для настройки компиляции и установки динамических библиотек в соответствии с особенностями данной операционной системы. В типичной практике используется копирование встроенного в приложение `libtool`. Если вам нужно использовать внешнюю команду `libtool`, то вы можете использовать версию, поставляемую Коллекцией Портов:
+
+[.programlisting]
+....
+USE_AUTOTOOLS= libtool:version[:env]
+....
+
+При отсутствии дополнительных операций, `libtool:version` сообщает инфраструктуре построения о применении патча к сценарию configure с установленной в системе копией `libtool`. Означает использование `GNU_CONFIGURE`. Более того, некоторые переменные make и оболочки shell будут назначены для дальнейшего использования этим портом. Подробности смотрите в [.filename]#bsd.autotools.mk#.
+
+При использовании операции `:env` будет настроено только окружение.
+
+Наконец, `LIBTOOLFLAGS` и `LIBTOOLFILES` можно установить по желанию, чтобы переопределить наиболее вероятные аргументы для `libtool` и файлы, предназначенные для изменения. Большинству портов это скорее всего не понадобится. Для дальнейших подробностей смотрите [.filename]#bsd.autotools.mk#.
+
+[[using-libltdl]]
+=== `libltdl`
+
+Некоторые порты задействуют пакет с библиотекой `libltdl`, которая является частью комплекта `libtool`. Использование этой библиотеки не вызывает автоматическое использование самой `libtool`, и, таким образом, обеспечивается отдельная конструкция.
+
+[.programlisting]
+....
+USE_AUTOTOOLS= libltdl:version
+....
+
+Всё, что в настоящее время она делает, это добавление `LIB_DEPENDS` для подходящего порта `libltdl`, потому она предоставляется как удобная функция для помощи в устранении всяких зависимостей от портов autotools вне инфраструктуры `USE_AUTOTOOLS`. Для этого инструмента не существует необязательных операций.
+
+[[using-autoconf]]
+=== `autoconf` и `autoheader`
+
+Вместо сценария configure некоторые порты содержат шаблон autoconf в файле [.filename]#configure.ac#. Вы можете использовать следующие присвоения, чтобы позволить `autoconf` создать сценарий configure, а `autoheader` создать заголовки шаблона для использования в сценарии configure.
+
+[.programlisting]
+....
+USE_AUTOTOOLS= autoconf:version[:env]
+....
+
+
+[.programlisting]
+....
+USE_AUTOTOOLS= autoheader:version
+....
+
+которые также подразумевают использование `autoconf:version`.
+
+Аналогично команде `libtool` включение необязательной операции `:env` всего лишь настраивает окружение для дальнейшего использования. Без этого выполняется наложение патчей и переконфигурирование порта.
+
+Дополнительные необязательные переменные `AUTOCONF_ARGS` и `AUTOHEADER_ARGS` можно переопределить в [.filename]#Makefile# порта, если указано явным образом. Как и с эквивалентами `libtool`, большинству портов это вряд ли понадобится.
+
+[[using-automake]]
+=== `automake` и `aclocal`
+
+Некоторые пакеты содержат только файлы [.filename]#Makefile.am#. Они должны быть преобразованы в файлы [.filename]#Makefile.in# с использованием automake и дальнейшей обработкой `configure` для получения настоящего [.filename]#Makefile#.
+
+Аналогично, иногда пакеты не поставляются с вложенными файлами [.filename]#aclocal.m4#, снова требуемых для построения программного обеспечения. Их можно получить командой `aclocal`, которая просматривает [.filename]#configure.ac# или [.filename]#configure.in#.
+
+`aclocal` имеет похожую связь с `automake`, как у `autoheader` с `autoconf`, что описано в предыдущей главе. `aclocal` подразумевает использование `automake`, таким образом, мы имеем:
+
+[.programlisting]
+....
+USE_AUTOTOOLS= automake:version[:env]
+....
+
+
+[.programlisting]
+....
+USE_AUTOTOOLS= aclocal:version
+....
+
+которые также подразумевают использование `automake:version`.
+
+Также как и для `libtool` и `autoconf`, подключение необязательной операции `:env` всего лишь устанавливает окружение для дальнейшего пользования. Без этого выполняется реконфигурирование этого порта.
+
+Как и в случае с `autoconf` и `autoheader`, обе команды `automake` и `aclocal` соответственно имеют необязательные переменные `AUTOMAKE_ARGS` и `ACLOCAL_ARGS`, которые при необходимости можно переопределить в [.filename]#Makefile# порта.
+
+[[using-gettext]]
+== Использование GNU `gettext`
+
+=== Простой вариант использования
+
+Если для вашего порта требуется `gettext`, добавьте `USES= gettext`, и ваш порт унаследует зависимость от package:devel/gettext[]. <<uses-makefiles>> содержит перечень других значений для использования `gettext`.
+
+Довольно распространенным случаем является использование в порте `gettext` и `configure`. Как правило, GNU `configure` способен находить `gettext` автоматически. Если он все же не сможет это сделать, то подсказки для размещения `gettext` можно передать через переменные окружения `CPPFLAGS` и `LDFLAGS`:
+
+[.programlisting]
+....
+USES= gettext
+CPPFLAGS+= -I${LOCALBASE}/include
+LDFLAGS+= -L${LOCALBASE}/lib
+
+GNU_CONFIGURE= yes
+....
+
+Конечно же, этот код можно записать в более компактном виде, если передавать флаги в `configure` не требуется:
+
+[.programlisting]
+....
+USES= gettext
+GNU_CONFIGURE= yes
+....
+
+=== Оптимальное использование
+
+Некоторые программные продукты позволяют отключать NLS, к примеру, передавая параметр `--disable-nls` сценарию `configure`. В этом случае ваш порт должен использовать `gettext`, в зависимости от значения `NLS`. Для портов небольшой или средней сложности вы можете полагаться на следующую идиому:
+
+[.programlisting]
+....
+GNU_CONFIGURE= yes
+
+.include <bsd.port.options.mk>
+
+.if ${PORT_OPTIONS:MNLS}
+USES+= gettext
+PLIST_SUB+= NLS=""
+.else
+CONFIGURE_ARGS+= --disable-nls
+PLIST_SUB+= NLS="@comment "
+.endif
+
+.include <bsd.port.mk>
+....
+
+Следующий пункт в вашем списке дел разобраться, чтобы файлы каталога сообщения включались в список упаковки по условию. Часть, входящая в [.filename]#Makefile#, уже обеспечена этой идиомой. Остальное объясняется в главе <<plist-sub,продвинутые практики [.filename]#pkg-plist#>>. Вкратце, каждое вхождение `%%NLS%%` в [.filename]#pkg-plist# будет заменено на "`@comment`", если NLS выключен, или пустой строкой, если включен. В результате строки, предваряемые `%%NLS%%`, станут комментариями в итоговом листе упаковки, если NLS выключен; иначе, префикс будет просто удален. Всё, что вам нужно, это вставить `%%NLS%%` перед каждым путем к файлу каталога сообщений в [.filename]#pkg-plist#. Например:
+
+[.programlisting]
+....
+%%NLS%%share/locale/fr/LC_MESSAGES/foobar.mo
+%%NLS%%share/locale/no/LC_MESSAGES/foobar.mo
+....
+
+В особо сложных случаях вам понадобиться использовать более продвинутые техники, чем данный рецепт, такие как <<plist-dynamic,динамические списки упаковки>>.
+
+=== Управление каталогами сообщений
+
+Существует момент, который следует учитывать при установке файлов каталогов сообщений. Целевые каталоги для размещения, расположенные под [.filename]#LOCALBASE/shared/locale#, редко когда должны создаваться и удаляться портом. Для наиболее популярных языков имеются собственные каталоги, перечисленные в [.filename]#PORTSDIR/Templates/BSD.local.dist#. Каталоги для множества других языков управляются с помощью порта package:devel/gettext[]. Обратите внимание на его [.filename]#pkg-plist# и посмотрите, куда данный порт собирается установить файлы каталогов сообщений для единственного в своем роде языка.
+
+[[using-perl]]
+== Использование Perl
+
+Если `MASTER_SITES` установлена в значение `MASTER_SITE_PERL_CPAN`, то предпочтительным значением `MASTER_SITE_SUBDIR` является имя иерархии верхнего уровня. Например, рекомендуемым значением для `p5-Module-Name` является `Module`. Иерархию верхнего уровня можно посмотреть на сайте http://cpan.org/modules/by-module/[cpan.org]. Это поддерживает порт в рабочем состоянии при изменении модуля автором.
+
+Исключением этого правила является отсутствие соответствующего каталога или файла с дистрибутивом в этом каталоге. В качестве `MASTER_SITE_SUBDIR` в этом случае разрешается использовать id автора.
+
+В качестве значения все из настраиваемых knobs ниже принимают `YES` или строку с версией вида `5.8.0+`. `YES` означает, что данный порт можно использовать с любой из поддерживаемых версий Perl. Если порт работает только с некоторыми версиями Perl, то это можно обозначить при помощи строки с версией, указывающей на минимальную версию (пример: `5.7.3+`), максимальную версию (пример: `5.8.0-`) или точную версию (пример: `5.8.3`).
+
+.Переменные для портов, использующих Perl
+[cols="1,1", frame="none", options="header"]
+|===
+| Переменная
+| Значение
+
+|`USE_PERL5`
+|Perl 5 используется для построения и работы.
+
+|`USE_PERL5_BUILD`
+|Perl 5 используется для построения.
+
+|`USE_PERL5_RUN`
+|Perl 5 используется во время работы.
+
+|`PERL`
+|Полный путь к интерпретатору Perl 5, либо в системе, либо установленному из портов, но без номера версии. Используйте это, если вам нужно заменить строки "`#!`" в скриптах.
+
+|`PERL_CONFIGURE`
+|Конфигурация при помощи MakeMaker языка Perl. Влечёт `USE_PERL5`.
+
+|`PERL_MODBUILD`
+|Конфигурация, построение и установка с использованием Module::Build. Влечёт `PERL_CONFIGURE`.
+|===
+
+[NOTE]
+====
+Порты для модулей Perl, которые не имеют официального вебсайта, должны указывать `cpan.org` в строке WWW в файле [.filename]#pkg-descr#. Предпочтительная форма URL `http://search.cpan.org/dist/Module-Name/` (включая завершающий слэш).
+====
+
+[NOTE]
+====
+Не используйте `${SITE_PERL}` в объявлении зависимостей. Использование этой конструкции подразумевает наличие подключенного [.filename]#bsd.perl.mk#, что не всегда так. Порты, зависимые от этого порта, получат неправильные зависимости, если файлы этого порта будут перемещены при последующем обновлении. Правильный способ объявления зависимостей для модулей Perl показан в примере ниже.
+====
+
+[[use-perl-dependency-example]]
+.Пример зависимости Perl
+[example]
+====
+[.programlisting]
+....
+p5-IO-Tee>=0.64:${PORTSDIR}/devel/p5-IO-Tee
+....
+
+====
+
+Для портов Perl, которые устанавливают страницы справочника, в [.filename]#pkg-plist# можно использовать макрос `PERL5_MANx` (где _x_ принимает значение от `1` до `9`). Например,
+
+[.programlisting]
+....
+lib/perl5/5.14/man/man3/AnyEvent::I3.3.gz
+....
+
+можно заменить на
+
+[.programlisting]
+....
+%%PERL5_MAN3%%/AnyEvent::I3.3.gz
+....
+
+[[using-x11]]
+== Использование X11
+
+[[x11-variables]]
+=== Компоненты X.Org
+
+X.Org является реализацией X11, доступной в Коллекции Портов. Если ваше приложение зависит от компонентов X, установите в переменную `USE_XORG` в перечень требуемых компонентов. К настоящему времени доступными компонентами являются:
+
+`bigreqsproto compositeproto damageproto dmx dmxproto dri2proto evieproto fixesproto fontcacheproto fontenc fontsproto fontutil glproto ice inputproto kbproto libfs oldx pciaccess pixman printproto randrproto recordproto renderproto resourceproto scrnsaverproto sm trapproto videoproto x11 xau xaw xaw6 xaw7 xbitmaps xcmiscproto xcomposite xcursor xdamage xdmcp xevie xext xextproto xf86bigfontproto xf86dgaproto xf86driproto xf86miscproto xf86rushproto xf86vidmodeproto xfixes xfont xfontcache xft xi xinerama xineramaproto xkbfile xkbui xmu xmuu xorg-server xp xpm xprintapputil xprintutil xproto xproxymngproto xrandr xrender xres xscrnsaver xt xtrans xtrap xtst xv xvmc xxf86dga xxf86misc xxf86vm`.
+
+Всегда актуальный перечень можно найти в [.filename]#/usr/ports/Mk/bsd.xorg.mk#.
+
+Проект Mesa является попыткой обеспечить свободную реализацию OpenGL. Вы можете указать зависимость от различных компонентов этого проекта при помощи переменной `USE_GL`. Действительные опции: `glut, glu, glw, glew, gl` и `linux`. Для обратной совместимости значение `yes` соответствует `glu`.
+
+[[use-xorg-example]]
+.Пример для USE_XORG
+[example]
+====
+[.programlisting]
+....
+USE_XORG= xrender xft xkbfile xt xaw
+USE_GL= glu
+....
+
+====
+
+.Переменные для портов, использующих X
+[cols="1,1", frame="none"]
+|===
+|`USES= imake`
+|Используется `imake`.
+
+|`XMKMF`
+|Задаёт маршрут до `xmkmf`, если он отсутствует в `PATH`. По умолчанию это `xmkmf -a`.
+|===
+
+[[using-x11-vars]]
+.Использование переменных X11 в порте
+[example]
+====
+[.programlisting]
+....
+# Использовать некоторые библиотеки X11
+USE_XORG= x11 xpm
+....
+
+====
+
+[[porting-motif]]
+=== Порты, которым требуется Motif
+
+Если вашему порту требуется Motif, задайте переменную `USES= motif` в файле [.filename]#Makefile#. Реализация Motif, используемая по умолчанию, находится в package:x11-toolkits/open-motif[]. Пользователи вместо этого могут выбрать package:x11-toolkits/lesstif[] через установку переменной `WANT_LESSTIF`.
+
+Переменная `MOTIFLIB` будет установлена в [.filename]#bsd.port.mk#, чтобы ссылаться на соответствующую библиотеку Motif. Пожалуйста, измените исходные тексты вашего порта на использование `${MOTIFLIB}` везде, где упоминается библиотека Motif, в первоначальном [.filename]#Makefile# или [.filename]#Imakefile#.
+
+Существует два общих случая:
+
+* Если порт обращается к библиотеке Motif как `-lXm` в своих файлах [.filename]#Makefile# или [.filename]#Imakefile#, просто подставьте вместо этих обращений `${MOTIFLIB}`.
+* Если порт использует `XmClientLibs` в своем файле [.filename]#Imakefile#, измените это обращение на `${MOTIFLIB} ${XTOOLLIB} ${XLIB}`.
+
+Заметьте, что переменная `MOTIFLIB` (как правило) раскрывается в `-L/usr/local/lib -lXm` или `/usr/local/lib/libXm.a`, так что нет нужды впереди добавлять `-L` или `-l`.
+
+=== Шрифты для X11
+
+Если ваш порт устанавливает шрифты для X Window System, поместите их в каталог [.filename]#LOCALBASE/lib/X11/fonts/local#.
+
+=== Получение поддельного `DISPLAY`, используя Xvfb
+
+Некоторые приложения для успешной компиляции требуют наличие работающего дисплея X11. Это создает проблему для машин, которые работают в режиме headless. При использовании следующего канонического хака инфраструктура построения запустит сервер X в виртуальном фреймбуфере. Затем переменная работающего `DISPLAY` передается при построении.
+
+[.programlisting]
+....
+USES= display
+....
+
+[[desktop-entries]]
+=== Элементы рабочего стола
+
+Элементы рабочего стола (http://standards.freedesktop.org/desktop-entry-spec/latest/[стандарта Freedesktop]) предоставляют способ автоматической настройки функций рабочего стола при установке новой программы, не требуя вмешательства пользователя. Например, новые программы автоматически отображаются в меню приложений совместимых окружений рабочего стола. Элементы рабочего стола изначально появились в окружении рабочего стола GNOME, но в настоящее время являются стандартом и также работают с KDE и Xfce. Такая небольшая автоматизация предоставляет реальное удобство для пользователя, и посему элементы рабочего стола приветствуются в приложениях, которые можно использовать в окружении рабочего стола.
+
+==== Использование предопределенных файлов [.filename]#.desktop#
+
+Порты, включающие предопределенные файлы [.filename]#*.desktop#, должны включать эти файлы в [.filename]#pkg-plist# и устанавливать их в каталог [.filename]#$LOCALBASE/shared/applications#. Для установки этих файлов используется <<install-macros,макрос `INSTALL_DATA`>>.
+
+[[updating-desktop-database]]
+==== Обновление базы данных рабочего стола
+
+Если в файле порта [.filename]#portname.desktop# имеется запись MimeType, то база данных рабочего стола олжна быть обновлена после установки и удаления. Для этого укажите `USES`= desktop-file-utils.
+
+[[desktop-entries-macro]]
+==== Создание элементов рабочего стола с использованием `DESKTOP_ENTRIES`
+
+Элементы рабочего стола можно легко создавать для приложений, используя переменную `DESKTOP_ENTRIES`. Будет автоматически создан, установлен и добавлен в [.filename]#pkg-plist# файл с названием [.filename]#name.desktop#. Синтаксис:
+
+[.programlisting]
+....
+DESKTOP_ENTRIES= "NAME" "COMMENT" "ICON" "COMMAND" "CATEGORY" StartupNotify
+....
+
+Перечень возможных категорий доступен на http://standards.freedesktop.org/menu-spec/latest/apa.html[вебсайте Freedesktop]. `StartupNotify` отобразит, поддерживает ли приложение _уведомления о запуске_. Как правило, это графический индикатор часы вместо указателя мыши, меню или панель, которые уведомляют пользователя о загрузке программы. Программа, поддерживающая уведомления о запуске, очистит этот индикатор после запуска. Программы, несовместимые с уведомлениями о запуске, не будут очищать индикатор (возможно, вызывая путаницу и приводя пользователей в бешенство), и поэтому должны иметь `StartupNotify` в выключенном состоянии `false`; тогда индикатор не будет отображаться совсем.
+
+Пример:
+
+[.programlisting]
+....
+DESKTOP_ENTRIES= "ToME" "Roguelike game based on JRR Tolkien's work" \
+ "${DATADIR}/xtra/graf/tome-128.png" \
+ "tome -v -g" "Application;Game;RolePlaying;" \
+ false
+....
+
+[[using-gnome]]
+== Использование GNOME
+
+Для задания того, какие компоненты GNOME использует конкретный порт, проект FreeBSD/GNOME использует собственный набор переменных. На странице проекта FreeBSD/GNOME размещён http://www.FreeBSD.org/gnome/docs/porting/[ исчерпывающий список этих переменных].
+
+[[using-qt]]
+== Использование Qt
+
+[[qt-common]]
+=== Порты, для которых требуется Qt
+
+.Переменные для портов, использующих Qt
+[cols="1,1", frame="none"]
+|===
+|`USE_QT4`
+|Указывает инструменты и библиотеки в качестве зависимостей для портов, которые используют Qt 4. Для получения подробностей смотрите <<qt4-components,выбор компонентов Qt 4>>.
+
+|`QT_PREFIX`
+|Устанавливается в значение, содержащее путь к установленному Qt (переменная только для чтения).
+
+|`MOC`
+|Устанавливается в значение, содержащее путь к `moc` (переменная только для чтения). По умолчанию устанавливается в соответствии со значением `USE_QT_VER`.
+
+|`QTCPPFLAGS`
+|Дополнительные флаги компилятора для инструментального пакета Qt, передаваемые через переменную `CONFIGURE_ENV`. По умолчанию устанавливается в соответствии со значением `USE_QT_VER`.
+
+|`QTCFGLIBS`
+|Дополнительные флаги компоновки для инструментального пакета Qt, передаваемые через переменную `CONFIGURE_ENV`. По умолчанию устанавливается в соответствии со значением `USE_QT_VER`.
+
+|`QTNONSTANDARD`
+|Подавляет изменение `CONFIGURE_ENV`, `CONFIGURE_ARGS`, `CPPFLAGS` и `MAKE_ENV`.
+|===
+
+.Дополнительные переменные для портов, использующих Qt 4.x
+[cols="1,1", frame="none"]
+|===
+|`UIC`
+|Устанавливает путь к `uic` (переменная только для чтения).
+
+|`QMAKE`
+|Устанавливает путь к `qmake` (переменная только для чтения).
+
+|`QMAKESPEC`
+|Устанавливает путь к конфигурационному файлу для `qmake` (переменная только для чтения).
+
+|`QMAKEFLAGS`
+|Дополнительные флаги для `qmake`.
+
+|`QT_INCDIR`
+|Устанавливает каталоги для заголовков Qt 4 (переменная только для чтения).
+
+|`QT_LIBDIR`
+|Устанавливает путь к библиотекам Qt 4 (переменная только для чтения).
+
+|`QT_PLUGINDIRC`
+|Устанавливает путь к плагинам Qt 4 (переменная только для чтения).
+|===
+
+При заданной переменной `USE_QT4` применяются следующие настройки:
+
+[.programlisting]
+....
+CONFIGURE_ARGS+= --with-qt-includes=${QT_INCDIR} \
+ --with-qt-libraries=${QT_LIBDIR} \
+ --with-extra-libs=${LOCALBASE}/lib \
+ --with-extra-includes=${LOCALBASE}/include
+CONFIGURE_ENV+= MOC="${MOC}" UIC="${UIC}" LIBS="${QTCFGLIBS}" \
+ QMAKE="${QMAKE}" QMAKESPEC="${QMAKESPEC}" QTDIR="${QT_PREFIX}"
+MAKE_ENV+= QMAKESPEC="${QMAKESPEC}"
+
+PLIST_SUB+= QT_INCDIR_REL=${QT_INCDIR_REL} \
+ QT_LIBDIR_REL=${QT_LIBDIR_REL} \
+ QT_PLUGINDIR_REL=${QT_PLUGINDIR_REL}
+....
+
+[[qt4-components]]
+=== Выбор компонентов
+
+В переменной `USE_QT4` должны указываться зависимости от отдельных инструментов и библиотек Qt 4. К каждому компоненту можно добавить суффикс, `_build` или `_run`, отражающий, когда должна быть применена зависимость, во время сборки или выполнения, соответственно. Если суффикс отсутствует, зависимость от компонента будет и для времени сборки, и для времени выполнения. Обычно, компоненты библиотек должны указываться без суффиксов, компоненты инструментов - с суффиксом `_build`, а компоненты плагинов - с суффиксом `_run`. Наиболее общие используемые компоненты перечислены ниже (все доступные компоненты перечислены в `_USE_QT4_ALL` в файле [.filename]#/usr/ports/Mk/bsd.qt.mk#):
+
+.Доступные библиотечные компоненты Qt 4
+[cols="1,1", frame="none", options="header"]
+|===
+| Название
+| Описание
+
+|`corelib`
+|основная библиотека (можно опустить, если порт не использует ничего, кроме `corelib`)
+
+|`gui`
+|библиотека графического пользовательского интерфейса
+
+|`network`
+|сетевая библиотека
+
+|`opengl`
+|библиотека OpenGL
+
+|`qt3support`
+|библиотека совместимости с Qt 3
+
+|`qtestlib`
+|библиотека модульного тестирования
+
+|`script`
+|библиотека сценариев
+
+|`sql`
+|библиотека SQL
+
+|`xml`
+|библиотека XML
+|===
+
+Вы можете определить, от каких библиотек зависит приложение, запустив `ldd` на основной исполняемый файл после успешной компиляции.
+
+.Доступные компоненты инструментов Qt 4
+[cols="1,1", frame="none", options="header"]
+|===
+| Название
+| Описание
+
+|`moc`
+|мета-объектный компилятор (нужен при построении почти для каждого приложения Qt)
+
+|`qmake`
+|генератор Makefile / утилита построения
+
+|`rcc`
+|компилятор ресурсов (нужен, если приложение идет вместе с файлами [.filename]#*.rc# или [.filename]#*.qrc#)
+
+|`uic`
+|компилятор пользовательского интерфейса (нужен, если приложение идет вместе с файлами [.filename]#*.ui#, созданными при помощи Qt Designer, - на практике каждое приложение Qt с GUI)
+|===
+
+.Доступные компоненты плагинов Qt 4
+[cols="1,1", frame="none", options="header"]
+|===
+| Название
+| Описание
+
+|`iconengines`
+|плагин для движка иконок SVG (если приложение поставляется с иконками SVG)
+
+|`imageformats`
+|плагины для графических форматов GIF, JPEG, MNG и SVG (если приложение поставляется с графическими файлами)
+|===
+
+[[qt4-components-example]]
+.Выбор компонентов Qt 4
+[example]
+====
+В этом примере портированное приложение использует библиотеку графического пользовательского интерфейса Qt 4, основную библиотеку Qt 4, все инструменты генерации кода Qt 4 и генератор Makefile Qt 4. Поскольку библиотека `gui` подразумевает зависимость от основной библиотеки, указывать `corelib` нет необходимости. Инструменты генерации кода Qt 4 `moc`, `uic` и `rcc`, а также генератор Makefile `qmake` нужны только для времени построения, поэтому они указаны с суффиксом `_build`:
+
+[.programlisting]
+....
+USE_QT4= gui moc_build qmake_build rcc_build uic_build
+....
+
+====
+
+[[using-qmake]]
+=== Использование `qmake`
+
+.Переменные для портов, использующих `qmake`
+[cols="1,1", frame="none", options="header"]
+|===
+| Название
+| Описание
+
+|`QMAKE_ARGS`
+|Спефицичные для порта флаги QMake для передачи программе `qmake`.
+
+|`QMAKE_ENV`
+|Переменные окружения, устанавливаемые для программы `qmake`. По умолчанию соответствует значению `${CONFIGURE_ENV}`.
+
+|`QMAKE_PRO`
+|Название файла проекта [.filename]#.pro#. По умолчанию имеет пустое значение (с использованием автоопределения).
+|===
+
+Если вместе с приложением вместо [.filename]#configure# поставляется файл [.filename]#.pro#, вы можете использовать следующее:
+
+[.programlisting]
+....
+USES= qmake
+USE_QT4= qmake_build
+....
+
+`USES=qmake` указывает порту на использование `qmake` в процессе конфигурации. Обратите внимание, что `USES=qmake` не подразумевает зависимость от Qt 4 `qmake`. Для этого в значении `USE_QT4` должен присутствовать компонент `qmake_build`.
+
+Приложения Qt часто пишутся в кроссплатформенной манере, и X11/Unix часто не является для них платформой разработки, что в свою очередь часто приводит к соответствующим упущенным моментам:
+
+* _Отсутствующие дополнительные пути для заголовочных файлов._ Многие приложения идут с поддержкой иконки в системном трее, но пренебрегают смотреть на наличие заголовочных файлов и/или библиотеками в каталогах X11. Вы можете сообщить `qmake`, чтобы она добавила каталоги в пути поиска заголовочных файлов и библиотек через командную строку. К примеру:
++
+[.programlisting]
+....
+QMAKE_ARGS+= INCLUDEPATH+=${LOCALBASE}/include \
+ LIBS+=-L${LOCALBASE}/lib
+....
+
+* _Фиктивные пути установки._ Иногда данные, такие как иконки и файлы .desktop, устанавливаются по умолчанию в каталоги, которые не просматриваются XDG-совместимыми приложениями. Примером является package:editors/texmaker[] - взгляните на [.filename]#patch-texmaker.pro# из каталога [.filename]#files# этого порта, который можно взять в качестве шаблона исправления этого непосредственно в файле проекта `qmake`.
+
+[[using-kde]]
+== Использование KDE
+
+[[kde4-variables]]
+=== Задание переменных KDE 4
+
+Если ваше приложение зависит от KDE 4.x, присвойте `USE_KDE4` список требуемых компонентов. Для переопределения типа зависимости компонента могут быть использованы суффиксы `_build` и `_run` (например, `baseapps_run`). Если суффикс не задан, будет использован тип зависимости по умолчанию. Если вы хотите использовать оба типа, добавьте компонент дважды с обоими суффиксами (например, `automoc4_build automoc4_run`). Основные наиболее используемые компоненты перечислены ниже (актуальные компоненты задокументированы в начале файла [.filename]#/usr/ports/Mk/bsd.kde4.mk#):
+
+.Доступные компоненты KDE 4
+[cols="1,1", frame="none", options="header"]
+|===
+| Название
+| Описание
+
+|`kdehier`
+|Иерархия основных каталогов KDE
+
+|`kdelibs`
+|KDE Developer Platform
+
+|`kdeprefix`
+|Если установлено, то порт будет установлен в `${KDE4_PREFIX}` вместо `${LOCALBASE}`
+
+|`sharedmime`
+|База данных MIME типов для портов KDE
+
+|`automoc4`
+|automoc для пакетов Qt 4
+
+|`akonadi`
+|Сервер хранения KDE-Pim
+
+|`soprano`
+|Фреймворк Qt 4 RDF
+
+|`strigi`
+|Поисковые даемон рабочего стола
+
+|`libkcddb`
+|Библиотека KDE CDDB
+
+|`libkcompactdisc`
+|Библиотека KDE для взаимодействия с аудио-CD
+
+|`libkdeedu`
+|Библиотеки, используемые для образовательных приложений
+
+|`libkdcraw`
+|Библиотека KDE LibRaw
+
+|`libkexiv2`
+|Библиотека KDE Exiv2
+
+|`libkipi`
+| KDE Image Plugin Interface
+
+|`libkonq`
+|Основная библиотека Konqueror
+
+|`libksane`
+|Библиотека KDE SANE ("Scanner Access Now Easy")
+
+|`pimlibs`
+|Библиотеки KDE-Pim
+
+|`kate`
+|Тектовый редактор
+
+|`marble`
+|Виртуальный глобус
+
+|`okular`
+|Универсальный просмотрщик документов
+
+|`korundum`
+|Привязка Ruby к KDE
+
+|`perlkde`
+|Привязка Perl к KDE
+
+|`pykde4`
+|Привязка Python к KDE
+
+|`pykdeuic4`
+|Компилятор пользовательского интерфейса PyKDE
+
+|`smokekde`
+|Библиотеки KDE SMOKE
+|===
+
+Порты KDE 4.x устанавливаются в `KDE4_PREFIX`, что в настоящее время соответствует [.filename]#/usr/local/kde4#. Это достигается путем указания компонента `kdeprefix`, который определяет значение по умолчанию для `PREFIX`. Тем не менее, порты учитывают любые `PREFIX`, установленные через переменную окружения `MAKEFLAGS` и/или параметры `make`.
+
+[[kde4-components-example]]
+.Пример `USE_KDE4`
+[example]
+====
+Это простой пример для порта KDE 4. `USES= cmake:outsource` указывает порту использовать CMake, конфигурационный инструмент, широко применяемый в проектах KDE 4 (подробное описание даёт <<using-cmake>>). `USE_KDE4` добавляет зависимость от библиотек KDE и заставляет порты использовать `automoc4` во время сборки. Требуемые компоненты KDE и другие зависимости можно определить в журнале configure. `USE_KDE4` не подразумевает `USE_QT4`. Если порт требует какой-либо из компонентов Qt 4, их следует указать в `USE_QT4`.
+
+[.programlisting]
+....
+USES= cmake:outsource
+USE_KDE4= kdelibs kdeprefix automoc4
+USE_QT4= moc_build qmake_build rcc_build uic_build
+....
+
+====
+
+[[using-java]]
+== Использование Java
+
+[[java-variables]]
+=== Задание переменных
+
+Если вашему порту необходимо наличие Java(TM) Development Kit (JDK(TM)) для построения, работы или даже распаковки дистрибутивного файла, то в нём должна быть задана переменная `USE_JAVA`.
+
+В Коллекции Портов присутствуют несколько JDK различных разработчиков и разных версий. Если ваш порт должен использовать одну из этих версий, то вы должны указать, какую именно. Самой последней версией и версией по умолчанию является package:java/openjdk6[].
+
+.Переменные, которые которые могут задаваться портами, использующими Java
+[cols="1,1", frame="none", options="header"]
+|===
+| Переменная
+| Значение
+
+|`USE_JAVA`
+|Должна быть определена для того, что последующие переменные вступили в действие.
+
+|`JAVA_VERSION`
+|Список версий Java, перечисленных через пробел, подходящих для порта. Опциональный знак `"+"` позволяет вам указать диапазон версий (возможные значения: `1.5[+] 1.6[+] 1.7[+]`).
+
+|`JAVA_OS`
+|Список операционных систем, перечисленных через пробел, порты JDK для которых подходят для порта (возможные значения: `native linux`).
+
+|`JAVA_VENDOR`
+|Список разработчиков портов JDK, перечисленных через пробел, которые подходят для порта (возможные значения: `freebsd bsdjava sun openjdk`).
+
+|`JAVA_BUILD`
+|Если задана, то означает, что выбранный порт JDK должен быть добавлен к зависимостям порта для его построения.
+
+|`JAVA_RUN`
+|Если задана, то означает, что выбранный порт JDK должен быть добавлен в зависимостям порта для его работы.
+
+|`JAVA_EXTRACT`
+|Если задана, то означает, что выбранный порт JDK должен быть добавлен в зависимостям порта для распаковки его дистрибутивных файлов.
+|===
+
+Ниже перечисляются все значения, которые принимают переменные после задания переменной `USE_JAVA`:
+
+.Переменные, доступные в портах, использующих Java
+[cols="1,1", frame="none", options="header"]
+|===
+| Переменная
+| Значение
+
+|`JAVA_PORT`
+|Название порта JDK (к примеру, `'java/openjdk6'`).
+
+|`JAVA_PORT_VERSION`
+|Полное наименовании версии порта JDK (к примеру, `'1.6.0'`). Если вам нужны только первые две цифры номера версии, используйте `${JAVA_PORT_VERSION:C/^([0-9])\.([0-9])(.*)$/\1.\2/}`.
+
+|`JAVA_PORT_OS`
+|Операционная система, используемая портом JDK (к примеру, `'native'`).
+
+|`JAVA_PORT_VENDOR`
+|Разработчик порта JDK (к примеру, `'openjdk'`).
+
+|`JAVA_PORT_OS_DESCRIPTION`
+|Описание операционной системы, используемой портом JDK (к примеру, `'Native'`).
+
+|`JAVA_PORT_VENDOR_DESCRIPTION`
+|Описание разработчика порта JDK (к примеру, `'OpenJDK BSD Porting Team'`).
+
+|`JAVA_HOME`
+|Маршрут к установочному каталогу JDK (к примеру, [.filename]#'/usr/local/openjdk6'#).
+
+|`JAVAC`
+|Маршрут к используемому компилятору Java (к примеру, [.filename]#'/usr/local/openjdk6/bin/javac'#.
+
+|`JAR`
+|Маршрут к используемой утилите `jar` (к примеру, [.filename]#'/usr/local/openjdk6/bin/jar'# или [.filename]#'/usr/local/bin/fastjar'#).
+
+|`APPLETVIEWER`
+|Маршрут к утилите `appletviewer` (к примеру, [.filename]#'/usr/local/openjdk6/bin/appletviewer'#).
+
+|`JAVA`
+|Маршрут к выполняемому файлу `java`. Используйте его для запуска Java-программ (к примеру, [.filename]#'/usr/local/openjdk6/bin/java'#).
+
+|`JAVADOC`
+|Маршрут к вспомогательной программе `javadoc`.
+
+|`JAVAH`
+|Маршрут к программе `javah`.
+
+|`JAVAP`
+|Маршрут к программе `javap`.
+
+|`JAVA_KEYTOOL`
+|Маршрут к вспомогательной программе `keytool`.
+
+|`JAVA_N2A`
+|Маршрут к утилите `native2ascii`.
+
+|`JAVA_POLICYTOOL`
+|Маршрут к программе `policytool`.
+
+|`JAVA_SERIALVER`
+|Маршрут к вспомогательной программе `serialver`.
+
+|`RMIC`
+|Маршрут к генератору каркаса программ RMI, утилите `rmic`.
+
+|`RMIREGISTRY`
+|Маршрут к программе регистрации RMI, `rmiregistry`.
+
+|`RMID`
+|Маршрут к программе-даемону RMI `rmid`.
+
+|`JAVA_CLASSES`
+|Маршрут к архиву, который содержит файлы классов JDK, [.filename]#${JAVA_HOME}/jre/lib/rt.jar#.
+|===
+
+Вы можете воспользоваться make-целью `java-debug` для получения информации, необходимой для отладки вашего порта. При её выполнении будут выданы значения многих упомянутых выше переменных.
+
+Кроме того, для единообразия установки всех портов Java определены следующие константы:
+
+.Константы, определённые для портов, использующих Java
+[cols="1,1", frame="none", options="header"]
+|===
+| Константа
+| Значение
+
+|`JAVASHAREDIR`
+|Корневой каталог для всего, что связано с Java. По умолчанию: [.filename]#${PREFIX}/shared/java#.
+
+|`JAVAJARDIR`
+|Каталог, в который должны устанавливаться JAR-файлы. По умолчанию: [.filename]#${JAVASHAREDIR}/classes#.
+
+|`JAVALIBDIR`
+|Каталог, в который устанавливаются JAR-файлы из других портов. По умолчанию: [.filename]#${LOCALBASE}/shared/java/classes#.
+|===
+
+Соответствующие записи определяются в обоих переменных `PLIST_SUB` (описана в <<plist-sub>>) и `SUB_LIST`.
+
+[[java-building-with-ant]]
+=== Построение с Ant
+
+Если построение порта производится с использованием Apache Ant, то необходимо определить `USE_ANT`. Таким образом Ant становится подкомандой make. Если в порте не определена цель `do-build`, то будет установлена цель по умолчанию, которая просто запускает Ant в соответствии со значением `MAKE_ENV`, `MAKE_ARGS` и `ALL_TARGET`. Это похоже на механизм `USES= gmake`, который описан в <<building>>.
+
+[[java-best-practices]]
+=== Практические рекомендации
+
+При портировании Java-библиотеки ваш порт должен устанавливать JAR-файл(ы) в каталог [.filename]#${JAVAJARDIR}#, а все остальные данные в каталог [.filename]#${JAVASHAREDIR}/${PORTNAME}# (за исключением документации, о которой пойдёт речь ниже). Для уменьшения размера упакованного файла вы можете сослаться на JAR-файл(ы) непосредственно в файле [.filename]#Makefile#. Просто воспользуйтесь следующей директивой (в которой [.filename]#myport.jar# является именем JAR-файла, устанавливаемого как часть порта):
+
+[.programlisting]
+....
+PLIST_FILES+= %%JAVAJARDIR%%/myport.jar
+....
+
+При портировании Java-приложения порт обычно устанавливает всё в один каталог (в том числе все свои JAR-зависимости). В этом отношении настоятельно рекомендуется использование [.filename]#${JAVASHAREDIR}/${PORTNAME}#. На усмотрение создателя порта остаётся решение вопроса о том, устанавливать ли дополнительные JAR-зависимости в этот каталог или напрямую использовать уже установленные (из каталога [.filename]#${JAVAJARDIR}#).
+
+При портировании приложения Java(TM), для запуска сервиса которого требуется сервер приложений, такой как package:www/tomcat7[], для производителя в порядке вещей является распространение файла [.filename]#.war#. Файл [.filename]#.war# - это Веб-приложение АРхивированное и оно распаковывается при вызове данным приложением. Избегайте добавлять файлы [.filename]#.war# в [.filename]#pkg-plist#. Это не является наилучшим решением. Сервер приложений производит расширение архива [.filename]#war# без должной его очистки при удалении порта. Более подходящим способом работы с этим файлом будет распаковать архив, установить файлы и добавить их в [.filename]#pkg-plist#.
+
+[.programlisting]
+....
+TOMCATDIR= ${LOCALBASE}/apache-tomcat-7.0
+WEBAPPDIR= myapplication
+
+post-extract:
+ @${MKDIR} ${WRKDIR}/${PORTDIRNAME}
+ @${TAR} xf ${WRKDIR}/myapplication.war -C ${WRKDIR}/${PORTDIRNAME}
+
+do-install:
+ cd ${WRKDIR} && \
+ ${INSTALL} -d -o ${WWWOWN} -g ${WWWGRP} ${TOMCATDIR}/webapps/${PORTDIRNAME}
+ @cd ${WRKDIR}/${PORTDIRNAME} && ${COPYTREE_SHARE} \* ${WEBAPPDIR}/${PORTDIRNAME}
+....
+
+Вне зависимости от типа вашего порта (библиотека это или приложение), дополнительная документация должна устанавливаться <<install-documentation,в тоже самое место>>, что и для других портов. Известно, что в зависимости от используемой версии JDK утилита JavaDoc генерирует различные наборы файлов. Для портов, которые не привязаны к использованию определённой версии JDK, таким образом становится проблематичным определить список файлов для упаковки ([.filename]#pkg-plist#). Это одна из причин, по которой создателям портов настоятельно рекомендуется использовать макрос `PORTDOCS`. Более того, даже если вы сможете угадать набор файлов, который будет сгенерирован утилитой `javadoc`, размер получающегося файла [.filename]#pkg-plist# голосует за использование `PORTDOCS`.
+
+Значением по умолчанию для переменной `DATADIR` является [.filename]#${PREFIX}/shared/${PORTNAME}#. Хорошей идеей является переопределение для Java-портов значения `DATADIR` как [.filename]#${JAVASHAREDIR}/${PORTNAME}#. На самом деле `DATADIR` автоматически добавляется к `PLIST_SUB` (это описано в <<plist-sub>>), так что вы сможете использовать `%%DATADIR%%` непосредственно в [.filename]#pkg-plist#.
+
+Что касается выбора между построением портов Java из исходных текстов или их прямой установкой из бинарных дистрибутивов, то на момент создания этого текста определённой политики на этот счёт не существует. Однако участники http://www.freebsd.org/java/[Проекта FreeBSD Java] рекомендуют создателям портов строить их из исходных текстов, если эта задача является несложной.
+
+Все возможности, которые были описаны в этом разделе, реализованы в файле [.filename]#bsd.java.mk#. Если вы предположите, что вашему порту требуется менее тривиальная поддержка Java, пожалуйста, взгляните сначала на http://svnweb.FreeBSD.org/ports/head/Mk/bsd.java.mk?view=markup[журнал изменений bsd.java.mk в Subversion], так как для документирования последних изменений требуется какое-то время. Затем, если вы думаете, что не хватающая вам поддержка окажется полезной для многих других портов Java, обсудите ваш вопрос в freebsd-java.
+
+Хотя в базе сообщений об ошибках для соответствующих PR имеется категория `java`, она относится к работе над портированием JDK, которые проводит Проект FreeBSD Java. Таким образом, вы должны относить свой Java-порт, как и любой другой, к категории `ports`, если решаемый вами вопрос не относится ни к реализации JDK, ни к [.filename]#bsd.java.mk#.
+
+Похожим образом определена политика по отношению к `CATEGORIES` порта Java, которая подробно описана в <<makefile-categories>>.
+
+[[using-php]]
+== Веб-приложения, Apache и PHP
+
+[[using-apache]]
+=== Apache
+
+.Переменные для портов, использующих Apache
+[cols="1,1", frame="none"]
+|===
+|`USE_APACHE`
+|Порт требует Apache. Возможные значения: `yes` (берёт любую версию), `22`, `24`, `22-24`, `22+` и так далее. Версия по умолчанию `22`. Более подробная информация содержится в файле [.filename]#ports/Mk/bsd.apache.mk# и на странице http://wiki.freebsd.org/Apache/[wiki.freebsd.org/Apache/].
+
+|`APXS`
+|Полный путь к исполняемому файлу `apxs`. Может быть переопределен в вашем порту.
+
+|`HTTPD`
+|Полный путь к исполняемому файлу `httpd`. Может быть переопределен в вашем порту.
+
+|`APACHE_VERSION`
+|Версия установленного Apache (переменная только для чтения). Эта переменная доступна только после подключения [.filename]#bsd.port.pre.mk#. Возможные значения: `22`, `24`.
+
+|`APACHEMODDIR`
+|Каталог для модулей Apache. Значение переменной автоматически подставляется в [.filename]#pkg-plist#.
+
+|`APACHEINCLUDEDIR`
+|Каталог для заголовков Apache. Значение переменной автоматически подставляется в [.filename]#pkg-plist#.
+
+|`APACHEETCDIR`
+|Каталог для конфигурационных файлов Apache. Значение переменной автоматически подставляется в [.filename]#pkg-plist#.
+|===
+
+.Используемые переменные при портировании модулей Apache
+[cols="1,1", frame="none"]
+|===
+|`MODULENAME`
+|Название модуля. Значением по умолчанию является `PORTNAME`. Пример: `mod_hello`
+
+|`SHORTMODNAME`
+|Краткое название модуля. Наследуется автоматически от `MODULENAME`, но может быть переопределено. Пример: `hello`
+
+|`AP_FAST_BUILD`
+|Использовать `apxs` для компиляции и установки модуля.
+
+|`AP_GENPLIST`
+|Также автоматически создает [.filename]#pkg-plist#.
+
+|`AP_INC`
+|Добавляет каталог к пути поиска заголовков во время компиляции.
+
+|`AP_LIB`
+|Добавляет каталог к пути поиска библиотек во время компиляции.
+
+|`AP_EXTRAS`
+|Дополнительные флаги, передаваемые `apxs`.
+|===
+
+[[web-apps]]
+=== Веб-приложения
+
+Веб-приложения следует устанавливать в [.filename]#PREFIX/www/appname#. Для вашего удобства этот путь одинаково доступен в [.filename]#Makefile# и [.filename]#pkg-plist# как переменная `WWWDIR`, а путь относительно `PREFIX` доступен в [.filename]#Makefile# как `WWWDIR_REL`.
+
+Пользователь и группа процесса веб-сервера доступны как `WWWOWN` и `WWWGRP`, в случае если вам нужно изменить владельца для некоторых файлов. Значением по умолчанию и для владельца, и для группы является `www`. Если вы хотите использовать в вашем порте другие значения, воспользуйтесь для этого нотацией `WWWOWN?= myuser`, чтобы позволить пользователю легко переопределить их.
+
+Не добавляйте зависимость от Apache, если веб-приложение явным образом не нуждается в Apache. Учитывайте, что пользователи могут пожелать запустить ваше веб-приложение на другом веб-сервере помимо Apache.
+
+[[php-variables]]
+=== PHP
+
+.Переменные для портов, использующих PHP
+[cols="1,1", frame="none"]
+|===
+|`USE_PHP`
+|Порт требует PHP. Значение `yes` добавляет зависимость от PHP. Вместо этого может быть указан перечень требуемых расширений PHP. Пример: `pcre xml gettext`
+
+|`DEFAULT_PHP_VER`
+|Выбирает старший номер версии, с которым будет установлен PHP как зависимость в случае, когда PHP еще не установлен. По умолчанию `5`. Возможные значения: `4`, `5`
+
+|`IGNORE_WITH_PHP`
+|Порт не работает с PHP данной версии. Возможные значения: `4`, `5`
+
+|`USE_PHPIZE`
+|Порт будет построен как расширение PHP.
+
+|`USE_PHPEXT`
+|Порт будет считаться расширением PHP, включая установку и регистрацию в реестре расширений.
+
+|`USE_PHP_BUILD`
+|Установить PHP как зависимость времени построения.
+
+|`WANT_PHP_CLI`
+|Хочет CLI (командная строка) версию PHP.
+
+|`WANT_PHP_CGI`
+|Хочет CGI версию PHP.
+
+|`WANT_PHP_MOD`
+|Хочет PHP как модуль Apache.
+
+|`WANT_PHP_SCR`
+|Хочет CLI или CGI версию PHP.
+
+|`WANT_PHP_WEB`
+|Хочет модуль Apache или CGI версию PHP.
+|===
+
+=== Модули PEAR
+
+Портирование модулей PEAR является очень простым процессом.
+
+Используйте переменные `FILES`, `TESTS`, `DATA`, `SQLS`, `SCRIPTFILES`, `DOCS` and `EXAMPLES` для перечисления файлов, которые вы хотите установить. Все перечисленные файлы будут автоматически установлены в подходящие места и добавлены в [.filename]#pkg-plist#.
+
+Подключите [.filename]#${PORTSDIR}/devel/pear/bsd.pear.mk# на последней строке [.filename]#Makefile#.
+
+[[pear-makefile]]
+.Пример Makefile для классов PEAR
+[example]
+====
+[.programlisting]
+....
+PORTNAME= Date
+PORTVERSION= 1.4.3
+CATEGORIES= devel www pear
+
+MAINTAINER= example@domain.com
+COMMENT= PEAR Date and Time Zone Classes
+
+BUILD_DEPENDS= ${PEARDIR}/PEAR.php:${PORTSDIR}/devel/pear-PEAR
+RUN_DEPENDS:= ${BUILD_DEPENDS}
+
+FILES= Date.php Date/Calc.php Date/Human.php Date/Span.php \
+ Date/TimeZone.php
+TESTS= test_calc.php test_date_methods_span.php testunit.php \
+ testunit_date.php testunit_date_span.php wknotest.txt \
+ bug674.php bug727_1.php bug727_2.php bug727_3.php \
+ bug727_4.php bug967.php weeksinmonth_4_monday.txt \
+ weeksinmonth_4_sunday.txt weeksinmonth_rdm_monday.txt \
+ weeksinmonth_rdm_sunday.txt
+DOCS= TODO
+_DOCSDIR= .
+
+.include <bsd.port.pre.mk>
+.include "${PORTSDIR}/devel/pear/bsd.pear.mk"
+.include <bsd.port.post.mk>
+....
+
+====
+
+[[using-python]]
+== Использование Python
+
+Коллекция Портов поддерживает параллельную установку множества версий Python. Следует убедиться, что в портах используется правильный интерпретатор `python` в соответствии с переменной `PYTHON_VERSION`, установленной пользователем. По большей части это означает замену пути к исполняемому файлу `python` в сценариях на значение переменной `PYTHON_CMD`.
+
+Порты, устанавливающие файлы под каталог `PYTHON_SITELIBDIR`, должны использовать префикс вида `pyXY-`, таким образом названия пакетов будут включать в себя версию Python, с которой они установлены.
+
+[.programlisting]
+....
+PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX}
+....
+
+.Переменные для портов, которые используют Python
+[cols="1,1", frame="none"]
+|===
+|`USE_PYTHON`
+|Для этого порта нужен Python. Минимальная требуемая версия может быть указана с таким значением как `2.6+`. Также можно указан диапазон версий с разделением двух версий через -, например: `2.6-2.7`
+
+|`USE_PYDISTUTILS`
+|Использовать дистрибутивные утилиты (distutils) Python для конфигурации, компиляции и установки. Необходимо, если порт использует [.filename]#setup.py#. Переопределяет цели `do-build` и `do-install` и также может переопределять `do-configure`, если не определена `GNU_CONFIGURE`.
+
+|`PYTHON_PKGNAMEPREFIX`
+|Используется как `PKGNAMEPREFIX` для отличия пакетов, использующих разные версии Python. Пример: `py24-`
+
+|`PYTHON_SITELIBDIR`
+|Местонахождение дерева site-packages, которое содержит путь установки Python (обычно, `LOCALBASE`). Переменная `PYTHON_SITELIBDIR` может быть очень полезной при установке модулей Python.
+
+|`PYTHONPREFIX_SITELIBDIR`
+|Вариант PYTHON_SITELIBDIR без PREFIX. По возможности всегда используйте `%%PYTHON_SITELIBDIR%%` в [.filename]#pkg-plist#. Значением по умолчанию для `%%PYTHON_SITELIBDIR%%` является `lib/python%%PYTHON_VERSION%%/site-packages`.
+
+|`PYTHON_CMD`
+|Командная строка интерпретатора Python, включая номер версии.
+
+|`PYNUMERIC`
+|Строка зависимости для расширения numeric.
+
+|`PYNUMPY`
+|Строка зависимости для нового расширения numeric, numpy (PYNUMERIC объявлен устаревшим вышестоящим производителем).
+
+|`PYXML`
+|Строка зависимости для расширения XML (не нужно для Python 2.0 и выше, т.к. включено в основной дистрибутив).
+|===
+
+Полный перечень доступных переменных можно найти в [.filename]#/usr/ports/Mk/bsd.python.mk#.
+
+Некоторые приложения на Python заявляют о поддержке `DESTDIR` (требуется для staging), которая не работает (в частности, у Mailman до версии 2.1.16). Ограничение можно обойти путём перекомпиляции сценариев. Например, это можно выполнить в цели `post-build`. С учётом того, что после установки предполагаемое место размещения сценариев Python будет находиться в `PYTHONPREFIX_SITELIBDIR`, можно применить следующее решение:
+
+[.programlisting]
+....
+(cd ${STAGEDIR}${PREFIX} \
+ && ${PYTHON_CMD} ${PYTHON_LIBDIR}/compileall.py \
+ -d ${PREFIX} -f ${PYTHONPREFIX_SITELIBDIR:S;${PREFIX}/;;})
+....
+
+Эта команда перекомпилирует исходный текст с заменой путей на относительные к каталогу сборки, а также дописывает значение `PREFIX` перед именем файла, записанного в выходном файле с промежуточным представлением, с использованием `-d`. `-f` требуется для безусловной перекомпиляции, `:S;${PREFIX}/;;` удаляет префиксы из значения переменной `PYTHONPREFIX_SITELIBDIR`, чтобы сделать его относительным к `PREFIX`.
+
+Для этого требуется Python 2.7 или выше. Это не работает с Python 2.6.
+
+[[using-tcl]]
+== Использование Tcl/Tk
+
+В Коллекции Портов поддерживается одновременная установка множественных версий Tcl/Tk. Порты должны пытаться поддерживать по крайней мере версию Tcl/Tk, используемую по умолчанию, и выше с помощью переменных `USE_TCL` и `USE_TK`. Желаемую версию `tcl` можно указать в переменной `WITH_TCL_VER`.
+
+.Наиболее востребованные переменные для портов, которые используют Tcl/Tk
+[cols="1,1", frame="none"]
+|===
+|`USE_TCL`
+|Порт зависит от библиотеки Tcl (не оболочки). Минимальную требуемую версию можно указать с использованием таких значений, как 84+. Отдельные неподдерживаемые версии указываются в переменной `INVALID_TCL_VER`.
+
+|`USE_TCL_BUILD`
+|Tcl нужен для порта только на время сборки.
+
+|`USE_TCL_WRAPPER`
+|Эту новую переменную следует использовать для портов, для которых требуется оболочка Tcl и не требуется конкретная версия `tclsh`. Обертка `tclsh` устанавливается в систему. Пользователь может указать желаемую оболочку `tcl` для использования.
+
+|`WITH_TCL_VER`
+|Определяемые пользователем переменные, которые устанавливают желаемую версию Tcl.
+
+|`UNIQUENAME_WITH_TCL_VER`
+|Подобно `WITH_TCL_VER`, но для каждого порта.
+
+|`USE_TCL_THREADS`
+|Требует многопоточную сборку Tcl/Tk.
+
+|`USE_TK`
+|Порт зависит от библиотеки Tk (не от предпочитаемой оболочки). Подразумевает `USE_TCL` с тем же значением. Для большей информации смотрите описание переменной `USE_TCL`.
+
+|`USE_TK_BUILD`
+|Аналогично `USE_TCL_BUILD`.
+
+|`USE_TK_WRAPPER`
+|Аналогично `USE_TCL_WRAPPER`.
+
+|`WITH_TK_VER`
+|Аналогично `WITH_TCL_VER`, подразумевает `WITH_TCL_VER` той же версии.
+|===
+
+Полный перечень доступных переменных находится в [.filename]#/usr/ports/Mk/bsd.tcl.mk#.
+
+[[using-emacs]]
+== Использование Emacs
+
+Этот раздел ещё предстоит написать.
+
+[[using-ruby]]
+== Использование Ruby
+
+.Полезные переменные для портов, использующих Ruby
+[cols="1,1", frame="none", options="header"]
+|===
+| Переменная
+| Описание
+
+|`USE_RUBY`
+|Порт требует Ruby.
+
+|`USE_RUBY_EXTCONF`
+|Порт использует для конфигурации [.filename]#extconf.rb#.
+
+|`USE_RUBY_SETUP`
+|Порт использует для конфигурации [.filename]#setup.rb#.
+
+|`RUBY_SETUP`
+|Устанавливает альтернативное имя для [.filename]#setup.rb#. Распространенным значением является [.filename]#install.rb#.
+|===
+
+Следующая таблица отражает некоторые переменные, доступные авторам портов через инфраструктуру портов. Эти переменные должны использоваться для установки файлов в правильное месторасположение. Используйте их в [.filename]#pkg-plist# как можно больше. Эти переменные не должны переопределяться в самом порте.
+
+.Отобранные переменные только для чтения для портов, использующих Ruby
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Переменная
+| Описание
+| Примерное значение
+
+|`RUBY_PKGNAMEPREFIX`
+|Используется как `PKGNAMEPREFIX` для различия пакетов от разных версий Ruby.
+|`ruby18-`
+
+|`RUBY_VERSION`
+|Полная версия Ruby в форме `x.y.z`.
+|`1.8.2`
+
+|`RUBY_SITELIBDIR`
+|Путь для установки архитектуронезависимых библиотек.
+|`/usr/local/lib/ruby/site_ruby/1.8`
+
+|`RUBY_SITEARCHLIBDIR`
+|Путь для установки архитектурозависимых библиотек.
+|`/usr/local/lib/ruby/site_ruby/1.8/amd64-freebsd6`
+
+|`RUBY_MODDOCDIR`
+|Путь для установки документации модуля.
+|`/usr/local/shared/doc/ruby18/patsy`
+
+|`RUBY_MODEXAMPLESDIR`
+|Путь для установки примеров модуля.
+|`/usr/local/shared/examples/ruby18/patsy`
+|===
+
+Полный перечень доступных переменных находится в [.filename]#/usr/ports/Mk/bsd.ruby.mk#.
+
+[[using-sdl]]
+== Использование SDL
+
+Переменная `USE_SDL` используется для автоматической настройки зависимостей для портов, использующих библиотеки на основе SDL, такие как package:devel/sdl12[] или package:graphics/sdl_image[].
+
+Для версии 1.2 на данный момент распознаются следующие SDL-библиотеки:
+
+* sdl: package:devel/sdl12[]
+* console: package:devel/sdl_console[]
+* gfx: package:graphics/sdl_gfx[]
+* image: package:graphics/sdl_image[]
+* mixer: package:audio/sdl_mixer[]
+* mm: package:devel/sdlmm[]
+* net: package:net/sdl_net[]
+* pango: package:x11-toolkits/sdl_pango[]
+* sound: package:audio/sdl_sound[]
+* ttf: package:graphics/sdl_ttf[]
+
+Для версии 2.0 на данный момент распознаются следующие SDL-библиотеки:
+
+* sdl: package:devel/sdl20[]
+* gfx: package:graphics/sdl2_gfx[]
+* image: package:graphics/sdl2_image[]
+* mixer: package:audio/sdl2_mixer[]
+* net: package:net/sdl2_net[]
+* ttf: package:graphics/sdl2_ttf[]
+
+Таким образом, если порт имеет зависимость от package:net/sdl_net[] и package:audio/sdl_mixer[], то строка будет следующей:
+
+[.programlisting]
+....
+USE_SDL= net mixer
+....
+
+Зависимость от порта package:devel/sdl12[], который требуется для package:net/sdl_net[] и package:audio/sdl_mixer[], будет также автоматически добавлен.
+
+Если вы используете `USE_SDL` с элементами SDL 1.2, то он автоматически:
+
+* Добавляет зависимость от sdl12-config к `BUILD_DEPENDS`
+* Добавляет переменную `SDL_CONFIG` к `CONFIGURE_ENV`
+* Добавляет зависимости от указанных библиотек к `LIB_DEPENDS`
+
+Если вы используете `USE_SDL` с элементами SDL 2.0, то он автоматически:
+
+* Добавляет зависимость от sdl2-config к `BUILD_DEPENDS`
+* Добавляет переменную `SDL2_CONFIG` к `CONFIGURE_ENV`
+* Добавляет зависимости от указанных библиотек к `LIB_DEPENDS`
+
+Для проверки наличия библиотеки SDL вы можете делать это при помощи переменной `WANT_SDL`:
+
+[.programlisting]
+....
+WANT_SDL= yes
+
+.include <bsd.port.pre.mk>
+
+.if ${HAVE_SDL:Mmixer}!=""
+USE_SDL+= mixer
+.endif
+
+.include <bsd.port.post.mk>
+....
+
+[[using-wx]]
+== Использование wxWidgets
+
+Эта глава описывает статус библиотек wxWidgets в дереве портов и их интеграцию с системой портов.
+
+[[wx-introduction]]
+=== Введение
+
+Существует множество версий библиотек wxWidgets, конфликтующих между собой (устанавливают файлы под тем же именем). В дереве портов эта проблема решена путем установки каждой версии под собственным названием с использованием номера версии в качестве суффикса.
+
+Очевидным недостатком этого является необходимость изменения каждого приложения для нахождения искомой версии. К счастью, большинство приложений для определения нужного компилятора и флагов компоновки вызывают сценарий `wx-config`. Для каждой доступной версии этот сценарий имеет своё имя. Большинство приложений учитывают переменную окружения или принимают аргумент configure для указания, какой сценарий `wx-config` следует вызывать. На все остальные приходится накладывать патч.
+
+[[wx-version]]
+=== Выбор версии
+
+Для того, чтобы заставить ваш порт использовать конкретную версию wxWidgets, существует две доступные для определения переменные (если определена только одна, то вторая примет значение по умолчанию):
+
+[[wx-ver-sel-table]]
+.Переменные для выбора версии wxWidgets
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Переменная
+| Описание
+| Значение по умолчанию
+
+|`USE_WX`
+|Перечень версий, которые порт может использовать
+|Все доступные версии
+
+|`USE_WX_NOT`
+|Перечень версий, которые порт не может использовать
+|Нет
+|===
+
+Перечень доступных версий wxWidgets и соответствующих им портов в дереве:
+
+.Доступные версии wxWidgets
+[cols="1,1", frame="none", options="header"]
+|===
+| Версия
+| Порт
+
+|`2.4`
+|package:x11-toolkits/wxgtk24[]
+
+|`2.6`
+|package:x11-toolkits/wxgtk26[]
+
+|`2.8`
+|package:x11-toolkits/wxgtk28[]
+|===
+
+[NOTE]
+====
+Версии начиная с `2.5` также поставляются с Unicode и устанавливается подчиненным портом с названием как как у обычного, но с суффиксом `-unicode`, но этим можно управлять при помощи переменных (смотрите <<wx-unicode>>).
+====
+
+Переменные в <<wx-ver-sel-table>> можно установить в одну или более следующих комбинаций, разделенных пробелами:
+
+.Определение версии для wxWidgets
+[cols="1,1", frame="none", options="header"]
+|===
+| Описание
+| Пример
+
+|Единичная версия
+|`2.4`
+
+|Восходящий диапазон
+|`2.4+`
+
+|Нисходящий диапазон
+|`2.6-`
+
+|Полный диапазон (обязан быть восходящим)
+|`2.4-2.6`
+|===
+
+Кроме того, существует несколько переменных для выбора предпочитаемых версий из перечня доступных. Они могут быть установлены в несколько версий, первая из которых будет иметь наибольший приоритет.
+
+.Переменные для выбора предпочитаемых версий wxWidgets
+[cols="1,1", frame="none", options="header"]
+|===
+| Название
+| Предназначение
+
+|`WANT_WX_VER`
+|порт
+
+|`WITH_WX_VER`
+|пользователь
+|===
+
+[[wx-components]]
+=== Выбор компонентов
+
+Существуют другие приложения, которые, хотя и не являются библиотеками wxWidgets, но в тоже время относятся к ним. Эти приложения можно указать в переменной `WX_COMPS`. Доступны следующие компоненты:
+
+.Доступные компоненты wxWidgets
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Название
+| Описание
+| Ограничение версии
+
+|`wx`
+|основная библиотека
+|нет
+
+|`contrib`
+|сторонние библиотеки
+|`нет`
+
+|`python`
+|wxPython (привязки к Python)
+|`2.4-2.6`
+
+|`mozilla`
+|wxMozilla
+|`2.4`
+
+|`svg`
+|wxSVG
+|`2.6`
+|===
+
+Тип добавляемой зависимости при выборе каждого компонента может быть указан вручную путем добавления суффикса, отделенного точкой с запятой. Если таковой отсутствует, но будет использовано значение по умолчанию (смотрите <<wx-def-dep-types>>). Доступные типы зависимости:
+
+.Доступные типы зависимости wxWidgets
+[cols="1,1", frame="none", options="header"]
+|===
+| Название
+| Описание
+
+|`build`
+|Компонент требуется для построения, эквивалентен `BUILD_DEPENDS`
+
+|`run`
+|Компонент требуется для запуска, эквивалентен `RUN_DEPENDS`
+
+|`lib`
+|Компонент требуется для построения и запуска, эквивалентен `LIB_DEPENDS`
+|===
+
+Значения по умолчанию для компонентов подробно рассматриваются в следующей таблице:
+
+[[wx-def-dep-types]]
+.Типы зависимости wxWidgets, используемые по умолчанию
+[cols="1,1", frame="none", options="header"]
+|===
+| Компонент
+| Тип зависимости
+
+|`wx`
+|`lib`
+
+|`contrib`
+|`lib`
+
+|`python`
+|`run`
+
+|`mozilla`
+|`lib`
+
+|`svg`
+|`lib`
+|===
+
+[[wx-components-example]]
+.Выбор компонентов wxWidgets
+[example]
+====
+Следующий фрагмент относится к порту, в котором используется wxWidgets версии `2.4` с его сторонними библиотеками.
+
+[.programlisting]
+....
+USE_WX= 2.4
+WX_COMPS= wx contrib
+....
+
+====
+
+[[wx-unicode]]
+=== Unicode
+
+Библиотека wxWidgets поддерживает Unicode начиная с версии `2.5`. В дереве портов доступны обе версии и могут быть выбраны с использованием следующих переменных:
+[[wx-unicode-var-table]]
+.Переменные для выбора версии wxWidgets с Unicode
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Переменная
+| Описание
+| Предназначение
+
+|`WX_UNICODE`
+|Порт работает _только_ с версией Unicode
+|порт
+
+|`WANT_UNICODE`
+|Порт работает с обеими версиями, но предпочитает версию с Unicode
+|порт
+
+|`WITH_UNICODE`
+|Порт будет использовать версию Unicode
+|пользователь
+
+|`WITHOUT_UNICODE`
+|Порт будет использовать обычную версию, если это поддерживается (когда `WX_UNICODE` не определена)
+|пользователь
+|===
+
+[WARNING]
+====
+
+Не используйте `WX_UNICODE` для портов, которые могут использовать обе версии. Если вы хотите, чтобы порт по умолчанию использовал Unicode, определите вместо этого `WANT_UNICODE`.
+====
+
+[[wx-version-detection]]
+=== Обнаружение установленных версий
+
+Для обнаружения установленной версии вам необходимо задать переменную `WANT_WX`. Если вы не присвоите ей определенную версию, то компоненты получат суффикс версии. Переменная `HAVE_WX` будет заполнена после обнаружения.
+
+[[wx-ver-det-example]]
+.Обнаружение установленных версий и компонентов wxWidgets
+[example]
+====
+Следующий фрагмент может быть использован в порту, который использует wxWidgets, в случае если он установлен или выбран соответствующий параметр.
+
+[.programlisting]
+....
+WANT_WX= yes
+
+.include <bsd.port.pre.mk>
+
+.if defined(WITH_WX) || !empty(PORT_OPTIONS:MWX) || !empty(HAVE_WX:Mwx-2.4)
+USE_WX= 2.4
+CONFIGURE_ARGS+= --enable-wx
+.endif
+....
+
+Следующий фрагмент может быть использован в порту, который задействует поддержку wxPython, в случае если он установлен или выбран соответствующий параметр, в дополнение к wxWidgets, обе версии `2.6`.
+
+[.programlisting]
+....
+USE_WX= 2.6
+WX_COMPS= wx
+WANT_WX= 2.6
+
+.include <bsd.port.pre.mk>
+
+.if defined(WITH_WXPYTHON) || !empty(PORT_OPTIONS:MWXPYTHON) || !empty(HAVE_WX:Mpython)
+WX_COMPS+= python
+CONFIGURE_ARGS+= --enable-wxpython
+.endif
+....
+
+====
+
+[[wx-defined-variables]]
+=== Переменные для определения
+
+Следующие переменные доступны в порту (после определения одной из переменных из <<wx-ver-sel-table>>).
+
+.Переменные, определенные для портов, использующих wxWidgets
+[cols="1,1", frame="none", options="header"]
+|===
+| Название
+| Описание
+
+|`WX_CONFIG`
+|Путь к сценарию wxWidgets `wx-config` (с другим именем)
+
+|`WXRC_CMD`
+|Путь к программе wxWidgets `wxrc` (с другим именем)
+
+|`WX_VERSION`
+|Версия wxWidgets, которая будет использоваться (например, `2.6`)
+
+|`WX_UNICODE`
+|Если не определена, но Unicode будет использоваться, то она будет определена
+|===
+
+[[wx-premk]]
+=== Обработка в [.filename]#bsd.port.pre.mk#
+
+Если вам нужно использовать переменные для запуска команд сразу после подключения [.filename]#bsd.port.pre.mk#, то вам нужно определить `WX_PREMK`.
+
+[IMPORTANT]
+====
+Если вы определите `WX_PREMK`, то версия, зависимости, компоненты и заданные переменные не изменяться, в случае вы изменили переменные порта wxWidgets после подключения [.filename]#bsd.port.pre.mk#.
+====
+
+[[wx-premk-example]]
+.Использование переменных wxWidgets в командах
+[example]
+====
+Следующий фрагмент иллюстрирует использование переменной `WX_PREMK` посредством запуска сценария `wx-config` для получения строки с полной версией с присвоением ее переменной и передачей в программу.
+
+[.programlisting]
+....
+USE_WX= 2.4
+WX_PREMK= yes
+
+.include <bsd.port.pre.mk>
+
+.if exists(${WX_CONFIG})
+VER_STR!= ${WX_CONFIG} --release
+
+PLIST_SUB+= VERSION="${VER_STR}"
+.endif
+....
+
+====
+
+[NOTE]
+====
+Переменные wxWidgets можно безопасно использовать в командах внутри целей без необходимости в использовании `WX_PREMK`.
+====
+
+[[wx-additional-config-args]]
+=== Дополнительные параметры `configure`
+
+Некоторые сценарии GNU `configure` не могут найти wxWidgets только с установленной переменной окружения `WX_CONFIG`, требуя дополнительные параметры. Для их передачи можно использовать переменную `WX_CONF_ARGS`.
+
+.Допустимые значения `WX_CONF_ARGS`
+[cols="1,1", frame="none", options="header"]
+|===
+| Возможное значение
+| Получаемый параметр
+
+|`absolute`
+|`--with-wx-config=${WX_CONFIG}`
+
+|`relative`
+|`--with-wx=${LOCALBASE} --with-wx-config=${WX_CONFIG:T}`
+|===
+
+[[using-lua]]
+== Использование Lua
+
+Эта глава описывает статус библиотек Lua в дереве портов и их интеграцию в систему портов.
+
+[[lua-introduction]]
+=== Введение
+
+Существует множество версий библиотек Lua и соответствующих интерпретаторов, конфликтующих между собой (устанавливают файлы под тем же именем). В дереве портов эта проблема решена путем установки каждой версии в собственное место с использованием номера версии в качестве суффикса.
+
+Очевидным недостатком этого является необходимость изменения каждого приложения для нахождения искомой версии. Но это решается добавлением некоторых дополнительных флагов для компилятора и компоновщика.
+
+[[lua-version]]
+=== Выбор версии
+
+Для того, чтобы заставить ваш порт использовать конкретную версию Lua, существует две доступные для определения переменные (если определена только одна, то вторая примет значение по умолчанию):
+
+[[lua-ver-sel-table]]
+.Переменные для выбора версии Lua
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Переменная
+| Описание
+| Значение по умолчанию
+
+|`USE_LUA`
+|Перечень версий, которые порт может использовать
+|Все доступные версии
+
+|`USE_LUA_NOT`
+|Перечень версий, которые порт не может использовать
+|Пусто
+|===
+
+Перечень доступных версий Lua и соответствующих портов в дереве:
+
+.Доступные версии Lua
+[cols="1,1", frame="none", options="header"]
+|===
+| Версия
+| Порт
+
+|`4.0`
+|package:lang/lua4[]
+
+|`5.0`
+|package:lang/lua50[]
+
+|`5.1`
+|package:lang/lua[]
+|===
+
+Переменные из <<lua-ver-sel-table>> могут иметь комбинации из одного или нескольких значений, разделенных пробелом:
+
+.Определение версии Lua
+[cols="1,1", frame="none", options="header"]
+|===
+| Описание
+| Пример
+
+|Единичная версия
+|`4.0`
+
+|Восходящий диапазон
+|`5.0+`
+
+|Нисходящий диапазон
+|`5.0-`
+
+|Полный диапазон (обязан быть восходящим)
+|`5.0-5.1`
+|===
+
+Кроме того, существует несколько переменных для выбора предпочитаемых версий из перечня доступных. Они могут быть установлены в несколько версий, первая из которых будет иметь наибольший приоритет.
+
+.Переменные для выбора предпочитаемых версий Lua
+[cols="1,1", frame="none", options="header"]
+|===
+| Название
+| Предназначение
+
+|`WANT_LUA_VER`
+|порт
+
+|`WITH_LUA_VER`
+|пользователь
+|===
+
+[[lua-version-example]]
+.Выбор версии Lua
+[example]
+====
+Следующий фрагмент взят из порта, который использует Lua версий `5.0` или `5.1`, по умолчанию `5.0`. Значение может быть переопределено пользователем с использованием переменной `WITH_LUA_VER`.
+
+[.programlisting]
+....
+USE_LUA= 5.0-5.1
+WANT_LUA_VER= 5.0
+....
+
+====
+
+[[lua-components]]
+=== Выбор компонентов
+
+Существуют другие приложения, которые хотя и не являются библиотеками Lua, но относятся к ним. Эти приложения можно указать в переменной `LUA_COMPS`. Доступны следующие компоненты:
+
+.Доступные компоненты Lua
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Название
+| Описание
+| Ограничение версии
+
+|`lua`
+|Основная библиотека
+|нет
+
+|`tolua`
+|Библиотека доступа к коду C/C++
+|4.0-5.0
+
+|`ruby`
+|Привязка к Ruby
+|4.0-5.0
+|===
+
+[NOTE]
+====
+Есть и другие компоненты, но они относятся к модулям для интерпретатора и не используются приложениями (только другими модулями).
+====
+
+Тип зависимости можно выбрать для каждого компонента через добавление суффикса, отделенного точкой с запятой. В случае отсутствия будет использован тип по умолчанию (смотрите <<lua-def-dep-types>>). Доступные следующие типы:
+
+.Доступные типы зависимости Lua
+[cols="1,1", frame="none", options="header"]
+|===
+| Название
+| Описание
+
+|`build`
+|Компонент требуется для построения, эквивалентен `BUILD_DEPENDS`
+
+|`run`
+|Компонент требуется для запуска, эквивалентен `RUN_DEPENDS`
+
+|`lib`
+|Компонент требуется для построения и запуска, эквивалентен `LIB_DEPENDS`
+|===
+
+Значения по умолчанию для компонентов подробно рассматриваются в следующей таблице:
+
+[[lua-def-dep-types]]
+.Типы зависимости Lua, используемые по умолчанию
+[cols="1,1", frame="none", options="header"]
+|===
+| Компонент
+| Тип зависимости
+
+|`lua`
+|`lib` для `4.0-5.0` (динамическая) и `build` для `5.1` (статическая)
+
+|`tolua`
+|`build` (статическая)
+
+|`ruby`
+|`lib` (динамическая)
+|===
+
+[[lua-components-example]]
+.Выбор компонентов Lua
+[example]
+====
+Следующий фрагмент соответствует порту, использующему Lua версии `4.0` и привязку к Ruby.
+
+[.programlisting]
+....
+USE_LUA= 4.0
+LUA_COMPS= lua ruby
+....
+
+====
+
+[[lua-version-detection]]
+=== Обнаружение установленных версий
+
+Для обнаружения установленной версии вам необходимо задать переменную `WANT_LUA`. Если вы не присвоите ей определенную версию, то компоненты получат суффикс версии. Переменная `HAVE_LUA` будет заполнена после обнаружения.
+
+[[lua-ver-det-example]]
+.Обнаружение установленных версий и компонентов Lua
+[example]
+====
+Следующий фрагмент можно использовать для порта, использующего Lua, если она установлена, или был выбран соответствующий параметр.
+
+[.programlisting]
+....
+WANT_LUA= yes
+
+.include <bsd.port.pre.mk>
+
+.if defined(WITH_LUA5) || !empty(PORT_OPTIONS:MLUA5) || !empty(HAVE_LUA:Mlua-5.[01])
+USE_LUA= 5.0-5.1
+CONFIGURE_ARGS+= --enable-lua5
+.endif
+....
+
+Следующий фрагмент можно использовать для порта, который включает поддержку tolua, если такой компонент установлен, или был выбран соответствующий параметр в дополнение к Lua, оба имеют версию `4.0`.
+
+[.programlisting]
+....
+USE_LUA= 4.0
+LUA_COMPS= lua
+WANT_LUA= 4.0
+
+.include <bsd.port.pre.mk>
+
+.if defined(WITH_TOLUA) || !empty(PORT_OPTIONS:MTOLUA) || !empty(HAVE_LUA:Mtolua)
+LUA_COMPS+= tolua
+CONFIGURE_ARGS+= --enable-tolua
+.endif
+....
+
+====
+
+[[lua-defined-variables]]
+=== Переменные для определения
+
+Следующие переменные доступны в порту (после определения одной из переменных из <<lua-ver-sel-table>>).
+
+.Переменные, определенные для портов, использующих Lua
+[cols="1,1", frame="none", options="header"]
+|===
+| Название
+| Описание
+
+|`LUA_VER`
+|Версия Lua, которая будет использоваться (например, `5.1`)
+
+|`LUA_VER_SH`
+|Старший номер версии динамической библиотеки Lua (например, `1`)
+
+|`LUA_VER_STR`
+|Версия Lua без точки (например, `51`)
+
+|`LUA_PREFIX`
+|Префикс, в который установлена Lua (и компоненты)
+
+|`LUA_SUBDIR`
+|Каталог под [.filename]#${PREFIX}/bin#, [.filename]#${PREFIX}/share# и [.filename]#${PREFIX}/lib#, в который установлена Lua
+
+|`LUA_INCDIR`
+|Каталог, в который установлены заголовочные файлы Lua и tolua
+
+|`LUA_LIBDIR`
+|Каталог, в который установлены библиотеки Lua и tolua
+
+|`LUA_MODLIBDIR`
+|Каталог, в который установлены модули библиотеки Lua ([.filename]#.so#)
+
+|`LUA_MODSHAREDIR`
+|Каталог, в который установлены модули Lua ([.filename]#.lua#)
+
+|`LUA_PKGNAMEPREFIX`
+|Префикс с именем пакета, используемый модулями Lua
+
+|`LUA_CMD`
+|Путь к интерпретатору Lua
+
+|`LUAC_CMD`
+|Путь к компилятору Lua
+
+|`TOLUA_CMD`
+|Путь к программе tolua
+|===
+
+[[lua-variables-example]]
+.Указание для порта, где искать Lua
+[example]
+====
+Следующий фрагмент показывает, как сообщить порту, который использует сценарий configure, где расположены заголовочные файлы и библиотеки Lua.
+
+[.programlisting]
+....
+USE_LUA= 4.0
+GNU_CONFIGURE= yes
+CONFIGURE_ENV= CPPFLAGS="-I${LUA_INCDIR}" LDFLAGS="-L${LUA_LIBDIR}"
+....
+
+====
+
+[[lua-premk]]
+=== Обработка в [.filename]#bsd.port.pre.mk#
+
+Если вам нужно использовать переменные для запуска команд сразу после подключения [.filename]#bsd.port.pre.mk#, для этого вам нужно определить переменную `LUA_PREMK`.
+
+[IMPORTANT]
+====
+Если вы задаете `LUA_PREMK`, то версия, зависимости, компоненты и уже заданные переменные не будут изменены, в случае если вы изменили переменные порта Lua после подключения [.filename]#bsd.port.pre.mk#.
+====
+
+[[lua-premk-example]]
+.Использование переменных Lua в командах
+[example]
+====
+Следующий фрагмент иллюстрирует использование `LUA_PREMK` посредством запуска интерпретатора Lua для того, чтобы получить строку с полной версией, сохранить ее в переменную и передать программе.
+
+[.programlisting]
+....
+USE_LUA= 5.0
+LUA_PREMK= yes
+
+.include <bsd.port.pre.mk>
+
+.if exists(${LUA_CMD})
+VER_STR!= ${LUA_CMD} -v
+
+CFLAGS+= -DLUA_VERSION_STRING="${VER_STR}"
+.endif
+....
+
+====
+
+[NOTE]
+====
+Переменные Lua можно безопасно использовать в командах внутри целей без необходимости в использовании `LUA_PREMK`.
+====
+
+[[using-iconv]]
+== Использование `iconv`
+
+После 10-08-2013 (link:https://svnweb.freebsd.org/changeset/base/254273[r254273]) в составе FreeBSD 10-CURRENT и более новых версий имеется собственный `iconv`. В более ранних версиях дополнительной зависимостью выступал package:converters/libiconv[].
+
+Для программного обеспечения, которому нужен `iconv`, определите `USES=iconv`. Версии FreeBSD до 10-CURRENT от 13-08-2013 (link:https://svnweb.freebsd.org/changeset/base/254273[r254273]) не имеют собственного `iconv`. На этих более ранных версиях будет автоматически добавлена зависимость от package:converters/libiconv[].
+
+Когда порт задаёт `USES=iconv`, становятся доступными следующие переменные:
+
+[.informaltable]
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Имя переменной
+| Назначение
+| Значение до FreeBSD 10-CURRENT 254273 (13-08-2013)
+| Значение после FreeBSD 10-CURRENT 254273 (13-08-2013)
+
+|`ICONV_CMD`
+|Каталог размещения двоичного файла `iconv`
+|`${LOCALBASE}/bin/iconv`
+|[.filename]#/usr/bin/iconv#
+
+|`ICONV_LIB`
+|Аргумент `ld` для компоновки с [.filename]#libiconv# (если нужно)
+|`-liconv`
+|(пусто)
+
+|`ICONV_PREFIX`
+|Каталог размещения реализации `iconv` (используется для сценариев конфигурации)
+|`${LOCALBASE}`
+|[.filename]#/usr#
+
+|`ICONV_CONFIGURE_ARG`
+|Параметр предварительно собранной конфигурации для сценариев конфигурации
+|`--with-libiconv-prefix=${LOCALBASE}`
+|(пусто)
+
+|`ICONV_CONFIGURE_BASE`
+|Параметр предварительно собранной конфигурации для сценариев конфигурации
+|`--with-libiconv=${LOCALBASE}`
+|(пусто)
+|===
+
+В следующих двух примерах демонстрируется автоматическое присвоение переменным правильных значений для систем, использующих package:converters/libiconv[] или собственный `iconv`.
+
+[[iconv-simple-use]]
+.Простое использование `iconv`
+[example]
+====
+[.programlisting]
+....
+USES= iconv
+LDFLAGS+= -L${LOCALBASE}/lib ${ICONV_LIB}
+....
+
+====
+
+[[iconv-configure-use]]
+.Использование `iconv` с `configure`
+[example]
+====
+[.programlisting]
+....
+USES= iconv
+CONFIGURE_ARGS+=${ICONV_CONFIGURE_ARG}
+....
+
+====
+
+Как показано выше, `ICONV_LIB` имеет пустое значение с собственным `iconv`. Эту особенность можно использовать для обнаружения собственного `iconv` с соответствующими действиями.
+
+Иногда в программе параметр `ld` или путь поиска жёстко заданы в [.filename]#Makefile# или сценарии конфигурации. Для решения этой проблемы можно использовать следующий подход:
+
+[[iconv-reinplace]]
+.Исправление жёстко заданного `-liconv`
+[example]
+====
+[.programlisting]
+....
+USES= iconv
+
+post-patch:
+ @${REINPLACE_CMD} -e 's/-liconv/${ICONV_LIB}/' ${WRKSRC}/Makefile
+....
+
+====
+
+В некоторых случаях необходимо установить альтернативные значения или выполнить операции в случае использования собственного `iconv`. Перед проверкой значения `ICONV_LIB` обязан быть подключён [.filename]#bsd.port.pre.mk#:
+
+[[iconv-conditional]]
+.Проверка доступности собственного `iconv`
+[example]
+====
+[.programlisting]
+....
+USES= iconv
+
+.include <bsd.port.pre.mk>
+
+post-patch:
+.if empty(ICONV_LIB)
+ # обнаружен собственный iconv
+ @${REINPLACE_CMD} -e 's|iconv||' ${WRKSRC}/Config.sh
+.endif
+
+.include <bsd.port.post.mk>
+....
+
+====
+
+[[using-xfce]]
+== Использование Xfce
+
+Переменная `USE_XFCE` используется для автоматической конфигурации зависимостей для портов, использующих библиотеки или приложения на основе Xfce, такие как package:x11-toolkits/libxfce4gui[] и package:x11-wm/xfce4-panel[].
+
+В настоящее время распознаются следующие библиотеки и приложения Xfce:
+
+* libexo: package:x11/libexo[]
+* libgui: package:x11-toolkits/libxfce4gui[]
+* libutil: package:x11/libxfce4util[]
+* libmcs: package:x11/libxfce4mcs[]
+* mcsmanager: package:sysutils/xfce4-mcs-manager[]
+* panel: package:x11-wm/xfce4-panel[]
+* thunar: package:x11-fm/thunar[]
+* wm: package:x11-wm/xfce4-wm[]
+* xfdev: package:dev/xfce4-dev-tools[]
+
+Распознаются следующие дополнительные параметры:
+
+* configenv: Используйте, если ваш порт требует специально измененного значения `CONFIGURE_ENV` для поиска требуемых для порта библиотек.
++
+[.programlisting]
+....
+-I${LOCALBASE}/include -L${LOCALBASE}/lib
+....
+
++
+добавляется в CPPFLAGS к `CONFIGURE_ENV`.
+
+Следовательно, если у порта имеется зависимость от package:sysutils/xfce4-mcs-manager[], и порт требует специальных CPPFLAGS в своем окружении configure, то синтаксис будет следующим:
+
+[.programlisting]
+....
+USE_XFCE= mcsmanager configenv
+....
+
+[[using-mozilla]]
+== Использование Mozilla
+
+.Переменные для портов, использующих Mozilla
+[cols="1,1", frame="none"]
+|===
+|`USE_GECKO`
+|Один из бэкэндов Gecko, с которым может работать порт. Возможные значения: `libxul` ([.filename]#libxul.so#), `seamonkey` ([.filename]#libgtkembedmoz.so#, устаревший, больше не должен использоваться).
+
+|`USE_FIREFOX`
+|Для запуска порта требуется Firefox. Возможные значения: `yes` (версия по умолчанию), `40`, `36`, `35`. По умолчанию устанавливает зависимость от версии `40`.
+
+|`USE_FIREFOX_BUILD`
+|Для построения порта требуется Firefox. Возможные значения: смотрите USE_FIREFOX. Автоматически устанавливает USE_FIREFOX с присвоением того же значения.
+
+|`USE_SEAMONKEY`
+|Для запуска порта требуется SeaMonkey. Возможные значения: `yes` (версия по умолчанию), `20`, `11` (устарело, больше не должно использоваться). По умолчанию устанавливает зависимость от версии `20`.
+
+|`USE_SEAMONKEY_BUILD`
+|Для построения порта требуется SeaMonkey. Возможные значения: смотрите USE_SEAMONKEY. Автоматически устанавливает USE_SEAMONKEY с присвоением того же значения.
+
+|`USE_THUNDERBIRD`
+|Для запуска порта требуется Thunderbird. Возможные значения: `yes` (версия по умолчанию), `31`, `30` (устарело, больше не должно использоваться). По умолчанию устанавливает зависимость от версии `31`.
+
+|`USE_THUNDERBIRD_BUILD`
+|Для построения порта требуется Thunderbird. Возможные значения: смотрите USE_THUNDERBIRD. Автоматически устанавливает USE_THUNDERBIRD с присвоением того же значения.
+|===
+
+Полный перечень доступных переменных можно получить в файле [.filename]#/usr/ports/Mk/bsd.gecko.mk#.
+
+[[using-databases]]
+== Использование баз данных
+
+.Переменные для портов, использующих базы данных
+[cols="1,1", frame="none", options="header"]
+|===
+| Переменная
+| Значение
+
+|`USE_BDB`
+|Если переменная установлена в `yes`, добавляет зависимость от порта package:databases/db41[]. Также переменной можно присвоить значения: 2, 3, 40, 41, 42, 43, 44, 46, 47, 48 или 51. Вы можете объявить диапазон принимаемых значений, `USE_BDB`=42+ будет искать установленную версию с наибольшим номером, и, если ничего не установлено, вернется к 42.
+
+|`USE_MYSQL`
+|Если переменная установлена в `yes`, добавляет зависимость от порта package:databases/mysql55-client[]. Как связанная переменная, `WANT_MYSQL_VER` может быть установлена в значение 323, 40, 41, 50, 51, 52, 55 или 60.
+
+|`USE_PGSQL`
+|Если установлена в `yes`, добавляет зависимость от порта package:databases/postgresql90-client[]. Как связанная переменная, `WANT_PGSQL_VER` может быть установлена в значение 83, 84, 90, 91 или 92. Вы можете указать максимальное и минимальное значения; `WANT_PGSQL_VER=90+` сделает порт зависимым от минимальной версии 9.0.
+
+|`USE_SQLITE`
+|Если переменная имеет значение `yes`, добавляет зависимость от порта package:databases/sqlite3[]. Переменная может принимать значения: 3, 2.
+|===
+
+Подробнее смотрите в http://svnweb.FreeBSD.org/ports/head/Mk/bsd.database.mk?view=markup[bsd.database.mk].
+
+[[rc-scripts]]
+== Запуск и остановка служб (сценарии `rc`)
+
+Сценарии [.filename]#rc.d# используются для запуска служб при запуске системы и дают администратору стандартный способ остановки, запуска и перезапуска службы. Порты интегрируются в системную инфраструктуру [.filename]#rc.d#. Подробности по её использованию можно найти в link:{handbook}#configtuning-rcd/[главе rc.d Руководства]. Подробное объяснение доступных команд находится в man:rc[8] и man:rc.subr[8]. Наконец, есть link:{rc-scripting}[статья]о практических аспектах написания сценариев [.filename]#rc.d#.
+
+Установить можно один или более сценариев [.filename]#rc.d#:
+
+[.programlisting]
+....
+USE_RC_SUBR= doormand
+....
+
+Сценарии обязаны размещаться в подкаталоге [.filename]#files# с обязательным добавлением суффикса `.in` к имени файла. Для этого файла будут использоваться стандартные расширения `SUB_LIST`. Также особенно приветствуется использование расширений `%%PREFIX%%` и `%%LOCALBASE%%`. Подробнее о `SUB_LIST` в <<using-sub-files,соответствующей главе>>.
+
+Начиная с FreeBSD 6.1-RELEASE локальные сценарии [.filename]#rc.d# (включая установленные из портов) включены в общий man:rcorder[8] основной системы.
+
+Пример простого сценария [.filename]#rc.d#:
+
+[.programlisting]
+....
+#!/bin/sh
+
+# $FreeBSD$
+#
+# PROVIDE: doormand
+# REQUIRE: LOGIN
+# KEYWORD: shutdown
+#
+# Add the following lines to /etc/rc.conf.local or /etc/rc.conf
+# to enable this service:
+#
+# doormand_enable (bool): Set to NO by default.
+# Set it to YES to enable doorman.
+# doormand_config (path): Set to %%PREFIX%%/etc/doormand/doormand.cf
+# by default.
+
+. /etc/rc.subr
+
+name=doormand
+rcvar=doormand_enable
+
+load_rc_config $name
+
+: ${doormand_enable:="NO"}
+: ${doormand_config="%%PREFIX%%/etc/doormand/doormand.cf"}
+
+command=%%PREFIX%%/sbin/${name}
+pidfile=/var/run/${name}.pid
+
+command_args="-p $pidfile -f $doormand_config"
+
+run_rc_command "$1"
+....
+
+Если нет стоящей причины запускать службы раньше всех портов, сценарии должны использовать
+
+[.programlisting]
+....
+REQUIRE: LOGIN
+....
+
+Если служба работает под определенным пользователем (отличным от root), то это делается принудительно. В сценарий выше включена конструкция
+
+[.programlisting]
+....
+KEYWORD: shutdown
+....
+
+потому что вымышленный порт, который мы используем в качестве примера, запускает службу, и она должна корректно завершиться при выключении системы. Если сценарий не запускает постоянную службу, то это не является необходимым.
+
+Для необязательных элементов конфигурации присвоение переменной по умолчанию в стиле "=" является более предпочтительным по сравнению со стилем ":=", используемым здесь, поскольку первый устанавливает значение по умолчанию только если переменная не установлена, а последний устанавливает её, если переменная не установлена _или_ обнулена. Пользователь вполне может написать в своем файле [.filename]#rc.conf.local# что-нибудь типа
+
+[.programlisting]
+....
+doormand_flags=""
+....
+
+и тогда произойдет неуместная подстановка переменной с использованием ":=", что переопределит намерения пользователя. Переменная `_enable` является обязательной; значением по умолчанию должно быть ":".
+
+=== Контрольный список перед внесением изменений
+
+Перед тем, как отсылать порт со сценарием [.filename]#rc.d#, и тем более перед его коммитом, сверьтесь со следующим контрольным списком, чтобы убедиться, что порт для этого готов.
+
+Большинство из этих проверок умеет выполнять порт package:devel/rclint[], но это не является заменой надлежащему просмотру.
+
+[.procedure]
+====
+. Если это новый файл, заканчивается ли он на [.filename]#.sh#? Если это так, то имя файла должно быть изменено на [.filename]#file.in#, поскольку файлы [.filename]#rc.d# не могут оканчиваться на такое расширение.
+. Присутствует ли в файле тег `$FreeBSD$`?
+. Соответствуют ли друг другу имя файла (без [.filename]#.in#), строка `PROVIDE` и ``$``__name__? Имя файла, совпадающее с `PROVIDE`, упрощает отладку, особенно для проблем, связанных с man:rcorder[8]. Соответствие имени файла и ``$``__name__ также упрощает понимание, какие переменные имеют отношение к сценарию в [.filename]#rc.conf[.local]#. Последнее также является тем, что вы могли бы назвать "политикой" для всех новых сценариев, включая те, что входят в базовую систему.
+. Содержит ли строка `REQUIRE` значение LOGIN? Это условие обязательно для сценариев, работающих не из-под суперпользователя. Если сценарий запускается из-под суперпользователя, то стоит ли его запускать до `LOGIN`? Если нет, то его следует запускать после, так чтобы мы могли свободно сгруппировать локальные сценарии в той точке man:rcorder[8], когда почти все сценарии в базовой системе уже стартовали.
+. Запускает ли сценарий постоянную службу? Если да, то он должен иметь `KEYWORD: shutdown`.
+. Убедитесь в том, что в сценарии отсутствует `KEYWORD: FreeBSD`. Это перестало быть нужным и нежелательно уже много лет. Это также служит индикатором того, что новый сценарий был скопирован со старого, поэтому особое внимание должно быть уделено при проверке.
+. Если сценарий использует интерпретируемый язык, такой как `perl`, `python` или `ruby`, то убедитесь, что значение `command_interpreter` установлено должным образом. В противном случае
++
+[source,bash]
+....
+# service name stop
+....
++
+возможно будет работать неправильно. Смотрите man:service[8] для дополнительной информации.
+. Все ли вхождения [.filename]#/usr/local# были заменены на `%%PREFIX%%`?
+. Идет ли присвоение переменным значений по умолчанию после `load_rc_config`?
+. Используются ли пустые строки при присвоении значений по умолчанию? Такие присвоения должны быть удалены, но перепроверьте, что эти параметры задокументированы в комментариях в начале файла.
+. Действительно ли в сценариях используются значения, присвоенные переменным?
+. Являются ли параметры по умолчанию, перечисленные в __name__``_flags``, обязательными? Если это так, то их следует поместить в `command_args`. Параметр `-d` здесь - это как красный флаг (прошу прощения за каламбур), поскольку обычно он применяется для "демонизации" процесса и поэтому на самом деле обязательный.
+. Никогда не включайте переменную __name__``_flags`` в `command_args` (и наоборот; в прочем, такая ошибка встречается реже).
+. Запускает ли сценарий какой-либо код безусловно? Это нехорошо. Обычно такие вещи могут/должны помещаться в `start_precmd`.
+. Все логические условия должны использовать функцию `checkyesno`. Не пишите самописных проверок для `[Yy][Ee][Ss]`, и так далее.
+. Если в сценарии выполняется цикл (например, ожидание чего-либо перед стартом), используется ли счетчик для завершения цикла? Мы не хотим бесконечного ожидания загрузки в случае возникновения ошибки.
+. Создает ли сценарий файлы или каталоги, которым нужны особые права доступа? Например, файл [.filename]#pid#, который должен принадлежать пользователю, из-под которого запускается процесс. Вместо традиционных команд man:touch[1]/man:chown[8]/man:chmod[1] подумайте об использовании man:install[1] с подходящими аргументами командной строки, для того чтобы выполнить всю процедуру за один шаг.
+====
+
+[[users-and-groups]]
+== Добавление пользователей и групп
+
+Некоторые порты требуют в установленной системе наличие определенного пользователя. Выберите свободный UID в диапазоне от 50 до 999 и зарегистрируйте его в [.filename]#ports/UIDs# (для пользователей) и/или в [.filename]#ports/GIDs# (для групп). Удостоверьтесь, что не используете UID, уже используемый системой или другими портами.
+
+Пожалуйста, включите в патч изменение для этих двух файлов, если вам требуется создать нового пользователя или группу для вашего порта.
+
+Затем вы сможете использовать в вашем [.filename]#Makefile# переменные `USERS` и `GROUPS`, и пользователь автоматически создастся при установке порта.
+
+[.programlisting]
+....
+USERS= pulse
+GROUPS= pulse pulse-access pulse-rt
+....
+
+Текущий перечень зарезервированных UID и GID находится в [.filename]#ports/UIDs# и [.filename]#ports/GIDs#.
+
+[[requiring-kernel-sources]]
+== Порты, требующие наличия исходных текстов ядра
+
+Некоторым портам (таким как загружаемые модули ядра) для компиляции нужны файлы с исходными текстами ядра. Ниже указан корректный способ определения, установлены ли они пользователем:
+
+[.programlisting]
+....
+USES= kmod
+....
+
+Кроме этой проверки, `kmod` заботится о большинстве пунктов, которые должны учитываться в этих портах.
diff --git a/documentation/content/ru/books/porters-handbook/testing/chapter.adoc b/documentation/content/ru/books/porters-handbook/testing/chapter.adoc
new file mode 100644
index 0000000000..a897ee6c73
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/testing/chapter.adoc
@@ -0,0 +1,120 @@
+---
+title: Глава 9. Тестирование вашего порта
+prev: books/porters-handbook/pkg-files
+next: books/porters-handbook/upgrading
+---
+
+[[testing]]
+= Тестирование вашего порта
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 9
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[make-describe]]
+== Запуск `make describe`
+
+Некоторые утилиты FreeBSD для сопровождения портов, например, man:portupgrade[1], опираются на базу данных с именем [.filename]#/usr/ports/INDEX#, в которой отслеживаются такие характеристики портов, как их зависимости. Файл [.filename]#INDEX# создаётся при помощи [.filename]#ports/Makefile# верхнего уровня по команде `make index`, спускающейся в подкаталог каждого порта и выполняющей в нём `make describe`. Таким образом, если выполнение `make describe` с каким-либо портом завершится неудачно, то никому не удастся создать [.filename]#INDEX#, при этом много людей вскоре станут несчастны.
+
+[NOTE]
+====
+Возможность генерировать этот файл очень важна вне зависимости от того, какие параметры присутствуют в [.filename]#make.conf#, поэтому, пожалуйста, избегайте, таких вещей, как использование декларации `.error`, когда (к примеру) требования к зависимости не было удовлетворено. (Смотрите <<dads-dot-error>>.)
+====
+
+Если `make describe` выдаёт строчку, а не ошибку, то для вас это пройдёт безболезненно. Обратитесь к файлу [.filename]#bsd.port.mk#, чтобы выяснить значение выдаваемых строк.
+
+Заметьте также, что запуск последней версии `portlint` (как указано в следующем разделе) приведёт к автоматическому запуску команды `make describe`.
+
+[[testing-portlint]]
+== Portlint
+
+Проверьте свою работу командой <<porting-portlint,`portlint`>> перед тем, как её отослать или перенести в дерево портов. `portlint` предупреждает вас о многих распространённых ошибках, как функциональных, так и стилистических. Для нового (или скопированного внутри хранилища) порта самым подходящим является запуск `portlint -A`; для уже существующего порта достаточно будет запустить `portlint -C`.
+
+Так как для обнаружения ошибок `portlint` использует эвристические методы, то им могут выдаваться и ошибочные предупреждения. Кроме того, время от времени нечто, отмечаемое как некорректность, из-за ограничений механизма создания портов не может быть сделано никак иначе. Если вы сомневаетесь, то лучше всего спросить в {freebsd-ports}.
+
+[[testing-porttools]]
+== Port Tools
+
+Программа package:ports-mgmt/porttools[] входит в состав Коллекции Портов.
+
+`port` является сценарием переднего плана, который может упростить вам задачу тестирования. Если вы хотите проверить новый порт или обновить существующий, то вы можете использовать `port test` для проверки вашего порта, включая проверку <<testing-portlint,`portlint`>>. Эта команда также находит и отображает любые файлы, которые невключенные в [.filename]#pkg-plist#. Смотрите следующий пример:
+
+[source,bash]
+....
+# port test /usr/ports/net/csup
+....
+
+[[porting-prefix]]
+== `PREFIX` и `DESTDIR`
+
+Переменная `PREFIX` определяет, куда будет установлен порт. По умолчанию это [.filename]#/usr/local#, но может меняться пользователем на собственный путь, такой как [.filename]#/opt#. В вашем порту значение этой переменной должно учитываться.
+
+Если пользователь установил переменную `DESTDIR`, то она определяет полное альтернативное окружение, обычно, это jail или установленная система, смонтированная в месте, отличном от [.filename]#/#. На самом деле порт устанавливается в [.filename]#DESTDIR/PREFIX# и регистрируется в базе данных пакетов в [.filename]#DESTDIR/var/db/pkg#. Поскольку управление `DESTDIR` производится автоматически инфраструктурой портов с помощью man:chroot[8], вам не нужны никакие изменения или проявление особой осторожности при написании портов, совместымых с `DESTDIR`.
+
+Значение переменной `PREFIX` будет установлено в `LOCALBASE` (по умолчанию [.filename]#/usr/local#). Если задана переменная `USE_LINUX_PREFIX`, то `PREFIX` примет значение `LINUXBASE` (по умолчанию [.filename]#/compat/linux#).
+
+Избегание явно прописываемых путей [.filename]#/usr/local# в исходном коде сделает порт гораздо более гибким и способным удовлетворить потребности других серверов. Часто этого можно добиться простой заменой строк [.filename]#/usr/local# в различных файлах [.filename]#Makefile# внутри порта на `${PREFIX}`. Эта переменная автоматически передаётся далее на каждом этапе построения и установки.
+
+Проверьте, что ваше приложение не устанавливает чего-либо в каталог [.filename]#/usr/local# вместо `PREFIX`. Наличие явно указанных путей можно быстро проверить следующим образом:
+
+[source,bash]
+....
+# make clean; make package PREFIX=/var/tmp/`make -V PORTNAME`
+....
+
+Если что-то было установлено за пределами `PREFIX`, то процесс создания пакета сообщит об отсутствии файлов.
+
+Это также стоит проверить с использованием поддержки каталога сборки (смотрите <<staging>>):
+
+[source,bash]
+....
+# make stage && make check-orphans && make package
+....
+
+Эти проверки не найдут явно указанных путей внутри файлов порта и не проверят корректность использования `LOCALBASE` в качестве ссылки на файлы из других портов. Порт, временно установленный в [.filename]#/var/tmp/`make -V PORTNAME`#, следует проверять на работоспособность, чтобы убедиться в отсутствии проблем с путями.
+
+Переменная `PREFIX` не должна задаваться явно в файле [.filename]#Makefile# порта. Пользователи при установке порта могут задать в `PREFIX` свое собственное место, и порт должен учитывать это значение.
+
+Обратитесь к программам/файлам из других портов с переменными, перечисленными выше, без указания явных маршрутов. Например, если ваш порт требует, чтобы макрос `PAGER` являлся полным путем утилиты `less`, не используйте строковый путь [.filename]#/usr/local/bin/less#. Вместо этого используйте `${LOCALBASE}`:
+
+[.programlisting]
+....
+-DPAGER=\"${LOCALBASE}/bin/less\"
+....
+
+Путь с использованием `LOCALBASE` имеет больше шансов оставаться работоспособным, если системный администратор переместил всё дерево [.filename]#/usr/local# куда-то в другое место.
+
+[[testing-tinderbox]]
+== Tinderbox
+
+Если вы алчный контрибутор портов, то вы можете захотеть взглянуть на Tinderbox. Это мощная система построения и тестирования портов. Tinderbox можно установить, используя порт package:ports-mgmt/tinderbox[]. Обязательно прочитайте поставляемую документацию, поскольку конфигурация не является тривиальной.
+
+Для получения подробностей посетите http://tinderbox.marcuscom.com/[вебсайт Tinderbox].
+
+[[testing-poudriere]]
+== Poudriere
+
+Если вы контрибутор портов, подумайте об установке poudriere. Это мощная система для построения и тестирования портов. Poudriere можно установить из package:ports-mgmt/poudriere[].
+
+Для получения подробной информации посетите http://fossil.etoilebsd.net/poudriere[вебсайт Poudriere].
diff --git a/documentation/content/ru/books/porters-handbook/upgrading/chapter.adoc b/documentation/content/ru/books/porters-handbook/upgrading/chapter.adoc
new file mode 100644
index 0000000000..0162b17503
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/upgrading/chapter.adoc
@@ -0,0 +1,168 @@
+---
+title: Глава 10. Обновление отдельного порта
+prev: books/porters-handbook/testing
+next: books/porters-handbook/security
+---
+
+[[port-upgrading]]
+= Обновление отдельного порта
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 10
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+Если вы заметите, что ваш порт устарел по сравнению с последней авторской версией, первым делом вы должны получить самую последнюю версия порта. Вы можете найти их в каталоге [.filename]#ports/ports-current# на зеркальных FTP-серверах FreeBSD. Однако если вы работаете с достаточно большим количеством портов, наверное, будет проще использовать Subversion или man:portsnap[8] для поддержания всей коллекции портов в актуальном состоянии, как это описано в link:{handbook}#ports-using/[Руководстве]. К тому же это даст возможность отслеживать все зависимости портов.
+
+На следующем шаге необходимо выяснить, нет ожидает ли уже это обновление своей очереди. Для этого у вас есть две возможности. Существует интерфейс к http://www.FreeBSD.org/cgi/query-pr-summary.cgi?query[базе данных сообщений о проблемах FreeBSD (PR)] (известной также как `GNATS`) с поисковыми возможностями. Выберите из выпадающего списка `ports` и введите название порта.
+
+Однако иногда люди забывают поместить название порта в поле Synopsis в точном виде. В таком случае вы можете воспользоваться <<portsmon,Системой мониторинга портов FreeBSD>> (которая известна также как `portsmon`). В рамках этой системы делается попытка классифицировать PR, касающиеся портов, по имени порта. Для поиска PR, относящихся к определённому порту, используйте механизм http://portsmon.FreeBSD.org/portoverview.py[Просмотра по одному порту].
+
+Если таких отложенных PR не существует, то на следующем этапе следует послать сообщение электронной почты человеку, поддерживающему порт, который выдаётся по команде `make maintainer`. Этот человек может уже работать над обновлением, или иметь причину не обновлять порт прямо сейчас (например, из-за проблем со стабильностью функционирования новой версии); вам нет нужды дублировать их работу. Заметьте, что неподдерживаемые порты перечисляются с адресом сопровождающего `ports@FreeBSD.org`, который является всего лишь адресом общего списка рассылки, так что отправка туда сообщений, скорее всего, в данном случае не поможет.
+
+Если сопровождающий просит вас выполнить обновление, либо сопровождающий отсутствует, то у вас появляется шанс помочь FreeBSD, приготовив обновление самим! Пожалуйста, делайте это с использованием команды man:diff[1] в основной системе.
+
+Чтобы создать подходящий `diff` для одного патча, скопируйте файл, который нужно пропатчить, в _something.orig_, сохраните ваши изменения в _something_, а затем создайте ваше патч:
+
+[source,bash]
+....
+% diff -u something.orig something > something.diff
+....
+
+В противном случае, вам следует воспользоваться методом `svn diff` (<<svn-diff>>), либо скопировать содержимое порта в отдельный каталог и применить результат рекурсивной команды man:diff[1] между новым и старым каталогами порта (например, если каталог с модифицированным портом называется [.filename]#superedit#, а оригинальный, совпадающий с находящимся в нашем дереве портов, [.filename]#superedit.bak#, то сохраните результат выполнения команды `diff -ruN superedit.bak superedit`). Подойдёт как унифицированный, так и контекстный дифф, однако коммиттеры портов обычно предпочитают унифицированный формат. Отметьте использование опции `-N`-это одобряемый способ заставить diff корректно работать в случае добавления новых файлов или удаления старых. Перед тем, как посылать нам diff-файл, пожалуйста, проверьте его, чтобы убедиться в значимости всех внесённых изменений. (В частности, убедитесь, что вы очистили рабочие каталоги командой `make clean`).
+
+Для упрощения повторяющихся операций с файлами заплаток вы можете воспользоваться скриптом [.filename]#/usr/ports/Tools/scripts/patchtool.py#. Перед тем, как его запускать, пожалуйста, прочтите [.filename]#/usr/ports/Tools/scripts/README.patchtool#.
+
+Если порт никем не поддерживается, а вы активно его используете, пожалуйста, подумайте над тем, чтобы добровольно стать его сопровождающим. Во FreeBSD имеется более 4000 портов без поддержки, и это как раз та область, где всегда нужны добровольцы. (Детальное описание обязанностей сопровождающего можно найти в разделе link:{developers-handbook}#POLICIES-MAINTAINER[Руководства Разработчика].)
+
+Лучше всего послать нам diff-файл, включив его в посылку по команде man:send-pr[1] (категория `ports`). Если вы сопровождаете порт, обязательно поместите текст `[maintainer update]` в начале строки описания и задайте в поле "Class" вашего PR строчку `maintainer-update`. В противном случае в поле "Class" вашего PR должно быть указано `change-request`. Будьте добры, в сообщении отметьте все добавленные или удалённые файлы, так как они будут непосредственно указаны man:svn[1] при выполнении операции коммита. Если diff-файл имеет размер, превышающий 20КБ, сожмите его и обработайте утилитой uuencode; в противном случае просто включите его как есть в PR.
+
+Прежде чем пользоваться man:send-pr[1] просмотрите раздел о link:{problem-reports}#pr-writing/[Написании сообщений о проблемах] в статье о Сообщениях об ошибках. Он содержит гораздо больше информации о том, как писать полезные сообщения о проблемах.
+
+[IMPORTANT]
+====
+Если обновление вызвано соображениями информационной безопасности или наличием серьёзных ошибок в имеющемся порте, пожалуйста, оповестите {portmgr} о необходимости немедленного перепостроения и повторного распространения пакета данного порта. В противном случае ничего не подозревающие пользователи `pkg` будут продолжать устанавливать старую версию по команде `pkg install` в течение ещё нескольких недель.
+====
+
+[NOTE]
+====
+Повторяем еще раз - для посылки обновлений существующих портов используйте утилиту man:diff[1], а не man:shar[1]! Это поможет понять коммиттерам портов, что именно было изменено.
+====
+
+Теперь, когда вы проделали всё это, прочитайте о том, как поддерживать актуальное состояние, в <<keeping-up>>.
+
+[[svn-diff]]
+== Использование Subversion для создания патчей
+
+По возможности присылайте исправления в формате man:svn[1] diff. В таком виде их проще использовать по сравнению с разницей между "старым и новым" каталогами. Так проще увидеть изменения и обновить их в случае, если что-нибудь изменилось в Коллекции Портов с тех пор, как вы начали работу, либо если коммиттер просит что-то исправить.
+
+[source,bash]
+....
+% cd ~/my_wrkdir <.>
+% svn co https://svn0.us-west.FreeBSD.org/ports/head/dns/pdnsd <.>
+% cd ~/my_wrkdir/pdnsd
+....
+
+<.> Это может быть где угодно; место, в котором производится построение портов, не привязано к [.filename]#/usr/ports/#.
+
+<.> https://svn0.us-west.FreeBSD.org/[svn0.us-west.FreeBSD.org] - это общедоступный сервер Subversion. Выберите ближайшее зеркало и проверьте сертификат зеркалирующего сервера на наличие в перечне link:{handbook}#svn-mirrors/[зеркалирующих сайтов Subversion].
+
+Находясь в рабочем каталоге, вносите любые изменения, которые обычно делают для порта. При добавлении или удалении файла используйте `svn` для отслеживания этих изменений:
+
+[source,bash]
+....
+% svn add new_file
+% svn remove deleted_file
+....
+
+Убедитесь, что вы проверяете порт в соответствии с рекомендуемым порядком проверки, описанным в <<porting-testing>> и <<porting-portlint>>.
+
+[source,bash]
+....
+% svn status
+% svn update <.>
+....
+
+<.> Эта команда попытается выполнить слияние различий между вашим патчем и текущей версией репозитория; внимательно проверьте полученный вывод. Буква перед названием каждого файла означает тип изменения, сделанного с этим файлом. Для получения полного списка смотрите <<table-svn-up>>.
+
+[[table-svn-up]]
+.Префиксы файлов для Subversion Update
+[cols="1,1", frame="none"]
+|===
+|U
+|Файл обновлен без проблем.
+
+|G
+|Файл обновлен без проблем (вы увидите это только при работе с удаленным репозиторием).
+
+|M
+|Файл с локальными изменениями, слияние выполнено без конфликтов.
+
+|C
+|Файл с локальными изменениями, слияние выполнено с конфликтами.
+|===
+
+Если в результате выполнения `svn update` отображается `C`, то это означает, что что-то изменилось в репозитории Subversion и man:svn[1] не смогла выполнить слияние локальных изменений с полученными из репозитория. В любом случае никогда не помешает просмотреть изменения, поскольку man:svn[1] ничего не знает о том, каким должен быть порт, поэтому эта команда может (и, вероятно, будет) делать слияние тех изменений, которые не имеют смысла.
+
+Последним шагом является создание унифицированного man:diff[1] для полученных изменений:
+
+[source,bash]
+....
+% svn diff > ../`basename ${PWD}`.diff
+....
+
+[NOTE]
+====
+Информация о любых удаляемых файлов должна быть явным образом указана в PR, поскольку необходимость в удалении файла для коммиттера может быть неочевидна.
+====
+
+Присылайте свои патчи в соответствии с руководством, описанном в <<port-upgrading>>.
+
+[[moved-and-updating-files]]
+== Файлы [.filename]#UPDATING# и [.filename]#MOVED#
+
+Если при обновлении порта требуются специальные шаги, такие как изменение файлов конфигурации или запуск специальной программы, то вам следует это задокументировать в файле [.filename]#/usr/ports/UPDATING#. Формат записи в этом файле приводится ниже:
+
+[.programlisting]
+....
+YYYYMMDD:
+ AFFECTS: users of portcategory/portname
+ AUTHOR: Your name <Your email address>
+
+ Special instructions
+....
+
+Если вы включаете точные инструкции portmaster или portupgrade, пожалуйста, убедитесь в правильном экранировании символов внутри командной оболочки.
+
+Файл [.filename]#/usr/ports/MOVED# содержит записи об удалённых или перемещённых портах. Каждая строка в этом файле состоит из полей: название порта, место, куда он был перемещён, дата и причина перемещения. Если порт был удалён, то поле, указывающее новое место, может оставаться незаполненным. Поля должны разделяться символом `|` (pipe), как это показано ниже:
+
+[.programlisting]
+....
+old name|new name (blank for deleted)|date of move|reason
+....
+
+Дату следует вводить в формате `YYYY-MM-DD`. Новые записи следует добавлять в конец файла в хронологическом порядке.
+
+Если порт был перемещён, но в дальнейшем восстановлен на прежнем месте, удалите в этом файле строку, содержащую информацию о перемещении.
+
+Полученные изменения можно проверить командой `Tools/scripts/MOVEDlint.awk`.
diff --git a/documentation/content/ru/books/porters-handbook/uses/chapter.adoc b/documentation/content/ru/books/porters-handbook/uses/chapter.adoc
new file mode 100644
index 0000000000..23ebb0a440
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/uses/chapter.adoc
@@ -0,0 +1,1672 @@
+---
+title: Глава 15. Значения USES
+prev: books/porters-handbook/keeping-up
+next: books/porters-handbook/versions
+---
+
+[[uses]]
+= Значения `USES`
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:c-plus-plus: c++
+:sectnumoffset: 15
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+[[uses-intro]]
+== An Introduction to `USES`
+
+`USES` macros make it easy to declare requirements and settings for a port. They can add dependencies, change building behavior, add metadata to packages, and so on, all by selecting simple, preset values.
+
+Each section in this chapter describes a possible value for `USES`, along with its possible arguments. Arguments are appeneded to the value after a colon (`:`). Multiple arguments are separated by commas (`,`).
+
+[[uses-intro-ex1]]
+.Using Multiple Values
+[example]
+====
+
+[.programlisting]
+....
+USES= bison perl
+....
+
+====
+
+[[uses-intro-ex2]]
+.Adding an Argument
+[example]
+====
+
+[.programlisting]
+....
+USES= tar:xz
+....
+
+====
+
+[[uses-intro-ex3]]
+.Adding Multiple Arguments
+[example]
+====
+
+[.programlisting]
+....
+USES= drupal:7,theme
+....
+
+====
+
+[[uses-intro-ex4]]
+.Mixing it All Together
+[example]
+====
+
+[.programlisting]
+....
+USES= pgsql:9.3+ cpe python:2.7,build
+....
+
+====
+
+[[uses-7z]]
+== `7z`
+
+Possible arguments: (none), `p7zip`, `partial`
+
+Extract using man:7z[1] instead of man:bsdtar[1] and sets `EXTRACT_SUFX=.7z`. The `p7zip` option forces a dependency on the `7z` from package:archivers/p7zip[] if the one from the base system is not able to extract the files. `EXTRACT_SUFX` is not changed if the `partial` option is used, this can be used if the main distribution file does not have a [.filename]#.7z# extension.
+
+[[uses-ada]]
+== `ada`
+
+Possible arguments: (none), `5`, `6`
+
+Depends on an Ada-capable compiler, and sets `CC` accordingly. Defaults to use gcc 5 from ports. Use the `:__X__` version option to force building with a different version.
+
+[[uses-autoreconf]]
+== `autoreconf`
+
+Possible arguments: (none), `build`
+
+Runs `autoreconf`. It encapsulates the `aclocal`, `autoconf`, `autoheader`, `automake`, `autopoint`, and `libtoolize` commands. Each command applies to [.filename]#${AUTORECONF_WRKSRC}/configure.ac# or its old name, [.filename]#${AUTORECONF_WRKSRC}/configure.in#. If [.filename]#configure.ac# defines subdirectories with their own [.filename]#configure.ac# using `AC_CONFIG_SUBDIRS`, `autoreconf` will recursively update those as well. The `:build` argument only adds build time dependencies on those tools but does not run `autoreconf`. A port can set `AUTORECONF_WRKSRC` if `WRKSRC` does not contain the path to [.filename]#configure.ac#.
+
+[[uses-blaslapack]]
+== `blaslapack`
+
+Possible arguments: (none), `atlas`, `netlib` (default), `gotoblas`, `openblas`
+
+Adds dependencies on Blas / Lapack libraries.
+
+[[uses-bdb]]
+== `bdb`
+
+Possible arguments: (none), `48`, `5` (default), `6`
+
+Add dependency on the Berkeley DB library. Default to package:databases/db5[]. It can also depend on package:databases/db48[] when using the `:48` argument or package:databases/db6[] with `:6`. It is possible to declare a range of acceptable values, `:48+` finds the highest installed version, and falls back to 4.8 if nothing else is installed. `INVALID_BDB_VER` can be used to specify versions which do not work with this port. The framework exposes the following variables to the port:
+
+`BDB_LIB_NAME`::
+The name of the Berkeley DB library. For example, when using package:databases/db5[], it contains `db-5.3`.
+
+`BDB_LIB_CXX_NAME`::
+The name of the Berkeley DBC++ library. For example, when using package:databases/db5[], it contains `db_cxx-5.3`.
+
+`BDB_INCLUDE_DIR`::
+The location of the Berkeley DB include directory. For example, when using package:databases/db5[], it will contain `${LOCALBASE}/include/db5`.
+
+`BDB_LIB_DIR`::
+The location of the Berkeley DB library directory. For example, when using package:databases/db5[], it contains `${LOCALBASE}/lib`.
+
+`BDB_VER`::
+The detected Berkeley DB version. For example, if using `USES=bdb:48+` and Berkeley DB 5 is installed, it contains `5`.
+
+[IMPORTANT]
+====
+package:databases/db48[] is deprecated and unsupported. It must not be used by any port.
+====
+
+[[uses-bison]]
+== `bison`
+
+Possible arguments: (none), `build`, `run`, `both`
+
+Uses package:devel/bison[] By default, with no arguments or with the `build` argument, it implies `bison` is a build-time dependency, `run` implies a run-time dependency, and `both` implies both run-time and build-time dependencies.
+
+[[uses-cabal]]
+== `cabal`
+
+[IMPORTANT]
+====
+Ports should not be created for Haskell libraries, see <<haskell-libs>> for more information.
+====
+
+Possible arguments: (none), `hpack`
+
+Sets default values and targets used to build Haskell software using Cabal. A build dependency on the Haskell compiler port (GHC) is added. If `hpack` argument is given, a build dependency on package:devel/hs-hpack[] is added and `hpack` is invoked at configuration step to generate .cabal file.
+
+The framework provides the following variables:
+
+`USE_CABAL`::
+If the software uses Haskell dependencies, list them in this variable. Each item should be present on Hackage and be listed in form `packagename-_0.1.2_`. Dependencies can have revisions, which are specified after the `_` symbol. Automatic generation of dependency list is supported, see <<using-cabal>>.
+
+`CABAL_FLAGS`::
+List of flags to be passed to `cabal-install` during the configuring and building stage. The flags are passed verbatim.
+
+`EXECUTABLES`::
+List of executable files installed by the port. Default value: `${PORTNAME}`. Items from this list are automatically added to pkg-plist.
+
+`SKIP_CABAL_PLIST`::
+If defined, do not add items from `${EXECUTABLES}` to pkg-plist.
+
+`opt_USE_CABAL`::
+Adds items to `${USE_CABAL}` depending on `opt` option.
+
+`opt_EXECUTABLES`::
+Adds items to `${EXECUTABLES}` depending on `opt` option.
+
+`opt_CABAL_FLAGS`::
+If `opt` is enabled, append the value to `${CABAL_FLAGS}`. Otherwise, append `-value` to disable the flag.
+
+`FOO_DATADIR_VARS`::
+For an executable named `FOO` list Haskell packages, whose data files should be accessible by the executable.
+
+[[uses-cargo]]
+== `cargo`
+
+Possible arguments: (none)
+
+Uses Cargo for configuring, building, and testing. It can be used to port Rust applications that use the Cargo build system. For more information see <<using-cargo>>.
+
+[[uses-charsetfix]]
+== `charsetfix`
+
+Possible arguments: (none)
+
+Prevents the port from installing [.filename]#charset.alias#. This must be installed only by package:converters/libiconv[]. `CHARSETFIX_MAKEFILEIN` can be set to a path relative to `WRKSRC` if [.filename]#charset.alias# is not installed by [.filename]#${WRKSRC}/Makefile.in#.
+
+[[uses-cmake]]
+== `cmake`
+
+Possible arguments: (none), `insource`, `noninja`, `run`
+
+Uses CMake for configuring and building.
+
+By default an out-of-source build is performed, leaving the sources in `WRKSRC` free from build artifacts. With the `insource` argument, an in-source build will be performed instead. Setting it should be the exception when a regular out-of-source build does not work.
+
+By default Ninja is used for the build. In some cases this does not work correctly. With the `noninja` argument, the build will fallback to using regular `make` for builds. It should only be used if a Ninja-based build does not work.
+
+With the `run` argument, a run dependency is registered in addition to a build dependency.
+
+For more information see <<using-cmake>>.
+
+[[uses-compiler]]
+== `compiler`
+
+Possible arguments: (none), `env` (default, implicit), `{c-plus-plus}17-lang`, `{c-plus-plus}14-lang`, `{c-plus-plus}11-lang`, `gcc-{c-plus-plus}11-lib`, `{c-plus-plus}11-lib`, `{c-plus-plus}0x`, `c11`, `openmp`, `nestedfct`, `features`
+
+Determines which compiler to use based on any given wishes. Use `{c-plus-plus}17-lang` if the port needs a {c-plus-plus}17-capable compiler, `{c-plus-plus}14-lang` if the port needs a {c-plus-plus}14-capable compiler, `{c-plus-plus}11-lang` if the port needs a {c-plus-plus}11-capable compiler, `gcc-{c-plus-plus}11-lib` if the port needs the `g++` compiler with a {c-plus-plus}11 library, or `{c-plus-plus}11-lib` if the port needs a {c-plus-plus}11-ready standard library. If the port needs a compiler understanding {c-plus-plus}0X, C11, OpenMP, or nested functions, the corresponding parameters should be used.
+
+Use `features` to request a list of features supported by the default compiler. After including [.filename]#bsd.port.pre.mk# the port can inspect the results using these variables:
+
+* `COMPILER_TYPE`: the default compiler on the system, either gcc or clang
+* `ALT_COMPILER_TYPE`: the alternative compiler on the system, either gcc or clang. Only set if two compilers are present in the base system.
+* `COMPILER_VERSION`: the first two digits of the version of the default compiler.
+* `ALT_COMPILER_VERSION`: the first two digits of the version of the alternative compiler, if present.
+* `CHOSEN_COMPILER_TYPE`: the chosen compiler, either gcc or clang
+* `COMPILER_FEATURES`: the features supported by the default compiler. It currently lists the {c-plus-plus} library.
+
+[[uses-cpe]]
+== `cpe`
+
+Possible arguments: (none)
+
+Include Common Platform Enumeration (CPE) information in package manifest as a CPE 2.3 formatted string. See the http://scap.nist.gov/specifications/cpe/[CPE specification] for details. To add CPE information to a port, follow these steps:
+
+[.procedure]
+====
+. Search for the official CPE entry for the software product either by using the NVD's http://web.nvd.nist.gov/view/cpe/search[CPE search engine] or in the http://static.nvd.nist.gov/feeds/xml/cpe/dictionary/official-cpe-dictionary_v2.3.xml[official CPE dictionary] (warning, very large XML file). _Do not ever make up CPE data._
+. Add `cpe` to `USES` and compare the result of `make -V CPE_STR` to the CPE dictionary entry. Continue one step at a time until `make -V CPE_STR` is correct.
+. If the product name (second field, defaults to `PORTNAME`) is incorrect, define `CPE_PRODUCT`.
+. If the vendor name (first field, defaults to `CPE_PRODUCT`) is incorrect, define `CPE_VENDOR`.
+. If the version field (third field, defaults to `PORTVERSION`) is incorrect, define `CPE_VERSION`.
+. If the update field (fourth field, defaults to empty) is incorrect, define `CPE_UPDATE`.
+. If it is still not correct, check [.filename]#Mk/Uses/cpe.mk# for additional details, or contact the {ports-secteam}.
+. Derive as much as possible of the CPE name from existing variables such as `PORTNAME` and `PORTVERSION`. Use variable modifiers to extract the relevant portions from these variables rather than hardcoding the name.
+. _Always_ run `make -V CPE_STR` and check the output before committing anything that changes `PORTNAME` or `PORTVERSION` or any other variable which is used to derive `CPE_STR`.
+====
+
+[[uses-cran]]
+== `cran`
+
+Possible arguments: (none), `auto-plist`, `compiles`
+
+Uses the Comprehensive R Archive Network. Specify `auto-plist` to automatically generate [.filename]#pkg-plist#. Specify `compiles` if the port has code that need to be compiled.
+
+[[uses-desktop-file-utils]]
+== `desktop-file-utils`
+
+Possible arguments: (none)
+
+Uses update-desktop-database from package:devel/desktop-file-utils[]. An extra post-install step will be run without interfering with any post-install steps already in the port [.filename]#Makefile#. A line with <<plist-keywords-desktop-file-utils,`@desktop-file-utils`>> will be added to the plist.
+
+[[uses-desthack]]
+== `desthack`
+
+Possible arguments: (none)
+
+Changes the behavior of GNU configure to properly support `DESTDIR` in case the original software does not.
+
+[[uses-display]]
+== `display`
+
+Possible arguments: (none), _ARGS_
+
+Set up a virtual display environment. If the environment variable `DISPLAY` is not set, then Xvfb is added as a build dependency, and `CONFIGURE_ENV` is extended with the port number of the currently running instance of Xvfb. The _ARGS_ parameter defaults to `install` and controls the phase around which to start and stop the virtual display.
+
+[[uses-dos2unix]]
+== `dos2unix`
+
+Possible arguments: (none)
+
+The port has files with line endings in DOS format which need to be converted. Several variables can be set to control which files will be converted. The default is to convert _all_ files, including binaries. See <<slow-patch-automatic-replacements>> for examples.
+
+* `DOS2UNIX_REGEX`: match file names based on a regular expression.
+* `DOS2UNIX_FILES`: match literal file names.
+* `DOS2UNIX_GLOB`: match file names based on a glob pattern.
+* `DOS2UNIX_WRKSRC`: the directory from which to start the conversions. Defaults to `${WRKSRC}`.
+
+[[uses-drupal]]
+== `drupal`
+
+Possible arguments: `7`, `module`, `theme`
+
+Automate installation of a port that is a Drupal theme or module. Use with the version of Drupal that the port is expecting. For example, `USES=drupal:7,module` says that this port creates a Drupal 6 module. A Drupal 7 theme can be specified with `USES=drupal:7,theme`.
+
+[[uses-fakeroot]]
+== `fakeroot`
+
+Possible arguments: (none)
+
+Changes some default behavior of build systems to allow installing as a user. See https://wiki.debian.org/FakeRoot[] for more information on `fakeroot`.
+
+[[uses-fam]]
+== `fam`
+
+Possible arguments: (none), `fam`, `gamin`
+
+Uses a File Alteration Monitor as a library dependency, either package:devel/fam[] or package:devel/gamin[]. End users can set WITH_FAM_SYSTEM to specify their preference.
+
+[[uses-firebird]]
+== `firebird`
+
+Possible arguments: (none), `25`
+
+Add a dependency to the client library of the Firebird database.
+
+[[uses-fonts]]
+== `fonts`
+
+Possible arguments: (none), `fc`, `fcfontsdir` (default), `fontsdir`, `none`
+
+Adds a runtime dependency on tools needed to register fonts. Depending on the argument, add a `<<plist-keywords-fc,@fc>> ${FONTSDIR}` line, `<<plist-keywords-fcfontsdir,@fcfontsdir>> ${FONTSDIR}` line, `<<plist-keywords-fontsdir,@fontsdir>> ${FONTSDIR}` line, or no line if the argument is `none`, to the plist. `FONTSDIR` defaults to [.filename]#${PREFIX}/shared/fonts/${FONTNAME}# and `FONTNAME` to `${PORTNAME}`. Add `FONTSDIR` to `PLIST_SUB` and `SUB_LIST`
+
+[[uses-fortran]]
+== `fortran`
+
+Possible arguments: `gcc` (default)
+
+Uses the GNU Fortran compiler.
+
+[[uses-fuse]]
+== `fuse`
+
+Possible arguments: `2` (default), `3`
+
+The port will depend on the FUSE library and handle the dependency on the kernel module depending on the version of FreeBSD.
+
+[[uses-gem]]
+== `gem`
+
+Possible arguments: (none), `noautoplist`
+
+Handle building with RubyGems. If `noautoplist` is used, the packing list is not generated automatically.
+
+[[uses-gettext]]
+== `gettext`
+
+Possible arguments: (none)
+
+Deprecated. Will include both <<uses-gettext-runtime,`gettext-runtime`>> and <<uses-gettext-tools,`gettext-tools`>>.
+
+[[uses-gettext-runtime]]
+== `gettext-runtime`
+
+Possible arguments: (none), `lib` (default), `build`, `run`
+
+Uses package:devel/gettext-runtime[]. By default, with no arguments or with the `lib` argument, implies a library dependency on [.filename]#libintl.so#. `build` and `run` implies, respectively a build-time and a run-time dependency on [.filename]#gettext#.
+
+[[uses-gettext-tools]]
+== `gettext-tools`
+
+Possible arguments: (none), `build` (default), `run`
+
+Uses package:devel/gettext-tools[]. By default, with no argument, or with the `build` argument, a build time dependency on [.filename]#msgfmt# is registered. With the `run` argument, a run-time dependency is registered.
+
+[[uses-ghostscript]]
+== `ghostscript`
+
+Possible arguments: _X_, `build`, `run`, `nox11`
+
+A specific version _X_ can be used. Possible versions are `7`, `8`, `9`, and `agpl` (default). `nox11` indicates that the `-nox11` version of the port is required. `build` and `run` add build- and run-time dependencies on Ghostscript. The default is both build- and run-time dependencies.
+
+[[uses-gl]]
+== `gl`
+
+Possible arguments: (none)
+
+Provides an easy way to depend on GL components. The components should be listed in `USE_GL`. The available components are:
+
+`egl`::
+add a library dependency on [.filename]#libEGL.so# from package:graphics/mesa-libs[]
+
+`gbm`::
+Add a library dependency on [.filename]#libgbm.so# from package:graphics/mesa-libs[]
+
+`gl`::
+Add a library dependency on [.filename]#libGL.so# from package:graphics/mesa-libs[]
+
+`glesv2`::
+Add a library dependency on [.filename]#libGLESv2.so# from package:graphics/mesa-libs[]
+
+`glew`::
+Add a library dependency on [.filename]#libGLEW.so# from package:graphics/glew[]
+
+`glu`::
+Add a library dependency on [.filename]#libGLU.so# from package:graphics/libGLU[]
+
+`glut`::
+Add a library dependency on [.filename]#libglut.so# from package:graphics/freeglut[]
+
+[[uses-gmake]]
+== `gmake`
+
+Possible arguments: (none)
+
+Uses package:devel/gmake[] as a build-time dependency and sets up the environment to use `gmake` as the default `make` for the build.
+
+[[uses-gnome]]
+== `gnome`
+
+Possible arguments: (none)
+
+Provides an easy way to depend on GNOME components. The components should be listed in `USE_GNOME`. The available components are:
+
+* `atk`
+* `atkmm`
+* `cairo`
+* `cairomm`
+* `dconf`
+* `esound`
+* `evolutiondataserver3`
+* `gconf2`
+* `gconfmm26`
+* `gdkpixbuf`
+* `gdkpixbuf2`
+* `glib12`
+* `glib20`
+* `glibmm`
+* `gnomecontrolcenter3`
+* `gnomedesktop3`
+* `gnomedocutils`
+* `gnomemenus3`
+* `gnomemimedata`
+* `gnomeprefix`
+* `gnomesharp20`
+* `gnomevfs2`
+* `gsound`
+* `gtk-update-icon-cache`
+* `gtk12`
+* `gtk20`
+* `gtk30`
+* `gtkhtml3`
+* `gtkhtml4`
+* `gtkmm20`
+* `gtkmm24`
+* `gtkmm30`
+* `gtksharp20`
+* `gtksourceview`
+* `gtksourceview2`
+* `gtksourceview3`
+* `gtksourceviewmm3`
+* `gvfs`
+* `intlhack`
+* `intltool`
+* `introspection`
+* `libartlgpl2`
+* `libbonobo`
+* `libbonoboui`
+* `libgda5`
+* `libgda5-ui`
+* `libgdamm5`
+* `libglade2`
+* `libgnome`
+* `libgnomecanvas`
+* `libgnomekbd`
+* `libgnomeprint`
+* `libgnomeprintui`
+* `libgnomeui`
+* `libgsf`
+* `libgtkhtml`
+* `libgtksourceviewmm`
+* `libidl`
+* `librsvg2`
+* `libsigc++12`
+* `libsigc++20`
+* `libwnck`
+* `libwnck3`
+* `libxml++26`
+* `libxml2`
+* `libxslt`
+* `metacity`
+* `nautilus3`
+* `orbit2`
+* `pango`
+* `pangomm`
+* `pangox-compat`
+* `py3gobject3`
+* `pygnome2`
+* `pygobject`
+* `pygobject3`
+* `pygtk2`
+* `pygtksourceview`
+* `referencehack`
+* `vte`
+* `vte3`
+
+The default dependency is build- and run-time, it can be changed with `:build` or `:run`. For example:
+
+[.programlisting]
+....
+USES= gnome
+USE_GNOME= gnomemenus3:build intlhack
+....
+
+See <<using-gnome>> for more information.
+
+[[uses-go]]
+== `go`
+
+[IMPORTANT]
+====
+Ports should not be created for Go libs, see <<go-libs>> for more information.
+====
+
+Possible arguments: (none), `modules`, `no_targets`, `run`
+
+Sets default values and targets used to build Go software. A build dependency on the Go compiler port selected via `GO_PORT` is added. By default the build is performed in GOPATH mode. If Go software uses modules, the modules-aware mode can be switched on with `modules` argument. `no_targets` will setup build environment like `GO_ENV`, `GO_BUILDFLAGS` but skip creating `post-extract` and `do-{build,install,test}` targets. `run` will also add a run dependency on what is in `GO_PORT`.
+
+The build process is controlled by several variables:
+
+`GO_PKGNAME`::
+The name of the Go package when building in GOPATH mode. This is the directory that will be created in `${GOPATH}/src`. If not set explicitly and `GH_SUBDIR` or `GL_SUBDIR` is present, `GO_PKGNAME` will be inferred from it. It is not needed when building in modules-aware mode.
+
+`GO_TARGET`::
+The packages to build. The default value is `${GO_PKGNAME}`. `GO_TARGET` can also be a tuple in the form `package:path` where path can be either a simple filename or a full path starting with `${PREFIX}`.
+
+`GO_TESTTARGET`::
+The packages to test. The default value is `./...` (the current package and all subpackages).
+
+`CGO_CFLAGS`::
+Additional `CFLAGS` values to be passed to the C compiler by `go`.
+
+`CGO_LDFLAGS`::
+Additional `LDFLAGS` values to be passed to the C compiler by `go`.
+
+`GO_BUILDFLAGS`::
+Additional build arguments to be passed to `go build`.
+
+`GO_TESTFLAGS`::
+Additional build arguments to be passed to `go test`.
+
+`GO_PORT`::
+The Go compiler port to use. By default this is package:lang/go[] but can be set to package:lang/go-devel[] in `make.conf` for testing with future Go versions.
++
+
+[WARNING]
+====
+
+This variable must not be set by individual ports!
+====
+
+See <<using-go>> for usage examples.
+
+[[uses-gperf]]
+== `gperf`
+
+Possible arguments: (none)
+
+Add a buildtime dependency on package:devel/gperf[] if `gperf` is not present in the base system.
+
+[[uses-grantlee]]
+== `grantlee`
+
+Possible arguments: `5`, `selfbuild`
+
+Handle dependency on Grantlee. Specify `5` to depend on the Qt5 based version, package:devel/grantlee5[]. `selfbuild` is used internally by package:devel/grantlee5[] to get their versions numbers.
+
+[[uses-groff]]
+== `groff`
+
+Possible arguments: `build`, `run`, `both`
+
+Registers a dependency on package:textproc/groff[] if not present in the base system.
+
+[[uses-gssapi]]
+== `gssapi`
+
+Possible arguments: (none), `base` (default), `heimdal`, `mit`, `flags`, `bootstrap`
+
+Handle dependencies needed by consumers of the GSS-API. Only libraries that provide the Kerberos mechanism are available. By default, or set to `base`, the GSS-API library from the base system is used. Can also be set to `heimdal` to use package:security/heimdal[], or `mit` to use package:security/krb5[].
+
+When the local Kerberos installation is not in `LOCALBASE`, set `HEIMDAL_HOME` (for `heimdal`) or `KRB5_HOME` (for `krb5`) to the location of the Kerberos installation.
+
+These variables are exported for the ports to use:
+
+* `GSSAPIBASEDIR`
+* `GSSAPICPPFLAGS`
+* `GSSAPIINCDIR`
+* `GSSAPILDFLAGS`
+* `GSSAPILIBDIR`
+* `GSSAPILIBS`
+* `GSSAPI_CONFIGURE_ARGS`
+
+The `flags` option can be given alongside `base`, `heimdal`, or `mit` to automatically add `GSSAPICPPFLAGS`, `GSSAPILDFLAGS`, and `GSSAPILIBS` to `CFLAGS`, `LDFLAGS`, and `LDADD`, respectively. For example, use `base,flags`.
+
+The `bootstrap` option is a special prefix only for use by package:security/krb5[] and package:security/heimdal[]. For example, use `bootstrap,mit`.
+
+[[uses-gssapi-ex1]]
+.Typical Use
+[example]
+====
+
+[.programlisting]
+....
+OPTIONS_SINGLE= GSSAPI
+OPTIONS_SINGLE_GSSAPI= GSSAPI_BASE GSSAPI_HEIMDAL GSSAPI_MIT GSSAPI_NONE
+
+GSSAPI_BASE_USES= gssapi
+GSSAPI_BASE_CONFIGURE_ON= --with-gssapi=${GSSAPIBASEDIR} ${GSSAPI_CONFIGURE_ARGS}
+GSSAPI_HEIMDAL_USES= gssapi:heimdal
+GSSAPI_HEIMDAL_CONFIGURE_ON= --with-gssapi=${GSSAPIBASEDIR} ${GSSAPI_CONFIGURE_ARGS}
+GSSAPI_MIT_USES= gssapi:mit
+GSSAPI_MIT_CONFIGURE_ON= --with-gssapi=${GSSAPIBASEDIR} ${GSSAPI_CONFIGURE_ARGS}
+GSSAPI_NONE_CONFIGURE_ON= --without-gssapi
+....
+
+====
+
+[[uses-horde]]
+== `horde`
+
+Possible arguments: (none)
+
+Add buildtime and runtime dependencies on package:devel/pear-channel-horde[]. Other Horde dependencies can be added with `USE_HORDE_BUILD` and `USE_HORDE_RUN`. See <<php-horde>> for more information.
+
+[[uses-iconv]]
+== `iconv`
+
+Possible arguments: (none), `lib`, `build`, `patch`, `translit`, `wchar_t`
+
+Uses `iconv` functions, either from the port package:converters/libiconv[] as a build-time and run-time dependency, or from the base system on 10-CURRENT after a native `iconv` was committed in link:https://svnweb.freebsd.org/changeset/base/254273[r254273]. By default, with no arguments or with the `lib` argument, implies `iconv` with build-time and run-time dependencies. `build` implies a build-time dependency, and `patch` implies a patch-time dependency. If the port uses the `WCHAR_T` or `//TRANSLIT` iconv extensions, add the relevant arguments so that the correct iconv is used. For more information see <<using-iconv>>.
+
+[[uses-imake]]
+== `imake`
+
+Possible arguments: (none), `env`, `notall`, `noman`
+
+Add package:devel/imake[] as a build-time dependency and run `xmkmf -a` during the `configure` stage. If the `env` argument is given, the `configure` target is not set. If the `-a` flag is a problem for the port, add the `notall` argument. If `xmkmf` does not generate a `install.man` target, add the `noman` argument.
+
+[[uses-kde]]
+== `kde`
+
+Possible arguments: `5`
+
+Add dependency on KDE components. See <<using-kde>> for more information.
+
+[[uses-kmod]]
+== `kmod`
+
+Possible arguments: (none), `debug`
+
+Fills in the boilerplate for kernel module ports, currently:
+
+* Add `kld` to `CATEGORIES`.
+* Set `SSP_UNSAFE`.
+* Set `IGNORE` if the kernel sources are not found in `SRC_BASE`.
+* Define `KMODDIR` to [.filename]#/boot/modules# by default, add it to `PLIST_SUB` and `MAKE_ENV`, and create it upon installation. If `KMODDIR` is set to [.filename]#/boot/kernel#, it will be rewritten to [.filename]#/boot/modules#. This prevents breaking packages when upgrading the kernel due to [.filename]#/boot/kernel# being renamed to [.filename]#/boot/kernel.old# in the process.
+* Handle cross-referencing kernel modules upon installation and deinstallation, using <<plist-keywords-kld,`@kld`>>.
+* If the `debug` argument is given, the port can install a debug version of the module into [.filename]#KERN_DEBUGDIR#/[.filename]#KMODDIR#. By default, `KERN_DEBUGDIR` is copied from `DEBUGDIR` and set to [.filename]#/usr/lib/debug#. The framework will take care of creating and removing any required directories.
+
+[[uses-lha]]
+== `lha`
+
+Possible arguments: (none)
+
+Set `EXTRACT_SUFX` to `.lzh`
+
+[[uses-libarchive]]
+== `libarchive`
+
+Possible arguments: (none)
+
+Registers a dependency on package:archivers/libarchive[]. Any ports depending on libarchive must include `USES=libarchive`.
+
+[[uses-libedit]]
+== `libedit`
+
+Possible arguments: (none)
+
+Registers a dependency on package:devel/libedit[]. Any ports depending on libedit must include `USES=libedit`.
+
+[[uses-libtool]]
+== `libtool`
+
+Possible arguments: (none), `keepla`, `build`
+
+Patches `libtool` scripts. This must be added to all ports that use `libtool`. The `keepla` argument can be used to keep [.filename]#.la# files. Some ports do not ship with their own copy of libtool and need a build time dependency on package:devel/libtool[], use the `:build` argument to add such dependency.
+
+[[uses-linux]]
+== `linux`
+
+Possible arguments: `c6`, `c7`
+
+Ports Linux compatibility framework. Specify `c6` to depend on CentOS 6 packags. Specify `c7` to depend on CentOS 7 packages. The available packages are:
+
+* `allegro`
+* `alsa-plugins-oss`
+* `alsa-plugins-pulseaudio`
+* `alsalib`
+* `atk`
+* `avahi-libs`
+* `base`
+* `cairo`
+* `cups-libs`
+* `curl`
+* `cyrus-sasl2`
+* `dbusglib`
+* `dbuslibs`
+* `devtools`
+* `dri`
+* `expat`
+* `flac`
+* `fontconfig`
+* `gdkpixbuf2`
+* `gnutls`
+* `graphite2`
+* `gtk2`
+* `harfbuzz`
+* `jasper`
+* `jbigkit`
+* `jpeg`
+* `libasyncns`
+* `libaudiofile`
+* `libelf`
+* `libgcrypt`
+* `libgfortran`
+* `libgpg-error`
+* `libmng`
+* `libogg`
+* `libpciaccess`
+* `libsndfile`
+* `libsoup`
+* `libssh2`
+* `libtasn1`
+* `libthai`
+* `libtheora`
+* `libv4l`
+* `libvorbis`
+* `libxml2`
+* `mikmod`
+* `naslibs`
+* `ncurses-base`
+* `nspr`
+* `nss`
+* `openal`
+* `openal-soft`
+* `openldap`
+* `openmotif`
+* `openssl`
+* `pango`
+* `pixman`
+* `png`
+* `pulseaudio-libs`
+* `qt`
+* `qt-x11`
+* `qtwebkit`
+* `scimlibs`
+* `sdl12`
+* `sdlimage`
+* `sdlmixer`
+* `sqlite3`
+* `tcl85`
+* `tcp_wrappers-libs`
+* `tiff`
+* `tk85`
+* `ucl`
+* `xorglibs`
+
+[[uses-localbase]]
+== `localbase`
+
+Possible arguments: (none), `ldflags`
+
+Ensures that libraries from dependencies in `LOCALBASE` are used instead of the ones from the base system. Specify `ldflags` to add `-L${LOCALBASE}/lib` to `LDFLAGS` instead of `LIBS`. Ports that depend on libraries that are also present in the base system should use this. It is also used internally by a few other `USES`.
+
+[[uses-lua]]
+== `lua`
+
+Possible arguments: (none), `_XY_+`, `_XY_`, `build`, `run`
+
+Adds a dependency on Lua. By default this is a library dependency, unless overridden by the `build` or `run` option. The default version is 5.2, unless set by the `_XY_` parameter (for example, `51` or `52+`).
+
+[[uses-lxqt]]
+== `lxqt`
+
+Possible arguments: (none)
+
+Handle dependencies for the LXQt Desktop Environment. Use `USE_LXQT` to select the components needed for the port. See <<using-lxqt>> for more information.
+
+[[uses-makeinfo]]
+== `makeinfo`
+
+Possible arguments: (none)
+
+Add a build-time dependency on `makeinfo` if it is not present in the base system.
+
+[[uses-makeself]]
+== `makeself`
+
+Possible arguments: (none)
+
+Indicates that the distribution files are makeself archives and sets the appropriate dependencies.
+
+[[uses-mate]]
+== `mate`
+
+Possible arguments: (none)
+
+Provides an easy way to depend on MATE components. The components should be listed in `USE_MATE`. The available components are:
+
+* `autogen`
+* `caja`
+* `common`
+* `controlcenter`
+* `desktop`
+* `dialogs`
+* `docutils`
+* `icontheme`
+* `intlhack`
+* `intltool`
+* `libmatekbd`
+* `libmateweather`
+* `marco`
+* `menus`
+* `notificationdaemon`
+* `panel`
+* `pluma`
+* `polkit`
+* `session`
+* `settingsdaemon`
+
+The default dependency is build- and run-time, it can be changed with `:build` or `:run`. For example:
+
+[.programlisting]
+....
+USES= mate
+USE_MATE= menus:build intlhack
+....
+
+[[uses-meson]]
+== `meson`
+
+Possible arguments: (none)
+
+Provide support for Meson based projects. For more information see <<using-meson>>.
+
+[[uses-metaport]]
+== `metaport`
+
+Possible arguments: (none)
+
+Sets the following variables to make it easier to create a metaport: `MASTER_SITES`, `DISTFILES`, `EXTRACT_ONLY`, `NO_BUILD`, `NO_INSTALL`, `NO_MTREE`, `NO_ARCH`.
+
+[[uses-mysql]]
+== `mysql`
+
+Possible arguments: (none), `_version_`, `client` (default), `server`, `embedded`
+
+Provide support for MySQL. If no version is given, try to find the current installed version. Fall back to the default version, MySQL-5.6. The possible versions are `55`, `55m`, `55p`, `56`, `56p`, `56w`, `57`, `57p`, `80`, `100m`, `101m`, and `102m`. The `m` and `p` suffixes are for the MariaDB and Percona variants of MySQL. `server` and `embedded` add a build- and run-time dependency on the MySQL server. When using `server` or `embedded`, add `client` to also add a dependency on [.filename]#libmysqlclient.so#. A port can set `IGNORE_WITH_MYSQL` if some versions are not supported.
+
+The framework sets `MYSQL_VER` to the detected MySQL version.
+
+[[uses-mono]]
+== `mono`
+
+Possible arguments: (none), `nuget`
+
+Adds a dependency on the Mono (currently only C#) framework by setting the appropriate dependencies.
+
+Specify `nuget` when the port uses nuget packages. `NUGET_DEPENDS` needs to be set with the names and versions of the nuget packages in the format `_name=version_`. An optional package origin can be added using `_name=version:origin_`.
+
+The helper target, `buildnuget`, will output the content of the `NUGET_DEPENDS` based on the provided [.filename]#packages.config#.
+
+[[uses-motif]]
+== `motif`
+
+Possible arguments: (none)
+
+Uses package:x11-toolkits/open-motif[] as a library dependency. End users can set `WANT_LESSTIF` for the dependency to be on package:x11-toolkits/lesstif[] instead of package:x11-toolkits/open-motif[].
+
+[[uses-ncurses]]
+== `ncurses`
+
+Possible arguments: (none), `base`, `port`
+
+Uses ncurses, and causes some useful variables to be set.
+
+[[uses-ninja]]
+== `ninja`
+
+Possible arguments: (none)
+
+Uses ninja to build the port.
+
+[[uses-objc]]
+== `objc`
+
+Possible arguments: (none)
+
+Add objective C dependencies (compiler, runtime library) if the base system does not support it.
+
+[[uses-openal]]
+== `openal`
+
+Possible arguments: `al`, `soft` (default), `si`, `alut`
+
+Uses OpenAL. The backend can be specified, with the software implementation as the default. The user can specify a preferred backend with `WANT_OPENAL`. Valid values for this knob are `soft` (default) and `si`.
+
+[[uses-pathfix]]
+== `pathfix`
+
+Possible arguments: (none)
+
+Look for [.filename]#Makefile.in# and [.filename]#configure# in `PATHFIX_WRKSRC` (defaults to `WRKSRC`) and fix common paths to make sure they respect the FreeBSD hierarchy. For example, it fixes the installation directory of ``pkgconfig``'s [.filename]#.pc# files to [.filename]#${PREFIX}/libdata/pkgconfig#. If the port uses `USES=autoreconf`, [.filename]#Makefile.am# will be added to `PATHFIX_MAKEFILEIN` automatically.
+
+If the port <<uses-cmake,`USES=cmake`>> it will look for [.filename]#CMakeLists.txt# in `PATHFIX_WRKSRC`. If needed, that default filename can be changed with `PATHFIX_CMAKELISTSTXT`.
+
+[[uses-pear]]
+== `pear`
+
+Possible arguments: `env`
+
+Adds a dependency on package:devel/pear[]. It will setup default behavior for software using the PHP Extension and Application Repository. Using the `env` arguments only sets up the PEAR environment variables. See <<php-pear>> for more information.
+
+[[uses-perl5]]
+== `perl5`
+
+Possible arguments: (none)
+
+Depends on Perl. The configuration is done using `USE_PERL5`.
+
+`USE_PERL5` can contain the phases in which to use Perl, can be `extract`, `patch`, `build`, `run`, or `test`.
+
+`USE_PERL5` can also contain `configure`, `modbuild`, or `modbuildtiny` when [.filename]#Makefile.PL#, [.filename]#Build.PL#, or Module::Build::Tiny's flavor of [.filename]#Build.PL# is required.
+
+`USE_PERL5` defaults to `build run`. When using `configure`, `modbuild`, or `modbuildtiny`, `build` and `run` are implied.
+
+See <<using-perl>> for more information.
+
+[[uses-pgsql]]
+== `pgsql`
+
+Possible arguments: (none), `_X.Y_`, `_X.Y_+`, `_X.Y_-`, `_X.Y_-_Z.A_`
+
+Provide support for PostgreSQL. Port maintainer can set version required. Minimum and maximum versions or a range can be specified; for example, `9.0-`, `8.4+`, `8.4-9.2.`
+
+By default, the added dependency will be the client, but if the port requires additional components, this can be done using `WANT_PGSQL=_component[:target]_`; for example, `WANT_PGSQL=server:configure pltcl plperl`. The available components are:
+
+* `client`
+* `contrib`
+* `docs`
+* `pgtcl`
+* `plperl`
+* `plpython`
+* `pltcl`
+* `server`
+
+[[uses-php]]
+== `php`
+
+Possible arguments: (none), `phpize`, `ext`, `zend`, `build`, `cli`, `cgi`, `mod`, `web`, `embed`, `pecl`, `flavors`, `noflavors`
+
+Provide support for PHP. Add a runtime dependency on the default PHP version, package:lang/php56[].
+
+`phpize`::
+Use to build a PHP extension. Enables flavors.
+
+`ext`::
+Use to build, install and register a PHP extension. Enables flavors.
+
+`zend`::
+Use to build, install and register a Zend extension. Enables flavors.
+
+`build`::
+Set PHP also as a build-time dependency.
+
+`cli`::
+Needs the CLI version of PHP.
+
+`cgi`::
+Needs the CGI version of PHP.
+
+`mod`::
+Needs the Apache module for PHP.
+
+`web`::
+Needs the Apache module or the CGI version of PHP.
+
+`embed`::
+Needs the embedded library version of PHP.
+
+`pecl`::
+Provide defaults for fetching PHP extensions from the PECL repository. Enables flavors.
+
+`flavors`::
+Enable automatic <<flavors-auto-php,PHP flavors>> generation. Flavors will be generated for all PHP versions, except the ones present in <<uses-php-ignore,`IGNORE_WITH_PHP`>>.
+
+`noflavors`::
+Disable automatic PHP flavors generation. _Must only_ be used with extensions provided by PHP itself.
+
+Variables are used to specify which PHP modules are required, as well as which version of PHP are supported.
+
+`USE_PHP`::
+The list of required PHP extensions at run-time. Add `:build` to the extension name to add a build-time dependency. Example: `pcre xml:build gettext`
+[[uses-php-ignore]]
+`IGNORE_WITH_PHP`::
+The port does not work with PHP of the given version. For possible values look at the content of `_ALL_PHP_VERSIONS` in [.filename]#Mk/Uses/php.mk#.
+
+When building a PHP or Zend extension with `:ext` or `:zend`, these variables can be set:
+
+`PHP_MODNAME`::
+The name of the PHP or Zend extension. Default value is `${PORTNAME}`.
+
+`PHP_HEADER_DIRS`::
+A list of subdirectories from which to install header files. The framework will always install the header files that are present in the same directory as the extension.
+
+`PHP_MOD_PRIO`::
+The priority at which to load the extension. It is a number between `00` and `99`.
++
+For extensions that do not depend on any extension, the priority is automatically set to `20`, for extensions that depend on another extension, the priority is automatically set to `30`. Some extensions may need to be loaded before every other extension, for example package:www/php56-opcache[]. Some may need to be loaded after an extension with a priority of `30`. In that case, add `PHP_MOD_PRIO=_XX_` in the port's Makefile. For example:
++
+[.programlisting]
+....
+USES= php:ext
+USE_PHP= wddx
+PHP_MOD_PRIO= 40
+....
+
+These variables are available to use in `PKGNAMEPREFIX` or `PKGNAMESUFFIX`:
+
+`PHP_PKGNAMEPREFIX`::
+Contains `php__XY__-` where _XY_ is the current flavor's PHP version. Use with PHP extensions and modules.
+
+`PHP_PKGNAMESUFFIX`::
+Contains `-php__XY__` where _XY_ is the current flavor's PHP version. Use with PHP applications.
+
+`PECL_PKGNAMEPREFIX`::
+Contains `php__XY__-pecl-` where _XY_ is the current flavor's PHP version. Use with PECL modules.
+
+[IMPORTANT]
+====
+With flavors, all PHP extensions, PECL extensions, PEAR modules _must have_ a different package name, so they must all use one of these three variables in their `PKGNAMEPREFIX` or `PKGNAMESUFFIX`.
+====
+
+[[uses-pkgconfig]]
+== `pkgconfig`
+
+Possible arguments: (none), `build` (default), `run`, `both`
+
+Uses package:devel/pkgconf[]. With no arguments or with the `build` argument, it implies `pkg-config` as a build-time dependency. `run` implies a run-time dependency and `both` implies both run-time and build-time dependencies.
+
+[[uses-pure]]
+== `pure`
+
+Possible arguments: (none), `ffi`
+
+Uses package:lang/pure[]. Largely used for building related pure ports. With the `ffi` argument, it implies package:devel/pure-ffi[] as a run-time dependency.
+
+[[uses-pyqt]]
+== `pyqt`
+
+Possible arguments: (none), `4`, `5`
+
+Uses PyQt. If the port is part of PyQT itself, set `PYQT_DIST`. Use `USE_PYQT` to select the components the port needs. The available components are:
+
+* `core`
+* `dbus`
+* `dbussupport`
+* `demo`
+* `designer`
+* `designerplugin`
+* `doc`
+* `gui`
+* `multimedia`
+* `network`
+* `opengl`
+* `qscintilla2`
+* `sip`
+* `sql`
+* `svg`
+* `test`
+* `webkit`
+* `xml`
+* `xmlpatterns`
+
+These components are only available with PyQT4:
+
+* `assistant`
+* `declarative`
+* `help`
+* `phonon`
+* `script`
+* `scripttools`
+
+These components are only available with PyQT5:
+
+* `multimediawidgets`
+* `printsupport`
+* `qml`
+* `serialport`
+* `webkitwidgets`
+* `widgets`
+
+The default dependency for each component is build- and run-time, to select only build or run, add `_build` or `_run` to the component name. For example:
+
+[.programlisting]
+....
+USES= pyqt
+USE_PYQT= core doc_build designer_run
+....
+
+[[uses-python]]
+== `python`
+
+Possible arguments: (none), `_X.Y_`, `_X.Y+_`, `_-X.Y_`, `_X.Y-Z.A_`, `patch`, `build`, `run`, `test`
+
+Uses Python. A supported version or version range can be specified. If Python is only needed at build time, run time or for the tests, it can be set as a build, run or test dependency with `build`, `run`, or `test`. If Python is also needed during the patch phase, use `patch`. See <<using-python>> for more information.
+
+`PYTHON_NO_DEPENDS=yes` can be used when the variables exported by the framework are needed but a dependency on Python is not. It can happen when using with <<uses-shebangfix,`USES=shebangfix`>>, and the goal is only to fix the shebangs but not add a dependency on Python.
+
+[[uses-qmail]]
+== `qmail`
+
+Possible arguments: (none), `build`, `run`, `both`, `vars`
+
+Uses package:mail/qmail[]. With the `build` argument, it implies `qmail` as a build-time dependency. `run` implies a run-time dependency. Using no argument or the `both` argument implies both run-time and build-time dependencies. `vars` will only set QMAIL variables for the port to use.
+
+[[uses-qmake]]
+== `qmake`
+
+Possible arguments: (none), `norecursive`, `outsource`, `no_env`, `no_configure`
+
+Uses QMake for configuring. For more information see <<using-qmake>>.
+
+[[uses-qt]]
+== `qt`
+
+Possible arguments: `5`, `no_env`
+
+Add dependency on Qt components. `no_env` is passed directly to `USES= qmake`. See <<using-qt>> for more information.
+
+[[uses-qt-dist]]
+== `qt-dist`
+
+Possible arguments: (none) or `5` and (none) or one of `3d`, `activeqt`, `androidextras`, `base`, `canvas3d`, `charts`, `connectivity`, `datavis3d`, `declarative`, `doc`, `gamepad`, `graphicaleffects`, `imageformats`, `location`, `macextras`, `multimedia`, `networkauth`, `purchasing`, `quickcontrols2`, `quickcontrols`, `remoteobjects`, `script`, `scxml`, `sensors`, `serialbus`, `serialport`, `speech`, `svg`, `tools`, `translations`, `virtualkeyboard`, `wayland`, `webchannel`, `webengine`, `websockets`, `webview`, `winextras`, `x11extras`, `xmlpatterns`
+
+Provides support for building Qt 5 components. It takes care of setting up the appropriate configuration environment for the port to build.
+
+[[qt5-dist-example]]
+.Building Qt 5 Components
+[example]
+====
+
+The port is Qt 5's `networkauth` component, which is part of the `networkauth` distribution file.
+
+[.programlisting]
+....
+PORTNAME= networkauth
+DISTVERSION= ${QT5_VERSION}
+
+USES= qt-dist:5
+....
+
+====
+
+If `PORTNAME` does not match the component name, it can be passed as an argument to `qt-dist`.
+
+[[qt5-dist-example-explicit]]
+.Building Qt 5 Components with Different Names
+[example]
+====
+
+The port is Qt 5's `gui` component, which is part of the `base` distribution file.
+
+[.programlisting]
+....
+PORTNAME= gui
+DISTVERSION= ${QT5_VERSION}
+
+USES= qt-dist:5,base
+....
+
+====
+
+[[uses-readline]]
+== `readline`
+
+Possible arguments: (none), `port`
+
+Uses readline as a library dependency, and sets `CPPFLAGS` and `LDFLAGS` as necessary. If the `port` argument is used or if readline is not present in the base system, add a dependency on package:devel/readline[]
+
+[[uses-samba]]
+== `samba`
+
+Possible arguments: `build`, `env`, `lib`, `run`
+
+Handle dependency on Samba. `env` will not add any dependency and only set up the variables. `build` and `run` will add build-time and run-time dependency on [.filename]#smbd#. `lib` will add a dependency on [.filename]#libsmbclient.so#. The variables that are exported are:
+
+`SAMBAPORT`::
+The origin of the default Samba port.
+
+`SAMBAINCLUDES`::
+The location of the Samba header files.
+
+`SAMBALIBS`::
+The directory where the Samba shared libraries are available.
+
+[[uses-scons]]
+== `scons`
+
+Possible arguments: (none)
+
+Provide support for the use of package:devel/scons[]. See <<using-scons>> for more information.
+
+[[uses-shared-mime-info]]
+== `shared-mime-info`
+
+Possible arguments: (none)
+
+Uses update-mime-database from package:misc/shared-mime-info[]. This uses will automatically add a post-install step in such a way that the port itself still can specify there own post-install step if needed. It also add an <<plist-keywords-shared-mime-info,`@shared-mime-info`>> entry to the plist.
+
+[[uses-shebangfix]]
+== `shebangfix`
+
+Possible arguments: (none)
+
+A lot of software uses incorrect locations for script interpreters, most notably [.filename]#/usr/bin/perl# and [.filename]#/bin/bash#. The shebangfix macro fixes shebang lines in scripts listed in `SHEBANG_REGEX`, `SHEBANG_GLOB`, or `SHEBANG_FILES`.
+
+`SHEBANG_REGEX`::
+Contains _one_ extended regular expressions, and is used with the `-iregex` argument of man:find[1]. See <<uses-shebangfix-ex-regex>>.
+
+`SHEBANG_GLOB`::
+Contains a list of patterns used with the `-name` argument of man:find[1]. See <<uses-shebangfix-ex-glob>>.
+
+`SHEBANG_FILES`::
+Contains a list of files or man:sh[1] globs. The shebangfix macro is run from `${WRKSRC}`, so `SHEBANG_FILES` can contain paths that are relative to `${WRKSRC}`. It can also deal with absolute paths if files outside of `${WRKSRC}` require patching. See <<uses-shebangfix-ex-files>>.
+
+Currently Bash, Java, Ksh, Lua, Perl, PHP, Python, Ruby, Tcl, and Tk are supported by default.
+
+There are three configuration variables:
+
+`SHEBANG_LANG`::
+The list of supported interpreters.
+
+`interp_CMD`::
+The path to the command interpreter on FreeBSD. The default value is `${LOCALBASE}/bin/_interp_`.
+
+`interp_OLD_CMD`::
+The list of wrong invocations of interpreters. These are typically obsolete paths, or paths used on other operating systems that are incorrect on FreeBSD. They will be replaced by the correct path in `interp_CMD`.
++
+[NOTE]
+====
+These will _always_ be part of `interp_OLD_CMD`: `"/usr/bin/env _interp_" /bin/_interp_ /usr/bin/_interp_ /usr/local/bin/_interp_`.
+====
++
+[TIP]
+====
+
+`interp_OLD_CMD` contain multiple values. Any entry with spaces must be quoted. See <<uses-shebangfix-ex-ksh>>.
+====
+
+[IMPORTANT]
+====
+The fixing of shebangs is done during the `patch` phase. If scripts are created with incorrect shebangs during the `build` phase, the build process (for example, the [.filename]#configure# script, or the [.filename]#Makefiles#) must be patched or given the right path (for example, with `CONFIGURE_ENV`, `CONFIGURE_ARGS`, `MAKE_ENV`, or `MAKE_ARGS`) to generate the right shebangs.
+
+Correct paths for supported interpreters are available in `interp_CMD`.
+====
+
+[TIP]
+====
+
+When used with <<uses-python,`USES=python`>>, and the aim is only to fix the shebangs but a dependency on Python itself is not wanted, use `PYTHON_NO_DEPENDS=yes`.
+====
+
+[[uses-shebangfix-ex-lua]]
+.Adding Another Interpreter to `USES=shebangfix`
+[example]
+====
+
+To add another interpreter, set `SHEBANG_LANG`. For example:
+
+[.programlisting]
+....
+SHEBANG_LANG= lua
+....
+
+====
+
+[[uses-shebangfix-ex-ksh]]
+.Specifying all the Paths When Adding an Interpreter to `USES=shebangfix`
+[example]
+====
+
+If it was not already defined, and there were no default values for `interp_OLD_CMD` and `interp_CMD` the Ksh entry could be defined as:
+
+[.programlisting]
+....
+SHEBANG_LANG= ksh
+ksh_OLD_CMD= "/usr/bin/env ksh" /bin/ksh /usr/bin/ksh
+ksh_CMD= ${LOCALBASE}/bin/ksh
+....
+
+====
+
+[[uses-shebangfix-ex-strange]]
+.Adding a Strange Location for an Interpreter
+[example]
+====
+
+Some software uses strange locations for an interpreter. For example, an application might expect Python to be located in [.filename]#/opt/bin/python2.7#. The strange path to be replaced can be declared in the port [.filename]#Makefile#:
+
+[.programlisting]
+....
+python_OLD_CMD= /opt/bin/python2.7
+....
+
+====
+
+[[uses-shebangfix-ex-regex]]
+.`USES=shebangfix` with `SHEBANG_REGEX`
+[example]
+====
+
+To fix all the files in `${WRKSRC}/scripts` ending in [.filename]#.pl#, [.filename]#.sh#, or [.filename]#.cgi# do:
+
+[.programlisting]
+....
+USES= shebangfix
+SHEBANG_REGEX= ./scripts/.*\.(sh|pl|cgi)
+....
+
+[NOTE]
+****
+`SHEBANG_REGEX` is used by running `find -E`, which uses modern regular expressions also known as extended regular expressions. See man:re_format[7] for more information.
+****
+====
+
+[[uses-shebangfix-ex-glob]]
+.`USES=shebangfix` with `SHEBANG_GLOB`
+[example]
+====
+To fix all the files in `${WRKSRC}` ending in [.filename]#.pl# or [.filename]#.sh#, do:
+
+[.programlisting]
+....
+USES= shebangfix
+SHEBANG_GLOB= *.sh *.pl
+....
+====
+
+[[uses-shebangfix-ex-files]]
+.`USES=shebangfix` with `SHEBANG_FILES`
+[example]
+====
+To fix the files [.filename]#script/foobar.pl# and [.filename]#script/*.sh# in `${WRKSRC}`, do:
+
+[.programlisting]
+....
+USES= shebangfix
+SHEBANG_FILES= scripts/foobar.pl scripts/*.sh
+....
+====
+
+[[uses-sqlite]]
+== `sqlite`
+
+Possible arguments: (none), `2`, `3`
+
+Add a dependency on SQLite. The default version used is 3, but version 2 is also possible using the `:2` modifier.
+
+[[uses-ssl]]
+== `ssl`
+
+Possible arguments: (none), `build`, `run`
+
+Provide support for OpenSSL. A build- or run-time only dependency can be specified using `build` or `run`. These variables are available for the port's use, they are also added to `MAKE_ENV`:
+
+`OPENSSLBASE`::
+Path to the OpenSSL installation base.
+
+`OPENSSLDIR`::
+Path to OpenSSL's configuration files.
+
+`OPENSSLLIB`::
+Path to the OpenSSL libraries.
+
+`OPENSSLINC`::
+Path to the OpenSSL includes.
+
+`OPENSSLRPATH`::
+If defined, the path the linker needs to use to find the OpenSSL libraries.
+
+[TIP]
+====
+
+If a port does not build with an OpenSSL flavor, set the `BROKEN_SSL` variable, and possibly the `BROKEN_SSL_REASON_flavor`:
+
+[.programlisting]
+....
+BROKEN_SSL= libressl
+BROKEN_SSL_REASON_libressl= needs features only available in OpenSSL
+....
+
+====
+
+[[uses-tar]]
+== `tar`
+
+Possible arguments: (none), `Z`, `bz2`, `bzip2`, `lzma`, `tbz`, `tbz2`, `tgz`, `txz`, `xz`
+
+Set `EXTRACT_SUFX` to `.tar`, `.tar.Z`, `.tar.bz2`, `.tar.bz2`, `.tar.lzma`, `.tbz`, `.tbz2`, `.tgz`, `.txz` or `.tar.xz` respectively.
+
+[[uses-tcl]]
+== `tcl`
+
+Possible arguments: _version_, `wrapper`, `build`, `run`, `tea`
+
+Add a dependency on Tcl. A specific version can be requested using _version_. The version can be empty, one or more exact version numbers (currently `84`, `85`, or `86`), or a minimal version number (currently `84+`, `85+` or `86+`). To only request a non version specific wrapper, use `wrapper`. A build- or run-time only dependency can be specified using `build` or `run`. To build the port using the Tcl Extension Architecture, use `tea`. After including [.filename]#bsd.port.pre.mk# the port can inspect the results using these variables:
+
+* `TCL_VER`: chosen major.minor version of Tcl
+* `TCLSH`: full path of the Tcl interpreter
+* `TCL_LIBDIR`: path of the Tcl libraries
+* `TCL_INCLUDEDIR`: path of the Tcl C header files
+* `TK_VER`: chosen major.minor version of Tk
+* `WISH`: full path of the Tk interpreter
+* `TK_LIBDIR`: path of the Tk libraries
+* `TK_INCLUDEDIR`: path of the Tk C header files
+
+[[uses-terminfo]]
+== `terminfo`
+
+Possible arguments: (none)
+
+Adds <<plist-keywords-terminfo,`@terminfo`>> to the [.filename]#plist#. Use when the port installs [.filename]#*.terminfo# files in [.filename]#${PREFIX}/shared/misc#.
+
+[[uses-tk]]
+== `tk`
+
+Same as arguments for `tcl`
+
+Small wrapper when using both Tcl and Tk. The same variables are returned as when using Tcl.
+
+[[uses-uidfix]]
+== `uidfix`
+
+Possible arguments: (none)
+
+Changes some default behavior (mostly variables) of the build system to allow installing this port as a normal user. Try this in the port before using <<uses-fakeroot,USES=fakeroot>> or patching.
+
+[[uses-uniquefiles]]
+== `uniquefiles`
+
+Possible arguments: (none), `dirs`
+
+Make files or directories 'unique', by adding a prefix or suffix. If the `dirs` argument is used, the port needs a prefix (and only a prefix) based on `UNIQUE_PREFIX` for standard directories `DOCSDIR`, `EXAMPLESDIR`, `DATADIR`, `WWWDIR`, `ETCDIR`. These variables are available for ports:
+
+* `UNIQUE_PREFIX`: The prefix to be used for directories and files. Default: `${PKGNAMEPREFIX}`.
+* `UNIQUE_PREFIX_FILES`: A list of files that need to be prefixed. Default: empty.
+* `UNIQUE_SUFFIX`: The suffix to be used for files. Default: `${PKGNAMESUFFIX}`.
+* `UNIQUE_SUFFIX_FILES`: A list of files that need to be suffixed. Default: empty.
+
+[[uses-varnish]]
+== `varnish`
+
+Possible arguments: `4`, `5`
+
+Handle dependencies on Varnish Cache. `4` will add a dependency on package:www/varnish4[]. `5` will add a dependency on package:www/varnish5[].
+
+[[uses-webplugin]]
+== `webplugin`
+
+Possible arguments: (none), `ARGS`
+
+Automatically create and remove symbolic links for each application that supports the webplugin framework. `ARGS` can be one of:
+
+* `gecko`: support plug-ins based on Gecko
+* `native`: support plug-ins for Gecko, Opera, and WebKit-GTK
+* `linux`: support Linux plug-ins
+* `all` (default, implicit): support all plug-in types
+* (individual entries): support only the browsers listed
+
+These variables can be adjusted:
+
+* `WEBPLUGIN_FILES`: No default, must be set manually. The plug-in files to install.
+* `WEBPLUGIN_DIR`: The directory to install the plug-in files to, default [.filename]#PREFIX/lib/browser_plugins/WEBPLUGIN_NAME#. Set this if the port installs plug-in files outside of the default directory to prevent broken symbolic links.
+* `WEBPLUGIN_NAME`: The final directory to install the plug-in files into, default `PKGBASE`.
+
+[[uses-xfce]]
+== `xfce`
+
+Possible arguments: (none), `gtk2`
+
+Provide support for Xfce related ports. See <<using-xfce>> for details.
+
+The `gtk2` argument specifies that the port requires GTK2 support. It adds additional features provided by some core components, for example, package:x11/libxfce4menu[] and package:x11-wm/xfce4-panel[].
+
+[[uses-xorg]]
+== `xorg`
+
+Possible arguments: (none)
+
+Provides an easy way to depend on X.org components. The components should be listed in `USE_XORG`. The available components are:
+[[using-x11-components]]
+.Available X.Org Components
+[cols="1,1", frame="none", options="header"]
+|===
+| Name
+| Description
+
+|`dmx`
+|DMX extension library
+
+|`fontenc`
+|The fontenc Library
+
+|`fontutil`
+|Create an index of X font files in a directory
+
+|`ice`
+|Inter Client Exchange library for X11
+
+|`libfs`
+|The FS library
+
+|`pciaccess`
+|Generic PCI access library
+
+|`pixman`
+|Low-level pixel manipulation library
+
+|`sm`
+|Session Management library for X11
+
+|`x11`
+|X11 library
+
+|`xau`
+|Authentication Protocol library for X11
+
+|`xaw`
+|X Athena Widgets library
+
+|`xaw6`
+|X Athena Widgets library
+
+|`xaw7`
+|X Athena Widgets library
+
+|`xbitmaps`
+|X.Org bitmaps data
+
+|`xcb`
+|The X protocol C-language Binding (XCB) library
+
+|`xcomposite`
+|X Composite extension library
+
+|`xcursor`
+|X client-side cursor loading library
+
+|`xdamage`
+|X Damage extension library
+
+|`xdmcp`
+|X Display Manager Control Protocol library
+
+|`xext`
+|X11 Extension library
+
+|`xfixes`
+|X Fixes extension library
+
+|`xfont`
+|X font library
+
+|`xfont2`
+|X font library
+
+|`xft`
+|Client-sided font API for X applications
+
+|`xi`
+|X Input extension library
+
+|`xinerama`
+|X11 Xinerama library
+
+|`xkbfile`
+|XKB file library
+
+|`xmu`
+|X Miscellaneous Utilities libraries
+
+|`xmuu`
+|X Miscellaneous Utilities libraries
+
+|`xorg-macros`
+|X.Org development aclocal macros
+
+|`xorg-server`
+|X.Org X server and related programs
+
+|`xorgproto`
+|xorg protocol headers
+
+|`xpm`
+|X Pixmap library
+
+|`xpresent`
+|X Present Extension library
+
+|`xrandr`
+|X Resize and Rotate extension library
+
+|`xrender`
+|X Render extension library
+
+|`xres`
+|X Resource usage library
+
+|`xscrnsaver`
+|The XScrnSaver library
+
+|`xshmfence`
+|Shared memory 'SyncFence' synchronization primitive
+
+|`xt`
+|X Toolkit library
+
+|`xtrans`
+|Abstract network code for X
+
+|`xtst`
+|X Test extension
+
+|`xv`
+|X Video Extension library
+
+|`xvmc`
+|X Video Extension Motion Compensation library
+
+|`xxf86dga`
+|X DGA Extension
+
+|`xxf86vm`
+|X Vidmode Extension
+|===
+
+[[uses-xorg-cat]]
+== `xorg-cat`
+
+Possible arguments: `app`, `data`, `doc`, `driver`, `font`, `lib`, `proto`, `util`, `xserver` and (none) or one off `autotools` (default), `meson`
+
+Provide support for building Xorg components. It takes care of setting up common dependencies and an appropriate configuration environment needed. This is intended only for Xorg components.
+
+The category has to match upstream categories.
+
+The second argument is the build system to use. autotools is the default, but meson is also supported.
+
+[[uses-zip]]
+== `zip`
+
+Possible arguments: (none), `infozip`
+
+Indicates that the distribution files use the ZIP compression algorithm. For files using the InfoZip algorithm the `infozip` argument must be passed to set the appropriate dependencies.
diff --git a/documentation/content/ru/books/porters-handbook/versions/chapter.adoc b/documentation/content/ru/books/porters-handbook/versions/chapter.adoc
new file mode 100644
index 0000000000..f9234dac57
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/versions/chapter.adoc
@@ -0,0 +1,6343 @@
+---
+title: Глава 16. Значения __FreeBSD_version
+prev: books/porters-handbook/uses
+---
+
+[[versions]]
+= Значения `__FreeBSD_version`
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Содержание
+:table-caption: Таблица
+:figure-caption: Рисунок
+:example-caption: Пример
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 16
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/ru/mailing-lists.adoc[]
+include::shared/ru/teams.adoc[]
+include::shared/ru/urls.adoc[]
+
+toc::[]
+
+Here is a convenient list of `__FreeBSD_version` values as defined in http://svnweb.FreeBSD.org/base/head/sys/sys/param.h?view=markup[sys/param.h]:
+
+[[versions-13]]
+== FreeBSD 13 Versions
+
+[[freebsd-versions-table-13]]
+.FreeBSD 13 `__FreeBSD_version` Values
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Value
+| Revision
+| Date
+| Release
+
+|1300000
+|link:https://svnweb.freebsd.org/changeset/base/339436[339436]
+|October 19, 2018
+|13.0-CURRENT.
+
+|1300001
+|link:https://svnweb.freebsd.org/changeset/base/339730[339730]
+|October 25, 2018
+|13.0-CURRENT after bumping OpenSSL shared library version numbers.
+
+|1300002
+|link:https://svnweb.freebsd.org/changeset/base/339765[339765]
+|October 25, 2018
+|13.0-CURRENT after restoration of [.filename]#sys/joystick.h#.
+
+|1300003
+|link:https://svnweb.freebsd.org/changeset/base/340055[340055]
+|November 2, 2018
+|13.0-CURRENT after vop_symlink API change (`a_target` is now `const`.)
+
+|1300004
+|link:https://svnweb.freebsd.org/changeset/base/340841[340841]
+|November 23, 2018
+|13.0-CURRENT after enabling crtbegin and crtend code.
+
+|1300005
+|link:https://svnweb.freebsd.org/changeset/base/341836[341836]
+|December 11, 2018
+|13.0-CURRENT after enabling UFS inode checksums.
+
+|1300006
+|link:https://svnweb.freebsd.org/changeset/base/342398[342398]
+|December 24, 2018
+|13.0-CURRENT after fixing `sys/random.h` include to be usable from C++.
+
+|1300007
+|link:https://svnweb.freebsd.org/changeset/base/342629[342629]
+|December 30, 2018
+|13.0-CURRENT after changing the size of `struct linux_cdev` on 32-bit platforms.
+
+|1300008
+|link:https://svnweb.freebsd.org/changeset/base/342772[342772]
+|January 4, 2019
+|13.0-CURRENT after adding `kern.smp.threads_per_core` and `kern.smp.cores` sysctls.
+
+|1300009
+|link:https://svnweb.freebsd.org/changeset/base/343213[343213]
+|January 20, 2019
+|13.0-CURRENT after `struct ieee80211vap` structure change to resolve ioctl/detach race for ieee80211com structure.
+
+|1300010
+|link:https://svnweb.freebsd.org/changeset/base/343485[343485]
+|January 27, 2019
+|13.0-CURRENT after increasing `SPECNAMELEN` from 63 to MAXNAMELEN (255).
+
+|1300011
+|link:https://svnweb.freebsd.org/changeset/base/344041[344041]
+|February 12, 2019
+|13.0-CURRENT after man:renameat[2] has been corrected to work with kernels built with the `CAPABILITIES` option.
+
+|1300012
+|link:https://svnweb.freebsd.org/changeset/base/344062[344062]
+|February 12, 2019
+|13.0-CURRENT after `taskqgroup_attach()` and `taskqgroup_attach_cpu()` take a device_t and a struct resource pointer as arguments for denoting device interrupts.
+
+|1300013
+|link:https://svnweb.freebsd.org/changeset/base/344300[344300]
+|February 19, 2019
+|13.0-CURRENT after the removal of drm and drm2.
+
+|1300014
+|link:https://svnweb.freebsd.org/changeset/base/344779[344779]
+|March 4, 2019
+|13.0-CURRENT after upgrading clang, llvm, lld, lldb, compiler-rt and libc++ to 8.0.0 rc3.
+
+|1300015
+|link:https://svnweb.freebsd.org/changeset/base/345196[345196]
+|March 15, 2019
+|13.0-CURRENT after deanonymizing thread and proc state enums, so userland applications can use them without redefining the value names.
+
+|1300016
+|link:https://svnweb.freebsd.org/changeset/base/345236[345236]
+|March 16, 2019
+|13.0-CURRENT after enabling LLVM OpenMP 8.0.0 rc5 on amd64 by default.
+
+|1300017
+|link:https://svnweb.freebsd.org/changeset/base/345305[345305]
+|March 19, 2019
+|13.0-CURRENT after exposing the Rx mbuf buffer size to drivers in iflib.
+
+|1300018
+|link:https://svnweb.freebsd.org/changeset/base/346012[346012]
+|March 16, 2019
+|13.0-CURRENT after introduction of funlinkat syscall in link:https://svnweb.freebsd.org/changeset/base/345982[345982].
+
+|1300019
+|link:https://svnweb.freebsd.org/changeset/base/346282[346282]
+|April 16, 2019
+|13.0-CURRENT after addition of is_random_seeded(9) to man:random[4].
+
+|1300020
+|link:https://svnweb.freebsd.org/changeset/base/346358[346358]
+|April 18, 2019
+|13.0-CURRENT after restoring man:random[4] availability tradeoff prior to link:https://svnweb.freebsd.org/changeset/base/346250[346250] and adding new tunables and diagnostic sysctls for programmatically discovering early seeding problems after boot.
+
+|1300021
+|link:https://svnweb.freebsd.org/changeset/base/346645[346645]
+|April 24, 2019
+|13.0-CURRENT after LinuxKPI uses man:bus_dma[9] to be compatible with an IOMMU.
+
+|1300022
+|link:https://svnweb.freebsd.org/changeset/base/347089[347089]
+|May 4, 2019
+|13.0-CURRENT after fixing regression issue after link:https://svnweb.freebsd.org/changeset/base/346645[346645] in the LinuxKPI.
+
+|1300023
+|link:https://svnweb.freebsd.org/changeset/base/347192[347192]
+|May 6, 2019
+|13.0-CURRENT after list-ifying kernel dump device configuration.
+
+|1300024
+|link:https://svnweb.freebsd.org/changeset/base/347325[347325]
+|May 8, 2019
+|13.0-CURRENT after bumping the Mellanox driver version numbers (man:mlx4en[4]; man:mlx5en[4]).
+
+|1300025
+|link:https://svnweb.freebsd.org/changeset/base/347532[347532]
+|May 13, 2019
+|13.0-CURRENT after renaming `vm.max_wired` to `vm.max_user_wired` and changing its type.
+
+|1300026
+|link:https://svnweb.freebsd.org/changeset/base/347596[347596]
+|May 14, 2019
+|13.0-CURRENT after adding context member to ww_mutex in LinuxKPI.
+
+|1300027
+|link:https://svnweb.freebsd.org/changeset/base/347601[347601]
+|May 14, 2019
+|13.0-CURRENT after adding prepare to pm_ops in LinuxKPI.
+
+|1300028
+|link:https://svnweb.freebsd.org/changeset/base/347925[347925]
+|May 17, 2019
+|13.0-CURRENT after removal of bm, cs, de, ed, ep, ex, fe, pcn, sf, sn, tl, tx, txp, vx, wb, and xe drivers.
+
+|1300029
+|link:https://svnweb.freebsd.org/changeset/base/347984[347984]
+|May 20, 2019
+|13.0-CURRENT after removing some header pollution due to `sys/eventhandler.h`. Affected files may now need to explicitly include one or more of `sys/eventhandler.h`, `sys/ktr.h`, `sys/lock.h`, or `sys/mutex.h`, when the missing header may have been included implicitly prior to 1300029.
+
+|1300030
+|link:https://svnweb.freebsd.org/changeset/base/348350[348350]
+|May 29, 2019
+|13.0-CURRENT after adding relocation support to libdwarf on powerpc64 to fix handling of DWARF information on unlinked objects. Original commit in link:https://svnweb.freebsd.org/changeset/base/348347[348347].
+
+|1300031
+|link:https://svnweb.freebsd.org/changeset/base/348808[348808]
+|June 8, 2019
+|13.0-CURRENT after adding dpcpu and vnet section fixes to i386 kernel modules to avoid panics in certain conditions. i386 kernel modules need to be recompiled with the linker script magic in place or they will refuse to load.
+
+|1300032
+|link:https://svnweb.freebsd.org/changeset/base/349151[349151]
+|June 17, 2019
+|13.0-CURRENT after separating kernel crc32() implementation to its own header (gsb_crc32.h) and renaming the source to gsb_crc32.c.
+
+|1300033
+|link:https://svnweb.freebsd.org/changeset/base/349277[349277]
+|June 21, 2019
+|13.0-CURRENT after additions to LinuxKPI's rcu list.
+
+|1300034
+|link:https://svnweb.freebsd.org/changeset/base/349352[349352]
+|June 24, 2019
+|13.0-CURRENT after NAND and NANDFS removal.
+
+|1300035
+|link:https://svnweb.freebsd.org/changeset/base/349846[349846]
+|July 8, 2019
+|13.0-CURRENT after merging the vm_page hold and wire mechanisms.
+
+|1300036
+|link:https://svnweb.freebsd.org/changeset/base/349972[349972]
+|July 13, 2019
+|13.0-CURRENT after adding arm_drain_writebuf() and arm_sync_icache() for compatibility with NetBSD and OpenBSD.
+
+|1300037
+|link:https://svnweb.freebsd.org/changeset/base/350307[350307]
+|July 24, 2019
+|13.0-CURRENT after removal of libcap_random(3).
+
+|1300038
+|link:https://svnweb.freebsd.org/changeset/base/350437[350437]
+|July 30, 2019
+|13.0-CURRENT after removal of gzip'ed a.out support.
+
+|1300039
+|link:https://svnweb.freebsd.org/changeset/base/350665[350665]
+|August 7, 2019
+|13.0-CURRENT after merge of fusefs from projects/fuse2.
+
+|1300040
+|link:https://svnweb.freebsd.org/changeset/base/351140[351140]
+|August 16, 2019
+|13.0-CURRENT after deletion of sys/dir.h which has been deprecated since 1997.
+
+|(not changed)
+|link:https://svnweb.freebsd.org/changeset/base/351423[351423]
+|August 23, 2019
+|13.0-CURRENT after changing most arguments to man:ping6[8].
+
+|1300041
+|link:https://svnweb.freebsd.org/changeset/base/351480[351480]
+|August 25, 2019
+|13.0-CURRENT after removal of zlib 1.0.4 after the completion of kernel zlib unification.
+
+|1300042
+|link:https://svnweb.freebsd.org/changeset/base/351522[351522]
+|August 27, 2019
+|13.0-CURRENT after addition of kernel-side support for in-kernel TLS.
+
+|1300043
+|link:https://svnweb.freebsd.org/changeset/base/351698[351698]
+|September 2, 2019
+|13.0-CURRENT after removal of man:gets[3].
+
+|1300044
+|link:https://svnweb.freebsd.org/changeset/base/351701[351701]
+|September 2, 2019
+|13.0-CURRENT after adding sysfs create/remove functions that handles multiple files in one call to the LinuxKPI.
+
+|1300045
+|link:https://svnweb.freebsd.org/changeset/base/351729[351729]
+|September 3, 2019
+|13.0-CURRENT after adding sysctlbyname system call
+
+|1300046
+|link:https://svnweb.freebsd.org/changeset/base/351937[351937]
+|September 6, 2019
+|13.0-CURRENT after LinuxKPI sysfs improvements.
+
+|1300047
+|link:https://svnweb.freebsd.org/changeset/base/352110[352110]
+|September 9, 2019
+|13.0-CURRENT after changing the synchonization rules for vm_page reference counting..
+
+|1300048
+|link:https://svnweb.freebsd.org/changeset/base/352700[352700]
+|September 25, 2019
+|13.0-CURRENT after adding a shm_open2 syscall to support the upcoming memfd_create syscall.
+
+|1300049
+|link:https://svnweb.freebsd.org/changeset/base/353274[353274]
+|October 7, 2019
+|13.0-CURRENT after factoring out the VNET shutdown check into an own vnet structure field.
+
+|1300050
+|link:https://svnweb.freebsd.org/changeset/base/353358[353358]
+|October 9, 2019
+|13.0-CURRENT after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 9.0.0 final release r372316.
+
+|1300051
+|link:https://svnweb.freebsd.org/changeset/base/353685[353685]
+|October 17, 2019
+|13.0-CURRENT after splitting out a more generic debugnet(4) from man:netdump[4].
+
+|1300052
+|link:https://svnweb.freebsd.org/changeset/base/353698[353698]
+|October 17, 2019
+|13.0-CURRENT after promoting the page busy field to a first class lock that no longer requires the object lock for consistency.
+
+|1300053
+|link:https://svnweb.freebsd.org/changeset/base/353700[353700]
+|October 17, 2019
+|13.0-CURRENT after implementing NetGDB.
+
+|1300054
+|link:https://svnweb.freebsd.org/changeset/base/353868[353868]
+|October 21, 2019
+|13.0-CURRENT after removing obsoleted KPIs that were used to access interface address lists.
+
+|1300055
+|link:https://svnweb.freebsd.org/changeset/base/354335[354335]
+|November 4, 2019
+|13.0-CURRENT after enabling device class group attributes in the LinuxKPI.
+
+|1300056
+|link:https://svnweb.freebsd.org/changeset/base/354460[354460]
+|November 7, 2019
+|13.0-CURRENT after fixing a potential OOB read security issue in libc++.
+
+|1300057
+|link:https://svnweb.freebsd.org/changeset/base/354694[354694]
+|November 13, 2019
+|13.0-CURRENT after adding support for AT_EXECPATH to elf_aux_info(3).
+
+|1300058
+|link:https://svnweb.freebsd.org/changeset/base/354820[354820]
+|November 18, 2019
+|13.0-CURRENT after widening the vm_page aflags field to 16 bits.
+
+|1300059
+|link:https://svnweb.freebsd.org/changeset/base/354835[354835]
+|November 18, 2019
+|13.0-CURRENT after converting the in-tree sysent targets to use the new [.filename]#makesyscalls.lua#.
+
+|1300060
+|link:https://svnweb.freebsd.org/changeset/base/354922[354922]
+|November 20, 2019
+|13.0-CURRENT after adding [.filename]#/etc/os-release# as a symbolic link to [.filename]#/var/run/os-release#.
+
+|1300061
+|link:https://svnweb.freebsd.org/changeset/base/354977[354977]
+|November 21, 2019
+|13.0-CURRENT after adding functions to man:bitstring[3] to find contiguous sequences of set or unset bits.
+
+|1300062
+|link:https://svnweb.freebsd.org/changeset/base/355309[355309]
+|December 2, 2019
+|13.0-CURRENT after adding TCP_STATS support.
+
+|1300063
+|link:https://svnweb.freebsd.org/changeset/base/355537[355537]
+|December 8, 2019
+|13.0-CURRENT after removal of VI_DOOMED (use VN_IS_DOOMED instead).
+
+|1300064
+|link:https://svnweb.freebsd.org/changeset/base/355658[355658]
+|December 9, 2019
+|13.0-CURRENT after correcting the C++ version check for declaring man:timespec_get[3].
+
+|1300065
+|link:https://svnweb.freebsd.org/changeset/base/355643[355643]
+|December 12, 2019
+|13.0-CURRENT after adding sigsetop extensions commonly found in musl libc and glibc.
+
+|1300066
+|link:https://svnweb.freebsd.org/changeset/base/355679[355679]
+|December 12, 2019
+|13.0-CURRENT after changing the internal interface between the NFS modules as part of the introduction of NFS 4.2.
+
+|1300067
+|link:https://svnweb.freebsd.org/changeset/base/355732[355732]
+|December 13, 2019
+|13.0-CURRENT after removing the deprecated `callout_handle_init`, `timeout`, and `untimeout` functions.
+
+|1300068
+|link:https://svnweb.freebsd.org/changeset/base/355828[355828]
+|December 16, 2019
+|13.0-CURRENT after doubling the value of `ARG_MAX`, for 64 bit platforms.
+
+|1300069
+|link:https://svnweb.freebsd.org/changeset/base/356051[356051]
+|December 24, 2019
+|13.0-CURRENT after the addition of busdma templates.
+
+|1300070
+|link:https://svnweb.freebsd.org/changeset/base/356113[356113]
+|December 27, 2019
+|13.0-CURRENT after eliminating the last MI difference in AT_* definitions (for powerpc).
+
+|1300071
+|link:https://svnweb.freebsd.org/changeset/base/356135[356135]
+|December 27, 2019
+|13.0-CURRENT after making USB statistics be per-device instead of per bus.
+
+|1300072
+|link:https://svnweb.freebsd.org/changeset/base/356185[356185]
+|December 29, 2019
+|13.0-CURRENT after removal of GEOM_SCHED class and gsched tool.
+
+|1300073
+|link:https://svnweb.freebsd.org/changeset/base/356263[356263]
+|January 2, 2020
+|13.0-CURRENT after removing arm/arm as a valid target.
+
+|1300074
+|link:https://svnweb.freebsd.org/changeset/base/356337[356337]
+|January 3, 2020
+|13.0-CURRENT after removing flags argument from VOP_UNLOCK.
+
+|1300075
+|link:https://svnweb.freebsd.org/changeset/base/356409[356409]
+|January 6, 2020
+|13.0-CURRENT after adding own counter for cancelled USB transfers.
+
+|1300076
+|link:https://svnweb.freebsd.org/changeset/base/356511[356511]
+|January 8, 2020
+|13.0-CURRENT after pushing vnop implementation into the fileop layer in posix_fallocate.
+
+|(not changed)
+|link:https://svnweb.freebsd.org/changeset/base/357396[357396]
+|February 2, 2020
+|13.0-CURRENT after removal of armv5 architecture code from the src tree.
+
+|1300077
+|link:https://svnweb.freebsd.org/changeset/base/357455[357455]
+|February 3, 2020
+|13.0-CURRENT after removal of sparc64 architecture code from the src tree.
+
+|1300078
+|link:https://svnweb.freebsd.org/changeset/base/358020[358020]
+|February 17, 2020
+|13.0-CURRENT after changing `struct vnet` and the VNET magic cookie.
+
+|1300079
+|link:https://svnweb.freebsd.org/changeset/base/358164[358164]
+|February 20, 2020
+|13.0-CURRENT after upgrading ncurses to 6.2.x
+
+|1300080
+|link:https://svnweb.freebsd.org/changeset/base/358172[358172]
+|February 20, 2020
+|13.0-CURRENT after adding realpathat syscall to VFS.
+
+|1300081
+|link:https://svnweb.freebsd.org/changeset/base/358218[358218]
+|February 21, 2020
+|13.0-CURRENT after after recent linuxkpi changes.
+
+|1300082
+|link:https://svnweb.freebsd.org/changeset/base/358497[358497]
+|March 1, 2020
+|13.0-CURRENT after removal of man:bktr[4].
+
+|1300083
+|link:https://svnweb.freebsd.org/changeset/base/358834[358834]
+|March 10, 2020
+|13.0-CURRENT after removal of man:amd[8], r358821.
+
+|1300084
+|link:https://svnweb.freebsd.org/changeset/base/358851[358851]
+|March 10, 2020
+|13.0-CURRENT after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 10.0.0-rc3 c290cb61fdc.
+
+|1300085
+|link:https://svnweb.freebsd.org/changeset/base/359261[359261]
+|March 23, 2020
+|13.0-CURRENT after the import of the kyua test framework.
+
+|1300086
+|link:https://svnweb.freebsd.org/changeset/base/359347[359347]
+|March 26, 2020
+|13.0-CURRENT after switching powerpc and powerpcspe to the lld linker.
+
+|1300087
+|link:https://svnweb.freebsd.org/changeset/base/359374[359374]
+|March 27, 2020
+|13.0-CURRENT after refactoring the driver and consumer interfaces for in-kernel cryptography.
+
+|1300088
+|link:https://svnweb.freebsd.org/changeset/base/359530[359530]
+|April 1, 2020
+|13.0-CURRENT after removing support for procfs process debugging.
+
+|1300089
+|link:https://svnweb.freebsd.org/changeset/base/359727[359727]
+|April 8, 2020
+|13.0-CURRENT after cloning the RCU interface into a sleepable and a non-sleepable part in the LinuxKPI.
+
+|1300090
+|link:https://svnweb.freebsd.org/changeset/base/359747[359747]
+|April 9, 2020
+|13.0-CURRENT after removing the old NFS lock device driver that uses Giant.
+
+|1300091
+|link:https://svnweb.freebsd.org/changeset/base/359839[359839]
+|April 12, 2020
+|13.0-CURRENT after implementing a close_range(2) syscall.
+
+|1300092
+|link:https://svnweb.freebsd.org/changeset/base/359920[359920]
+|April 14, 2020
+|13.0-CURRENT after reworking unmapped mbufs in KTLS to carry ext_pgs in the mbuf itself.
+
+|1300093
+|link:https://svnweb.freebsd.org/changeset/base/360418[360418]
+|April 27, 2020
+|13.0-CURRENT after adding support for kernel TLS receive offload.
+
+|1300094
+|link:https://svnweb.freebsd.org/changeset/base/360796[360796]
+|May 7, 2020
+|13.0-CURRENT after linuxkpi changes.
+
+|1300095
+|link:https://svnweb.freebsd.org/changeset/base/361275[361275]
+|May 20, 2020
+|13.0-CURRENT after adding HyperV socket support for FreeBSD guests.
+
+|1300096
+|link:https://svnweb.freebsd.org/changeset/base/361410[361410]
+|May 23, 2020
+|13.0-CURRENT after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 10.0.1 rc1 f79cd71e145.
+
+|1300097
+|link:https://svnweb.freebsd.org/changeset/base/361724[361724]
+|June 2, 2020
+|13.0-CURRENT after implementing __is_constexpr() function macro in the LinuxKPI.
+
+|1300098
+|link:https://svnweb.freebsd.org/changeset/base/362159[362159]
+|June 14, 2020
+|13.0-CURRENT after changing the `export_args ex_flags` field so that is 64bits.
+
+|1300099
+|link:https://svnweb.freebsd.org/changeset/base/362453[362453]
+|June 20, 2020
+|13.0-CURRENT after making liblzma use libmd implementation of SHA256.
+
+|1300100
+|link:https://svnweb.freebsd.org/changeset/base/362640[362640]
+|June 26, 2020
+|13.0-CURRENT after changing the internal API between the NFS kernel modules.
+
+|1300101
+|link:https://svnweb.freebsd.org/changeset/base/363077[363077]
+|July 10, 2020
+|13.0-CURRENT after implementing the array_size() function in the LinuxKPI.
+
+|1300102
+|link:https://svnweb.freebsd.org/changeset/base/363562[363562]
+|July 26, 2020
+|13.0-CURRENT after implementing lockless lookup in the VFS layer.
+
+|1300103
+|link:https://svnweb.freebsd.org/changeset/base/363757[363757]
+|August 1, 2020
+|13.0-CURRENT after making rights mandatory for NDINIT_ALL.
+
+|1300104
+|link:https://svnweb.freebsd.org/changeset/base/363783[363783]
+|August 2, 2020
+|13.0-CURRENT after vnode layout changes.
+
+|1300105
+|link:https://svnweb.freebsd.org/changeset/base/363894[363894]
+|August 5, 2020
+|13.0-CURRENT after vaccess() change.
+
+|1300106
+|link:https://svnweb.freebsd.org/changeset/base/364092[364092]
+|August 11, 2020
+|13.0-CURRENT after adding an argument to newnfs_connect() that indicates use TLS for the connection.
+
+|1300107
+|link:https://svnweb.freebsd.org/changeset/base/364109[364109]
+|August 11, 2020
+|13.0-CURRENT after change to clone the task struct fields related to RCU.
+
+|1300108
+|link:https://svnweb.freebsd.org/changeset/base/364233[364233]
+|August 14, 2020
+|13.0-CURRENT after adding a few wait_bit functions to the linuxkpi, which are needed for DRM from Linux v5.4.
+
+|1300109
+|link:https://svnweb.freebsd.org/changeset/base/364274[364274]
+|August 16, 2020
+|13.0-CURRENT after vget() argument removal and namei flags renumbering.
+
+|(not changed)
+|link:https://svnweb.freebsd.org/changeset/base/364284[364284]
+|August 16, 2020
+|13.0-CURRENT after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to release/11.x llvmorg-11.0.0-rc1-47-gff47911ddfc.
+
+|1300110
+|link:https://svnweb.freebsd.org/changeset/base/364331[364331]
+|August 18, 2020
+|13.0-CURRENT after deleting the unused `use_ext` argument to `nfscl_reqstart()`.
+
+|1300111
+|link:https://svnweb.freebsd.org/changeset/base/364476[364476]
+|August 22, 2020
+|13.0-CURRENT after adding TLS support to the kernel RPC.
+
+|1300112
+|link:https://svnweb.freebsd.org/changeset/base/364747[364747]
+|August 25, 2020
+|13.0-CURRENT after merging OpenZFS support.
+
+|1300113
+|link:https://svnweb.freebsd.org/changeset/base/364753[364753]
+|August 25, 2020
+|13.0-CURRENT after adding atomic and bswap functions to libcompiler_rt.
+
+|1300114
+|link:https://svnweb.freebsd.org/changeset/base/365459[365459]
+|September 8, 2020
+|13.0-CURRENT after changing arm64 AT_HWCAP definitions for elf_aux_info(3).
+
+|1300115
+|link:https://svnweb.freebsd.org/changeset/base/365705[365705]
+|September 14, 2020
+|13.0-CURRENT after fixing man:crunchgen[1] application build with `WARNS=6`.
+|===
+
+[[versions-12]]
+== FreeBSD 12 Versions
+
+[[freebsd-versions-table-12]]
+.FreeBSD 12 `__FreeBSD_version` Values
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Value
+| Revision
+| Date
+| Release
+
+|1200000
+|link:https://svnweb.freebsd.org/changeset/base/302409[302409]
+|July 7, 2016
+|12.0-CURRENT.
+
+|1200001
+|link:https://svnweb.freebsd.org/changeset/base/302628[302628]
+|July 12, 2016
+|12.0-CURRENT after removing collation from `[a-z]`-type ranges.
+
+|1200002
+|link:https://svnweb.freebsd.org/changeset/base/304395[304395]
+|August 18, 2016
+|12.0-CURRENT after removing unused and obsolete `openbsd_poll` system call.
+
+|1200003
+|link:https://svnweb.freebsd.org/changeset/base/304608[304608]
+|August 22, 2016
+|12.0-CURRENT after adding C++11 `thread_local` support in rev link:https://svnweb.freebsd.org/changeset/base/303795[303795].
+
+|1200004
+|link:https://svnweb.freebsd.org/changeset/base/304752[304752]
+|August 24, 2016
+|12.0-CURRENT after fixing LC*MASK for man:newlocale[3] and man:querylocale[3] (rev link:https://svnweb.freebsd.org/changeset/base/304703[304703]).
+
+|1200005
+|link:https://svnweb.freebsd.org/changeset/base/304789[304789]
+|August 25, 2016
+|12.0-CURRENT after changing some ioctl interfaces in rev link:https://svnweb.freebsd.org/changeset/base/304787[304787] between the iSCSI userspace programs and the kernel.
+
+|1200006
+|link:https://svnweb.freebsd.org/changeset/base/305256[305256]
+|September 1, 2016
+|12.0-CURRENT after man:crunchgen[1] META_MODE fix in link:https://svnweb.freebsd.org/changeset/base/305254[305254].
+
+|1200007
+|link:https://svnweb.freebsd.org/changeset/base/305421[305421]
+|September 5, 2016
+|12.0-CURRENT after resolving a deadlock between `device_detach()` and man:usbd_do_request_flags[9].
+
+|1200008
+|link:https://svnweb.freebsd.org/changeset/base/305833[305833]
+|September 15, 2016
+|12.0-CURRENT after removing the 4.3BSD compatible macro `m_copy()` in link:https://svnweb.freebsd.org/changeset/base/305824[305824].
+
+|1200009
+|link:https://svnweb.freebsd.org/changeset/base/306077[306077]
+|September 21, 2016
+|12.0-CURRENT after removing `bio_taskqueue()` in link:https://svnweb.freebsd.org/changeset/base/305988[305988].
+
+|1200010
+|link:https://svnweb.freebsd.org/changeset/base/306276[306276]
+|September 23, 2016
+|12.0-CURRENT after mounting man:msdosfs[5] with longnames support by default.
+
+|1200011
+|link:https://svnweb.freebsd.org/changeset/base/306556[306556]
+|October 1, 2016
+|12.0-CURRENT after adding `fb_memattr` field to `fb_info` in link:https://svnweb.freebsd.org/changeset/base/306555[306555].
+
+|1200012
+|link:https://svnweb.freebsd.org/changeset/base/306592[306592]
+|October 2, 2016
+|12.0-CURRENT after man:net80211[4] changes (rev link:https://svnweb.freebsd.org/changeset/base/306590[306590], link:https://svnweb.freebsd.org/changeset/base/306591[306591]).
+
+|1200013
+|link:https://svnweb.freebsd.org/changeset/base/307140[307140]
+|October 12, 2016
+|12.0-CURRENT after installing header files required development with libzfs_core.
+
+|1200014
+|link:https://svnweb.freebsd.org/changeset/base/307529[307529]
+|October 17, 2016
+|12.0-CURRENT after merging common code in man:rtwn[4] and man:urtwn[4], and adding support for 802.11ac devices.
+
+|1200015
+|link:https://svnweb.freebsd.org/changeset/base/308874[308874]
+|November 20, 2016
+|12.0-CURRENT after some ABI change for unbreaking powerpc.
+
+|1200016
+|link:https://svnweb.freebsd.org/changeset/base/309017[309017]
+|November 22, 2016
+|12.0-CURRENT after removing `PG_CACHED`-related fields from `vmmeter`.
+
+|1200017
+|link:https://svnweb.freebsd.org/changeset/base/309124[309124]
+|November 25, 2016
+|12.0-CURRENT after upgrading our copies of clang, llvm, lldb, compiler-rt and libc++ to 3.9.0 release, and adding lld 3.9.0.
+
+|1200018
+|link:https://svnweb.freebsd.org/changeset/base/309676[309676]
+|December 7, 2016
+|12.0-CURRENT after adding the `ki_moretdname` member to `struct kinfo_proc` and `struct kinfo_proc32` to export the whole thread name to user-space utilities.
+
+|1200019
+|link:https://svnweb.freebsd.org/changeset/base/310149[310149]
+|December 16, 2016
+|12.0-CURRENT after starting to lay down the foundation for 11ac support.
+
+|1200020
+|link:https://svnweb.freebsd.org/changeset/base/312087[312087]
+|January 13, 2017
+|12.0-CURRENT after removing `fgetsock` and `fputsock`.
+
+|1200021
+|link:https://svnweb.freebsd.org/changeset/base/313858[313858]
+|February 16, 2017
+|12.0-CURRENT after removing MCA and EISA support.
+
+|1200022
+|link:https://svnweb.freebsd.org/changeset/base/314040[314040]
+|February 21, 2017
+|12.0-CURRENT after making the LinuxKPI task struct persistent across system calls.
+
+|(not changed)
+|link:https://svnweb.freebsd.org/changeset/base/314373[314373]
+|March 2, 2017
+|12.0-CURRENT after removing System V Release 4 binary compatibility support.
+
+|1200023
+|link:https://svnweb.freebsd.org/changeset/base/314564[314564]
+|March 2, 2017
+|12.0-CURRENT after upgrading our copies of clang, llvm, lld, lldb, compiler-rt and libc++ to 4.0.0.
+
+|1200024
+|link:https://svnweb.freebsd.org/changeset/base/314865[314865]
+|March 7, 2017
+|12.0-CURRENT after removal of [.filename]#pcap-int.h#
+
+|1200025
+|link:https://svnweb.freebsd.org/changeset/base/315430[315430]
+|March 16, 2017
+|12.0-CURRENT after addition of the [.filename]#<dev/mmc/mmc_ioctl.h># header.
+
+|1200026
+|link:https://svnweb.freebsd.org/changeset/base/315662[315662]
+|March 16, 2017
+|12.0-CURRENT after hiding `struct inpcb` and `struct tcpcb` from userland.
+
+|1200027
+|link:https://svnweb.freebsd.org/changeset/base/315673[315673]
+|March 21, 2017
+|12.0-CURRENT after making CAM SIM lock optional.
+
+|1200028
+|link:https://svnweb.freebsd.org/changeset/base/316683[316683]
+|April 10, 2017
+|12.0-CURRENT after renaming `smp_no_rendevous_barrier()` to `smp_no_rendezvous_barrier()` in link:https://svnweb.freebsd.org/changeset/base/316648[316648].
+
+|1200029
+|link:https://svnweb.freebsd.org/changeset/base/317176[317176]
+|April 19, 2017
+|12.0-CURRENT after the removal of `struct vmmeter` from `struct pcpu` from link:https://svnweb.freebsd.org/changeset/base/317061[317061].
+
+|1200030
+|link:https://svnweb.freebsd.org/changeset/base/317383[317383]
+|April 24, 2017
+|12.0-CURRENT after removing NATM support including man:en[4], man:fatm[4], man:hatm[4], and man:patm[4].
+
+|1200031
+|link:https://svnweb.freebsd.org/changeset/base/318736[318736]
+|May 23, 2017
+|12.0-CURRENT after types `ino_t`, `dev_t`, `nlink_t` were extended to 64bit and `struct dirent` changed layout (also known as ino64).
+
+|1200032
+|link:https://svnweb.freebsd.org/changeset/base/319664[319664]
+|June 8, 2017
+|12.0-CURRENT after removal of `groff`.
+
+|1200033
+|link:https://svnweb.freebsd.org/changeset/base/320043[320043]
+|June 17, 2017
+|12.0-CURRENT after the type of the `struct event` member `data` was increased to 64bit, and ext structure members added.
+
+|1200034
+|link:https://svnweb.freebsd.org/changeset/base/320085[320085]
+|June 19, 2017
+|12.0-CURRENT after the NFS client and server were changed so that they actually use the 64bit `ino_t`.
+
+|1200035
+|link:https://svnweb.freebsd.org/changeset/base/320317[320317]
+|June 24, 2017
+|12.0-CURRENT after the `MAP_GUARD` man:mmap[2] flag was added.
+
+|1200036
+|link:https://svnweb.freebsd.org/changeset/base/320347[320347]
+|June 26, 2017
+|12.0-CURRENT after changing `time_t` to 64 bits on powerpc (32-bit version).
+
+|1200037
+|link:https://svnweb.freebsd.org/changeset/base/320545[320545]
+|July 1, 2017
+|12.0-CURRENT after the cleanup and inlining of `bus_dmamap*` functions (link:https://svnweb.freebsd.org/changeset/base/320528[320528]).
+
+|1200038
+|link:https://svnweb.freebsd.org/changeset/base/320879[320879]
+|July 10, 2017
+|12.0-CURRENT after MMC CAM committed. (link:https://svnweb.freebsd.org/changeset/base/320844[320844]).
+
+|1200039
+|link:https://svnweb.freebsd.org/changeset/base/321369[321369]
+|July 22, 2017
+|12.0-CURRENT after upgrade of copies of clang, llvm, lld, lldb, compiler-rt and libc++ to 5.0.0 (trunk r308421).
+
+|1200040
+|link:https://svnweb.freebsd.org/changeset/base/321688[321688]
+|July 29, 2017
+|12.0-CURRENT after adding NFS client forced dismount support `umount -N`.
+
+|1200041
+|link:https://svnweb.freebsd.org/changeset/base/322762[322762]
+|August 21, 2017
+|12.0-CURRENT after WRFSBASE instruction become operational on amd64.
+
+|1200042
+|link:https://svnweb.freebsd.org/changeset/base/322900[322900]
+|August 25, 2017
+|12.0-CURRENT after PLPMTUD counters were changed to use man:counter[9].
+
+|1200043
+|link:https://svnweb.freebsd.org/changeset/base/322989[322989]
+|August 28, 2017
+|12.0-CURRENT after dropping x86 CACHE_LINE_SIZE down to 64 bytes.
+
+|1200044
+|link:https://svnweb.freebsd.org/changeset/base/323349[323349]
+|September 8, 2017
+|12.0-CURRENT after implementing poll_wait() in the LinuxKPI.
+
+|1200045
+|link:https://svnweb.freebsd.org/changeset/base/323706[323706]
+|September 18, 2017
+|12.0-CURRENT after adding shared memory support to LinuxKPI. (link:https://svnweb.freebsd.org/changeset/base/323703[323703]).
+
+|1200046
+|link:https://svnweb.freebsd.org/changeset/base/323910[323910]
+|September 22, 2017
+|12.0-CURRENT after adding support for 32-bit compatibility IOCTLs to LinuxKPI.
+
+|1200047
+|link:https://svnweb.freebsd.org/changeset/base/324053[324053]
+|September 26, 2017
+|12.0-CURRENT after removing M_HASHTYPE_RSS_UDP_IPV4_EX. (link:https://svnweb.freebsd.org/changeset/base/324052[324052]).
+
+|1200048
+|link:https://svnweb.freebsd.org/changeset/base/324227[324227]
+|October 2, 2017
+|12.0-CURRENT after hiding `struct socket` and `struct unpcb` from userland.
+
+|1200049
+|link:https://svnweb.freebsd.org/changeset/base/324281[324281]
+|October 4, 2017
+|12.0-CURRENT after adding the `value.u16` field to `struct diocgattr_arg`.
+
+|1200050
+|link:https://svnweb.freebsd.org/changeset/base/324342[324342]
+|October 5, 2017
+|12.0-CURRENT after adding the `armv7 MACHINE_ARCH`. (link:https://svnweb.freebsd.org/changeset/base/324340[324340]).
+
+|1200051
+|link:https://svnweb.freebsd.org/changeset/base/324455[324455]
+|October 9, 2017
+|12.0-CURRENT after removing [.filename]#libstand.a# as a public interface. (link:https://svnweb.freebsd.org/changeset/base/324454[324454]).
+
+|1200052
+|link:https://svnweb.freebsd.org/changeset/base/325028[325028]
+|October 26, 2017
+|12.0-CURRENT after fixing `ptrace()` to always clear the correct thread event when resuming.
+
+|1200053
+|link:https://svnweb.freebsd.org/changeset/base/325506[325506]
+|November 7, 2017
+|12.0-CURRENT after changing `struct mbuf` layout to add optional hardware timestamps for receive packets.
+
+|1200054
+|link:https://svnweb.freebsd.org/changeset/base/325852[325852]
+|November 15, 2017
+|12.0-CURRENT after changing the layout of `struct vmtotal` to allow for reporting large memory counters.
+
+|1200055
+|link:https://svnweb.freebsd.org/changeset/base/327740[327740]
+|January 9, 2018
+|12.0-CURRENT after adding `cpucontrol -e` support.
+
+|1200056
+|link:https://svnweb.freebsd.org/changeset/base/327952[327952]
+|January 14, 2018
+|12.0-CURRENT after upgrading clang, llvm, lld, lldb, compiler-rt and libc++ to 6.0.0 (branches/release_60 r321788).
+
+|1200057
+|link:https://svnweb.freebsd.org/changeset/base/329033[329033]
+|February 8, 2018
+|12.0-CURRENT after applying a clang 6.0.0 fix to make the wine ports build correctly.
+
+|1200058
+|link:https://svnweb.freebsd.org/changeset/base/329166[329166]
+|February 12, 2018
+|12.0-CURRENT after the lua loader was committed.
+
+|1200059
+|link:https://svnweb.freebsd.org/changeset/base/330299[330299]
+|March 2, 2018
+|12.0-CURRENT after removing the declaration of `union semun` unless `_WANT_SEMUN` is defined. Also the removal of `struct mymsg` and the renaming of kernel-only members of `struct semid_ds` and `struct msgid_ds`.
+
+|1200060
+|link:https://svnweb.freebsd.org/changeset/base/330384[330384]
+|March 4, 2018
+|12.0-CURRENT after upgrading clang, llvm, lld, lldb, compiler-rt and libc++ to 6.0.0 release.
+
+|1200061
+|link:https://svnweb.freebsd.org/changeset/base/332100[332100]
+|April 6, 2018
+|12.0-CURRENT after changing man:syslog[3] to emit RFC 5424 formatted messages.
+
+|1200062
+|link:https://svnweb.freebsd.org/changeset/base/332423[332423]
+|April 12, 2018
+|12.0-CURRENT after changing the Netmap API.
+
+|1200063
+|link:https://svnweb.freebsd.org/changeset/base/333446[333446]
+|May 10, 2018
+|12.0-CURRENT after reworking CTL frontend and backend options to use man:nv[3], allow creating multiple ioctl frontend ports.
+
+|1200064
+|link:https://svnweb.freebsd.org/changeset/base/334074[334074]
+|May 22, 2018
+|12.0-CURRENT after changing the ifnet address and multicast address TAILQ to CK_STAILQ.
+
+|1200065
+|link:https://svnweb.freebsd.org/changeset/base/334290[334290]
+|May 28, 2018
+|12.0-CURRENT after changing man:dwatch[1] to allow '-E code' to override profile EVENT_DETAILS.
+
+|1200066
+|link:https://svnweb.freebsd.org/changeset/base/334466[334466]
+|June 1, 2018
+|12.0-CURRENT after removal of in-kernel pmc tables for Intel.
+
+|1200067
+|link:https://svnweb.freebsd.org/changeset/base/334892[334892]
+|June 9, 2018
+|12.0-CURRENT after adding DW_LANG constants to libdwarf.
+
+|1200068
+|link:https://svnweb.freebsd.org/changeset/base/334930[334930]
+|June 12, 2018
+|12.0-CURRENT after changing the interface between the NFS modules.
+
+|1200069
+|link:https://svnweb.freebsd.org/changeset/base/335237[335237]
+|June 15, 2018
+|12.0-CURRENT after changing `struct kerneldumpheader` to version 4 (similar to version 2 in 11-STABLE and previous).
+
+|1200070
+|link:https://svnweb.freebsd.org/changeset/base/335873[335873]
+|July 2, 2018
+|12.0-CURRENT after inlining man:atomic[9] in modules on amd64 and i386 requiring all modules of consumers to be rebuilt for these architectures.
+
+|1200071
+|link:https://svnweb.freebsd.org/changeset/base/335930[335930]
+|July 4, 2018
+|12.0-CURRENT after changing the ABI and API of man:epoch[9] (link:https://svnweb.freebsd.org/changeset/base/335924[335924]) requiring modules of consumers to be rebuilt.
+
+|1200072
+|link:https://svnweb.freebsd.org/changeset/base/335979[335979]
+|July 5, 2018
+|12.0-CURRENT after changing the ABI and API of `struct xinpcb` and friends.
+
+|1200073
+|link:https://svnweb.freebsd.org/changeset/base/336313[336313]
+|July 15, 2018
+|12.0-CURRENT after changing the ABI and API of `struct if_shared_ctx` and `struct if_softc_ctx` requiring modules of man:iflib[9] consumers to be rebuilt.
+
+|1200074
+|link:https://svnweb.freebsd.org/changeset/base/336360[336360]
+|July 16, 2018
+|12.0-CURRENT after updating the configuration of libstdc++ to make use of C99 functions.
+
+|1200075
+|link:https://svnweb.freebsd.org/changeset/base/336538[336538]
+|July 19, 2018
+|12.0-CURRENT after zfsloader being folded into loader, and after adding ntpd:ntpd as uid:gid 123:123, and after removing arm big-endian support (MACHINE_ARCH=armeb).
+
+|1200076
+|link:https://svnweb.freebsd.org/changeset/base/336914[336914]
+|July 30, 2018
+|12.0-CURRENT after KPI changes to timespecadd.
+
+|1200077
+|link:https://svnweb.freebsd.org/changeset/base/337576[337576]
+|August 10, 2018
+|12.0-CURRENT after man:timespec_get[3] was added to the system.
+
+|1200078
+|link:https://svnweb.freebsd.org/changeset/base/337863[337863]
+|August 15, 2018
+|12.0-CURRENT after exec.created hook for jails.
+
+|1200079
+|link:https://svnweb.freebsd.org/changeset/base/338061[338061]
+|August 19, 2018
+|12.0-CURRENT after converting `arc4random` to using the Chacha20 algorithm and deprecating `arc4random_stir` and `arc4random_addrandom`.
+
+|1200080
+|link:https://svnweb.freebsd.org/changeset/base/338172[338172]
+|August 22, 2018
+|12.0-CURRENT after removing the drm drivers.
+
+|1200081
+|link:https://svnweb.freebsd.org/changeset/base/338182[338182]
+|August 21, 2018
+|12.0-CURRENT after KPI changes to NVMe.
+
+|1200082
+|link:https://svnweb.freebsd.org/changeset/base/338285[338285]
+|August 24, 2018
+|12.0-CURRENT after reverting the removal of the drm drivers.
+
+|1200083
+|link:https://svnweb.freebsd.org/changeset/base/338331[338331]
+|August 26, 2018
+|12.0-CURRENT after removing `arc4random_stir` and `arc4random_addrandom`.
+
+|1200084
+|link:https://svnweb.freebsd.org/changeset/base/338478[338478]
+|September 5, 2018
+|12.0-CURRENT after updating man:objcopy[1] to properly handle little-endian MIPS64 object files.
+
+|1200085
+|link:https://svnweb.freebsd.org/changeset/base/339270[339270]
+|October 19, 2018
+|12.0-STABLE after updating OpenSSL to version 1.1.1.
+
+|1200086
+|link:https://svnweb.freebsd.org/changeset/base/339732[339732]
+|October 25, 2018
+|12.0-STABLE after updating OpenSSL shared library version numbers.
+
+|1200500
+|link:https://svnweb.freebsd.org/changeset/base/340471[340471]
+|November 16, 2018
+|12-STABLE after releng/12.0 was branched.
+
+|1200501
+|link:https://svnweb.freebsd.org/changeset/base/342801[342801]
+|January 6, 2019
+|12-STABLE after merge of fixing linux_destroy_dev() behaviour when there are still files open from the destroying cdev.
+
+|1200502
+|link:https://svnweb.freebsd.org/changeset/base/343126[343126]
+|January 17, 2019
+|12-STABLE after enabling sys/random.h #include from C++.
+
+|1200503
+|link:https://svnweb.freebsd.org/changeset/base/344152[344152]
+|Febrary 15, 2019
+|12-STABLE after merge of fixing man:renameat[2] for CAPABILITIES kernels.
+
+|1200504
+|link:https://svnweb.freebsd.org/changeset/base/345169[345169]
+|March 15, 2019
+|12-STABLE after merging CCM for the benefit of the ZoF port.
+
+|1200505
+|link:https://svnweb.freebsd.org/changeset/base/345327[345327]
+|March 20, 2019
+|12-STABLE after merging support for selectively disabling ZFS without disabling loader.
+
+|1200506
+|link:https://svnweb.freebsd.org/changeset/base/346168[346168]
+|April 12, 2019
+|12-STABLE after merging llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp 8.0.0 final release r356365.
+
+|1200507
+|link:https://svnweb.freebsd.org/changeset/base/346337[346337]
+|April 17, 2019
+|12-STABLE after MFC of iflib changes in link:https://svnweb.freebsd.org/changeset/base/345303[345303], link:https://svnweb.freebsd.org/changeset/base/345658,[345658,] and partially of link:https://svnweb.freebsd.org/changeset/base/345305[345305].
+
+|1200508
+|link:https://svnweb.freebsd.org/changeset/base/346784[346784]
+|April 27, 2019
+|12-STABLE after ether_gen_addr availability.
+
+|1200509
+|link:https://svnweb.freebsd.org/changeset/base/347790[347790]
+|May 16, 2019
+|12-STABLE after bumping the Mellanox driver version numbers (man:mlx4en[4]; man:mlx5en[4]).
+
+|1200510
+|link:https://svnweb.freebsd.org/changeset/base/348036[348036]
+|May 21, 2019
+|12-STABLE after change to struct in linuxkpi from link:https://svnweb.freebsd.org/changeset/base/348035[348035].
+
+|1200511
+|link:https://svnweb.freebsd.org/changeset/base/348243[348243]
+|May 24, 2019
+|12-STABLE after MFC of link:https://svnweb.freebsd.org/changeset/base/347843[347843]: adding group_leader member to struct task_struct to the LinuxKPI.
+
+|1200512
+|link:https://svnweb.freebsd.org/changeset/base/348245[348245]
+|May 24, 2019
+|12-STABLE after adding context member to ww_mutex in LinuxKPI.
+
+|1200513
+|link:https://svnweb.freebsd.org/changeset/base/349763[349763]
+|July 5, 2019
+|12-STABLE after MFC of man:epoch[9] changes: link:https://svnweb.freebsd.org/changeset/base/349763[349763], link:https://svnweb.freebsd.org/changeset/base/340404[340404], link:https://svnweb.freebsd.org/changeset/base/340415[340415], link:https://svnweb.freebsd.org/changeset/base/340417[340417], link:https://svnweb.freebsd.org/changeset/base/340419[340419], link:https://svnweb.freebsd.org/changeset/base/340420[340420].
+
+|1200514
+|link:https://svnweb.freebsd.org/changeset/base/350083[350083]
+|July 17, 2019
+|12-STABLE after additions to LinuxKPI's rcu list.
+
+|1200515
+|link:https://svnweb.freebsd.org/changeset/base/350877[350877]
+|August 11, 2019
+|12-STABLE after MFC of link:https://svnweb.freebsd.org/changeset/base/349891[349891] (reorganize the SRCS lists as one file per line, and then alphabetize them) and link:https://svnweb.freebsd.org/changeset/base/349972[349972] (add arm_sync_icache() and arm_drain_writebuf() sysarch syscall wrappers).
+
+|1200516
+|link:https://svnweb.freebsd.org/changeset/base/351276[351276]
+|August 20, 2019
+|12-STABLE after MFC of various changes to iflib link:https://svnweb.freebsd.org/changeset/base/351276[351276].
+
+|1200517
+|link:https://svnweb.freebsd.org/changeset/base/352076[352076]
+|September 9, 2019
+|12-STABLE after adding sysfs create/remove functions that handles multiple files in one call to the LinuxKPI.
+
+|1200518
+|link:https://svnweb.freebsd.org/changeset/base/352114[352114]
+|September 10, 2019
+|12-STABLE after additional updates to LinuxKPI's sysfs.
+
+|1200519
+|link:https://svnweb.freebsd.org/changeset/base/352351[352351]
+|September 15, 2019
+|12-STABLE after MFC of the new fusefs driver.
+
+|1201000
+|link:https://svnweb.freebsd.org/changeset/base/352546[352546]
+|September 20, 2019
+|releng/12.1 branched from stable/12@r352480.
+
+|1201500
+|link:https://svnweb.freebsd.org/changeset/base/352547[352547]
+|September 20, 2019
+|12-STABLE after branching releng/12.1.
+
+|1201501
+|link:https://svnweb.freebsd.org/changeset/base/354598[354598]
+|November 10, 2019
+|12-STABLE after fixing a potential OOB read security issue in libc++.
+
+|1201502
+|link:https://svnweb.freebsd.org/changeset/base/354613[354613]
+|November 11, 2019
+|12-STABLE after enabling device class group attributes in the LinuxKPI.
+
+|1201503
+|link:https://svnweb.freebsd.org/changeset/base/354928[354928]
+|November 21, 2019
+|12-STABLE after adding support for AT_EXECPATH to elf_aux_info(3).
+
+|1201504
+|link:https://svnweb.freebsd.org/changeset/base/355658[355658]
+|November 10, 2019
+|12-STABLE after correcting the C++ version check for declaring man:timespec_get[3].
+
+|1201505
+|link:https://svnweb.freebsd.org/changeset/base/355899[355899]
+|December 19, 2019
+|12-STABLE after adding sigsetop extensions commonly found in musl libc and glibc.
+
+|1201506
+|link:https://svnweb.freebsd.org/changeset/base/355968[355968]
+|December 21, 2019
+|12-STABLE after doubling the value of `ARG_MAX`, for 64 bit platforms.
+
+|1201507
+|link:https://svnweb.freebsd.org/changeset/base/356306[356306]
+|January 2, 2020
+|12-STABLE after adding functions to man:bitstring[3] to find contiguous sequences of set or unset bits.
+
+|1201508
+|link:https://svnweb.freebsd.org/changeset/base/356394[356394]
+|January 6, 2020
+|12-STABLE after making USB statistics be per-device instead of per bus.
+
+|1201509
+|link:https://svnweb.freebsd.org/changeset/base/356460[356460]
+|January 7, 2020
+|12-STABLE after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 9.0.0 final release r372316.
+
+|1201510
+|link:https://svnweb.freebsd.org/changeset/base/356679[356679]
+|January 13, 2020
+|12-STABLE after adding own counter for cancelled USB transfers.
+
+|1201511
+|link:https://svnweb.freebsd.org/changeset/base/357333[357333]
+|January 31, 2020
+|12-STABLE after adding [.filename]#/etc/os-release# as a symbolic link to [.filename]#/var/run/os-release#.
+
+|1201512
+|link:https://svnweb.freebsd.org/changeset/base/357612[357612]
+|February 6, 2020
+|12-STABLE after recent LinuxKPI changes.
+
+|1201513
+|link:https://svnweb.freebsd.org/changeset/base/359957[359957]
+|Apr 15, 2020
+|12-STABLE after cloning the RCU interface into a sleepable and a non-sleepable part in the LinuxKPI.
+
+|1201514
+|link:https://svnweb.freebsd.org/changeset/base/360525[360525]
+|May 1, 2020
+|12-STABLE after implementing full man:bus_dma[9] support in the LinuxKPI and pulling in all dependencies.
+
+|1201515
+|link:https://svnweb.freebsd.org/changeset/base/360545[360545]
+|May 1, 2020
+|12-STABLE after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 10.0.0 release.
+
+|1201516
+|link:https://svnweb.freebsd.org/changeset/base/360620[360620]
+|May 4, 2020
+|12-STABLE after moving `id_mapped` to end of `bus_dma_impl` structure to preserve KPI.
+
+|1201517
+|link:https://svnweb.freebsd.org/changeset/base/361350[361350]
+|May 21, 2020
+|12-STABLE after renaming `vm.max_wired` to `vm.max_user_wired` and changing its type.
+
+|1201518
+|link:https://svnweb.freebsd.org/changeset/base/362319[362319]
+|June 18, 2020
+|12-STABLE after implementing __is_constexpr() function macro in the LinuxKPI.
+
+|1201519
+|link:https://svnweb.freebsd.org/changeset/base/362916[362916]
+|July 4, 2020
+|12-STABLE after making liblzma use libmd implementation of SHA256.
+
+|1201520
+|link:https://svnweb.freebsd.org/changeset/base/363494[363494]
+|July 24, 2020
+|12-STABLE after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 10.0.1 release.
+
+|1201521
+|link:https://svnweb.freebsd.org/changeset/base/363790[363790]
+|August 3, 2020
+|12-STABLE after implementing the array_size() function in the LinuxKPI.
+
+|1201522
+|link:https://svnweb.freebsd.org/changeset/base/363832[363832]
+|August 4, 2020
+|12-STABLE after adding sysctlbyname system call.
+
+|1201523
+|link:https://svnweb.freebsd.org/changeset/base/364390[364390]
+|August 19, 2020
+|12-STABLE after change to clone the task struct fields related to RCU.
+
+|1201524
+|link:https://svnweb.freebsd.org/changeset/base/365356[365356]
+|September 5, 2020
+|12-STABLE after splitting XDR off into a separate kernel module, to minimize ZFS dependencies.
+
+|1201525
+|link:https://svnweb.freebsd.org/changeset/base/365471[365471]
+|September 8, 2020
+|12-STABLE after adding atomic and bswap functions to libcompiler_rt.
+
+|1201526
+|link:https://svnweb.freebsd.org/changeset/base/365608[365608]
+|September 10, 2020
+|12-STABLE after updating net80211 and kernel privilege checking API changes.
+
+|1202000
+|link:https://svnweb.freebsd.org/changeset/base/365618[365618]
+|September 11, 2020
+|releng/12.2 branched from stable/12@r365618.
+
+|1202500
+|link:https://svnweb.freebsd.org/changeset/base/365619[365619]
+|September 11, 2020
+|12-STABLE after branching releng/12.2.
+
+|1202501
+|link:https://svnweb.freebsd.org/changeset/base/365661[365661]
+|September 12, 2020
+|12-STABLE after followup commits to libcompiler_rt.
+
+|1202502
+|link:https://svnweb.freebsd.org/changeset/base/365816[365816]
+|September 16, 2020
+|12-STABLE after fixing man:crunchgen[1] application build with `WARNS=6`.
+|===
+
+[[versions-11]]
+== FreeBSD 11 Versions
+
+[[freebsd-versions-table-11]]
+.FreeBSD 11 `__FreeBSD_version` Values
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Value
+| Revision
+| Date
+| Release
+
+|1100000
+|link:https://svnweb.freebsd.org/changeset/base/256284[256284]
+|October 10, 2013
+|11.0-CURRENT.
+
+|1100001
+|link:https://svnweb.freebsd.org/changeset/base/256776[256776]
+|October 19, 2013
+|11.0-CURRENT after addition of support for "first boot" [.filename]#rc.d# scripts, so ports can make use of this.
+
+|1100002
+|link:https://svnweb.freebsd.org/changeset/base/257696[257696]
+|November 5, 2013
+|11.0-CURRENT after dropping support for historic ioctls.
+
+|1100003
+|link:https://svnweb.freebsd.org/changeset/base/258284[258284]
+|November 17, 2013
+|11.0-CURRENT after iconv changes.
+
+|1100004
+|link:https://svnweb.freebsd.org/changeset/base/259424[259424]
+|December 15, 2013
+|11.0-CURRENT after the behavior change of `gss_pseudo_random` introduced in link:https://svnweb.freebsd.org/changeset/base/259286[259286].
+
+|1100005
+|link:https://svnweb.freebsd.org/changeset/base/260010[260010]
+|December 28, 2013
+|11.0-CURRENT after link:https://svnweb.freebsd.org/changeset/base/259951[259951] - Do not coalesce entries in man:vm_map_stack[9].
+
+|1100006
+|link:https://svnweb.freebsd.org/changeset/base/261246[261246]
+|January 28, 2014
+|11.0-CURRENT after upgrades of libelf and libdwarf.
+
+|1100007
+|link:https://svnweb.freebsd.org/changeset/base/261283[261283]
+|January 30, 2014
+|11.0-CURRENT after upgrade of libc++ to 3.4 release.
+
+|1100008
+|link:https://svnweb.freebsd.org/changeset/base/261881[261881]
+|February 14, 2014
+|11.0-CURRENT after libc++ 3.4 ABI compatibility fix.
+
+|1100009
+|link:https://svnweb.freebsd.org/changeset/base/261991[261991]
+|February 16, 2014
+|11.0-CURRENT after upgrade of llvm/clang to 3.4 release.
+
+|1100010
+|link:https://svnweb.freebsd.org/changeset/base/262630[262630]
+|February 28, 2014
+|11.0-CURRENT after upgrade of ncurses to 5.9 release (rev link:https://svnweb.freebsd.org/changeset/base/262629[262629]).
+
+|1100011
+|link:https://svnweb.freebsd.org/changeset/base/263102[263102]
+|March 13, 2014
+|11.0-CURRENT after ABI change in struct if_data.
+
+|1100012
+|link:https://svnweb.freebsd.org/changeset/base/263140[263140]
+|March 14, 2014
+|11.0-CURRENT after removal of Novell IPX protocol support.
+
+|1100013
+|link:https://svnweb.freebsd.org/changeset/base/263152[263152]
+|March 14, 2014
+|11.0-CURRENT after removal of AppleTalk protocol support.
+
+|1100014
+|link:https://svnweb.freebsd.org/changeset/base/263235[263235]
+|March 16, 2014
+|11.0-CURRENT after renaming [.filename]#<sys/capability.h># to [.filename]#<sys/capsicum.h># to avoid a clash with similarly named headers in other operating systems. A compatibility header is left in place to limit build breakage, but will be deprecated in due course.
+
+|1100015
+|link:https://svnweb.freebsd.org/changeset/base/263620[263620]
+|March 22, 2014
+|11.0-CURRENT after `cnt` rename to `vm_cnt`.
+
+|1100016
+|link:https://svnweb.freebsd.org/changeset/base/263660[263660]
+|March 23, 2014
+|11.0-CURRENT after addition of `armv6hf TARGET_ARCH`.
+
+|1100017
+|link:https://svnweb.freebsd.org/changeset/base/264121[264121]
+|April 4, 2014
+|11.0-CURRENT after GCC support for `__block` definition.
+
+|1100018
+|link:https://svnweb.freebsd.org/changeset/base/264212[264212]
+|April 6, 2014
+|11.0-CURRENT after support for UDP-Lite protocol (RFC 3828).
+
+|1100019
+|link:https://svnweb.freebsd.org/changeset/base/264289[264289]
+|April 8, 2014
+|11.0-CURRENT after FreeBSD-SA-14:06.openssl (rev link:https://svnweb.freebsd.org/changeset/base/264265[264265]).
+
+|1100020
+|link:https://svnweb.freebsd.org/changeset/base/265215[265215]
+|May 1, 2014
+|11.0-CURRENT after removing lindev in favor of having /dev/full by default (rev link:https://svnweb.freebsd.org/changeset/base/265212[265212]).
+
+|1100021
+|link:https://svnweb.freebsd.org/changeset/base/266151[266151]
+|May 6, 2014
+|11.0-CURRENT after [.filename]#src.opts.mk# changes, decoupling man:make.conf[5] from `buildworld` (rev link:https://svnweb.freebsd.org/changeset/base/265419[265419]).
+
+|1100022
+|link:https://svnweb.freebsd.org/changeset/base/266904[266904]
+|May 30, 2014
+|11.0-CURRENT after changes to man:strcasecmp[3], moving man:strcasecmp_l[3] and man:strncasecmp_l[3] from [.filename]#<string.h># to [.filename]#<strings.h># for POSIX 2008 compliance (rev link:https://svnweb.freebsd.org/changeset/base/266865[266865]).
+
+|1100023
+|link:https://svnweb.freebsd.org/changeset/base/267440[267440]
+|June 13, 2014
+|11.0-CURRENT after the CUSE library and kernel module have been attached to the build by default.
+
+|1100024
+|link:https://svnweb.freebsd.org/changeset/base/267992[267992]
+|June 27, 2014
+|11.0-CURRENT after man:sysctl[3] API change.
+
+|1100025
+|link:https://svnweb.freebsd.org/changeset/base/268066[268066]
+|June 30, 2014
+|11.0-CURRENT after man:regex[3] library update to add ">" and "<" delimiters.
+
+|1100026
+|link:https://svnweb.freebsd.org/changeset/base/268118[268118]
+|July 1, 2014
+|11.0-CURRENT after the internal interface between the NFS modules, including the krpc, was changed by (rev link:https://svnweb.freebsd.org/changeset/base/268115[268115]).
+
+|1100027
+|link:https://svnweb.freebsd.org/changeset/base/268441[268441]
+|July 8, 2014
+|11.0-CURRENT after FreeBSD-SA-14:17.kmem (rev link:https://svnweb.freebsd.org/changeset/base/268431[268431]).
+
+|1100028
+|link:https://svnweb.freebsd.org/changeset/base/268945[268945]
+|July 21, 2014
+|11.0-CURRENT after man:hdestroy[3] compliance fix changed ABI.
+
+|1100029
+|link:https://svnweb.freebsd.org/changeset/base/270173[270173]
+|August 3, 2014
+|11.0-CURRENT after `SOCK_DGRAM` bug fix (rev link:https://svnweb.freebsd.org/changeset/base/269489[269489]).
+
+|1100030
+|link:https://svnweb.freebsd.org/changeset/base/270929[270929]
+|September 1, 2014
+|11.0-CURRENT after `SOCK_RAW` sockets were changed to not modify packets at all.
+
+|1100031
+|link:https://svnweb.freebsd.org/changeset/base/271341[271341]
+|September 9, 2014
+|11.0-CURRENT after FreeBSD-SA-14:18.openssl (rev link:https://svnweb.freebsd.org/changeset/base/269686[269686]).
+
+|1100032
+|link:https://svnweb.freebsd.org/changeset/base/271438[271438]
+|September 11, 2014
+|11.0-CURRENT after API changes to `ifa_ifwithbroadaddr`, `ifa_ifwithdstaddr`, `ifa_ifwithnet`, and `ifa_ifwithroute`.
+
+|1100033
+|link:https://svnweb.freebsd.org/changeset/base/271657[271657]
+|September 9, 2014
+|11.0-CURRENT after changing `access`, `eaccess`, and `faccessat` to validate the mode argument.
+
+|1100034
+|link:https://svnweb.freebsd.org/changeset/base/271686[271686]
+|September 16, 2014
+|11.0-CURRENT after FreeBSD-SA-14:19.tcp (rev link:https://svnweb.freebsd.org/changeset/base/271666[271666]).
+
+|1100035
+|link:https://svnweb.freebsd.org/changeset/base/271705[271705]
+|September 17, 2014
+|11.0-CURRENT after i915 HW context support.
+
+|1100036
+|link:https://svnweb.freebsd.org/changeset/base/271724[271724]
+|September 17, 2014
+|Version bump to have ABI note distinguish binaries ready for strict man:mmap[2] flags checking (rev link:https://svnweb.freebsd.org/changeset/base/271724[271724]).
+
+|1100037
+|link:https://svnweb.freebsd.org/changeset/base/272674[272674]
+|October 6, 2014
+|11.0-CURRENT after addition of man:explicit_bzero[3] (rev link:https://svnweb.freebsd.org/changeset/base/272673[272673]).
+
+|1100038
+|link:https://svnweb.freebsd.org/changeset/base/272951[272951]
+|October 11, 2014
+|11.0-CURRENT after cleanup of TCP wrapper headers.
+
+|1100039
+|link:https://svnweb.freebsd.org/changeset/base/273250[273250]
+|October 18, 2014
+|11.0-CURRENT after removal of `MAP_RENAME` and `MAP_NORESERVE`.
+
+|1100040
+|link:https://svnweb.freebsd.org/changeset/base/273432[273432]
+|October 21, 2014
+|11.0-CURRENT after FreeBSD-SA-14:23 (rev link:https://svnweb.freebsd.org/changeset/base/273146[273146]).
+
+|1100041
+|link:https://svnweb.freebsd.org/changeset/base/273875[273875]
+|October 30, 2014
+|11.0-CURRENT after API changes to `syscall_register`, `syscall32_register`, `syscall_register_helper` and `syscall32_register_helper` (rev link:https://svnweb.freebsd.org/changeset/base/273707[273707]).
+
+|1100042
+|link:https://svnweb.freebsd.org/changeset/base/274046[274046]
+|November 3, 2014
+|11.0-CURRENT after a change to `struct tcpcb`.
+
+|1100043
+|link:https://svnweb.freebsd.org/changeset/base/274085[274085]
+|November 4, 2014
+|11.0-CURRENT after enabling man:vt[4] by default.
+
+|1100044
+|link:https://svnweb.freebsd.org/changeset/base/274116[274116]
+|November 4, 2014
+|11.0-CURRENT after adding new libraries/utilities (dpv and figpar) for data throughput visualization.
+
+|1100045
+|link:https://svnweb.freebsd.org/changeset/base/274162[274162]
+|November 4, 2014
+|11.0-CURRENT after FreeBSD-SA-14:23, FreeBSD-SA-14:24, and FreeBSD-SA-14:25.
+
+|1100046
+|link:https://svnweb.freebsd.org/changeset/base/274470[274470]
+|November 13, 2014
+|11.0-CURRENT after `kern_poll` signature change (rev link:https://svnweb.freebsd.org/changeset/base/274462[274462]).
+
+|1100047
+|link:https://svnweb.freebsd.org/changeset/base/274476[274476]
+|November 13, 2014
+|11.0-CURRENT after removal of no-at version of VFS syscalls helpers, like `kern_open`.
+
+|1100048
+|link:https://svnweb.freebsd.org/changeset/base/275358[275358]
+|December 1, 2014
+|11.0-CURRENT after starting the process of removing the use of the deprecated "M_FLOWID" flag from the network code.
+
+|1100049
+|link:https://svnweb.freebsd.org/changeset/base/275633[275633]
+|December 9, 2014
+|11.0-CURRENT after importing an important fix to the LLVM vectorizer, which could lead to buffer overruns in some cases.
+
+|1100050
+|link:https://svnweb.freebsd.org/changeset/base/275732[275732]
+|December 12, 2014
+|11.0-CURRENT after adding AES-ICM and AES-GCM to OpenCrypto.
+
+|1100051
+|link:https://svnweb.freebsd.org/changeset/base/276096[276096]
+|December 23, 2014
+|11.0-CURRENT after removing old NFS client and server code from the kernel.
+
+|1100052
+|link:https://svnweb.freebsd.org/changeset/base/276479[276479]
+|December 31, 2014
+|11.0-CURRENT after upgrade of clang, llvm and lldb to 3.5.0 release.
+
+|1100053
+|link:https://svnweb.freebsd.org/changeset/base/276781[276781]
+|January 7, 2015
+|11.0-CURRENT after man:MCLGET[9] gained a return value (rev link:https://svnweb.freebsd.org/changeset/base/276750[276750]).
+
+|1100054
+|link:https://svnweb.freebsd.org/changeset/base/277213[277213]
+|January 15, 2015
+|11.0-CURRENT after rewrite of callout subsystem.
+
+|1100055
+|link:https://svnweb.freebsd.org/changeset/base/277528[277528]
+|January 22, 2015
+|11.0-CURRENT after reverting callout changes in link:https://svnweb.freebsd.org/changeset/base/277213[277213].
+
+|1100056
+|link:https://svnweb.freebsd.org/changeset/base/277610[277610]
+|January 23, 2015
+|11.0-CURRENT after addition of `futimens` and `utimensat` system calls.
+
+|1100057
+|link:https://svnweb.freebsd.org/changeset/base/277897[277897]
+|January 29, 2015
+|11.0-CURRENT after removal of d_thread_t.
+
+|1100058
+|link:https://svnweb.freebsd.org/changeset/base/278228[278228]
+|February 5, 2015
+|11.0-CURRENT after addition of support for probing the SCSI VPD Extended Inquiry page (0x86).
+
+|1100059
+|link:https://svnweb.freebsd.org/changeset/base/278442[278442]
+|February 9, 2015
+|11.0-CURRENT after import of xz 5.2.0, which added multi-threaded compression and lzma gained libthr dependency (rev link:https://svnweb.freebsd.org/changeset/base/278433[278433]).
+
+|1100060
+|link:https://svnweb.freebsd.org/changeset/base/278846[278846]
+|February 16, 2015
+|11.0-CURRENT after forwarding `FBIO_BLANK` to framebuffer clients.
+
+|1100061
+|link:https://svnweb.freebsd.org/changeset/base/278964[278964]
+|February 18, 2015
+|11.0-CURRENT after `CDAI_FLAG_NONE` addition.
+
+|1100062
+|link:https://svnweb.freebsd.org/changeset/base/279221[279221]
+|February 23, 2015
+|11.0-CURRENT after man:mtio[4] and man:sa[4] API and man:ioctl[2] additions.
+
+|1100063
+|link:https://svnweb.freebsd.org/changeset/base/279728[279728]
+|March 7, 2015
+|11.0-CURRENT after adding mutex support to the `pps_ioctl()` API in the kernel.
+
+|1100064
+|link:https://svnweb.freebsd.org/changeset/base/279729[279729]
+|March 7, 2015
+|11.0-CURRENT after adding PPS support to USB serial drivers.
+
+|1100065
+|link:https://svnweb.freebsd.org/changeset/base/280031[280031]
+|March 15, 2015
+|11.0-CURRENT after upgrading clang, llvm and lldb to 3.6.0.
+
+|1100066
+|link:https://svnweb.freebsd.org/changeset/base/280306[280306]
+|March 20, 2015
+|11.0-CURRENT after removal of SSLv2 support from OpenSSL.
+
+|1100067
+|link:https://svnweb.freebsd.org/changeset/base/280630[280630]
+|March 25, 2015
+|11.0-CURRENT after removal of SSLv2 support from man:fetch[1] and man:fetch[3].
+
+|1100068
+|link:https://svnweb.freebsd.org/changeset/base/281172[281172]
+|April 6, 2015
+|11.0-CURRENT after change to net.inet6.ip6.mif6table sysctl.
+
+|1100069
+|link:https://svnweb.freebsd.org/changeset/base/281550[281550]
+|April 15, 2015
+|11.0-CURRENT after removal of const qualifier from man:iconv[3].
+
+|1100070
+|link:https://svnweb.freebsd.org/changeset/base/281613[281613]
+|April 16, 2015
+|11.0-CURRENT after moving ALTQ from [.filename]#contrib# to [.filename]#net/altq#.
+
+|1100071
+|link:https://svnweb.freebsd.org/changeset/base/282256[282256]
+|April 29, 2015
+|11.0-CURRENT after API/ABI change to man:smb[4] (rev link:https://svnweb.freebsd.org/changeset/base/281985[281985]).
+
+|1100072
+|link:https://svnweb.freebsd.org/changeset/base/282319[282319]
+|May 1, 2015
+|11.0-CURRENT after adding man:reallocarray[3] in libc (rev link:https://svnweb.freebsd.org/changeset/base/282314[282314]).
+
+|1100073
+|link:https://svnweb.freebsd.org/changeset/base/282650[282650]
+|May 8, 2015
+|11.0-CURRENT after extending the maximum number of allowed PCM channels in a PCM stream to 127 and decreasing the maximum number of sub-channels to 1.
+
+|1100074
+|link:https://svnweb.freebsd.org/changeset/base/283526[283526]
+|May 25, 2015
+|11.0-CURRENT after adding preliminary support for x86-64 Linux binaries (rev link:https://svnweb.freebsd.org/changeset/base/283424[283424]), and upgrading clang and llvm to 3.6.1.
+
+|1100075
+|link:https://svnweb.freebsd.org/changeset/base/283623[283623]
+|May 27, 2015
+|11.0-CURRENT after `dounmount()` requiring a reference on the passed struct mount (rev link:https://svnweb.freebsd.org/changeset/base/283602[283602]).
+
+|1100076
+|link:https://svnweb.freebsd.org/changeset/base/283983[283983]
+|June 4, 2015
+|11.0-CURRENT after disabled generation of legacy formatted password databases entries by default.
+
+|1100077
+|link:https://svnweb.freebsd.org/changeset/base/284233[284233]
+|June 10, 2015
+|11.0-CURRENT after API changes to `lim_cur`, `lim_max`, and `lim_rlimit` (rev link:https://svnweb.freebsd.org/changeset/base/284215[284215]).
+
+|1100078
+|link:https://svnweb.freebsd.org/changeset/base/286672[286672]
+|August 12, 2015
+|11.0-CURRENT after man:crunchgen[1] changes from link:https://svnweb.freebsd.org/changeset/base/284356[284356] to link:https://svnweb.freebsd.org/changeset/base/285986[285986].
+
+|1100079
+|link:https://svnweb.freebsd.org/changeset/base/286874[286874]
+|August 18, 2015
+|11.0-CURRENT after import of jemalloc 4.0.0 (rev link:https://svnweb.freebsd.org/changeset/base/286866[286866]).
+
+|1100080
+|link:https://svnweb.freebsd.org/changeset/base/288943[288943]
+|October 5, 2015
+|11.0-CURRENT after upgrading clang, llvm, lldb, compiler-rt and libc++ to 3.7.0.
+
+|1100081
+|link:https://svnweb.freebsd.org/changeset/base/289415[289415]
+|October 16, 2015
+|11.0-CURRENT after undating ZFS to support resumable send/receive (rev link:https://svnweb.freebsd.org/changeset/base/289362[289362]).
+
+|1100082
+|link:https://svnweb.freebsd.org/changeset/base/289594[289594]
+|October 19, 2015
+|11.0-CURRENT after Linux KPI updates.
+
+|1100083
+|link:https://svnweb.freebsd.org/changeset/base/289749[289749]
+|October 22, 2015
+|11.0-CURRENT after renaming [.filename]#linuxapi.ko# to [.filename]#linuxkpi.ko#.
+
+|1100084
+|link:https://svnweb.freebsd.org/changeset/base/290135[290135]
+|October 29, 2015
+|11.0-CURRENT after moving the LinuxKPI module into the default kernel build.
+
+|1100085
+|link:https://svnweb.freebsd.org/changeset/base/290207[290207]
+|October 30, 2015
+|11.0-CURRENT after import of OpenSSL 1.0.2d.
+
+|1100086
+|link:https://svnweb.freebsd.org/changeset/base/290275[290275]
+|November 2, 2015
+|11.0-CURRENT after making man:figpar[3] macros more unique.
+
+|1100087
+|link:https://svnweb.freebsd.org/changeset/base/290479[290479]
+|November 7, 2015
+|11.0-CURRENT after changing man:sysctl_add_oid[9]'s ABI.
+
+|1100088
+|link:https://svnweb.freebsd.org/changeset/base/290495[290495]
+|November 7, 2015
+|11.0-CURRENT after string collation and locales rework.
+
+|1100089
+|link:https://svnweb.freebsd.org/changeset/base/290505[290505]
+|November 7, 2015
+|11.0-CURRENT after API change to man:sysctl_add_oid[9] (rev link:https://svnweb.freebsd.org/changeset/base/290475[290475]).
+
+|1100090
+|link:https://svnweb.freebsd.org/changeset/base/290715[290715]
+|November 10, 2015
+|11.0-CURRENT after API change to callout_stop macro; (rev link:https://svnweb.freebsd.org/changeset/base/290664[290664]).
+
+|1100091
+|link:https://svnweb.freebsd.org/changeset/base/291537[291537]
+|November 30, 2015
+|11.0-CURRENT after changing the interface between the [.filename]#nfsd.ko# and [.filename]#nfscommon.ko# modules in link:https://svnweb.freebsd.org/changeset/base/291527[291527].
+
+|1100092
+|link:https://svnweb.freebsd.org/changeset/base/292499[292499]
+|December 19, 2015
+|11.0-CURRENT after removal of vm_pageout_grow_cache (rev link:https://svnweb.freebsd.org/changeset/base/292469[292469]).
+
+|1100093
+|link:https://svnweb.freebsd.org/changeset/base/292966[292966]
+|December 30, 2015
+|11.0-CURRENT after removal of sys/crypto/sha2.h (rev link:https://svnweb.freebsd.org/changeset/base/292782[292782]).
+
+|1100094
+|link:https://svnweb.freebsd.org/changeset/base/294086[294086]
+|January 15, 2016
+|11.0-CURRENT after LinuxKPI PCI changes (rev link:https://svnweb.freebsd.org/changeset/base/294086[294086]).
+
+|1100095
+|link:https://svnweb.freebsd.org/changeset/base/294327[294327]
+|January 19, 2016
+|11.0-CURRENT after LRO optimizations.
+
+|1100096
+|link:https://svnweb.freebsd.org/changeset/base/294505[294505]
+|January 21, 2016
+|11.0-CURRENT after LinuxKPI idr_* additions.
+
+|1100097
+|link:https://svnweb.freebsd.org/changeset/base/294860[294860]
+|January 26, 2016
+|11.0-CURRENT after API change to man:dpv[3].
+
+|1100098
+|link:https://svnweb.freebsd.org/changeset/base/295682[295682]
+|February 16, 2016
+|11.0-CURRENT after API change to rman (rev link:https://svnweb.freebsd.org/changeset/base/294883[294883]).
+
+|1100099
+|link:https://svnweb.freebsd.org/changeset/base/295739[295739]
+|February 18, 2016
+|11.0-CURRENT after allowing drivers to set the TCP ACK/data segment aggregation limit.
+
+|1100100
+|link:https://svnweb.freebsd.org/changeset/base/296136[296136]
+|February 26, 2016
+|11.0-CURRENT after man:bus_alloc_resource_any[9] API addition.
+
+|1100101
+|link:https://svnweb.freebsd.org/changeset/base/296417[296417]
+|March 5, 2016
+|11.0-CURRENT after upgrading our copies of clang, llvm, lldb and compiler-rt to 3.8.0 release.
+
+|1100102
+|link:https://svnweb.freebsd.org/changeset/base/296749[296749]
+|March 12, 2016
+|11.0-CURRENT after libelf cross-endian fix in rev link:https://svnweb.freebsd.org/changeset/base/296685[296685].
+
+|1100103
+|link:https://svnweb.freebsd.org/changeset/base/297000[297000]
+|March 18, 2016
+|11.0-CURRENT after using uintmax_t for rman ranges.
+
+|1100104
+|link:https://svnweb.freebsd.org/changeset/base/297156[297156]
+|March 21, 2016
+|11.0-CURRENT after tracking filemon usage via a proc.p_filemon pointer rather than its own lists.
+
+|1100105
+|link:https://svnweb.freebsd.org/changeset/base/297602[297602]
+|April 6, 2016
+|11.0-CURRENT after fixing sed functions `i` and `a` from discarding leading white space.
+
+|1100106
+|link:https://svnweb.freebsd.org/changeset/base/298486[298486]
+|April 22, 2016
+|11.0-CURRENT after fixes for using IPv6 addresses with RDMA.
+
+|1100107
+|link:https://svnweb.freebsd.org/changeset/base/299090[299090]
+|May 4, 2016
+|11.0-CURRENT after improving performance and functionality of the man:bitstring[3] api.
+
+|1100108
+|link:https://svnweb.freebsd.org/changeset/base/299530[299530]
+|May 12, 2016
+|11.0-CURRENT after fixing handling of IOCTLs in the LinuxKPI.
+
+|1100109
+|link:https://svnweb.freebsd.org/changeset/base/299933[299933]
+|May 16, 2016
+|11.0-CURRENT after implementing more Linux device related functions in the LinuxKPI.
+
+|1100110
+|link:https://svnweb.freebsd.org/changeset/base/300207[300207]
+|May 19, 2016
+|11.0-CURRENT after adding support for managing Shingled Magnetic Recording (SMR) drives.
+
+|1100111
+|link:https://svnweb.freebsd.org/changeset/base/300303[300303]
+|May 20, 2016
+|11.0-CURRENT after removing brk and sbrk from arm64.
+
+|1100112
+|link:https://svnweb.freebsd.org/changeset/base/300539[300539]
+|May 23, 2016
+|11.0-CURRENT after adding bit_count to the man:bitstring[3] API.
+
+|1100113
+|link:https://svnweb.freebsd.org/changeset/base/300701[300701]
+|May 26, 2016
+|11.0-CURRENT after disabling alignment faults on armv6.
+
+|1100114
+|link:https://svnweb.freebsd.org/changeset/base/300806[300806]
+|May 26, 2016
+|11.0-CURRENT after fixing man:crunchgen[1] usage with `MAKEOBJDIRPREFIX`.
+
+|1100115
+|link:https://svnweb.freebsd.org/changeset/base/300982[300982]
+|May 30, 2016
+|11.0-CURRENT after adding an mbuf flag for `M_HASHTYPE_`.
+
+|1100116
+|link:https://svnweb.freebsd.org/changeset/base/301011[301011]
+|May 31, 2016
+|11.0-CURRENT after SHA-512t256 (rev link:https://svnweb.freebsd.org/changeset/base/300903[300903]) and Skein (rev link:https://svnweb.freebsd.org/changeset/base/300966[300966]) where added to libmd, libcrypt, the kernel, and ZFS (rev link:https://svnweb.freebsd.org/changeset/base/301010[301010]).
+
+|1100117
+|link:https://svnweb.freebsd.org/changeset/base/301892[301892]
+|June 6, 2016
+|11.0-CURRENT after libpam was synced with stock link:https://svnweb.freebsd.org/changeset/base/301602[301602], bumping library version.
+
+|1100118
+|link:https://svnweb.freebsd.org/changeset/base/302071[302071]
+|June 21, 2016
+|11.0-CURRENT after breaking binary compatibility of struct disk link:https://svnweb.freebsd.org/changeset/base/302069[302069].
+
+|1100119
+|link:https://svnweb.freebsd.org/changeset/base/302150[302150]
+|June 23, 2016
+|11.0-CURRENT after switching geom_disk to using a pool mutex.
+
+|1100120
+|link:https://svnweb.freebsd.org/changeset/base/302153[302153]
+|June 23, 2016
+|11.0-CURRENT after adding spares to struct ifnet.
+
+|1100121
+|link:https://svnweb.freebsd.org/changeset/base/303979[303979]
+|August 12, 2015
+|11-STABLE after `releng/11.0` branched from 11-STABLE (rev link:https://svnweb.freebsd.org/changeset/base/303975[303975]).
+
+|1100500
+|link:https://svnweb.freebsd.org/changeset/base/303979[303979]
+|August 12, 2016
+|11.0-STABLE adding branched link:https://svnweb.freebsd.org/changeset/base/303976[303976].
+
+|1100501
+|link:https://svnweb.freebsd.org/changeset/base/304609[304609]
+|August 22, 2016
+|11.0-STABLE after adding C++11 thread_local support.
+
+|1100502
+|link:https://svnweb.freebsd.org/changeset/base/304865[304865]
+|August 26, 2016
+|11.0-STABLE after `LC_*_MASK` fix.
+
+|1100503
+|link:https://svnweb.freebsd.org/changeset/base/305733[305733]
+|September 12, 2016
+|11.0-STABLE after resolving a deadlock between `device_detach()` and man:usbd_do_request_flags[9].
+
+|1100504
+|link:https://svnweb.freebsd.org/changeset/base/307330[307330]
+|October 14, 2016
+|11.0-STABLE after ZFS merges.
+
+|1100505
+|link:https://svnweb.freebsd.org/changeset/base/307590[307590]
+|October 19, 2016
+|11.0-STABLE after `struct fb_info` change.
+
+|1100506
+|link:https://svnweb.freebsd.org/changeset/base/308048[308048]
+|October 28, 2016
+|11.0-STABLE after installing header files required development with libzfs_core.
+
+|1100507
+|link:https://svnweb.freebsd.org/changeset/base/310120[310120]
+|December 15, 2016
+|11.0-STABLE after adding the `ki_moretdname` member to `struct kinfo_proc` and `struct kinfo_proc32` to export the whole thread name to user-space utilities.
+
+|1100508
+|link:https://svnweb.freebsd.org/changeset/base/310618[310618]
+|December 26, 2016
+|11.0-STABLE after upgrading our copies of clang, llvm, lldb, compiler-rt and libc++ to 3.9.1 release, and adding lld 3.9.1.
+
+|1100509
+|link:https://svnweb.freebsd.org/changeset/base/311186[311186]
+|January 3, 2017
+|11.0-STABLE after man:crunchgen[1] META_MODE fix (rev link:https://svnweb.freebsd.org/changeset/base/311185[311185]).
+
+|1100510
+|link:https://svnweb.freebsd.org/changeset/base/315312[315312]
+|March 15, 2017
+|11.0-STABLE after MFC of `fget_cap`, `getsock_cap`, and related changes.
+
+|1100511
+|link:https://svnweb.freebsd.org/changeset/base/316423[316423]
+|April 2, 2017
+|11.0-STABLE after multiple MFCs updating clang, llvm, lld, lldb, compiler-rt and libc++ to 4.0.0 release.
+
+|1100512
+|link:https://svnweb.freebsd.org/changeset/base/316498[316498]
+|April 4, 2017
+|11.0-STABLE after making CAM SIM lock optional (revs link:https://svnweb.freebsd.org/changeset/base/315673[315673], link:https://svnweb.freebsd.org/changeset/base/315674[315674]).
+
+|1100513
+|link:https://svnweb.freebsd.org/changeset/base/318197[318197]
+|May 11, 2017
+|11.0-STABLE after merging the addition of the [.filename]#<dev/mmc/mmc_ioctl.h># header.
+
+|1100514
+|link:https://svnweb.freebsd.org/changeset/base/319279[319279]
+|May 31, 2017
+|11.0-STABLE after multiple MFCs of `libpcap`, `WITHOUT_INET6`, and a few other minor changes.
+
+|1101000
+|link:https://svnweb.freebsd.org/changeset/base/320486[320486]
+|June 30, 2017
+|`releng/11.1` branched from `stable/11`.
+
+|1101001
+|link:https://svnweb.freebsd.org/changeset/base/320763[320763]
+|June 30, 2017
+|11.1-RC1 After merging the `MAP_GUARD` man:mmap[2] flag addition.
+
+|1101500
+|link:https://svnweb.freebsd.org/changeset/base/320487[320487]
+|June 30, 2017
+|11-STABLE after `releng/11.1` branched.
+
+|1101501
+|link:https://svnweb.freebsd.org/changeset/base/320666[320666]
+|July 5, 2017
+|11-STABLE after merging the `MAP_GUARD` man:mmap[2] flag addition.
+
+|1101502
+|link:https://svnweb.freebsd.org/changeset/base/321688[321688]
+|July 29, 2017
+|11-STABLE after merging the NFS client forced dismount support `umount -N` addition.
+
+|1101503
+|link:https://svnweb.freebsd.org/changeset/base/323431[323431]
+|September 11, 2017
+|11-STABLE after merging changes making the WRFSBASE instruction operational on amd64.
+
+|1101504
+|link:https://svnweb.freebsd.org/changeset/base/324006[324006]
+|September 26, 2017
+|11-STABLE after merging libm from head, which adds man:cacoshl[3], man:cacosl[3], man:casinhl[3], man:casinl[3], man:catanl[3], man:catanhl[3], man:sincos[3], man:sincosf[3], and man:sincosl[3].
+
+|1101505
+|link:https://svnweb.freebsd.org/changeset/base/324023[324023]
+|September 26, 2017
+|11-STABLE after merging clang, llvm, lld, lldb, compiler-rt and libc++ 5.0.0 release.
+
+|1101506
+|link:https://svnweb.freebsd.org/changeset/base/325003[325003]
+|October 25, 2017
+|11-STABLE after merging link:https://svnweb.freebsd.org/changeset/base/324281[324281], adding the `value.u16` field to `struct diocgattr_arg`.
+
+|1101507
+|link:https://svnweb.freebsd.org/changeset/base/328379[328379]
+|January 24, 2018
+|11-STABLE after merging link:https://svnweb.freebsd.org/changeset/base/325028[325028], fixing `ptrace()` to always clear the correct thread event when resuming.
+
+|1101508
+|link:https://svnweb.freebsd.org/changeset/base/328386[328386]
+|January 24, 2018
+|11-STABLE after merging link:https://svnweb.freebsd.org/changeset/base/316648[316648], renaming smp_no_rendevous_barrier() to smp_no_rendezvous_barrier().
+
+|1101509
+|link:https://svnweb.freebsd.org/changeset/base/328653[328653]
+|February 1, 2018
+|11-STABLE after an overwrite merge backport of the LinuxKPI from FreeBSD-head.
+
+|1101510
+|link:https://svnweb.freebsd.org/changeset/base/329450[329450]
+|February 17, 2018
+|11-STABLE after the cmpxchg() macro is now fully functional in the LinuxKPI.
+
+|1101511
+|link:https://svnweb.freebsd.org/changeset/base/329981[329981]
+|February 25, 2018
+|11-STABLE after concluding the recent LinuxKPI related updates.
+
+|1101512
+|link:https://svnweb.freebsd.org/changeset/base/331219[331219]
+|March 19, 2018
+|11-STABLE after merging retpoline support from the upstream llvm, clang and lld 5.0 branches.
+
+|1101513
+|link:https://svnweb.freebsd.org/changeset/base/331838[331838]
+|March 31, 2018
+|11-STABLE after merging clang, llvm, lld, lldb, compiler-rt and libc++ 6.0.0 release, and several follow-up fixes.
+
+|1101514
+|link:https://svnweb.freebsd.org/changeset/base/332089[332089]
+|April 5, 2018
+|11-STABLE after merging link:https://svnweb.freebsd.org/changeset/base/328331[328331], adding a new and incompatible interpretation of ${name}_limits in rc scripts.
+
+|1101515
+|link:https://svnweb.freebsd.org/changeset/base/332363[332363]
+|April 10, 2018
+|11-STABLE after reverting link:https://svnweb.freebsd.org/changeset/base/331880[331880], removing the new and incompatible interpretation of ${name}_limits in rc scripts.
+
+|1101516
+|link:https://svnweb.freebsd.org/changeset/base/334392[334392]
+|May 30, 2018
+|11-STABLE after man:dwatch[1] touch-ups.
+
+|1102000
+|link:https://svnweb.freebsd.org/changeset/base/334459[334459]
+|June 1, 2018
+|`releng/11.2` branched from `stable/11`.
+
+|1102500
+|link:https://svnweb.freebsd.org/changeset/base/334461[334461]
+|June 1, 2018
+|11-STABLE after releng/11.2 branched.
+
+|1102501
+|link:https://svnweb.freebsd.org/changeset/base/335436[335436]
+|June 20, 2018
+|11-STABLE after LinuxKPI updates requiring recompilation of external kernel modules.
+
+|1102502
+|link:https://svnweb.freebsd.org/changeset/base/338617[338617]
+|September 12, 2018
+|11-STABLE after adding a socket option SO_TS_CLOCK and fixing recvmsg32() system call to properly down-convert layout of the 64-bit structures to match what 32-bit app(s) expect.
+
+|1102503
+|link:https://svnweb.freebsd.org/changeset/base/338931[338931]
+|September 25, 2018
+|11-STABLE after merging a TCP checksum fix to man:iflib[9] and adding new media types to if_media.h
+
+|1102504
+|link:https://svnweb.freebsd.org/changeset/base/340309[340309]
+|November 9, 2018
+|11-STABLE after several MFCs: updating man:objcopy[1] to properly handle little-endian MIPS64 object; correcting mips64el test to use ELF header; adding test for 64-bit ELF in _libelf_is_mips64el.
+
+|1102505
+|link:https://svnweb.freebsd.org/changeset/base/342804[342804]
+|January 6, 2019
+|11-STABLE after merge of fixing linux_destroy_dev() behaviour when there are still files open from the destroying cdev.
+
+|1102506
+|link:https://svnweb.freebsd.org/changeset/base/344220[344220]
+|February 17, 2019
+|11-STABLE after merging multiple commits to lualoader.
+
+|1102507
+|link:https://svnweb.freebsd.org/changeset/base/346296[346296]
+|April 16, 2019
+|11-STABLE after merging llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp 8.0.0 final release r356365.
+
+|1102508
+|link:https://svnweb.freebsd.org/changeset/base/346784[346784]
+|April 27, 2019
+|11-STABLE after ether_gen_addr availability.
+
+|1102509
+|link:https://svnweb.freebsd.org/changeset/base/347212[347212]
+|May 6, 2019
+|11-STABLE after MFC of link:https://svnweb.freebsd.org/changeset/base/345303[345303], link:https://svnweb.freebsd.org/changeset/base/345658,[345658,] and partially of link:https://svnweb.freebsd.org/changeset/base/345305[345305].
+
+|1102510
+|link:https://svnweb.freebsd.org/changeset/base/347883[347883]
+|May 16, 2019
+|11-STABLE after bumping the Mellanox driver version numbers (man:mlx4en[4]; man:mlx5en[4]).
+
+|1103000
+|link:https://svnweb.freebsd.org/changeset/base/349026[349026]
+|June 14, 2019
+|`releng/11.3` branched from `stable/11`.
+
+|1103500
+|link:https://svnweb.freebsd.org/changeset/base/349027[349027]
+|June 14, 2019
+|11-STABLE after releng/11.3 branched.
+
+|1103501
+|link:https://svnweb.freebsd.org/changeset/base/354598[354598]
+|November 10, 2019
+|11-STABLE after fixing a potential OOB read security issue in libc++.
+
+|1103502
+|link:https://svnweb.freebsd.org/changeset/base/354614[354614]
+|November 11, 2019
+|11-STABLE after adding sysfs create/remove functions that handles multiple files in one call to the LinuxKPI.
+
+|1103503
+|link:https://svnweb.freebsd.org/changeset/base/354615[354615]
+|November 11, 2019
+|11-STABLE after LinuxKPI sysfs improvements.
+
+|1103504
+|link:https://svnweb.freebsd.org/changeset/base/354616[354616]
+|November 11, 2019
+|11-STABLE after enabling device class group attributes in the LinuxKPI.
+
+|1103505
+|link:https://svnweb.freebsd.org/changeset/base/355899[355899]
+|December 19, 2019
+|11-STABLE after adding sigsetop extensions commonly found in musl libc and glibc.
+
+|1103506
+|link:https://svnweb.freebsd.org/changeset/base/356395[356395]
+|January 6, 2020
+|11-STABLE after making USB statistics be per-device instead of per bus.
+
+|1103507
+|link:https://svnweb.freebsd.org/changeset/base/356680[356680]
+|January 13, 2020
+|11-STABLE after adding own counter for cancelled USB transfers.
+
+|1103508
+|link:https://svnweb.freebsd.org/changeset/base/357613[357613]
+|February 6, 2020
+|11-STABLE after recent LinuxKPI changes.
+
+|1103509
+|link:https://svnweb.freebsd.org/changeset/base/359958[359958]
+|April 15, 2020
+|11-STABLE after moving `id_mapped` to end of `bus_dma_impl` structure to preserve KPI.
+
+|1103510
+|link:https://svnweb.freebsd.org/changeset/base/360658[360658]
+|May 5, 2020
+|11-STABLE after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 9.0.0 final release r372316.
+
+|1103511
+|link:https://svnweb.freebsd.org/changeset/base/360784[360784]
+|May 7, 2020
+|11-STABLE after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 10.0.0 release.
+
+|1104000
+|link:https://svnweb.freebsd.org/changeset/base/360804[360804]
+|May 8, 2020
+|`releng/11.4` branched from `stable/11`.
+
+|1104001
+|link:https://svnweb.freebsd.org/changeset/base/360822[360822]
+|May 8, 2020
+|11.4-BETA1 after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 10.0.0 release.
+
+|1104500
+|link:https://svnweb.freebsd.org/changeset/base/360805[360805]
+|May 8, 2020
+|11-STABLE after releng/11.4 branched.
+
+|1104501
+|link:https://svnweb.freebsd.org/changeset/base/362320[362320]
+|June 18, 2020
+|11-STABLE after implementing __is_constexpr() function macro in the LinuxKPI.
+
+|1104502
+|link:https://svnweb.freebsd.org/changeset/base/362919[362919]
+|July 4, 2020
+|11-STABLE after making liblzma use libmd implementation of SHA256.
+
+|1104503
+|link:https://svnweb.freebsd.org/changeset/base/363496[363496]
+|July 24, 2020
+|11-STABLE after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 10.0.1 release.
+
+|1104504
+|link:https://svnweb.freebsd.org/changeset/base/363792[363792]
+|August 3, 2020
+|11-STABLE after implementing the array_size() function in the LinuxKPI.
+
+|1104505
+|link:https://svnweb.freebsd.org/changeset/base/364391[364391]
+|August 19, 2020
+|11-STABLE after change to clone the task struct fields related to RCU.
+
+|1104506
+|link:https://svnweb.freebsd.org/changeset/base/365471[365471]
+|September 8, 2020
+|11-STABLE after adding atomic and bswap functions to libcompiler_rt.
+
+|1104507
+|link:https://svnweb.freebsd.org/changeset/base/365661[365661]
+|September 12, 2020
+|11-STABLE after followup commits to libcompiler_rt.
+|===
+
+[[versions-10]]
+== FreeBSD 10 Versions
+
+[[freebsd-versions-table-10]]
+.FreeBSD 10 `__FreeBSD_version` Values
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Value
+| Revision
+| Date
+| Release
+
+|1000000
+|link:https://svnweb.freebsd.org/changeset/base/225757[225757]
+|September 26, 2011
+|10.0-CURRENT.
+
+|1000001
+|link:https://svnweb.freebsd.org/changeset/base/227070[227070]
+|November 4, 2011
+|10-CURRENT after addition of the man:posix_fadvise[2] system call.
+
+|1000002
+|link:https://svnweb.freebsd.org/changeset/base/228444[228444]
+|December 12, 2011
+|10-CURRENT after defining boolean true/false in sys/types.h, sizeof(bool) may have changed (rev link:https://svnweb.freebsd.org/changeset/base/228444[228444]). 10-CURRENT after xlocale.h was introduced (rev link:https://svnweb.freebsd.org/changeset/base/227753[227753]).
+
+|1000003
+|link:https://svnweb.freebsd.org/changeset/base/228571[228571]
+|December 16, 2011
+|10-CURRENT after major changes to man:carp[4], changing size of struct in_aliasreq, struct in6_aliasreq (rev link:https://svnweb.freebsd.org/changeset/base/228571[228571]) and straitening arguments check of SIOCAIFADDR (rev link:https://svnweb.freebsd.org/changeset/base/228574[228574]).
+
+|1000004
+|link:https://svnweb.freebsd.org/changeset/base/229204[229204]
+|January 1, 2012
+|10-CURRENT after the removal of `skpc()` and the addition of man:memcchr[9] (rev link:https://svnweb.freebsd.org/changeset/base/229200[229200]).
+
+|1000005
+|link:https://svnweb.freebsd.org/changeset/base/230207[230207]
+|January 16, 2012
+|10-CURRENT after the removal of support for SIOCSIFADDR, SIOCSIFNETMASK, SIOCSIFBRDADDR, SIOCSIFDSTADDR ioctls.
+
+|1000006
+|link:https://svnweb.freebsd.org/changeset/base/230590[230590]
+|January 26, 2012
+|10-CURRENT after introduction of read capacity data asynchronous notification in the man:cam[4] layer.
+
+|1000007
+|link:https://svnweb.freebsd.org/changeset/base/231025[231025]
+|February 5, 2012
+|10-CURRENT after introduction of new man:tcp[4] socket options: TCP_KEEPINIT, TCP_KEEPIDLE, TCP_KEEPINTVL, and TCP_KEEPCNT.
+
+|1000008
+|link:https://svnweb.freebsd.org/changeset/base/231505[231505]
+|February 11, 2012
+|10-CURRENT after introduction of the new extensible man:sysctl[3] interface NET_RT_IFLISTL to query address lists.
+
+|1000009
+|link:https://svnweb.freebsd.org/changeset/base/232154[232154]
+|February 25, 2012
+|10-CURRENT after import of libarchive 3.0.3 (rev link:https://svnweb.freebsd.org/changeset/base/232153[232153]).
+
+|1000010
+|link:https://svnweb.freebsd.org/changeset/base/233757[233757]
+|March 31, 2012
+|10-CURRENT after xlocale cleanup.
+
+|1000011
+|link:https://svnweb.freebsd.org/changeset/base/234355[234355]
+|April 16, 2012
+|10-CURRENT import of LLVM/Clang 3.1 trunk link:https://svnweb.freebsd.org/changeset/base/154661[154661] (rev link:https://svnweb.freebsd.org/changeset/base/234353[234353]).
+
+|1000012
+|link:https://svnweb.freebsd.org/changeset/base/234924[234924]
+|May 2, 2012
+|10-CURRENT jemalloc import.
+
+|1000013
+|link:https://svnweb.freebsd.org/changeset/base/235788[235788]
+|May 22, 2012
+|10-CURRENT after byacc import.
+
+|1000014
+|link:https://svnweb.freebsd.org/changeset/base/237631[237631]
+|June 27, 2012
+|10-CURRENT after BSD sort becoming the default sort (rev link:https://svnweb.freebsd.org/changeset/base/237629[237629]).
+
+|1000015
+|link:https://svnweb.freebsd.org/changeset/base/238405[238405]
+|July 12, 2012
+|10-CURRENT after import of OpenSSL 1.0.1c.
+
+|(not changed)
+|link:https://svnweb.freebsd.org/changeset/base/238429[238429]
+|July 13, 2012
+|10-CURRENT after the fix for LLVM/Clang 3.1 regression.
+
+|1000016
+|link:https://svnweb.freebsd.org/changeset/base/239179[239179]
+|August 8, 2012
+|10-CURRENT after KBI change in man:ucom[4].
+
+|1000017
+|link:https://svnweb.freebsd.org/changeset/base/239214[239214]
+|August 8, 2012
+|10-CURRENT after adding streams feature to the USB stack.
+
+|1000018
+|link:https://svnweb.freebsd.org/changeset/base/240233[240233]
+|September 8, 2012
+|10-CURRENT after major rewrite of man:pf[4].
+
+|1000019
+|link:https://svnweb.freebsd.org/changeset/base/241245[241245]
+|October 6, 2012
+|10-CURRENT after man:pfil[9] KBI/KPI changed to supply packets in net byte order to AF_INET filter hooks.
+
+|1000020
+|link:https://svnweb.freebsd.org/changeset/base/241610[241610]
+|October 16, 2012
+|10-CURRENT after the network interface cloning KPI changed and struct if_clone becoming opaque.
+
+|1000021
+|link:https://svnweb.freebsd.org/changeset/base/241897[241897]
+|October 22, 2012
+|10-CURRENT after removal of support for non-MPSAFE filesystems and addition of support for FUSEFS (rev link:https://svnweb.freebsd.org/changeset/base/241519[241519]).
+
+|1000022
+|link:https://svnweb.freebsd.org/changeset/base/241913[241913]
+|October 22, 2012
+|10-CURRENT after the entire IPv4 stack switched to network byte order for IP packet header storage.
+
+|1000023
+|link:https://svnweb.freebsd.org/changeset/base/242619[242619]
+|November 5, 2012
+|10-CURRENT after jitter buffer in the common USB serial driver code, to temporarily store characters if the TTY buffer is full. Add flow stop and start signals when this happens.
+
+|1000024
+|link:https://svnweb.freebsd.org/changeset/base/242624[242624]
+|November 5, 2012
+|10-CURRENT after clang was made the default compiler on i386 and amd64.
+
+|1000025
+|link:https://svnweb.freebsd.org/changeset/base/243443[243443]
+|November 17, 2012
+|10-CURRENT after the sin6_scope_id member variable in struct sockaddr_in6 was changed to being filled by the kernel before passing the structure to the userland via sysctl or routing socket. This means the KAME-specific embedded scope id in sin6_addr.s6_addr[2] is always cleared in userland application.
+
+|1000026
+|link:https://svnweb.freebsd.org/changeset/base/245313[245313]
+|January 11, 2013
+|10-CURRENT after install gained the -N flag. May also be used to indicate the presence of nmtree.
+
+|1000027
+|link:https://svnweb.freebsd.org/changeset/base/246084[246084]
+|January 29, 2013
+|10-CURRENT after cat gained the -l flag (rev link:https://svnweb.freebsd.org/changeset/base/246083[246083]).
+
+|1000028
+|link:https://svnweb.freebsd.org/changeset/base/246759[246759]
+|February 13, 2013
+|10-CURRENT after USB moved to the driver structure requiring a rebuild of all USB modules.
+
+|1000029
+|link:https://svnweb.freebsd.org/changeset/base/247821[247821]
+|March 4, 2013
+|10-CURRENT after the introduction of tickless callout facility which also changed the layout of struct callout (rev link:https://svnweb.freebsd.org/changeset/base/247777[247777]).
+
+|1000030
+|link:https://svnweb.freebsd.org/changeset/base/248210[248210]
+|March 12, 2013
+|10-CURRENT after KPI breakage introduced in the VM subsystem to support read/write locking (rev link:https://svnweb.freebsd.org/changeset/base/248084[248084]).
+
+|1000031
+|link:https://svnweb.freebsd.org/changeset/base/249943[249943]
+|April 26, 2013
+|10-CURRENT after the dst parameter of the ifnet `if_output` method was changed to take const qualifier (rev link:https://svnweb.freebsd.org/changeset/base/249925[249925]).
+
+|1000032
+|link:https://svnweb.freebsd.org/changeset/base/250163[250163]
+|May 1, 2013
+|10-CURRENT after the introduction of the man:accept4[2] (rev link:https://svnweb.freebsd.org/changeset/base/250154[250154]) and man:pipe2[2] (rev link:https://svnweb.freebsd.org/changeset/base/250159[250159]) system calls.
+
+|1000033
+|link:https://svnweb.freebsd.org/changeset/base/250881[250881]
+|May 21, 2013
+|10-CURRENT after flex 2.5.37 import.
+
+|1000034
+|link:https://svnweb.freebsd.org/changeset/base/251294[251294]
+|June 3, 2013
+|10-CURRENT after the addition of these functions to libm: man:cacos[3], man:cacosf[3], man:cacosh[3], man:cacoshf[3], man:casin[3], man:casinf[3], man:casinh[3], man:casinhf[3], man:catan[3], man:catanf[3], man:catanh[3], man:catanhf[3], man:logl[3], man:log2l[3], man:log10l[3], man:log1pl[3], man:expm1l[3].
+
+|1000035
+|link:https://svnweb.freebsd.org/changeset/base/251527[251527]
+|June 8, 2013
+|10-CURRENT after the introduction of the man:aio_mlock[2] system call (rev link:https://svnweb.freebsd.org/changeset/base/251526[251526]).
+
+|1000036
+|link:https://svnweb.freebsd.org/changeset/base/253049[253049]
+|July 9, 2013
+|10-CURRENT after the addition of a new function to the kernel GSSAPI module's function call interface.
+
+|1000037
+|link:https://svnweb.freebsd.org/changeset/base/253089[253089]
+|July 9, 2013
+|10-CURRENT after the migration of statistics structures to PCPU counters. Changed structures include: `ahstat`, `arpstat`, `espstat`, `icmp6_ifstat`, `icmp6stat`, `in6_ifstat`, `ip6stat`, `ipcompstat`, `ipipstat`, `ipsecstat`, `mrt6stat`, `mrtstat`, `pfkeystat`, `pim6stat`, `pimstat`, `rip6stat`, `udpstat` (rev link:https://svnweb.freebsd.org/changeset/base/253081[253081]).
+
+|1000038
+|link:https://svnweb.freebsd.org/changeset/base/253396[253396]
+|July 16, 2013
+|10-CURRENT after making `ARM EABI` the default ABI on arm, armeb, armv6, and armv6eb architectures.
+
+|1000039
+|link:https://svnweb.freebsd.org/changeset/base/253549[253549]
+|July 22, 2013
+|10-CURRENT after `CAM` and man:mps[4] driver scanning changes.
+
+|1000040
+|link:https://svnweb.freebsd.org/changeset/base/253638[253638]
+|July 24, 2013
+|10-CURRENT after addition of libusb pkgconf files.
+
+|1000041
+|link:https://svnweb.freebsd.org/changeset/base/253970[253970]
+|August 5, 2013
+|10-CURRENT after change from `time_second` to `time_uptime` in `PF_INET6`.
+
+|1000042
+|link:https://svnweb.freebsd.org/changeset/base/254138[254138]
+|August 9, 2013
+|10-CURRENT after VM subsystem change to unify soft and hard busy mechanisms.
+
+|1000043
+|link:https://svnweb.freebsd.org/changeset/base/254273[254273]
+|August 13, 2013
+|10-CURRENT after `WITH_ICONV` is enabled by default. A new man:src.conf[5] option, `WITH_LIBICONV_COMPAT` (disabled by default) adds `libiconv_open` to provide compatibility with the package:libiconv[] port.
+
+|1000044
+|link:https://svnweb.freebsd.org/changeset/base/254358[254358]
+|August 15, 2013
+|10-CURRENT after `libc.so` conversion to an man:ld[1] script (rev link:https://svnweb.freebsd.org/changeset/base/251668[251668]).
+
+|1000045
+|link:https://svnweb.freebsd.org/changeset/base/254389[254389]
+|August 15, 2013
+|10-CURRENT after devfs programming interface change by replacing the cdevsw flag `D_UNMAPPED_IO` with the struct cdev flag `SI_UNMAPPED`.
+
+|1000046
+|link:https://svnweb.freebsd.org/changeset/base/254537[254537]
+|August 19, 2013
+|10-CURRENT after addition of `M_PROTO[9-12]` and removal of `M_FRAG\|M_FIRSTFRAG\|M_LASTFRAG` mbuf flags (rev link:https://svnweb.freebsd.org/changeset/base/254524[254524], link:https://svnweb.freebsd.org/changeset/base/254526[254526]).
+
+|1000047
+|link:https://svnweb.freebsd.org/changeset/base/254627[254627]
+|August 21, 2013
+|10-CURRENT after man:stat[2] update to allow storing some Windows/DOS and CIFS file attributes as man:stat[2] flags.
+
+|1000048
+|link:https://svnweb.freebsd.org/changeset/base/254672[254672]
+|August 22, 2013
+|10-CURRENT after modification of structure `xsctp_inpcb`.
+
+|1000049
+|link:https://svnweb.freebsd.org/changeset/base/254760[254760]
+|August 24, 2013
+|10-CURRENT after man:physio[9] support for devices that do not function properly with split I/O, such as man:sa[4].
+
+|1000050
+|link:https://svnweb.freebsd.org/changeset/base/254844[254844]
+|August 24, 2013
+|10-CURRENT after modifications of structure `mbuf` (rev link:https://svnweb.freebsd.org/changeset/base/254780[254780], link:https://svnweb.freebsd.org/changeset/base/254799[254799], link:https://svnweb.freebsd.org/changeset/base/254804[254804], link:https://svnweb.freebsd.org/changeset/base/254807[254807]link:https://svnweb.freebsd.org/changeset/base/254842[254842]).
+
+|1000051
+|link:https://svnweb.freebsd.org/changeset/base/254887[254887]
+|August 25, 2013
+|10-CURRENT after Radeon KMS driver import (rev link:https://svnweb.freebsd.org/changeset/base/254885[254885]).
+
+|1000052
+|link:https://svnweb.freebsd.org/changeset/base/255180[255180]
+|September 3, 2013
+|10-CURRENT after import of NetBSD `libexecinfo` is connected to the build.
+
+|1000053
+|link:https://svnweb.freebsd.org/changeset/base/255305[255305]
+|September 6, 2013
+|10-CURRENT after API and ABI changes to the Capsicum framework.
+
+|1000054
+|link:https://svnweb.freebsd.org/changeset/base/255321[255321]
+|September 6, 2013
+|10-CURRENT after `gcc` and `libstdc++` are no longer built by default.
+
+|1000055
+|link:https://svnweb.freebsd.org/changeset/base/255449[255449]
+|September 6, 2013
+|10-CURRENT after addition of `MMAP_32BIT` man:mmap[2] flag (rev link:https://svnweb.freebsd.org/changeset/base/255426[255426]).
+
+|1000100
+|link:https://svnweb.freebsd.org/changeset/base/259065[259065]
+|December 7, 2013
+|`releng/10.0` branched from `stable/10`.
+
+|1000500
+|link:https://svnweb.freebsd.org/changeset/base/256283[256283]
+|October 10, 2013
+|10-STABLE after branch from `head/`.
+
+|1000501
+|link:https://svnweb.freebsd.org/changeset/base/256916[256916]
+|October 22, 2013
+|10-STABLE after addition of first-boot man:rc[8] support.
+
+|1000502
+|link:https://svnweb.freebsd.org/changeset/base/258398[258398]
+|November 20, 2013
+|10-STABLE after removal of iconv symbols from `libc.so.7`.
+
+|1000510
+|link:https://svnweb.freebsd.org/changeset/base/259067[259067]
+|December 7, 2013
+|`releng/10.0` __FreeBSD_version update to prevent the value from going backwards.
+
+|1000700
+|link:https://svnweb.freebsd.org/changeset/base/259069[259069]
+|December 7, 2013
+|10-STABLE after `releng/10.0` branch.
+
+|1000701
+|link:https://svnweb.freebsd.org/changeset/base/259447[259447]
+|December 15, 2013
+|10.0-STABLE after Heimdal encoding fix.
+
+|1000702
+|link:https://svnweb.freebsd.org/changeset/base/260135[260135]
+|December 31, 2013
+|10-STABLE after MAP_STACK fixes.
+
+|1000703
+|link:https://svnweb.freebsd.org/changeset/base/262801[262801]
+|March 5, 2014
+|10-STABLE after upgrade of libc++ to 3.4 release.
+
+|1000704
+|link:https://svnweb.freebsd.org/changeset/base/262889[262889]
+|March 7, 2014
+|10-STABLE after MFC of the man:vt[4] driver (rev link:https://svnweb.freebsd.org/changeset/base/262861[262861]).
+
+|1000705
+|link:https://svnweb.freebsd.org/changeset/base/263508[263508]
+|March 21, 2014
+|10-STABLE after upgrade of llvm/clang to 3.4 release.
+
+|1000706
+|link:https://svnweb.freebsd.org/changeset/base/264214[264214]
+|April 6, 2014
+|10-STABLE after GCC support for `__block` definition.
+
+|1000707
+|link:https://svnweb.freebsd.org/changeset/base/264289[264289]
+|April 8, 2014
+|10-STABLE after FreeBSD-SA-14:06.openssl.
+
+|1000708
+|link:https://svnweb.freebsd.org/changeset/base/265122[265122]
+|April 30, 2014
+|10-STABLE after FreeBSD-SA-14:07.devfs, FreeBSD-SA-14:08.tcp, and FreeBSD-SA-14:09.openssl.
+
+|1000709
+|link:https://svnweb.freebsd.org/changeset/base/265946[265946]
+|May 13, 2014
+|10-STABLE after support for UDP-Lite protocol (RFC 3828).
+
+|1000710
+|link:https://svnweb.freebsd.org/changeset/base/267465[267465]
+|June 13, 2014
+|10-STABLE after changes to man:strcasecmp[3], moving man:strcasecmp_l[3] and man:strncasecmp_l[3] from [.filename]#<string.h># to [.filename]#<strings.h># for POSIX 2008 compliance.
+
+|1000711
+|link:https://svnweb.freebsd.org/changeset/base/268442[268442]
+|July 8, 2014
+|10-STABLE after FreeBSD-SA-14:17.kmem (rev link:https://svnweb.freebsd.org/changeset/base/268432[268432]).
+
+|1000712
+|link:https://svnweb.freebsd.org/changeset/base/269400[269400]
+|August 1, 2014
+|10-STABLE after man:nfsd[8] 4.1 merge (rev link:https://svnweb.freebsd.org/changeset/base/269398[269398]).
+
+|1000713
+|link:https://svnweb.freebsd.org/changeset/base/269484[269484]
+|August 3, 2014
+|10-STABLE after man:regex[3] library update to add ">" and "<" delimiters.
+
+|1000714
+|link:https://svnweb.freebsd.org/changeset/base/270174[270174]
+|August 3, 2014
+|10-STABLE after `SOCK_DGRAM` bug fix (rev link:https://svnweb.freebsd.org/changeset/base/269490[269490]).
+
+|1000715
+|link:https://svnweb.freebsd.org/changeset/base/271341[271341]
+|September 9, 2014
+|10-STABLE after FreeBSD-SA-14:18 (rev link:https://svnweb.freebsd.org/changeset/base/269686[269686]).
+
+|1000716
+|link:https://svnweb.freebsd.org/changeset/base/271686[271686]
+|September 16, 2014
+|10-STABLE after FreeBSD-SA-14:19 (rev link:https://svnweb.freebsd.org/changeset/base/271667[271667]).
+
+|1000717
+|link:https://svnweb.freebsd.org/changeset/base/271816[271816]
+|September 18, 2014
+|10-STABLE after i915 HW context support.
+
+|1001000
+|link:https://svnweb.freebsd.org/changeset/base/272463[272463]
+|October 2, 2014
+|10.1-RC1 after releng/10.1 branch.
+
+|1001500
+|link:https://svnweb.freebsd.org/changeset/base/272464[272464]
+|October 2, 2014
+|10-STABLE after releng/10.1 branch.
+
+|1001501
+|link:https://svnweb.freebsd.org/changeset/base/273432[273432]
+|October 21, 2014
+|10-STABLE after FreeBSD-SA-14:20, FreeBSD-SA-14:22, and FreeBSD-SA-14:23 (rev link:https://svnweb.freebsd.org/changeset/base/273411[273411]).
+
+|1001502
+|link:https://svnweb.freebsd.org/changeset/base/274162[274162]
+|November 4, 2014
+|10-STABLE after FreeBSD-SA-14:23, FreeBSD-SA-14:24, and FreeBSD-SA-14:25.
+
+|1001503
+|link:https://svnweb.freebsd.org/changeset/base/275040[275040]
+|November 25, 2014
+|10-STABLE after merging new libraries/utilities (man:dpv[1] man:dpv[3], and man:figpar[3]) for data throughput visualization.
+
+|1001504
+|link:https://svnweb.freebsd.org/changeset/base/275742[275742]
+|December 13, 2014
+|10-STABLE after merging an important fix to the LLVM vectorizer, which could lead to buffer overruns in some cases.
+
+|1001505
+|link:https://svnweb.freebsd.org/changeset/base/276633[276633]
+|January 3, 2015
+|10-STABLE after merging some arm constants in link:https://svnweb.freebsd.org/changeset/base/276312[276312].
+
+|1001506
+|link:https://svnweb.freebsd.org/changeset/base/277087[277087]
+|January 12, 2015
+|10-STABLE after merging max table size update for yacc.
+
+|1001507
+|link:https://svnweb.freebsd.org/changeset/base/277790[277790]
+|January 27, 2015
+|10-STABLE after changes to the UDP tunneling callback to provide a context pointer and the source sockaddr.
+
+|1001508
+|link:https://svnweb.freebsd.org/changeset/base/278974[278974]
+|February 18, 2015
+|10-STABLE after addition of the `CDAI_TYPE_EXT_INQ` request type.
+
+|1001509
+|link:https://svnweb.freebsd.org/changeset/base/279287[279287]
+|February 25, 2015
+|10-STABLE after FreeBSD-EN-15:01.vt, FreeBSD-EN-15:02.openssl, FreeBSD-EN-15:03.freebsd-update, FreeBSD-SA-15:04.igmp, and FreeBSD-SA-15:05.bind.
+
+|1001510
+|link:https://svnweb.freebsd.org/changeset/base/279329[279329]
+|February 26, 2015
+|10-STABLE after MFC of rev link:https://svnweb.freebsd.org/changeset/base/278964[278964].
+
+|1001511
+|link:https://svnweb.freebsd.org/changeset/base/280246[280246]
+|19 March, 2015
+|10-STABLE after [.filename]#sys/capability.h# is renamed to [.filename]#sys/capsicum.h# (rev link:https://svnweb.freebsd.org/changeset/base/280224/[280224/]).
+
+|1001512
+|link:https://svnweb.freebsd.org/changeset/base/280438[280438]
+|24 March, 2015
+|10-STABLE after addition of new man:mtio[4], man:sa[4] ioctls.
+
+|1001513
+|link:https://svnweb.freebsd.org/changeset/base/281955[281955]
+|24 April, 2015
+|10-STABLE after starting the process of removing the use of the deprecated "M_FLOWID" flag from the network code.
+
+|1001514
+|link:https://svnweb.freebsd.org/changeset/base/282275[282275]
+|April 30, 2015
+|10-STABLE after MFC of man:iconv[3] fixes.
+
+|1001515
+|link:https://svnweb.freebsd.org/changeset/base/282781[282781]
+|May 11, 2015
+|10-STABLE after adding back `M_FLOWID`.
+
+|1001516
+|link:https://svnweb.freebsd.org/changeset/base/283341[283341]
+|May 24, 2015
+|10-STABLE after MFC of many USB things.
+
+|1001517
+|link:https://svnweb.freebsd.org/changeset/base/283950[283950]
+|June 3, 2015
+|10-STABLE after MFC of sound related things.
+
+|1001518
+|link:https://svnweb.freebsd.org/changeset/base/284204[284204]
+|June 10, 2015
+|10-STABLE after MFC of zfs vfs fixes (rev link:https://svnweb.freebsd.org/changeset/base/284203[284203]).
+
+|1001519
+|link:https://svnweb.freebsd.org/changeset/base/284720[284720]
+|June 23, 2015
+|10-STABLE after reverting bumping `MAXCPU` on amd64.
+
+|1002000
+|link:https://svnweb.freebsd.org/changeset/base/285830[285830]
+|24 July, 2015
+|`releng/10.2` branched from 10-STABLE.
+
+|1002500
+|link:https://svnweb.freebsd.org/changeset/base/285831[285831]
+|24 July, 2015
+|10-STABLE after `releng/10.2` branched from 10-STABLE.
+
+|1002501
+|link:https://svnweb.freebsd.org/changeset/base/289005[289005]
+|8 October, 2015
+|10-STABLE after merge of ZFS changes that affected the internal interface of zfeature_info structure (rev link:https://svnweb.freebsd.org/changeset/base/288572[288572]).
+
+|1002502
+|link:https://svnweb.freebsd.org/changeset/base/291243[291243]
+|24 November, 2015
+|10-STABLE after merge of dump device changes that affected the arguments of `g_dev_setdumpdev()`(rev link:https://svnweb.freebsd.org/changeset/base/291215[291215]).
+
+|1002503
+|link:https://svnweb.freebsd.org/changeset/base/292224[292224]
+|14 December, 2015
+|10-STABLE after merge of changes to the internal interface between the nfsd.ko and nfscommon.ko modules, requiring them to be upgraded together (rev link:https://svnweb.freebsd.org/changeset/base/292223[292223]).
+
+|1002504
+|link:https://svnweb.freebsd.org/changeset/base/292589[292589]
+|22 December, 2015
+|10-STABLE after merge of xz 5.2.2 merge (multithread support) (rev link:https://svnweb.freebsd.org/changeset/base/292588[292588]).
+
+|1002505
+|link:https://svnweb.freebsd.org/changeset/base/292908[292908]
+|30 December, 2015
+|10-STABLE after merge of changes to man:pci[4] (rev link:https://svnweb.freebsd.org/changeset/base/292907[292907]).
+
+|1002506
+|link:https://svnweb.freebsd.org/changeset/base/293476[293476]
+|9 January, 2016
+|10-STABLE after merge of man:utimensat[2] (rev link:https://svnweb.freebsd.org/changeset/base/293473[293473]).
+
+|1002507
+|link:https://svnweb.freebsd.org/changeset/base/293610[293610]
+|9 January, 2016
+|10-STABLE after merge of changes to man:linux[4] (rev link:https://svnweb.freebsd.org/changeset/base/293477[293477] through link:https://svnweb.freebsd.org/changeset/base/293609[293609]).
+
+|1002508
+|link:https://svnweb.freebsd.org/changeset/base/293619[293619]
+|9 January, 2016
+|10-STABLE after merge of changes to man:figpar[3] types/macros (rev link:https://svnweb.freebsd.org/changeset/base/290275[290275]).
+
+|1002509
+|link:https://svnweb.freebsd.org/changeset/base/295107[295107]
+|1 February, 2016
+|10-STABLE after merge of API change to man:dpv[3].
+
+|1003000
+|link:https://svnweb.freebsd.org/changeset/base/296373[296373]
+|4 March, 2016
+|`releng/10.3` branched from 10-STABLE.
+
+|1003500
+|link:https://svnweb.freebsd.org/changeset/base/296374[296374]
+|4 March, 2016
+|10-STABLE after `releng/10.3` branched from 10-STABLE.
+
+|1003501
+|link:https://svnweb.freebsd.org/changeset/base/298299[298299]
+|19 June, 2016
+|10-STABLE after adding kdbcontrol's -P option (rev link:https://svnweb.freebsd.org/changeset/base/298297[298297]).
+
+|1003502
+|link:https://svnweb.freebsd.org/changeset/base/299966[299966]
+|19 June, 2016
+|10-STABLE after libcrypto.so was made position independent.
+
+|1003503
+|link:https://svnweb.freebsd.org/changeset/base/300235[300235]
+|19 June, 2016
+|10-STABLE after allowing MK_ overrides (rev link:https://svnweb.freebsd.org/changeset/base/300233[300233]).
+
+|1003504
+|link:https://svnweb.freebsd.org/changeset/base/302066[302066]
+|21 June, 2016
+|10-STABLE after MFC of filemon changes from 11-CURRENT.
+
+|1003505
+|link:https://svnweb.freebsd.org/changeset/base/302228[302228]
+|27 June, 2016
+|10-STABLE after converting sed to use REG_STARTEND, fixing a Mesa issue.
+
+|1003506
+|link:https://svnweb.freebsd.org/changeset/base/304611[304611]
+|August 22, 2016
+|10-STABLE after adding C++11 thread_local support.
+
+|1003507
+|link:https://svnweb.freebsd.org/changeset/base/304864[304864]
+|August 26, 2016
+|10-STABLE after `LC_*_MASK` fix.
+
+|1003508
+|link:https://svnweb.freebsd.org/changeset/base/305734[305734]
+|September 12, 2016
+|10-STABLE after resolving a deadlock between `device_detach()` and man:usbd_do_request_flags[9].
+
+|1003509
+|link:https://svnweb.freebsd.org/changeset/base/307331[307331]
+|October 14, 2016
+|10-STABLE after ZFS merges.
+
+|1003510
+|link:https://svnweb.freebsd.org/changeset/base/308047[308047]
+|October 28, 2016
+|10-STABLE after installing header files required development with libzfs_core.
+
+|1003511
+|link:https://svnweb.freebsd.org/changeset/base/310121[310121]
+|December 15, 2016
+|10-STABLE after exporting whole thread name in `kinfo_proc` (rev link:https://svnweb.freebsd.org/changeset/base/309676[309676]).
+
+|1003512
+|link:https://svnweb.freebsd.org/changeset/base/315730[315730]
+|March 22, 2017
+|10-STABLE after libmd changes (rev link:https://svnweb.freebsd.org/changeset/base/314143[314143]).
+
+|1003513
+|link:https://svnweb.freebsd.org/changeset/base/316499[316499]
+|April 4, 2017
+|10-STABLE after making CAM SIM lock optional (revs link:https://svnweb.freebsd.org/changeset/base/315673[315673], link:https://svnweb.freebsd.org/changeset/base/315674[315674]).
+
+|1003514
+|link:https://svnweb.freebsd.org/changeset/base/318198[318198]
+|May 11, 2017
+|10-STABLE after merging the addition of the [.filename]#<dev/mmc/mmc_ioctl.h># header.
+
+|1003515
+|link:https://svnweb.freebsd.org/changeset/base/321222[321222]
+|July 19, 2017
+|10-STABLE after adding C++14 sized deallocation functions to libc++.
+
+|1003516
+|link:https://svnweb.freebsd.org/changeset/base/321717[321717]
+|July 30, 2017
+|10-STABLE after merging the `MAP_GUARD` man:mmap[2] flag addition.
+
+|1004000
+|link:https://svnweb.freebsd.org/changeset/base/323604[323604]
+|September 15, 2017
+|`releng/10.4` branched from 10-STABLE.
+
+|1004500
+|link:https://svnweb.freebsd.org/changeset/base/323605[323605]
+|September 15, 2017
+|10-STABLE after `releng/10.4` branched from 10-STABLE.
+
+|1004501
+|link:https://svnweb.freebsd.org/changeset/base/328379[328379]
+|January 24, 2018
+|10-STABLE after merging link:https://svnweb.freebsd.org/changeset/base/325028[325028], fixing `ptrace()` to always clear the correct thread event when resuming.
+
+|1004502
+|link:https://svnweb.freebsd.org/changeset/base/356396[356396]
+|January 6, 2020
+|10-STABLE after making USB statistics be per-device instead of per bus.
+
+|1004503
+|link:https://svnweb.freebsd.org/changeset/base/356681[356681]
+|January 13, 2020
+|10-STABLE after adding own counter for cancelled USB transfers.
+|===
+
+[[versions-9]]
+== FreeBSD 9 Versions
+
+[[freebsd-versions-table-9]]
+.FreeBSD 9 `__FreeBSD_version` Values
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Value
+| Revision
+| Date
+| Release
+
+|900000
+|link:https://svnweb.freebsd.org/changeset/base/196432[196432]
+|August 22, 2009
+|9.0-CURRENT.
+
+|900001
+|link:https://svnweb.freebsd.org/changeset/base/197019[197019]
+|September 8, 2009
+|9.0-CURRENT after importing x86emu, a software emulator for real mode x86 CPU from OpenBSD.
+
+|900002
+|link:https://svnweb.freebsd.org/changeset/base/197430[197430]
+|September 23, 2009
+|9.0-CURRENT after implementing the EVFILT_USER kevent filter functionality.
+
+|900003
+|link:https://svnweb.freebsd.org/changeset/base/200039[200039]
+|December 2, 2009
+|9.0-CURRENT after addition of man:sigpause[2] and PIE support in csu.
+
+|900004
+|link:https://svnweb.freebsd.org/changeset/base/200185[200185]
+|December 6, 2009
+|9.0-CURRENT after addition of libulog and its libutempter compatibility interface.
+
+|900005
+|link:https://svnweb.freebsd.org/changeset/base/200447[200447]
+|December 12, 2009
+|9.0-CURRENT after addition of man:sleepq_sleepcnt[9], which can be used to query the number of waiters on a specific waiting queue.
+
+|900006
+|link:https://svnweb.freebsd.org/changeset/base/201513[201513]
+|January 4, 2010
+|9.0-CURRENT after change of the man:scandir[3] and man:alphasort[3] prototypes to conform to SUSv4.
+
+|900007
+|link:https://svnweb.freebsd.org/changeset/base/202219[202219]
+|January 13, 2010
+|9.0-CURRENT after the removal of man:utmp[5] and the addition of utmpx (see man:getutxent[3]) for improved logging of user logins and system events.
+
+|900008
+|link:https://svnweb.freebsd.org/changeset/base/202722[202722]
+|January 20, 2010
+|9.0-CURRENT after the import of BSDL bc/dc and the deprecation of GNU bc/dc.
+
+|900009
+|link:https://svnweb.freebsd.org/changeset/base/203052[203052]
+|January 26, 2010
+|9.0-CURRENT after the addition of SIOCGIFDESCR and SIOCSIFDESCR ioctls to network interfaces. These ioctl can be used to manipulate interface description, as inspired by OpenBSD.
+
+|900010
+|link:https://svnweb.freebsd.org/changeset/base/205471[205471]
+|March 22, 2010
+|9.0-CURRENT after the import of zlib 1.2.4.
+
+|900011
+|link:https://svnweb.freebsd.org/changeset/base/207410[207410]
+|April 24, 2010
+|9.0-CURRENT after adding soft-updates journalling.
+
+|900012
+|link:https://svnweb.freebsd.org/changeset/base/207842[207842]
+|May 10, 2010
+|9.0-CURRENT after adding liblzma, xz, xzdec, and lzmainfo.
+
+|900013
+|link:https://svnweb.freebsd.org/changeset/base/208486[208486]
+|May 24, 2010
+|9.0-CURRENT after bringing in USB fixes for man:linux[4].
+
+|900014
+|link:https://svnweb.freebsd.org/changeset/base/208973[208973]
+|June 10, 2010
+|9.0-CURRENT after adding Clang.
+
+|900015
+|link:https://svnweb.freebsd.org/changeset/base/210390[210390]
+|July 22, 2010
+|9.0-CURRENT after the import of BSD grep.
+
+|900016
+|link:https://svnweb.freebsd.org/changeset/base/210565[210565]
+|July 28, 2010
+|9.0-CURRENT after adding mti_zone to struct malloc_type_internal.
+
+|900017
+|link:https://svnweb.freebsd.org/changeset/base/211701[211701]
+|August 23, 2010
+|9.0-CURRENT after changing back default grep to GNU grep and adding WITH_BSD_GREP knob.
+
+|900018
+|link:https://svnweb.freebsd.org/changeset/base/211735[211735]
+|August 24, 2010
+|9.0-CURRENT after the man:pthread_kill[3] -generated signal is identified as SI_LWP in si_code. Previously, si_code was SI_USER.
+
+|900019
+|link:https://svnweb.freebsd.org/changeset/base/211937[211937]
+|August 28, 2010
+|9.0-CURRENT after addition of the MAP_PREFAULT_READ flag to man:mmap[2].
+
+|900020
+|link:https://svnweb.freebsd.org/changeset/base/212381[212381]
+|September 9, 2010
+|9.0-CURRENT after adding drain functionality to sbufs, which also changed the layout of struct sbuf.
+
+|900021
+|link:https://svnweb.freebsd.org/changeset/base/212568[212568]
+|September 13, 2010
+|9.0-CURRENT after DTrace has grown support for userland tracing.
+
+|900022
+|link:https://svnweb.freebsd.org/changeset/base/213395[213395]
+|October 2, 2010
+|9.0-CURRENT after addition of the BSDL man utilities and retirement of GNU/GPL man utilities.
+
+|900023
+|link:https://svnweb.freebsd.org/changeset/base/213700[213700]
+|October 11, 2010
+|9.0-CURRENT after updating xz to git 20101010 snapshot.
+
+|900024
+|link:https://svnweb.freebsd.org/changeset/base/215127[215127]
+|November 11, 2010
+|9.0-CURRENT after libgcc.a was replaced by libcompiler_rt.a.
+
+|900025
+|link:https://svnweb.freebsd.org/changeset/base/215166[215166]
+|November 12, 2010
+|9.0-CURRENT after the introduction of the modularised congestion control.
+
+|900026
+|link:https://svnweb.freebsd.org/changeset/base/216088[216088]
+|November 30, 2010
+|9.0-CURRENT after the introduction of Serial Management Protocol (SMP) passthrough and the XPT_SMP_IO and XPT_GDEV_ADVINFO CAM CCBs.
+
+|900027
+|link:https://svnweb.freebsd.org/changeset/base/216212[216212]
+|December 5, 2010
+|9.0-CURRENT after the addition of log2 to libm.
+
+|900028
+|link:https://svnweb.freebsd.org/changeset/base/216615[216615]
+|December 21, 2010
+|9.0-CURRENT after the addition of the Hhook (Helper Hook), Khelp (Kernel Helpers) and Object Specific Data (OSD) KPIs.
+
+|900029
+|link:https://svnweb.freebsd.org/changeset/base/216758[216758]
+|December 28, 2010
+|9.0-CURRENT after the modification of the TCP stack to allow Khelp modules to interact with it via helper hook points and store per-connection data in the TCP control block.
+
+|900030
+|link:https://svnweb.freebsd.org/changeset/base/217309[217309]
+|January 12, 2011
+|9.0-CURRENT after the update of libdialog to version 20100428.
+
+|900031
+|link:https://svnweb.freebsd.org/changeset/base/218414[218414]
+|February 7, 2011
+|9.0-CURRENT after the addition of man:pthread_getthreadid_np[3].
+
+|900032
+|link:https://svnweb.freebsd.org/changeset/base/218425[218425]
+|February 8, 2011
+|9.0-CURRENT after the removal of the uio_yield prototype and symbol.
+
+|900033
+|link:https://svnweb.freebsd.org/changeset/base/218822[218822]
+|February 18, 2011
+|9.0-CURRENT after the update of binutils to version 2.17.50.
+
+|900034
+|link:https://svnweb.freebsd.org/changeset/base/219406[219406]
+|March 8, 2011
+|9.0-CURRENT after the struct sysvec (sv_schedtail) changes.
+
+|900035
+|link:https://svnweb.freebsd.org/changeset/base/220150[220150]
+|March 29, 2011
+|9.0-CURRENT after the update of base gcc and libstdc++ to the last GPLv2 licensed revision.
+
+|900036
+|link:https://svnweb.freebsd.org/changeset/base/220770[220770]
+|April 18, 2011
+|9.0-CURRENT after the removal of libobjc and Objective-C support from the base system.
+
+|900037
+|link:https://svnweb.freebsd.org/changeset/base/221862[221862]
+|May 13, 2011
+|9.0-CURRENT after importing the man:libprocstat[3] library and man:fuser[1] utility to the base system.
+
+|900038
+|link:https://svnweb.freebsd.org/changeset/base/222167[222167]
+|May 22, 2011
+|9.0-CURRENT after adding a lock flag argument to man:VFS_FHTOVP[9].
+
+|900039
+|link:https://svnweb.freebsd.org/changeset/base/223637[223637]
+|June 28, 2011
+|9.0-CURRENT after importing pf from OpenBSD 4.5.
+
+|900040
+|link:https://svnweb.freebsd.org/changeset/base/224217[224217]
+|July 19, 2011
+|Increase default MAXCPU for FreeBSD to 64 on amd64 and ia64 and to 128 for XLP (mips).
+
+|900041
+|link:https://svnweb.freebsd.org/changeset/base/224834[224834]
+|August 13, 2011
+|9.0-CURRENT after the implementation of Capsicum capabilities; fget(9) gains a rights argument.
+
+|900042
+|link:https://svnweb.freebsd.org/changeset/base/225350[225350]
+|August 28, 2011
+|Bump shared libraries' version numbers for libraries whose ABI has changed in preparation for 9.0.
+
+|900043
+|link:https://svnweb.freebsd.org/changeset/base/225350[225350]
+|September 2, 2011
+|Add automatic detection of USB mass storage devices which do not support the no synchronize cache SCSI command.
+
+|900044
+|link:https://svnweb.freebsd.org/changeset/base/225469[225469]
+|September 10, 2011
+|Re-factor auto-quirk. 9.0-RELEASE.
+
+|900045
+|link:https://svnweb.freebsd.org/changeset/base/229285[229285]
+|January 2, 2012
+|9-STABLE after MFC of true/false from 1000002.
+
+|900500
+|link:https://svnweb.freebsd.org/changeset/base/229318[229318]
+|January 2, 2012
+|9.0-STABLE.
+
+|900501
+|link:https://svnweb.freebsd.org/changeset/base/229723[229723]
+|January 6, 2012
+|9.0-STABLE after merging of addition of the man:posix_fadvise[2] system call.
+
+|900502
+|link:https://svnweb.freebsd.org/changeset/base/230237[230237]
+|January 16, 2012
+|9.0-STABLE after merging gperf 3.0.3
+
+|900503
+|link:https://svnweb.freebsd.org/changeset/base/231768[231768]
+|February 15, 2012
+|9.0-STABLE after introduction of the new extensible man:sysctl[3] interface NET_RT_IFLISTL to query address lists.
+
+|900504
+|link:https://svnweb.freebsd.org/changeset/base/232728[232728]
+|March 3, 2012
+|9.0-STABLE after changes related to mounting of filesystem inside a jail.
+
+|900505
+|link:https://svnweb.freebsd.org/changeset/base/232945[232945]
+|March 13, 2012
+|9.0-STABLE after introduction of new man:tcp[4] socket options: TCP_KEEPINIT, TCP_KEEPIDLE, TCP_KEEPINTVL, and TCP_KEEPCNT.
+
+|900506
+|link:https://svnweb.freebsd.org/changeset/base/235786[235786]
+|May 22, 2012
+|9.0-STABLE after introduction of the `quick_exit` function and related changes required for C++11.
+
+|901000
+|link:https://svnweb.freebsd.org/changeset/base/239082[239082]
+|August 5, 2012
+|9.1-RELEASE.
+
+|901500
+|link:https://svnweb.freebsd.org/changeset/base/239081[239081]
+|August 6, 2012
+|9.1-STABLE after branching releng/9.1 (RELENG_9_1).
+
+|901501
+|link:https://svnweb.freebsd.org/changeset/base/240659[240659]
+|November 11, 2012
+|9.1-STABLE after man:LIST_PREV[3] added to queue.h (rev link:https://svnweb.freebsd.org/changeset/base/242893[242893]) and KBI change in USB serial devices.
+
+|901502
+|link:https://svnweb.freebsd.org/changeset/base/243656[243656]
+|November 28, 2012
+|9.1-STABLE after USB serial jitter buffer requires rebuild of USB serial device modules.
+
+|901503
+|link:https://svnweb.freebsd.org/changeset/base/247090[247090]
+|February 21, 2013
+|9.1-STABLE after USB moved to the driver structure requiring a rebuild of all USB modules. Also indicates the presence of nmtree.
+
+|901504
+|link:https://svnweb.freebsd.org/changeset/base/248338[248338]
+|March 15, 2013
+|9.1-STABLE after install gained -l, -M, -N and related flags and cat gained the -l option.
+
+|901505
+|link:https://svnweb.freebsd.org/changeset/base/251687[251687]
+|June 13, 2013
+|9.1-STABLE after fixes in ctfmerge bootstrapping (rev link:https://svnweb.freebsd.org/changeset/base/249243[249243]).
+
+|902001
+|link:https://svnweb.freebsd.org/changeset/base/253912[253912]
+|August 3, 2013
+|`releng/9.2` branched from `stable/9`.
+
+|902501
+|link:https://svnweb.freebsd.org/changeset/base/253913[253913]
+|August 2, 2013
+|9.2-STABLE after creation of `releng/9.2` branch.
+
+|902502
+|link:https://svnweb.freebsd.org/changeset/base/254938[254938]
+|August 26, 2013
+|9.2-STABLE after inclusion of the `PIM_RESCAN` CAM path inquiry flag.
+
+|902503
+|link:https://svnweb.freebsd.org/changeset/base/254979[254979]
+|August 27, 2013
+|9.2-STABLE after inclusion of the `SI_UNMAPPED` cdev flag.
+
+|902504
+|link:https://svnweb.freebsd.org/changeset/base/256917[256917]
+|October 22, 2013
+|9.2-STABLE after inclusion of support for "first boot" man:rc[8] scripts.
+
+|902505
+|link:https://svnweb.freebsd.org/changeset/base/259448[259448]
+|December 12, 2013
+|9.2-STABLE after Heimdal encoding fix.
+
+|902506
+|link:https://svnweb.freebsd.org/changeset/base/260136[260136]
+|December 31, 2013
+|9-STABLE after MAP_STACK fixes (rev link:https://svnweb.freebsd.org/changeset/base/260082[260082]).
+
+|902507
+|link:https://svnweb.freebsd.org/changeset/base/262801[262801]
+|March 5, 2014
+|9-STABLE after upgrade of libc++ to 3.4 release.
+
+|902508
+|link:https://svnweb.freebsd.org/changeset/base/263171[263171]
+|March 14, 2014
+|9-STABLE after merge of the Radeon KMS driver (rev link:https://svnweb.freebsd.org/changeset/base/263170[263170]).
+
+|902509
+|link:https://svnweb.freebsd.org/changeset/base/263509[263509]
+|March 21, 2014
+|9-STABLE after upgrade of llvm/clang to 3.4 release.
+
+|902510
+|link:https://svnweb.freebsd.org/changeset/base/263818[263818]
+|March 27, 2014
+|9-STABLE after merge of the man:vt[4] driver.
+
+|902511
+|link:https://svnweb.freebsd.org/changeset/base/264289[264289]
+|March 27, 2014
+|9-STABLE after FreeBSD-SA-14:06.openssl.
+
+|902512
+|link:https://svnweb.freebsd.org/changeset/base/265123[265123]
+|April 30, 2014
+|9-STABLE after FreeBSD-SA-14:08.tcp.
+
+|903000
+|link:https://svnweb.freebsd.org/changeset/base/267656[267656]
+|June 20, 2014
+|9-RC1 `releng/9.3` branch.
+
+|903500
+|link:https://svnweb.freebsd.org/changeset/base/267657[267657]
+|June 20, 2014
+|9.3-STABLE `releng/9.3` branch.
+
+|903501
+|link:https://svnweb.freebsd.org/changeset/base/268443[268443]
+|July 8, 2014
+|9-STABLE after FreeBSD-SA-14:17.kmem (rev link:https://svnweb.freebsd.org/changeset/base/268433[268433]).
+
+|903502
+|link:https://svnweb.freebsd.org/changeset/base/270175[270175]
+|August 19, 2014
+|9-STABLE after `SOCK_DGRAM` bug fix (rev link:https://svnweb.freebsd.org/changeset/base/269789[269789]).
+
+|903503
+|link:https://svnweb.freebsd.org/changeset/base/271341[271341]
+|September 9, 2014
+|9-STABLE after FreeBSD-SA-14:18 (rev link:https://svnweb.freebsd.org/changeset/base/269687[269687]).
+
+|903504
+|link:https://svnweb.freebsd.org/changeset/base/271686[271686]
+|September 16, 2014
+|9-STABLE after FreeBSD-SA-14:19 (rev link:https://svnweb.freebsd.org/changeset/base/271668[271668]).
+
+|903505
+|link:https://svnweb.freebsd.org/changeset/base/273432[273432]
+|October 21, 2014
+|9-STABLE after FreeBSD-SA-14:20, FreeBSD-SA-14:21, and FreeBSD-SA-14:22 (rev link:https://svnweb.freebsd.org/changeset/base/273412[273412]).
+
+|903506
+|link:https://svnweb.freebsd.org/changeset/base/274162[274162]
+|November 4, 2014
+|9-STABLE after FreeBSD-SA-14:23, FreeBSD-SA-14:24, and FreeBSD-SA-14:25.
+
+|903507
+|link:https://svnweb.freebsd.org/changeset/base/275742[275742]
+|December 13, 2014
+|9-STABLE after merging an important fix to the LLVM vectorizer, which could lead to buffer overruns in some cases.
+
+|903508
+|link:https://svnweb.freebsd.org/changeset/base/279287[279287]
+|February 25, 2015
+|9-STABLE after FreeBSD-EN-15:01.vt, FreeBSD-EN-15:02.openssl, FreeBSD-EN-15:03.freebsd-update, FreeBSD-SA-15:04.igmp, and FreeBSD-SA-15:05.bind.
+
+|903509
+|link:https://svnweb.freebsd.org/changeset/base/296219[296219]
+|February 29, 2016
+|9-STABLE after bumping the default value of `compat.linux.osrelease` to `2.6.18` to support the linux-c6-* ports out of the box.
+
+|903510
+|link:https://svnweb.freebsd.org/changeset/base/300236[300236]
+|May 19, 2016
+|9-STABLE after System Binary Interface (SBI) page was moved in latest version of Berkeley Boot Loader (BBL) due to code size increase in link:https://svnweb.freebsd.org/changeset/base/300234[300234].
+
+|903511
+|link:https://svnweb.freebsd.org/changeset/base/305735[305735]
+|September 12, 2016
+|9-STABLE after resolving a deadlock between `device_detach()` and man:usbd_do_request_flags[9].
+|===
+
+[[versions-8]]
+== FreeBSD 8 Versions
+
+[[freebsd-versions-table-8]]
+.FreeBSD 8 `__FreeBSD_version` Values
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Value
+| Revision
+| Date
+| Release
+
+|800000
+|link:https://svnweb.freebsd.org/changeset/base/172531[172531]
+|October 11, 2007
+|8.0-CURRENT. Separating wide and single byte ctype.
+
+|800001
+|link:https://svnweb.freebsd.org/changeset/base/172688[172688]
+|October 16, 2007
+|8.0-CURRENT after libpcap 0.9.8 and tcpdump 3.9.8 import.
+
+|800002
+|link:https://svnweb.freebsd.org/changeset/base/172841[172841]
+|October 21, 2007
+|8.0-CURRENT after renaming man:kthread_create[9] and friends to man:kproc_create[9] etc.
+
+|800003
+|link:https://svnweb.freebsd.org/changeset/base/172932[172932]
+|October 24, 2007
+|8.0-CURRENT after ABI backwards compatibility to the FreeBSD 4/5/6 versions of the PCIOCGETCONF, PCIOCREAD and PCIOCWRITE IOCTLs was added, which required the ABI of the PCIOCGETCONF IOCTL to be broken again
+
+|800004
+|link:https://svnweb.freebsd.org/changeset/base/173573[173573]
+|November 12, 2007
+|8.0-CURRENT after man:agp[4] driver moved from src/sys/pci to src/sys/dev/agp
+
+|800005
+|link:https://svnweb.freebsd.org/changeset/base/174261[174261]
+|December 4, 2007
+|8.0-CURRENT after changes to the jumbo frame allocator (rev link:https://svnweb.freebsd.org/changeset/base/174247[174247]).
+
+|800006
+|link:https://svnweb.freebsd.org/changeset/base/174399[174399]
+|December 7, 2007
+|8.0-CURRENT after the addition of callgraph capture functionality to man:hwpmc[4].
+
+|800007
+|link:https://svnweb.freebsd.org/changeset/base/174901[174901]
+|December 25, 2007
+|8.0-CURRENT after `kdb_enter()` gains a "why" argument.
+
+|800008
+|link:https://svnweb.freebsd.org/changeset/base/174951[174951]
+|December 28, 2007
+|8.0-CURRENT after LK_EXCLUPGRADE option removal.
+
+|800009
+|link:https://svnweb.freebsd.org/changeset/base/175168[175168]
+|January 9, 2008
+|8.0-CURRENT after introduction of man:lockmgr_disown[9]
+
+|800010
+|link:https://svnweb.freebsd.org/changeset/base/175204[175204]
+|January 10, 2008
+|8.0-CURRENT after the man:vn_lock[9] prototype change.
+
+|800011
+|link:https://svnweb.freebsd.org/changeset/base/175295[175295]
+|January 13, 2008
+|8.0-CURRENT after the man:VOP_LOCK[9] and man:VOP_UNLOCK[9] prototype changes.
+
+|800012
+|link:https://svnweb.freebsd.org/changeset/base/175487[175487]
+|January 19, 2008
+|8.0-CURRENT after introduction of man:lockmgr_recursed[9], man:BUF_RECURSED[9] and man:BUF_ISLOCKED[9] and the removal of `BUF_REFCNT()`.
+
+|800013
+|link:https://svnweb.freebsd.org/changeset/base/175581[175581]
+|January 23, 2008
+|8.0-CURRENT after introduction of the "ASCII" encoding.
+
+|800014
+|link:https://svnweb.freebsd.org/changeset/base/175636[175636]
+|January 24, 2008
+|8.0-CURRENT after changing the prototype of man:lockmgr[9] and removal of `lockcount()` and `LOCKMGR_ASSERT()`.
+
+|800015
+|link:https://svnweb.freebsd.org/changeset/base/175688[175688]
+|January 26, 2008
+|8.0-CURRENT after extending the types of the man:fts[3] structures.
+
+|800016
+|link:https://svnweb.freebsd.org/changeset/base/175872[175872]
+|February 1, 2008
+|8.0-CURRENT after adding an argument to man:MEXTADD[9]
+
+|800017
+|link:https://svnweb.freebsd.org/changeset/base/176015[176015]
+|February 6, 2008
+|8.0-CURRENT after the introduction of LK_NODUP and LK_NOWITNESS options in the man:lockmgr[9] space.
+
+|800018
+|link:https://svnweb.freebsd.org/changeset/base/176112[176112]
+|February 8, 2008
+|8.0-CURRENT after the addition of m_collapse.
+
+|800019
+|link:https://svnweb.freebsd.org/changeset/base/176124[176124]
+|February 9, 2008
+|8.0-CURRENT after the addition of current working directory, root directory, and jail directory support to the kern.proc.filedesc sysctl.
+
+|800020
+|link:https://svnweb.freebsd.org/changeset/base/176251[176251]
+|February 13, 2008
+|8.0-CURRENT after introduction of man:lockmgr_assert[9] and `BUF_ASSERT` functions.
+
+|800021
+|link:https://svnweb.freebsd.org/changeset/base/176321[176321]
+|February 15, 2008
+|8.0-CURRENT after introduction of man:lockmgr_args[9] and LK_INTERNAL flag removal.
+
+|800022
+|link:https://svnweb.freebsd.org/changeset/base/176556[176556]
+|(backed out)
+|8.0-CURRENT after changing the default system ar to BSD man:ar[1].
+
+|800023
+|link:https://svnweb.freebsd.org/changeset/base/176560[176560]
+|February 25, 2008
+|8.0-CURRENT after changing the prototypes of man:lockstatus[9] and man:VOP_ISLOCKED[9];, more specifically retiring the `struct thread` argument.
+
+|800024
+|link:https://svnweb.freebsd.org/changeset/base/176709[176709]
+|March 1, 2008
+|8.0-CURRENT after axing out the `lockwaiters` and `BUF_LOCKWAITERS` functions, changing the return value of `brelvp` from void to int and introducing new flags for man:lockinit[9].
+
+|800025
+|link:https://svnweb.freebsd.org/changeset/base/176958[176958]
+|March 8, 2008
+|8.0-CURRENT after adding F_DUP2FD command to man:fcntl[2].
+
+|800026
+|link:https://svnweb.freebsd.org/changeset/base/177086[177086]
+|March 12, 2008
+|8.0-CURRENT after changing the priority parameter to cv_broadcastpri such that 0 means no priority.
+
+|800027
+|link:https://svnweb.freebsd.org/changeset/base/177551[177551]
+|March 24, 2008
+|8.0-CURRENT after changing the bpf monitoring ABI when zerocopy bpf buffers were added.
+
+|800028
+|link:https://svnweb.freebsd.org/changeset/base/177637[177637]
+|March 26, 2008
+|8.0-CURRENT after adding l_sysid to struct flock.
+
+|800029
+|link:https://svnweb.freebsd.org/changeset/base/177688[177688]
+|March 28, 2008
+|8.0-CURRENT after reintegration of the `BUF_LOCKWAITERS` function and the addition of man:lockmgr_waiters[9].
+
+|800030
+|link:https://svnweb.freebsd.org/changeset/base/177844[177844]
+|April 1, 2008
+|8.0-CURRENT after the introduction of the man:rw_try_rlock[9] and man:rw_try_wlock[9] functions.
+
+|800031
+|link:https://svnweb.freebsd.org/changeset/base/177958[177958]
+|April 6, 2008
+|8.0-CURRENT after the introduction of the `lockmgr_rw` and `lockmgr_args_rw` functions.
+
+|800032
+|link:https://svnweb.freebsd.org/changeset/base/178006[178006]
+|April 8, 2008
+|8.0-CURRENT after the implementation of the openat and related syscalls, introduction of the O_EXEC flag for the man:open[2], and providing the corresponding linux compatibility syscalls.
+
+|800033
+|link:https://svnweb.freebsd.org/changeset/base/178017[178017]
+|April 8, 2008
+|8.0-CURRENT after added man:write[2] support for man:psm[4] in native operation level. Now arbitrary commands can be written to [.filename]#/dev/psm%d# and status can be read back from it.
+
+|800034
+|link:https://svnweb.freebsd.org/changeset/base/178051[178051]
+|April 10, 2008
+|8.0-CURRENT after introduction of the `memrchr` function.
+
+|800035
+|link:https://svnweb.freebsd.org/changeset/base/178256[178256]
+|April 16, 2008
+|8.0-CURRENT after introduction of the `fdopendir` function.
+
+|800036
+|link:https://svnweb.freebsd.org/changeset/base/178362[178362]
+|April 20, 2008
+|8.0-CURRENT after switchover of 802.11 wireless to multi-bss support (aka vaps).
+
+|800037
+|link:https://svnweb.freebsd.org/changeset/base/178892[178892]
+|May 9, 2008
+|8.0-CURRENT after addition of multi routing table support (aka man:setfib[1], man:setfib[2]).
+
+|800038
+|link:https://svnweb.freebsd.org/changeset/base/179316[179316]
+|May 26, 2008
+|8.0-CURRENT after removal of netatm and ISDN4BSD. Also, the addition of the Compact C Type (CTF) tools.
+
+|800039
+|link:https://svnweb.freebsd.org/changeset/base/179784[179784]
+|June 14, 2008
+|8.0-CURRENT after removal of sgtty.
+
+|800040
+|link:https://svnweb.freebsd.org/changeset/base/180025[180025]
+|June 26, 2008
+|8.0-CURRENT with kernel NFS lockd client.
+
+|800041
+|link:https://svnweb.freebsd.org/changeset/base/180691[180691]
+|July 22, 2008
+|8.0-CURRENT after addition of man:arc4random_buf[3] and man:arc4random_uniform[3].
+
+|800042
+|link:https://svnweb.freebsd.org/changeset/base/181439[181439]
+|August 8, 2008
+|8.0-CURRENT after addition of man:cpuctl[4].
+
+|800043
+|link:https://svnweb.freebsd.org/changeset/base/181694[181694]
+|August 13, 2008
+|8.0-CURRENT after changing man:bpf[4] to use a single device node, instead of device cloning.
+
+|800044
+|link:https://svnweb.freebsd.org/changeset/base/181803[181803]
+|August 17, 2008
+|8.0-CURRENT after the commit of the first step of the vimage project renaming global variables to be virtualized with a V_ prefix with macros to map them back to their global names.
+
+|800045
+|link:https://svnweb.freebsd.org/changeset/base/181905[181905]
+|August 20, 2008
+|8.0-CURRENT after the integration of the MPSAFE TTY layer, including changes to various drivers and utilities that interact with it.
+
+|800046
+|link:https://svnweb.freebsd.org/changeset/base/182869[182869]
+|September 8, 2008
+|8.0-CURRENT after the separation of the GDT per CPU on amd64 architecture.
+
+|800047
+|link:https://svnweb.freebsd.org/changeset/base/182905[182905]
+|September 10, 2008
+|8.0-CURRENT after removal of VSVTX, VSGID and VSUID.
+
+|800048
+|link:https://svnweb.freebsd.org/changeset/base/183091[183091]
+|September 16, 2008
+|8.0-CURRENT after converting the kernel NFS mount code to accept individual mount options in the man:nmount[2] iovec, not just one big struct nfs_args.
+
+|800049
+|link:https://svnweb.freebsd.org/changeset/base/183114[183114]
+|September 17, 2008
+|8.0-CURRENT after the removal of man:suser[9] and man:suser_cred[9].
+
+|800050
+|link:https://svnweb.freebsd.org/changeset/base/184099[184099]
+|October 20, 2008
+|8.0-CURRENT after buffer cache API change.
+
+|800051
+|link:https://svnweb.freebsd.org/changeset/base/184205[184205]
+|October 23, 2008
+|8.0-CURRENT after the removal of the man:MALLOC[9] and man:FREE[9] macros.
+
+|800052
+|link:https://svnweb.freebsd.org/changeset/base/184419[184419]
+|October 28, 2008
+|8.0-CURRENT after the introduction of accmode_t and renaming of VOP_ACCESS 'a_mode' argument to 'a_accmode'.
+
+|800053
+|link:https://svnweb.freebsd.org/changeset/base/184555[184555]
+|November 2, 2008
+|8.0-CURRENT after the prototype change of man:vfs_busy[9] and the introduction of its MBF_NOWAIT and MBF_MNTLSTLOCK flags.
+
+|800054
+|link:https://svnweb.freebsd.org/changeset/base/185162[185162]
+|November 22, 2008
+|8.0-CURRENT after the addition of buf_ring, memory barriers and ifnet functions to facilitate multiple hardware transmit queues for cards that support them, and a lockless ring-buffer implementation to enable drivers to more efficiently manage queuing of packets.
+
+|800055
+|link:https://svnweb.freebsd.org/changeset/base/185363[185363]
+|November 27, 2008
+|8.0-CURRENT after the addition of Intel(TM) Core, Core2, and Atom support to man:hwpmc[4].
+
+|800056
+|link:https://svnweb.freebsd.org/changeset/base/185435[185435]
+|November 29, 2008
+|8.0-CURRENT after the introduction of multi-/no-IPv4/v6 jails.
+
+|800057
+|link:https://svnweb.freebsd.org/changeset/base/185522[185522]
+|December 1, 2008
+|8.0-CURRENT after the switch to the ath hal source code.
+
+|800058
+|link:https://svnweb.freebsd.org/changeset/base/185968[185968]
+|December 12, 2008
+|8.0-CURRENT after the introduction of the VOP_VPTOCNP operation.
+
+|800059
+|link:https://svnweb.freebsd.org/changeset/base/186119[186119]
+|December 15, 2008
+|8.0-CURRENT incorporates the new arp-v2 rewrite.
+
+|800060
+|link:https://svnweb.freebsd.org/changeset/base/186344[186344]
+|December 19, 2008
+|8.0-CURRENT after the addition of makefs.
+
+|800061
+|link:https://svnweb.freebsd.org/changeset/base/187289[187289]
+|January 15, 2009
+|8.0-CURRENT after TCP Appropriate Byte Counting.
+
+|800062
+|link:https://svnweb.freebsd.org/changeset/base/187830[187830]
+|January 28, 2009
+|8.0-CURRENT after removal of minor(), minor2unit(), unit2minor(), etc.
+
+|800063
+|link:https://svnweb.freebsd.org/changeset/base/188745[188745]
+|February 18, 2009
+|8.0-CURRENT after GENERIC config change to use the USB2 stack, but also the addition of man:fdevname[3].
+
+|800064
+|link:https://svnweb.freebsd.org/changeset/base/188946[188946]
+|February 23, 2009
+|8.0-CURRENT after the USB2 stack is moved to and replaces dev/usb.
+
+|800065
+|link:https://svnweb.freebsd.org/changeset/base/189092[189092]
+|February 26, 2009
+|8.0-CURRENT after the renaming of all functions in man:libmp[3].
+
+|800066
+|link:https://svnweb.freebsd.org/changeset/base/189110[189110]
+|February 27, 2009
+|8.0-CURRENT after changing USB devfs handling and layout.
+
+|800067
+|link:https://svnweb.freebsd.org/changeset/base/189136[189136]
+|February 28, 2009
+|8.0-CURRENT after adding getdelim(), getline(), stpncpy(), strnlen(), wcsnlen(), wcscasecmp(), and wcsncasecmp().
+
+|800068
+|link:https://svnweb.freebsd.org/changeset/base/189276[189276]
+|March 2, 2009
+|8.0-CURRENT after renaming the ushub devclass to uhub.
+
+|800069
+|link:https://svnweb.freebsd.org/changeset/base/189585[189585]
+|March 9, 2009
+|8.0-CURRENT after libusb20.so.1 was renamed to libusb.so.1.
+
+|800070
+|link:https://svnweb.freebsd.org/changeset/base/189592[189592]
+|March 9, 2009
+|8.0-CURRENT after merging IGMPv3 and Source-Specific Multicast (SSM) to the IPv4 stack.
+
+|800071
+|link:https://svnweb.freebsd.org/changeset/base/189825[189825]
+|March 14, 2009
+|8.0-CURRENT after gcc was patched to use C99 inline semantics in c99 and gnu99 mode.
+
+|800072
+|link:https://svnweb.freebsd.org/changeset/base/189853[189853]
+|March 15, 2009
+|8.0-CURRENT after the IFF_NEEDSGIANT flag has been removed; non-MPSAFE network device drivers are no longer supported.
+
+|800073
+|link:https://svnweb.freebsd.org/changeset/base/190265[190265]
+|March 18, 2009
+|8.0-CURRENT after the dynamic string token substitution has been implemented for rpath and needed paths.
+
+|800074
+|link:https://svnweb.freebsd.org/changeset/base/190373[190373]
+|March 24, 2009
+|8.0-CURRENT after tcpdump 4.0.0 and libpcap 1.0.0 import.
+
+|800075
+|link:https://svnweb.freebsd.org/changeset/base/190787[190787]
+|April 6, 2009
+|8.0-CURRENT after layout of structs vnet_net, vnet_inet and vnet_ipfw has been changed.
+
+|800076
+|link:https://svnweb.freebsd.org/changeset/base/190866[190866]
+|April 9, 2009
+|8.0-CURRENT after adding delay profiles in dummynet.
+
+|800077
+|link:https://svnweb.freebsd.org/changeset/base/190914[190914]
+|April 14, 2009
+|8.0-CURRENT after removing VOP_LEASE() and vop_vector.vop_lease.
+
+|800078
+|link:https://svnweb.freebsd.org/changeset/base/191080[191080]
+|April 15, 2009
+|8.0-CURRENT after struct rt_weight fields have been added to struct rt_metrics and struct rt_metrics_lite, changing the layout of struct rt_metrics_lite. A bump to RTM_VERSION was made, but backed out.
+
+|800079
+|link:https://svnweb.freebsd.org/changeset/base/191117[191117]
+|April 15, 2009
+|8.0-CURRENT after struct llentry pointers are added to struct route and struct route_in6.
+
+|800080
+|link:https://svnweb.freebsd.org/changeset/base/191126[191126]
+|April 15, 2009
+|8.0-CURRENT after layout of struct inpcb has been changed.
+
+|800081
+|link:https://svnweb.freebsd.org/changeset/base/191267[191267]
+|April 19, 2009
+|8.0-CURRENT after the layout of struct malloc_type has been changed.
+
+|800082
+|link:https://svnweb.freebsd.org/changeset/base/191368[191368]
+|April 21, 2009
+|8.0-CURRENT after the layout of struct ifnet has changed, and with if_ref() and if_rele() ifnet refcounting.
+
+|800083
+|link:https://svnweb.freebsd.org/changeset/base/191389[191389]
+|April 22, 2009
+|8.0-CURRENT after the implementation of a low-level Bluetooth HCI API.
+
+|800084
+|link:https://svnweb.freebsd.org/changeset/base/191672[191672]
+|April 29, 2009
+|8.0-CURRENT after IPv6 SSM and MLDv2 changes.
+
+|800085
+|link:https://svnweb.freebsd.org/changeset/base/191688[191688]
+|April 30, 2009
+|8.0-CURRENT after enabling support for VIMAGE kernel builds with one active image.
+
+|800086
+|link:https://svnweb.freebsd.org/changeset/base/191910[191910]
+|May 8, 2009
+|8.0-CURRENT after adding support for input lines of arbitrarily length in man:patch[1].
+
+|800087
+|link:https://svnweb.freebsd.org/changeset/base/191990[191990]
+|May 11, 2009
+|8.0-CURRENT after some VFS KPI changes. The thread argument has been removed from the FSD parts of the VFS. `VFS_*` functions do not need the context any more because it always refers to `curthread`. In some special cases, the old behavior is retained.
+
+|800088
+|link:https://svnweb.freebsd.org/changeset/base/192470[192470]
+|May 20, 2009
+|8.0-CURRENT after net80211 monitor mode changes.
+
+|800089
+|link:https://svnweb.freebsd.org/changeset/base/192649[192649]
+|May 23, 2009
+|8.0-CURRENT after adding UDP control block support.
+
+|800090
+|link:https://svnweb.freebsd.org/changeset/base/192669[192669]
+|May 23, 2009
+|8.0-CURRENT after virtualizing interface cloning.
+
+|800091
+|link:https://svnweb.freebsd.org/changeset/base/192895[192895]
+|May 27, 2009
+|8.0-CURRENT after adding hierarchical jails and removing global securelevel.
+
+|800092
+|link:https://svnweb.freebsd.org/changeset/base/193011[193011]
+|May 29, 2009
+|8.0-CURRENT after changing `sx_init_flags()` KPI. The `SX_ADAPTIVESPIN` is retired and a new `SX_NOADAPTIVE` flag is introduced to handle the reversed logic.
+
+|800093
+|link:https://svnweb.freebsd.org/changeset/base/193047[193047]
+|May 29, 2009
+|8.0-CURRENT after adding mnt_xflag to struct mount.
+
+|800094
+|link:https://svnweb.freebsd.org/changeset/base/193093[193093]
+|May 30, 2009
+|8.0-CURRENT after adding man:VOP_ACCESSX[9].
+
+|800095
+|link:https://svnweb.freebsd.org/changeset/base/193096[193096]
+|May 30, 2009
+|8.0-CURRENT after changing the polling KPI. The polling handlers now return the number of packets processed. A new `IFCAP_POLLING_NOCOUNT` is also introduced to specify that the return value is not significant and the counting should be skipped.
+
+|800096
+|link:https://svnweb.freebsd.org/changeset/base/193219[193219]
+|June 1, 2009
+|8.0-CURRENT after updating to the new netisr implementation and after changing the way we store and access FIBs.
+
+|800097
+|link:https://svnweb.freebsd.org/changeset/base/193731[193731]
+|June 8, 2009
+|8.0-CURRENT after the introduction of vnet destructor hooks and infrastructure.
+
+|(not changed)
+|link:https://svnweb.freebsd.org/changeset/base/194012[194012]
+|June 11, 2009
+|8.0-CURRENT after the introduction of netgraph outbound to inbound path call detection and queuing, which also changed the layout of struct thread.
+
+|800098
+|link:https://svnweb.freebsd.org/changeset/base/194210[194210]
+|June 14, 2009
+|8.0-CURRENT after OpenSSL 0.9.8k import.
+
+|800099
+|link:https://svnweb.freebsd.org/changeset/base/194675[194675]
+|June 22, 2009
+|8.0-CURRENT after NGROUPS update and moving route virtualization into its own VImage module.
+
+|800100
+|link:https://svnweb.freebsd.org/changeset/base/194920[194920]
+|June 24, 2009
+|8.0-CURRENT after SYSVIPC ABI change.
+
+|800101
+|link:https://svnweb.freebsd.org/changeset/base/195175[195175]
+|June 29, 2009
+|8.0-CURRENT after the removal of the /dev/net/* per-interface character devices.
+
+|800102
+|link:https://svnweb.freebsd.org/changeset/base/195634[195634]
+|July 12, 2009
+|8.0-CURRENT after padding was added to struct sackhint, struct tcpcb, and struct tcpstat.
+
+|800103
+|link:https://svnweb.freebsd.org/changeset/base/195654[195654]
+|July 13, 2009
+|8.0-CURRENT after replacing struct tcpopt with struct toeopt in the TOE driver interface to the TCP syncache.
+
+|800104
+|link:https://svnweb.freebsd.org/changeset/base/195699[195699]
+|July 14, 2009
+|8.0-CURRENT after the addition of the linker-set based per-vnet allocator.
+
+|800105
+|link:https://svnweb.freebsd.org/changeset/base/195767[195767]
+|July 19, 2009
+|8.0-CURRENT after version bump for all shared libraries that do not have symbol versioning turned on.
+
+|800106
+|link:https://svnweb.freebsd.org/changeset/base/195852[195852]
+|July 24, 2009
+|8.0-CURRENT after introduction of OBJT_SG VM object type.
+
+|800107
+|link:https://svnweb.freebsd.org/changeset/base/196037[196037]
+|August 2, 2009
+|8.0-CURRENT after making the newbus subsystem Giant free by adding the newbus sxlock and 8.0-RELEASE.
+
+|800108
+|link:https://svnweb.freebsd.org/changeset/base/199627[199627]
+|November 21, 2009
+|8.0-STABLE after implementing EVFILT_USER kevent filter.
+
+|800500
+|link:https://svnweb.freebsd.org/changeset/base/201749[201749]
+|January 7, 2010
+|8.0-STABLE after `__FreeBSD_version` bump to make `pkg_add -r` use packages-8-stable.
+
+|800501
+|link:https://svnweb.freebsd.org/changeset/base/202922[202922]
+|January 24, 2010
+|8.0-STABLE after change of the man:scandir[3] and man:alphasort[3] prototypes to conform to SUSv4.
+
+|800502
+|link:https://svnweb.freebsd.org/changeset/base/203299[203299]
+|January 31, 2010
+|8.0-STABLE after addition of man:sigpause[2].
+
+|800503
+|link:https://svnweb.freebsd.org/changeset/base/204344[204344]
+|February 25, 2010
+|8.0-STABLE after addition of SIOCGIFDESCR and SIOCSIFDESCR ioctls to network interfaces. These ioctl can be used to manipulate interface description, as inspired by OpenBSD.
+
+|800504
+|link:https://svnweb.freebsd.org/changeset/base/204546[204546]
+|March 1, 2010
+|8.0-STABLE after MFC of importing x86emu, a software emulator for real mode x86 CPU from OpenBSD.
+
+|800505
+|link:https://svnweb.freebsd.org/changeset/base/208259[208259]
+|May 18, 2010
+|8.0-STABLE after MFC of adding liblzma, xz, xzdec, and lzmainfo.
+
+|801000
+|link:https://svnweb.freebsd.org/changeset/base/209150[209150]
+|June 14, 2010
+|8.1-RELEASE
+
+|801500
+|link:https://svnweb.freebsd.org/changeset/base/209146[209146]
+|June 14, 2010
+|8.1-STABLE after 8.1-RELEASE.
+
+|801501
+|link:https://svnweb.freebsd.org/changeset/base/214762[214762]
+|November 3, 2010
+|8.1-STABLE after KBI change in struct sysentvec, and implementation of PL_FLAG_SCE/SCX/EXEC/SI and pl_siginfo for ptrace(PT_LWPINFO) .
+
+|802000
+|link:https://svnweb.freebsd.org/changeset/base/216639[216639]
+|December 22, 2010
+|8.2-RELEASE
+
+|802500
+|link:https://svnweb.freebsd.org/changeset/base/216654[216654]
+|December 22, 2010
+|8.2-STABLE after 8.2-RELEASE.
+
+|802501
+|link:https://svnweb.freebsd.org/changeset/base/219107[219107]
+|February 28, 2011
+|8.2-STABLE after merging DTrace changes, including support for userland tracing.
+
+|802502
+|link:https://svnweb.freebsd.org/changeset/base/219324[219324]
+|March 6, 2011
+|8.2-STABLE after merging log2 and log2f into libm.
+
+|802503
+|link:https://svnweb.freebsd.org/changeset/base/221275[221275]
+|May 1, 2011
+|8.2-STABLE after upgrade of the gcc to the last GPLv2 version from the FSF gcc-4_2-branch.
+
+|802504
+|link:https://svnweb.freebsd.org/changeset/base/222401[222401]
+|May 28, 2011
+|8.2-STABLE after introduction of the KPI and supporting infrastructure for modular congestion control.
+
+|802505
+|link:https://svnweb.freebsd.org/changeset/base/222406[222406]
+|May 28, 2011
+|8.2-STABLE after introduction of Hhook and Khelp KPIs.
+
+|802506
+|link:https://svnweb.freebsd.org/changeset/base/222408[222408]
+|May 28, 2011
+|8.2-STABLE after addition of OSD to struct tcpcb.
+
+|802507
+|link:https://svnweb.freebsd.org/changeset/base/222741[222741]
+|June 6, 2011
+|8.2-STABLE after ZFS v28 import.
+
+|802508
+|link:https://svnweb.freebsd.org/changeset/base/222846[222846]
+|June 8, 2011
+|8.2-STABLE after removal of the schedtail event handler and addition of the sv_schedtail method to struct sysvec.
+
+|802509
+|link:https://svnweb.freebsd.org/changeset/base/224017[224017]
+|July 14, 2011
+|8.2-STABLE after merging the SSSE3 support into binutils.
+
+|802510
+|link:https://svnweb.freebsd.org/changeset/base/224214[224214]
+|July 19, 2011
+|8.2-STABLE after addition of RFTSIGZMB flag for man:rfork[2].
+
+|802511
+|link:https://svnweb.freebsd.org/changeset/base/225458[225458]
+|September 9, 2011
+|8.2-STABLE after addition of automatic detection of USB mass storage devices which do not support the no synchronize cache SCSI command.
+
+|802512
+|link:https://svnweb.freebsd.org/changeset/base/225470[225470]
+|September 10, 2011
+|8.2-STABLE after merging of re-factoring of auto-quirk.
+
+|802513
+|link:https://svnweb.freebsd.org/changeset/base/226763[226763]
+|October 25, 2011
+|8.2-STABLE after merging of the MAP_PREFAULT_READ flag to man:mmap[2].
+
+|802514
+|link:https://svnweb.freebsd.org/changeset/base/227573[227573]
+|November 16, 2011
+|8.2-STABLE after merging of addition of man:posix_fallocate[2] syscall.
+
+|802515
+|link:https://svnweb.freebsd.org/changeset/base/229725[229725]
+|January 6, 2012
+|8.2-STABLE after merging of addition of the man:posix_fadvise[2] system call.
+
+|802516
+|link:https://svnweb.freebsd.org/changeset/base/230239[230239]
+|January 16, 2012
+|8.2-STABLE after merging gperf 3.0.3
+
+|802517
+|link:https://svnweb.freebsd.org/changeset/base/231769[231769]
+|February 15, 2012
+|8.2-STABLE after introduction of the new extensible man:sysctl[3] interface NET_RT_IFLISTL to query address lists.
+
+|803000
+|link:https://svnweb.freebsd.org/changeset/base/232446[232446]
+|March 3, 2012
+|8.3-RELEASE.
+
+|803500
+|link:https://svnweb.freebsd.org/changeset/base/232439[232439]
+|March 3, 2012
+|8.3-STABLE after branching releng/8.3 (RELENG_8_3).
+
+|803501
+|link:https://svnweb.freebsd.org/changeset/base/247091[247091]
+|February 21, 2013
+|8.3-STABLE after MFC of two USB fixes (rev link:https://svnweb.freebsd.org/changeset/base/246616[246616] and link:https://svnweb.freebsd.org/changeset/base/246759[246759]).
+
+|804000
+|link:https://svnweb.freebsd.org/changeset/base/248850[248850]
+|March 28, 2013
+|8.4-RELEASE.
+
+|804500
+|link:https://svnweb.freebsd.org/changeset/base/248819[248819]
+|March 28, 2013
+|8.4-STABLE after 8.4-RELEASE.
+
+|804501
+|link:https://svnweb.freebsd.org/changeset/base/259449[259449]
+|December 16, 2013
+|8.4-STABLE after MFC of upstream Heimdal encoding fix.
+
+|804502
+|link:https://svnweb.freebsd.org/changeset/base/265123[265123]
+|April 30, 2014
+|8.4-STABLE after FreeBSD-SA-14:08.tcp.
+
+|804503
+|link:https://svnweb.freebsd.org/changeset/base/268444[268444]
+|July 9, 2014
+|8.4-STABLE after FreeBSD-SA-14:17.kmem.
+
+|804504
+|link:https://svnweb.freebsd.org/changeset/base/271341[271341]
+|September 9, 2014
+|8.4-STABLE after FreeBSD-SA-14:18 (rev link:https://svnweb.freebsd.org/changeset/base/271305[271305]).
+
+|804505
+|link:https://svnweb.freebsd.org/changeset/base/271686[271686]
+|September 16, 2014
+|8.4-STABLE after FreeBSD-SA-14:19 (rev link:https://svnweb.freebsd.org/changeset/base/271668[271668]).
+
+|804506
+|link:https://svnweb.freebsd.org/changeset/base/273432[273432]
+|October 21, 2014
+|8.4-STABLE after FreeBSD-SA-14:21 (rev link:https://svnweb.freebsd.org/changeset/base/273413[273413]).
+
+|804507
+|link:https://svnweb.freebsd.org/changeset/base/274162[274162]
+|November 4, 2014
+|8.4-STABLE after FreeBSD-SA-14:23, FreeBSD-SA-14:24, and FreeBSD-SA-14:25.
+
+|804508
+|link:https://svnweb.freebsd.org/changeset/base/279287[279287]
+|February 25, 2015
+|8-STABLE after FreeBSD-EN-15:01.vt, FreeBSD-EN-15:02.openssl, FreeBSD-EN-15:03.freebsd-update, FreeBSD-SA-15:04.igmp, and FreeBSD-SA-15:05.bind.
+
+|804509
+|link:https://svnweb.freebsd.org/changeset/base/305736[305736]
+|September 12, 2016
+|8-STABLE after resolving a deadlock between `device_detach()` and man:usbd_do_request_flags[9].
+|===
+
+[[versions-7]]
+== FreeBSD 7 Versions
+
+[[freebsd-versions-table-7]]
+.FreeBSD 7 `__FreeBSD_version` Values
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Value
+| Revision
+| Date
+| Release
+
+|700000
+|link:https://svnweb.freebsd.org/changeset/base/147925[147925]
+|July 11, 2005
+|7.0-CURRENT.
+
+|700001
+|link:https://svnweb.freebsd.org/changeset/base/148341[148341]
+|July 23, 2005
+|7.0-CURRENT after bump of all shared library versions that had not been changed since RELENG_5.
+
+|700002
+|link:https://svnweb.freebsd.org/changeset/base/149039[149039]
+|August 13, 2005
+|7.0-CURRENT after credential argument is added to dev_clone event handler.
+
+|700003
+|link:https://svnweb.freebsd.org/changeset/base/149470[149470]
+|August 25, 2005
+|7.0-CURRENT after man:memmem[3] is added to libc.
+
+|700004
+|link:https://svnweb.freebsd.org/changeset/base/151888[151888]
+|October 30, 2005
+|7.0-CURRENT after man:solisten[9] kernel arguments are modified to accept a backlog parameter.
+
+|700005
+|link:https://svnweb.freebsd.org/changeset/base/152296[152296]
+|November 11, 2005
+|7.0-CURRENT after IFP2ENADDR() was changed to return a pointer to IF_LLADDR().
+
+|700006
+|link:https://svnweb.freebsd.org/changeset/base/152315[152315]
+|November 11, 2005
+|7.0-CURRENT after addition of `if_addr` member to `struct ifnet` and IFP2ENADDR() removal.
+
+|700007
+|link:https://svnweb.freebsd.org/changeset/base/153027[153027]
+|December 2, 2005
+|7.0-CURRENT after incorporating scripts from the local_startup directories into the base man:rcorder[8].
+
+|700008
+|link:https://svnweb.freebsd.org/changeset/base/153107[153107]
+|December 5, 2005
+|7.0-CURRENT after removal of MNT_NODEV mount option.
+
+|700009
+|link:https://svnweb.freebsd.org/changeset/base/153519[153519]
+|December 19, 2005
+|7.0-CURRENT after ELF-64 type changes and symbol versioning.
+
+|700010
+|link:https://svnweb.freebsd.org/changeset/base/153579[153579]
+|December 20, 2005
+|7.0-CURRENT after addition of hostb and vgapci drivers, addition of pci_find_extcap(), and changing the AGP drivers to no longer map the aperture.
+
+|700011
+|link:https://svnweb.freebsd.org/changeset/base/153936[153936]
+|December 31, 2005
+|7.0-CURRENT after tv_sec was made time_t on all platforms but Alpha.
+
+|700012
+|link:https://svnweb.freebsd.org/changeset/base/154114[154114]
+|January 8, 2006
+|7.0-CURRENT after ldconfig_local_dirs change.
+
+|700013
+|link:https://svnweb.freebsd.org/changeset/base/154269[154269]
+|January 12, 2006
+|7.0-CURRENT after changes to [.filename]#/etc/rc.d/abi# to support [.filename]#/compat/linux/etc/ld.so.cache# being a symlink in a readonly filesystem.
+
+|700014
+|link:https://svnweb.freebsd.org/changeset/base/154863[154863]
+|January 26, 2006
+|7.0-CURRENT after pts import.
+
+|700015
+|link:https://svnweb.freebsd.org/changeset/base/157144[157144]
+|March 26, 2006
+|7.0-CURRENT after the introduction of version 2 of man:hwpmc[4]'s ABI.
+
+|700016
+|link:https://svnweb.freebsd.org/changeset/base/157962[157962]
+|April 22, 2006
+|7.0-CURRENT after addition of man:fcloseall[3] to libc.
+
+|700017
+|link:https://svnweb.freebsd.org/changeset/base/158513[158513]
+|May 13, 2006
+|7.0-CURRENT after removal of ip6fw.
+
+|700018
+|link:https://svnweb.freebsd.org/changeset/base/160386[160386]
+|July 15, 2006
+|7.0-CURRENT after import of snd_emu10kx.
+
+|700019
+|link:https://svnweb.freebsd.org/changeset/base/160821[160821]
+|July 29, 2006
+|7.0-CURRENT after import of OpenSSL 0.9.8b.
+
+|700020
+|link:https://svnweb.freebsd.org/changeset/base/161931[161931]
+|September 3, 2006
+|7.0-CURRENT after addition of bus_dma_get_tag function
+
+|700021
+|link:https://svnweb.freebsd.org/changeset/base/162023[162023]
+|September 4, 2006
+|7.0-CURRENT after libpcap 0.9.4 and tcpdump 3.9.4 import.
+
+|700022
+|link:https://svnweb.freebsd.org/changeset/base/162170[162170]
+|September 9, 2006
+|7.0-CURRENT after dlsym change to look for a requested symbol both in specified dso and its implicit dependencies.
+
+|700023
+|link:https://svnweb.freebsd.org/changeset/base/162588[162588]
+|September 23, 2006
+|7.0-CURRENT after adding new sound IOCTLs for the OSSv4 mixer API.
+
+|700024
+|link:https://svnweb.freebsd.org/changeset/base/162919[162919]
+|September 28, 2006
+|7.0-CURRENT after import of OpenSSL 0.9.8d.
+
+|700025
+|link:https://svnweb.freebsd.org/changeset/base/164190[164190]
+|November 11, 2006
+|7.0-CURRENT after the addition of libelf.
+
+|700026
+|link:https://svnweb.freebsd.org/changeset/base/164614[164614]
+|November 26, 2006
+|7.0-CURRENT after major changes on sound sysctls.
+
+|700027
+|link:https://svnweb.freebsd.org/changeset/base/164770[164770]
+|November 30, 2006
+|7.0-CURRENT after the addition of Wi-Spy quirk.
+
+|700028
+|link:https://svnweb.freebsd.org/changeset/base/165242[165242]
+|December 15, 2006
+|7.0-CURRENT after the addition of sctp calls to libc
+
+|700029
+|link:https://svnweb.freebsd.org/changeset/base/166259[166259]
+|January 26, 2007
+|7.0-CURRENT after the GNU man:gzip[1] implementation was replaced with a BSD licensed version ported from NetBSD.
+
+|700030
+|link:https://svnweb.freebsd.org/changeset/base/166549[166549]
+|February 7, 2007
+|7.0-CURRENT after the removal of IPIP tunnel encapsulation (VIFF_TUNNEL) from the IPv4 multicast forwarding code.
+
+|700031
+|link:https://svnweb.freebsd.org/changeset/base/166907[166907]
+|February 23, 2007
+|7.0-CURRENT after the modification of bus_setup_intr() (newbus).
+
+|700032
+|link:https://svnweb.freebsd.org/changeset/base/167165[167165]
+|March 2, 2007
+|7.0-CURRENT after the inclusion of man:ipw[4] and man:iwi[4] firmware.
+
+|700033
+|link:https://svnweb.freebsd.org/changeset/base/167360[167360]
+|March 9, 2007
+|7.0-CURRENT after the inclusion of ncurses wide character support.
+
+|700034
+|link:https://svnweb.freebsd.org/changeset/base/167684[167684]
+|March 19, 2007
+|7.0-CURRENT after changes to how insmntque(), getnewvnode(), and vfs_hash_insert() work.
+
+|700035
+|link:https://svnweb.freebsd.org/changeset/base/167906[167906]
+|March 26, 2007
+|7.0-CURRENT after addition of a notify mechanism for CPU frequency changes.
+
+|700036
+|link:https://svnweb.freebsd.org/changeset/base/168413[168413]
+|April 6, 2007
+|7.0-CURRENT after import of the ZFS filesystem.
+
+|700037
+|link:https://svnweb.freebsd.org/changeset/base/168504[168504]
+|April 8, 2007
+|7.0-CURRENT after addition of CAM 'SG' peripheral device, which implements a subset of Linux SCSI SG passthrough device API.
+
+|700038
+|link:https://svnweb.freebsd.org/changeset/base/169151[169151]
+|April 30, 2007
+|7.0-CURRENT after changing man:getenv[3], man:putenv[3], man:setenv[3] and man:unsetenv[3] to be POSIX conformant.
+
+|700039
+|link:https://svnweb.freebsd.org/changeset/base/169190[169190]
+|May 1, 2007
+|7.0-CURRENT after the changes in 700038 were backed out.
+
+|700040
+|link:https://svnweb.freebsd.org/changeset/base/169453[169453]
+|May 10, 2007
+|7.0-CURRENT after the addition of man:flopen[3] to libutil.
+
+|700041
+|link:https://svnweb.freebsd.org/changeset/base/169526[169526]
+|May 13, 2007
+|7.0-CURRENT after enabling symbol versioning, and changing the default thread library to libthr.
+
+|700042
+|link:https://svnweb.freebsd.org/changeset/base/169758[169758]
+|May 19, 2007
+|7.0-CURRENT after the import of gcc 4.2.0.
+
+|700043
+|link:https://svnweb.freebsd.org/changeset/base/169830[169830]
+|May 21, 2007
+|7.0-CURRENT after bump of all shared library versions that had not been changed since RELENG_6.
+
+|700044
+|link:https://svnweb.freebsd.org/changeset/base/170395[170395]
+|June 7, 2007
+|7.0-CURRENT after changing the argument for vn_open()/VOP_OPEN() from file descriptor index to the struct file *.
+
+|700045
+|link:https://svnweb.freebsd.org/changeset/base/170510[170510]
+|June 10, 2007
+|7.0-CURRENT after changing man:pam_nologin[8] to provide an account management function instead of an authentication function to the PAM framework.
+
+|700046
+|link:https://svnweb.freebsd.org/changeset/base/170530[170530]
+|June 11, 2007
+|7.0-CURRENT after updated 802.11 wireless support.
+
+|700047
+|link:https://svnweb.freebsd.org/changeset/base/170579[170579]
+|June 11, 2007
+|7.0-CURRENT after adding TCP LRO interface capabilities.
+
+|700048
+|link:https://svnweb.freebsd.org/changeset/base/170613[170613]
+|June 12, 2007
+|7.0-CURRENT after RFC 3678 API support added to the IPv4 stack. Legacy RFC 1724 behavior of the IP_MULTICAST_IF ioctl has now been removed; 0.0.0.0/8 may no longer be used to specify an interface index. Use struct ipmreqn instead.
+
+|700049
+|link:https://svnweb.freebsd.org/changeset/base/171175[171175]
+|July 3, 2007
+|7.0-CURRENT after importing pf from OpenBSD 4.1
+
+|(not changed)
+|link:https://svnweb.freebsd.org/changeset/base/171167[171167]
+|
+|7.0-CURRENT after adding IPv6 support for FAST_IPSEC, deleting KAME IPSEC, and renaming FAST_IPSEC to IPSEC.
+
+|700050
+|link:https://svnweb.freebsd.org/changeset/base/171195[171195]
+|July 4, 2007
+|7.0-CURRENT after converting setenv/putenv/etc. calls from traditional BSD to POSIX.
+
+|700051
+|link:https://svnweb.freebsd.org/changeset/base/171211[171211]
+|July 4, 2007
+|7.0-CURRENT after adding new mmap/lseek/etc syscalls.
+
+|700052
+|link:https://svnweb.freebsd.org/changeset/base/171275[171275]
+|July 6, 2007
+|7.0-CURRENT after moving I4B headers to include/i4b.
+
+|700053
+|link:https://svnweb.freebsd.org/changeset/base/172394[172394]
+|September 30, 2007
+|7.0-CURRENT after the addition of support for PCI domains
+
+|700054
+|link:https://svnweb.freebsd.org/changeset/base/172988[172988]
+|October 25, 2007
+|7.0-STABLE after MFC of wide and single byte ctype separation.
+
+|700055
+|link:https://svnweb.freebsd.org/changeset/base/173104[173104]
+|October 28, 2007
+|7.0-RELEASE, and 7.0-CURRENT after ABI backwards compatibility to the FreeBSD 4/5/6 versions of the PCIOCGETCONF, PCIOCREAD and PCIOCWRITE IOCTLs was MFCed, which required the ABI of the PCIOCGETCONF IOCTL to be broken again
+
+|700100
+|link:https://svnweb.freebsd.org/changeset/base/174864[174864]
+|December 22, 2007
+|7.0-STABLE after 7.0-RELEASE
+
+|700101
+|link:https://svnweb.freebsd.org/changeset/base/176111[176111]
+|February 8, 2008
+|7.0-STABLE after the MFC of m_collapse().
+
+|700102
+|link:https://svnweb.freebsd.org/changeset/base/177735[177735]
+|March 30, 2008
+|7.0-STABLE after the MFC of kdb_enter_why().
+
+|700103
+|link:https://svnweb.freebsd.org/changeset/base/178061[178061]
+|April 10, 2008
+|7.0-STABLE after adding l_sysid to struct flock.
+
+|700104
+|link:https://svnweb.freebsd.org/changeset/base/178108[178108]
+|April 11, 2008
+|7.0-STABLE after the MFC of man:procstat[1].
+
+|700105
+|link:https://svnweb.freebsd.org/changeset/base/178120[178120]
+|April 11, 2008
+|7.0-STABLE after the MFC of umtx features.
+
+|700106
+|link:https://svnweb.freebsd.org/changeset/base/178225[178225]
+|April 15, 2008
+|7.0-STABLE after the MFC of man:write[2] support to man:psm[4].
+
+|700107
+|link:https://svnweb.freebsd.org/changeset/base/178353[178353]
+|April 20, 2008
+|7.0-STABLE after the MFC of F_DUP2FD command to man:fcntl[2].
+
+|700108
+|link:https://svnweb.freebsd.org/changeset/base/178783[178783]
+|May 5, 2008
+|7.0-STABLE after some man:lockmgr[9] changes, which makes it necessary to include [.filename]#sys/lock.h# to use man:lockmgr[9].
+
+|700109
+|link:https://svnweb.freebsd.org/changeset/base/179367[179367]
+|May 27, 2008
+|7.0-STABLE after MFC of the man:memrchr[3] function.
+
+|700110
+|link:https://svnweb.freebsd.org/changeset/base/181328[181328]
+|August 5, 2008
+|7.0-STABLE after MFC of kernel NFS lockd client.
+
+|700111
+|link:https://svnweb.freebsd.org/changeset/base/181940[181940]
+|August 20, 2008
+|7.0-STABLE after addition of physically contiguous jumbo frame support.
+
+|700112
+|link:https://svnweb.freebsd.org/changeset/base/182294[182294]
+|August 27, 2008
+|7.0-STABLE after MFC of kernel DTrace support.
+
+|701000
+|link:https://svnweb.freebsd.org/changeset/base/185315[185315]
+|November 25, 2008
+|7.1-RELEASE
+
+|701100
+|link:https://svnweb.freebsd.org/changeset/base/185302[185302]
+|November 25, 2008
+|7.1-STABLE after 7.1-RELEASE.
+
+|701101
+|link:https://svnweb.freebsd.org/changeset/base/187023[187023]
+|January 10, 2009
+|7.1-STABLE after man:strndup[3] merge.
+
+|701102
+|link:https://svnweb.freebsd.org/changeset/base/187370[187370]
+|January 17, 2009
+|7.1-STABLE after man:cpuctl[4] support added.
+
+|701103
+|link:https://svnweb.freebsd.org/changeset/base/188281[188281]
+|February 7, 2009
+|7.1-STABLE after the merge of multi-/no-IPv4/v6 jails.
+
+|701104
+|link:https://svnweb.freebsd.org/changeset/base/188625[188625]
+|February 14, 2009
+|7.1-STABLE after the store of the suspension owner in the struct mount, and introduction of vfs_susp_clean method into the struct vfsops.
+
+|701105
+|link:https://svnweb.freebsd.org/changeset/base/189740[189740]
+|March 12, 2009
+|7.1-STABLE after the incompatible change to the kern.ipc.shmsegs sysctl to allow allocating larger SysV shared memory segments on 64bit architectures.
+
+|701106
+|link:https://svnweb.freebsd.org/changeset/base/189786[189786]
+|March 14, 2009
+|7.1-STABLE after the merge of a fix for POSIX semaphore wait operations.
+
+|702000
+|link:https://svnweb.freebsd.org/changeset/base/191099[191099]
+|April 15, 2009
+|7.2-RELEASE
+
+|702100
+|link:https://svnweb.freebsd.org/changeset/base/191091[191091]
+|April 15, 2009
+|7.2-STABLE after 7.2-RELEASE.
+
+|702101
+|link:https://svnweb.freebsd.org/changeset/base/192149[192149]
+|May 15, 2009
+|7.2-STABLE after man:ichsmb[4] was changed to use left-adjusted slave addressing to match other SMBus controller drivers.
+
+|702102
+|link:https://svnweb.freebsd.org/changeset/base/193020[193020]
+|May 28, 2009
+|7.2-STABLE after MFC of the man:fdopendir[3] function.
+
+|702103
+|link:https://svnweb.freebsd.org/changeset/base/193638[193638]
+|June 6, 2009
+|7.2-STABLE after MFC of PmcTools.
+
+|702104
+|link:https://svnweb.freebsd.org/changeset/base/195694[195694]
+|July 14, 2009
+|7.2-STABLE after MFC of the man:closefrom[2] system call.
+
+|702105
+|link:https://svnweb.freebsd.org/changeset/base/196006[196006]
+|July 31, 2009
+|7.2-STABLE after MFC of the SYSVIPC ABI change.
+
+|702106
+|link:https://svnweb.freebsd.org/changeset/base/197198[197198]
+|September 14, 2009
+|7.2-STABLE after MFC of the x86 PAT enhancements and addition of d_mmap_single() and the scatter/gather list VM object type.
+
+|703000
+|link:https://svnweb.freebsd.org/changeset/base/203740[203740]
+|February 9, 2010
+|7.3-RELEASE
+
+|703100
+|link:https://svnweb.freebsd.org/changeset/base/203742[203742]
+|February 9, 2010
+|7.3-STABLE after 7.3-RELEASE.
+
+|704000
+|link:https://svnweb.freebsd.org/changeset/base/216647[216647]
+|December 22, 2010
+|7.4-RELEASE
+
+|704100
+|link:https://svnweb.freebsd.org/changeset/base/216658[216658]
+|December 22, 2010
+|7.4-STABLE after 7.4-RELEASE.
+
+|704101
+|link:https://svnweb.freebsd.org/changeset/base/221318[221318]
+|May 2, 2011
+|7.4-STABLE after the gcc MFC in rev link:https://svnweb.freebsd.org/changeset/base/221317[221317].
+|===
+
+[[versions-6]]
+== FreeBSD 6 Versions
+
+[[freebsd-versions-table-6]]
+.FreeBSD 6 `__FreeBSD_version` Values
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Value
+| Revision
+| Date
+| Release
+
+|600000
+|link:https://svnweb.freebsd.org/changeset/base/133921[133921]
+|August 18, 2004
+|6.0-CURRENT
+
+|600001
+|link:https://svnweb.freebsd.org/changeset/base/134396[134396]
+|August 27, 2004
+|6.0-CURRENT after permanently enabling PFIL_HOOKS in the kernel.
+
+|600002
+|link:https://svnweb.freebsd.org/changeset/base/134514[134514]
+|August 30, 2004
+|6.0-CURRENT after initial addition of ifi_epoch to struct if_data. Backed out after a few days. Do not use this value.
+
+|600003
+|link:https://svnweb.freebsd.org/changeset/base/134933[134933]
+|September 8, 2004
+|6.0-CURRENT after the re-addition of the ifi_epoch member of struct if_data.
+
+|600004
+|link:https://svnweb.freebsd.org/changeset/base/135920[135920]
+|September 29, 2004
+|6.0-CURRENT after addition of the struct inpcb argument to the pfil API.
+
+|600005
+|link:https://svnweb.freebsd.org/changeset/base/136172[136172]
+|October 5, 2004
+|6.0-CURRENT after addition of the "-d DESTDIR" argument to newsyslog.
+
+|600006
+|link:https://svnweb.freebsd.org/changeset/base/137192[137192]
+|November 4, 2004
+|6.0-CURRENT after addition of glibc style man:strftime[3] padding options.
+
+|600007
+|link:https://svnweb.freebsd.org/changeset/base/138760[138760]
+|December 12, 2004
+|6.0-CURRENT after addition of 802.11 framework updates.
+
+|600008
+|link:https://svnweb.freebsd.org/changeset/base/140809[140809]
+|January 25, 2005
+|6.0-CURRENT after changes to VOP_*VOBJECT() functions and introduction of MNTK_MPSAFE flag for Giantfree filesystems.
+
+|600009
+|link:https://svnweb.freebsd.org/changeset/base/141250[141250]
+|February 4, 2005
+|6.0-CURRENT after addition of the cpufreq framework and drivers.
+
+|600010
+|link:https://svnweb.freebsd.org/changeset/base/141394[141394]
+|February 6, 2005
+|6.0-CURRENT after importing OpenBSD's man:nc[1].
+
+|600011
+|link:https://svnweb.freebsd.org/changeset/base/141727[141727]
+|February 12, 2005
+|6.0-CURRENT after removing semblance of SVID2 `matherr()` support.
+
+|600012
+|link:https://svnweb.freebsd.org/changeset/base/141940[141940]
+|February 15, 2005
+|6.0-CURRENT after increase of default thread stacks' size.
+
+|600013
+|link:https://svnweb.freebsd.org/changeset/base/142089[142089]
+|February 19, 2005
+|6.0-CURRENT after fixes in [.filename]#<src/include/stdbool.h># and [.filename]#<src/sys/i386/include/_types.h># for using the GCC-compatibility of the Intel C/C++ compiler.
+
+|600014
+|link:https://svnweb.freebsd.org/changeset/base/142184[142184]
+|February 21, 2005
+|6.0-CURRENT after EOVERFLOW checks in man:vswprintf[3] fixed.
+
+|600015
+|link:https://svnweb.freebsd.org/changeset/base/142501[142501]
+|February 25, 2005
+|6.0-CURRENT after changing the struct if_data member, ifi_epoch, from wall clock time to uptime.
+
+|600016
+|link:https://svnweb.freebsd.org/changeset/base/142582[142582]
+|February 26, 2005
+|6.0-CURRENT after LC_CTYPE disk format changed.
+
+|600017
+|link:https://svnweb.freebsd.org/changeset/base/142683[142683]
+|February 27, 2005
+|6.0-CURRENT after NLS catalogs disk format changed.
+
+|600018
+|link:https://svnweb.freebsd.org/changeset/base/142686[142686]
+|February 27, 2005
+|6.0-CURRENT after LC_COLLATE disk format changed.
+
+|600019
+|link:https://svnweb.freebsd.org/changeset/base/142752[142752]
+|February 28, 2005
+|Installation of acpica includes into /usr/include.
+
+|600020
+|link:https://svnweb.freebsd.org/changeset/base/143308[143308]
+|March 9, 2005
+|Addition of MSG_NOSIGNAL flag to man:send[2] API.
+
+|600021
+|link:https://svnweb.freebsd.org/changeset/base/143746[143746]
+|March 17, 2005
+|Addition of fields to cdevsw
+
+|600022
+|link:https://svnweb.freebsd.org/changeset/base/143901[143901]
+|March 21, 2005
+|Removed gtar from base system.
+
+|600023
+|link:https://svnweb.freebsd.org/changeset/base/144980[144980]
+|April 13, 2005
+|LOCAL_CREDS, LOCAL_CONNWAIT socket options added to man:unix[4].
+
+|600024
+|link:https://svnweb.freebsd.org/changeset/base/145565[145565]
+|April 19, 2005
+|man:hwpmc[4] and related tools added to 6.0-CURRENT.
+
+|600025
+|link:https://svnweb.freebsd.org/changeset/base/145565[145565]
+|April 26, 2005
+|struct icmphdr added to 6.0-CURRENT.
+
+|600026
+|link:https://svnweb.freebsd.org/changeset/base/145843[145843]
+|May 3, 2005
+|pf updated to 3.7.
+
+|600027
+|link:https://svnweb.freebsd.org/changeset/base/145966[145966]
+|May 6, 2005
+|Kernel libalias and ng_nat introduced.
+
+|600028
+|link:https://svnweb.freebsd.org/changeset/base/146191[146191]
+|May 13, 2005
+|POSIX man:ttyname_r[3] made available through unistd.h and libc.
+
+|600029
+|link:https://svnweb.freebsd.org/changeset/base/146780[146780]
+|May 29, 2005
+|6.0-CURRENT after libpcap updated to v0.9.1 alpha 096.
+
+|600030
+|link:https://svnweb.freebsd.org/changeset/base/146988[146988]
+|June 5, 2005
+|6.0-CURRENT after importing NetBSD's man:if_bridge[4].
+
+|600031
+|link:https://svnweb.freebsd.org/changeset/base/147256[147256]
+|June 10, 2005
+|6.0-CURRENT after struct ifnet was broken out of the driver softcs.
+
+|600032
+|link:https://svnweb.freebsd.org/changeset/base/147898[147898]
+|July 11, 2005
+|6.0-CURRENT after the import of libpcap v0.9.1.
+
+|600033
+|link:https://svnweb.freebsd.org/changeset/base/148388[148388]
+|July 25, 2005
+|6.0-STABLE after bump of all shared library versions that had not been changed since RELENG_5.
+
+|600034
+|link:https://svnweb.freebsd.org/changeset/base/149040[149040]
+|August 13, 2005
+|6.0-STABLE after credential argument is added to dev_clone event handler. 6.0-RELEASE.
+
+|600100
+|link:https://svnweb.freebsd.org/changeset/base/151958[151958]
+|November 1, 2005
+|6.0-STABLE after 6.0-RELEASE
+
+|600101
+|link:https://svnweb.freebsd.org/changeset/base/153601[153601]
+|December 21, 2005
+|6.0-STABLE after incorporating scripts from the local_startup directories into the base man:rcorder[8].
+
+|600102
+|link:https://svnweb.freebsd.org/changeset/base/153912[153912]
+|December 30, 2005
+|6.0-STABLE after updating the ELF types and constants.
+
+|600103
+|link:https://svnweb.freebsd.org/changeset/base/154396[154396]
+|January 15, 2006
+|6.0-STABLE after MFC of man:pidfile[3] API.
+
+|600104
+|link:https://svnweb.freebsd.org/changeset/base/154453[154453]
+|January 17, 2006
+|6.0-STABLE after MFC of ldconfig_local_dirs change.
+
+|600105
+|link:https://svnweb.freebsd.org/changeset/base/156019[156019]
+|February 26, 2006
+|6.0-STABLE after NLS catalog support of man:csh[1].
+
+|601000
+|link:https://svnweb.freebsd.org/changeset/base/158330[158330]
+|May 6, 2006
+|6.1-RELEASE
+
+|601100
+|link:https://svnweb.freebsd.org/changeset/base/158331[158331]
+|May 6, 2006
+|6.1-STABLE after 6.1-RELEASE.
+
+|601101
+|link:https://svnweb.freebsd.org/changeset/base/159861[159861]
+|June 22, 2006
+|6.1-STABLE after the import of csup.
+
+|601102
+|link:https://svnweb.freebsd.org/changeset/base/160253[160253]
+|July 11, 2006
+|6.1-STABLE after the man:iwi[4] update.
+
+|601103
+|link:https://svnweb.freebsd.org/changeset/base/160429[160429]
+|July 17, 2006
+|6.1-STABLE after the resolver update to BIND9, and exposure of reentrant version of netdb functions.
+
+|601104
+|link:https://svnweb.freebsd.org/changeset/base/161098[161098]
+|August 8, 2006
+|6.1-STABLE after DSO (dynamic shared objects) support has been enabled in OpenSSL.
+
+|601105
+|link:https://svnweb.freebsd.org/changeset/base/161900[161900]
+|September 2, 2006
+|6.1-STABLE after 802.11 fixups changed the api for the IEEE80211_IOC_STA_INFO ioctl.
+
+|602000
+|link:https://svnweb.freebsd.org/changeset/base/164312[164312]
+|November 15, 2006
+|6.2-RELEASE
+
+|602100
+|link:https://svnweb.freebsd.org/changeset/base/162329[162329]
+|September 15, 2006
+|6.2-STABLE after 6.2-RELEASE.
+
+|602101
+|link:https://svnweb.freebsd.org/changeset/base/165122[165122]
+|December 12, 2006
+|6.2-STABLE after the addition of Wi-Spy quirk.
+
+|602102
+|link:https://svnweb.freebsd.org/changeset/base/165596[165596]
+|December 28, 2006
+|6.2-STABLE after pci_find_extcap() addition.
+
+|602103
+|link:https://svnweb.freebsd.org/changeset/base/166039[166039]
+|January 16, 2007
+|6.2-STABLE after MFC of dlsym change to look for a requested symbol both in specified dso and its implicit dependencies.
+
+|602104
+|link:https://svnweb.freebsd.org/changeset/base/166314[166314]
+|January 28, 2007
+|6.2-STABLE after MFC of man:ng_deflate[4] and man:ng_pred1[4] netgraph nodes and new compression and encryption modes for man:ng_ppp[4] node.
+
+|602105
+|link:https://svnweb.freebsd.org/changeset/base/166840[166840]
+|February 20, 2007
+|6.2-STABLE after MFC of BSD licensed version of man:gzip[1] ported from NetBSD.
+
+|602106
+|link:https://svnweb.freebsd.org/changeset/base/168133[168133]
+|March 31, 2007
+|6.2-STABLE after MFC of PCI MSI and MSI-X support.
+
+|602107
+|link:https://svnweb.freebsd.org/changeset/base/168438[168438]
+|April 6, 2007
+|6.2-STABLE after MFC of ncurses 5.6 and wide character support.
+
+|602108
+|link:https://svnweb.freebsd.org/changeset/base/168611[168611]
+|April 11, 2007
+|6.2-STABLE after MFC of CAM 'SG' peripheral device, which implements a subset of Linux SCSI SG passthrough device API.
+
+|602109
+|link:https://svnweb.freebsd.org/changeset/base/168805[168805]
+|April 17, 2007
+|6.2-STABLE after MFC of readline 5.2 patchset 002.
+
+|602110
+|link:https://svnweb.freebsd.org/changeset/base/169222[169222]
+|May 2, 2007
+|6.2-STABLE after MFC of pmap_invalidate_cache(), pmap_change_attr(), pmap_mapbios(), pmap_mapdev_attr(), and pmap_unmapbios() for amd64 and i386.
+
+|602111
+|link:https://svnweb.freebsd.org/changeset/base/170556[170556]
+|June 11, 2007
+|6.2-STABLE after MFC of BOP_BDFLUSH and caused breakage of the filesystem modules KBI.
+
+|602112
+|link:https://svnweb.freebsd.org/changeset/base/172284[172284]
+|September 21, 2007
+|6.2-STABLE after libutil(3) MFC's.
+
+|602113
+|link:https://svnweb.freebsd.org/changeset/base/172986[172986]
+|October 25, 2007
+|6.2-STABLE after MFC of wide and single byte ctype separation. Newly compiled binary that references to ctype.h may require a new symbol, __mb_sb_limit, which is not available on older systems.
+
+|602114
+|link:https://svnweb.freebsd.org/changeset/base/173170[173170]
+|October 30, 2007
+|6.2-STABLE after ctype ABI forward compatibility restored.
+
+|602115
+|link:https://svnweb.freebsd.org/changeset/base/173794[173794]
+|November 21, 2007
+|6.2-STABLE after back out of wide and single byte ctype separation.
+
+|603000
+|link:https://svnweb.freebsd.org/changeset/base/173897[173897]
+|November 25, 2007
+|6.3-RELEASE
+
+|603100
+|link:https://svnweb.freebsd.org/changeset/base/173891[173891]
+|November 25, 2007
+|6.3-STABLE after 6.3-RELEASE.
+
+|(not changed)
+|link:https://svnweb.freebsd.org/changeset/base/174434[174434]
+|December 7, 2007
+|6.3-STABLE after fixing multibyte type support in bit macro.
+
+|603102
+|link:https://svnweb.freebsd.org/changeset/base/178459[178459]
+|April 24, 2008
+|6.3-STABLE after adding l_sysid to struct flock.
+
+|603103
+|link:https://svnweb.freebsd.org/changeset/base/179367[179367]
+|May 27, 2008
+|6.3-STABLE after MFC of the man:memrchr[3] function.
+
+|603104
+|link:https://svnweb.freebsd.org/changeset/base/179810[179810]
+|June 15, 2008
+|6.3-STABLE after MFC of support for `:u` variable modifier in man:make[1].
+
+|604000
+|link:https://svnweb.freebsd.org/changeset/base/183583[183583]
+|October 4, 2008
+|6.4-RELEASE
+
+|604100
+|link:https://svnweb.freebsd.org/changeset/base/183584[183584]
+|October 4, 2008
+|6.4-STABLE after 6.4-RELEASE.
+|===
+
+[[versions-5]]
+== FreeBSD 5 Versions
+
+[[freebsd-versions-table-5]]
+.FreeBSD 5 `__FreeBSD_version` Values
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Value
+| Revision
+| Date
+| Release
+
+|500000
+|link:https://svnweb.freebsd.org/changeset/base/58009[58009]
+|March 13, 2000
+|5.0-CURRENT
+
+|500001
+|link:https://svnweb.freebsd.org/changeset/base/59348[59348]
+|April 18, 2000
+|5.0-CURRENT after adding addition ELF header fields, and changing our ELF binary branding method.
+
+|500002
+|link:https://svnweb.freebsd.org/changeset/base/59906[59906]
+|May 2, 2000
+|5.0-CURRENT after kld metadata changes.
+
+|500003
+|link:https://svnweb.freebsd.org/changeset/base/60688[60688]
+|May 18, 2000
+|5.0-CURRENT after buf/bio changes.
+
+|500004
+|link:https://svnweb.freebsd.org/changeset/base/60936[60936]
+|May 26, 2000
+|5.0-CURRENT after binutils upgrade.
+
+|500005
+|link:https://svnweb.freebsd.org/changeset/base/61221[61221]
+|June 3, 2000
+|5.0-CURRENT after merging libxpg4 code into libc and after TASKQ interface introduction.
+
+|500006
+|link:https://svnweb.freebsd.org/changeset/base/61500[61500]
+|June 10, 2000
+|5.0-CURRENT after the addition of AGP interfaces.
+
+|500007
+|link:https://svnweb.freebsd.org/changeset/base/62235[62235]
+|June 29, 2000
+|5.0-CURRENT after Perl upgrade to 5.6.0
+
+|500008
+|link:https://svnweb.freebsd.org/changeset/base/62764[62764]
+|July 7, 2000
+|5.0-CURRENT after the update of KAME code to 2000/07 sources.
+
+|500009
+|link:https://svnweb.freebsd.org/changeset/base/63154[63154]
+|July 14, 2000
+|5.0-CURRENT after ether_ifattach() and ether_ifdetach() changes.
+
+|500010
+|link:https://svnweb.freebsd.org/changeset/base/63265[63265]
+|July 16, 2000
+|5.0-CURRENT after changing mtree defaults back to original variant, adding -L to follow symlinks.
+
+|500011
+|link:https://svnweb.freebsd.org/changeset/base/63459[63459]
+|July 18, 2000
+|5.0-CURRENT after kqueue API changed.
+
+|500012
+|link:https://svnweb.freebsd.org/changeset/base/65353[65353]
+|September 2, 2000
+|5.0-CURRENT after man:setproctitle[3] moved from libutil to libc.
+
+|500013
+|link:https://svnweb.freebsd.org/changeset/base/65671[65671]
+|September 10, 2000
+|5.0-CURRENT after the first SMPng commit.
+
+|500014
+|link:https://svnweb.freebsd.org/changeset/base/70650[70650]
+|January 4, 2001
+|5.0-CURRENT after <sys/select.h> moved to <sys/selinfo.h>.
+
+|500015
+|link:https://svnweb.freebsd.org/changeset/base/70894[70894]
+|January 10, 2001
+|5.0-CURRENT after combining libgcc.a and libgcc_r.a, and associated GCC linkage changes.
+
+|500016
+|link:https://svnweb.freebsd.org/changeset/base/71583[71583]
+|January 24, 2001
+|5.0-CURRENT after change allowing libc and libc_r to be linked together, deprecating -pthread option.
+
+|500017
+|link:https://svnweb.freebsd.org/changeset/base/72650[72650]
+|February 18, 2001
+|5.0-CURRENT after switch from struct ucred to struct xucred to stabilize kernel-exported API for mountd et al.
+
+|500018
+|link:https://svnweb.freebsd.org/changeset/base/72975[72975]
+|February 24, 2001
+|5.0-CURRENT after addition of CPUTYPE make variable for controlling CPU-specific optimizations.
+
+|500019
+|link:https://svnweb.freebsd.org/changeset/base/77937[77937]
+|June 9, 2001
+|5.0-CURRENT after moving machine/ioctl_fd.h to sys/fdcio.h
+
+|500020
+|link:https://svnweb.freebsd.org/changeset/base/78304[78304]
+|June 15, 2001
+|5.0-CURRENT after locale names renaming.
+
+|500021
+|link:https://svnweb.freebsd.org/changeset/base/78632[78632]
+|June 22, 2001
+|5.0-CURRENT after Bzip2 import. Also signifies removal of S/Key.
+
+|500022
+|link:https://svnweb.freebsd.org/changeset/base/83435[83435]
+|July 12, 2001
+|5.0-CURRENT after SSE support.
+
+|500023
+|link:https://svnweb.freebsd.org/changeset/base/83435[83435]
+|September 14, 2001
+|5.0-CURRENT after KSE Milestone 2.
+
+|500024
+|link:https://svnweb.freebsd.org/changeset/base/84324[84324]
+|October 1, 2001
+|5.0-CURRENT after d_thread_t, and moving UUCP to ports.
+
+|500025
+|link:https://svnweb.freebsd.org/changeset/base/84481[84481]
+|October 4, 2001
+|5.0-CURRENT after ABI change for descriptor and creds passing on 64 bit platforms.
+
+|500026
+|link:https://svnweb.freebsd.org/changeset/base/84710[84710]
+|October 9, 2001
+|5.0-CURRENT after moving to XFree86 4 by default for package builds, and after the new libc strnstr() function was added.
+
+|500027
+|link:https://svnweb.freebsd.org/changeset/base/84743[84743]
+|October 10, 2001
+|5.0-CURRENT after the new libc strcasestr() function was added.
+
+|500028
+|link:https://svnweb.freebsd.org/changeset/base/87879[87879]
+|December 14, 2001
+|5.0-CURRENT after the userland components of smbfs were imported.
+
+|(not changed)
+|
+|
+|5.0-CURRENT after the new C99 specific-width integer types were added.
+
+|500029
+|link:https://svnweb.freebsd.org/changeset/base/89938[89938]
+|January 29, 2002
+|5.0-CURRENT after a change was made in the return value of man:sendfile[2].
+
+|500030
+|link:https://svnweb.freebsd.org/changeset/base/90711[90711]
+|February 15, 2002
+|5.0-CURRENT after the introduction of the type `fflags_t`, which is the appropriate size for file flags.
+
+|500031
+|link:https://svnweb.freebsd.org/changeset/base/91203[91203]
+|February 24, 2002
+|5.0-CURRENT after the usb structure element rename.
+
+|500032
+|link:https://svnweb.freebsd.org/changeset/base/92453[92453]
+|March 16, 2002
+|5.0-CURRENT after the introduction of Perl 5.6.1.
+
+|500033
+|link:https://svnweb.freebsd.org/changeset/base/93722[93722]
+|April 3, 2002
+|5.0-CURRENT after the `sendmail_enable` man:rc.conf[5] variable was made to take the value `NONE`.
+
+|500034
+|link:https://svnweb.freebsd.org/changeset/base/95831[95831]
+|April 30, 2002
+|5.0-CURRENT after mtx_init() grew a third argument.
+
+|500035
+|link:https://svnweb.freebsd.org/changeset/base/96498[96498]
+|May 13, 2002
+|5.0-CURRENT with Gcc 3.1.
+
+|500036
+|link:https://svnweb.freebsd.org/changeset/base/96781[96781]
+|May 17, 2002
+|5.0-CURRENT without Perl in /usr/src
+
+|500037
+|link:https://svnweb.freebsd.org/changeset/base/97516[97516]
+|May 29, 2002
+|5.0-CURRENT after the addition of man:dlfunc[3]
+
+|500038
+|link:https://svnweb.freebsd.org/changeset/base/100591[100591]
+|July 24, 2002
+|5.0-CURRENT after the types of some struct sockbuf members were changed and the structure was reordered.
+
+|500039
+|link:https://svnweb.freebsd.org/changeset/base/102757[102757]
+|September 1, 2002
+|5.0-CURRENT after GCC 3.2.1 import. Also after headers stopped using _BSD_FOO_T_ and started using _FOO_T_DECLARED. This value can also be used as a conservative estimate of the start of man:bzip2[1] package support.
+
+|500040
+|link:https://svnweb.freebsd.org/changeset/base/103675[103675]
+|September 20, 2002
+|5.0-CURRENT after various changes to disk functions were made in the name of removing dependency on disklabel structure internals.
+
+|500041
+|link:https://svnweb.freebsd.org/changeset/base/104250[104250]
+|October 1, 2002
+|5.0-CURRENT after the addition of man:getopt_long[3] to libc.
+
+|500042
+|link:https://svnweb.freebsd.org/changeset/base/105178[105178]
+|October 15, 2002
+|5.0-CURRENT after Binutils 2.13 upgrade, which included new FreeBSD emulation, vec, and output format.
+
+|500043
+|link:https://svnweb.freebsd.org/changeset/base/106289[106289]
+|November 1, 2002
+|5.0-CURRENT after adding weak pthread_XXX stubs to libc, obsoleting libXThrStub.so. 5.0-RELEASE.
+
+|500100
+|link:https://svnweb.freebsd.org/changeset/base/109405[109405]
+|January 17, 2003
+|5.0-CURRENT after branching for RELENG_5_0
+
+|500101
+|link:https://svnweb.freebsd.org/changeset/base/111120[111120]
+|February 19, 2003
+|<sys/dkstat.h> is empty. Do not include it.
+
+|500102
+|link:https://svnweb.freebsd.org/changeset/base/111482[111482]
+|February 25, 2003
+|5.0-CURRENT after the d_mmap_t interface change.
+
+|500103
+|link:https://svnweb.freebsd.org/changeset/base/111540[111540]
+|February 26, 2003
+|5.0-CURRENT after taskqueue_swi changed to run without Giant, and taskqueue_swi_giant added to run with Giant.
+
+|500104
+|link:https://svnweb.freebsd.org/changeset/base/111600[111600]
+|February 27, 2003
+|cdevsw_add() and cdevsw_remove() no longer exists. Appearance of MAJOR_AUTO allocation facility.
+
+|500105
+|link:https://svnweb.freebsd.org/changeset/base/111864[111864]
+|March 4, 2003
+|5.0-CURRENT after new cdevsw initialization method.
+
+|500106
+|link:https://svnweb.freebsd.org/changeset/base/112007[112007]
+|March 8, 2003
+|devstat_add_entry() has been replaced by devstat_new_entry()
+
+|500107
+|link:https://svnweb.freebsd.org/changeset/base/112288[112288]
+|March 15, 2003
+|Devstat interface change; see sys/sys/param.h 1.149
+
+|500108
+|link:https://svnweb.freebsd.org/changeset/base/112300[112300]
+|March 15, 2003
+|Token-Ring interface changes.
+
+|500109
+|link:https://svnweb.freebsd.org/changeset/base/112571[112571]
+|March 25, 2003
+|Addition of vm_paddr_t.
+
+|500110
+|link:https://svnweb.freebsd.org/changeset/base/112741[112741]
+|March 28, 2003
+|5.0-CURRENT after man:realpath[3] has been made thread-safe
+
+|500111
+|link:https://svnweb.freebsd.org/changeset/base/113273[113273]
+|April 9, 2003
+|5.0-CURRENT after man:usbhid[3] has been synced with NetBSD
+
+|500112
+|link:https://svnweb.freebsd.org/changeset/base/113597[113597]
+|April 17, 2003
+|5.0-CURRENT after new NSS implementation and addition of POSIX.1 getpw*_r, getgr*_r functions
+
+|500113
+|link:https://svnweb.freebsd.org/changeset/base/114492[114492]
+|May 2, 2003
+|5.0-CURRENT after removal of the old rc system.
+
+|501000
+|link:https://svnweb.freebsd.org/changeset/base/115816[115816]
+|June 4, 2003
+|5.1-RELEASE.
+
+|501100
+|link:https://svnweb.freebsd.org/changeset/base/115710[115710]
+|June 2, 2003
+|5.1-CURRENT after branching for RELENG_5_1.
+
+|501101
+|link:https://svnweb.freebsd.org/changeset/base/117025[117025]
+|June 29, 2003
+|5.1-CURRENT after correcting the semantics of man:sigtimedwait[2] and man:sigwaitinfo[2].
+
+|501102
+|link:https://svnweb.freebsd.org/changeset/base/117191[117191]
+|July 3, 2003
+|5.1-CURRENT after adding the lockfunc and lockfuncarg fields to man:bus_dma_tag_create[9].
+
+|501103
+|link:https://svnweb.freebsd.org/changeset/base/118241[118241]
+|July 31, 2003
+|5.1-CURRENT after GCC 3.3.1-pre 20030711 snapshot integration.
+
+|501104
+|link:https://svnweb.freebsd.org/changeset/base/118511[118511]
+|August 5, 2003
+|5.1-CURRENT 3ware API changes to twe.
+
+|501105
+|link:https://svnweb.freebsd.org/changeset/base/119021[119021]
+|August 17, 2003
+|5.1-CURRENT dynamically-linked /bin and /sbin support and movement of libraries to /lib.
+
+|501106
+|link:https://svnweb.freebsd.org/changeset/base/119881[119881]
+|September 8, 2003
+|5.1-CURRENT after adding kernel support for Coda 6.x.
+
+|501107
+|link:https://svnweb.freebsd.org/changeset/base/120180[120180]
+|September 17, 2003
+|5.1-CURRENT after 16550 UART constants moved from [.filename]#<dev/sio/sioreg.h># to [.filename]#<dev/ic/ns16550.h>#. Also when libmap functionality was unconditionally supported by rtld.
+
+|501108
+|link:https://svnweb.freebsd.org/changeset/base/120386[120386]
+|September 23, 2003
+|5.1-CURRENT after PFIL_HOOKS API update
+
+|501109
+|link:https://svnweb.freebsd.org/changeset/base/120503[120503]
+|September 27, 2003
+|5.1-CURRENT after adding man:kiconv[3]
+
+|501110
+|link:https://svnweb.freebsd.org/changeset/base/120556[120556]
+|September 28, 2003
+|5.1-CURRENT after changing default operations for open and close in cdevsw
+
+|501111
+|link:https://svnweb.freebsd.org/changeset/base/121125[121125]
+|October 16, 2003
+|5.1-CURRENT after changed layout of cdevsw
+
+|501112
+|link:https://svnweb.freebsd.org/changeset/base/121129[121129]
+|October 16, 2003
+| 5.1-CURRENT after adding kobj multiple inheritance
+
+|501113
+|link:https://svnweb.freebsd.org/changeset/base/121816[121816]
+|October 31, 2003
+| 5.1-CURRENT after the if_xname change in struct ifnet
+
+|501114
+|link:https://svnweb.freebsd.org/changeset/base/122779[122779]
+|November 16, 2003
+| 5.1-CURRENT after changing /bin and /sbin to be dynamically linked
+
+|502000
+|link:https://svnweb.freebsd.org/changeset/base/123198[123198]
+|December 7, 2003
+|5.2-RELEASE
+
+|502010
+|link:https://svnweb.freebsd.org/changeset/base/126150[126150]
+|February 23, 2004
+|5.2.1-RELEASE
+
+|502100
+|link:https://svnweb.freebsd.org/changeset/base/123196[123196]
+|December 7, 2003
+|5.2-CURRENT after branching for RELENG_5_2
+
+|502101
+|link:https://svnweb.freebsd.org/changeset/base/123677[123677]
+|December 19, 2003
+|5.2-CURRENT after __cxa_atexit/__cxa_finalize functions were added to libc.
+
+|502102
+|link:https://svnweb.freebsd.org/changeset/base/125236[125236]
+|January 30, 2004
+|5.2-CURRENT after change of default thread library from libc_r to libpthread.
+
+|502103
+|link:https://svnweb.freebsd.org/changeset/base/126083[126083]
+|February 21, 2004
+|5.2-CURRENT after device driver API megapatch.
+
+|502104
+|link:https://svnweb.freebsd.org/changeset/base/126208[126208]
+|February 25, 2004
+|5.2-CURRENT after getopt_long_only() addition.
+
+|502105
+|link:https://svnweb.freebsd.org/changeset/base/126644[126644]
+|March 5, 2004
+|5.2-CURRENT after NULL is made into ((void *)0) for C, creating more warnings.
+
+|502106
+|link:https://svnweb.freebsd.org/changeset/base/126757[126757]
+|March 8, 2004
+|5.2-CURRENT after pf is linked to the build and install.
+
+|502107
+|link:https://svnweb.freebsd.org/changeset/base/126819[126819]
+|March 10, 2004
+|5.2-CURRENT after time_t is changed to a 64-bit value on sparc64.
+
+|502108
+|link:https://svnweb.freebsd.org/changeset/base/126891[126891]
+|March 12, 2004
+|5.2-CURRENT after Intel C/C++ compiler support in some headers and man:execve[2] changes to be more strictly conforming to POSIX.
+
+|502109
+|link:https://svnweb.freebsd.org/changeset/base/127312[127312]
+|March 22, 2004
+|5.2-CURRENT after the introduction of the bus_alloc_resource_any API
+
+|502110
+|link:https://svnweb.freebsd.org/changeset/base/127475[127475]
+|March 27, 2004
+|5.2-CURRENT after the addition of UTF-8 locales
+
+|502111
+|link:https://svnweb.freebsd.org/changeset/base/128144[128144]
+|April 11, 2004
+|5.2-CURRENT after the removal of the man:getvfsent[3] API
+
+|502112
+|link:https://svnweb.freebsd.org/changeset/base/128182[128182]
+|April 13, 2004
+|5.2-CURRENT after the addition of the .warning directive for make.
+
+|502113
+|link:https://svnweb.freebsd.org/changeset/base/130057[130057]
+|June 4, 2004
+|5.2-CURRENT after ttyioctl() was made mandatory for serial drivers.
+
+|502114
+|link:https://svnweb.freebsd.org/changeset/base/130418[130418]
+|June 13, 2004
+|5.2-CURRENT after import of the ALTQ framework.
+
+|502115
+|link:https://svnweb.freebsd.org/changeset/base/130481[130481]
+|June 14, 2004
+|5.2-CURRENT after changing man:sema_timedwait[9] to return 0 on success and a non-zero error code on failure.
+
+|502116
+|link:https://svnweb.freebsd.org/changeset/base/130585[130585]
+|June 16, 2004
+|5.2-CURRENT after changing kernel dev_t to be pointer to struct cdev *.
+
+|502117
+|link:https://svnweb.freebsd.org/changeset/base/130640[130640]
+|June 17, 2004
+|5.2-CURRENT after changing kernel udev_t to dev_t.
+
+|502118
+|link:https://svnweb.freebsd.org/changeset/base/130656[130656]
+|June 17, 2004
+|5.2-CURRENT after adding support for CLOCK_VIRTUAL and CLOCK_PROF to man:clock_gettime[2] and man:clock_getres[2].
+
+|502119
+|link:https://svnweb.freebsd.org/changeset/base/130934[130934]
+|June 22, 2004
+|5.2-CURRENT after changing network interface cloning overhaul.
+
+|502120
+|link:https://svnweb.freebsd.org/changeset/base/131429[131429]
+|July 2, 2004
+|5.2-CURRENT after the update of the package tools to revision 20040629.
+
+|502121
+|link:https://svnweb.freebsd.org/changeset/base/131883[131883]
+|July 9, 2004
+|5.2-CURRENT after marking Bluetooth code as non-i386 specific.
+
+|502122
+|link:https://svnweb.freebsd.org/changeset/base/131971[131971]
+|July 11, 2004
+|5.2-CURRENT after the introduction of the KDB debugger framework, the conversion of DDB into a backend and the introduction of the GDB backend.
+
+|502123
+|link:https://svnweb.freebsd.org/changeset/base/132025[132025]
+|July 12, 2004
+|5.2-CURRENT after change to make VFS_ROOT take a struct thread argument as does vflush. Struct kinfo_proc now has a user data pointer. The switch of the default X implementation to `xorg` was also made at this time.
+
+|502124
+|link:https://svnweb.freebsd.org/changeset/base/132597[132597]
+|July 24, 2004
+|5.2-CURRENT after the change to separate the way ports rc.d and legacy scripts are started.
+
+|502125
+|link:https://svnweb.freebsd.org/changeset/base/132726[132726]
+|July 28, 2004
+|5.2-CURRENT after the backout of the previous change.
+
+|502126
+|link:https://svnweb.freebsd.org/changeset/base/132914[132914]
+|July 31, 2004
+|5.2-CURRENT after the removal of kmem_alloc_pageable() and the import of gcc 3.4.2.
+
+|502127
+|link:https://svnweb.freebsd.org/changeset/base/132991[132991]
+|August 2, 2004
+|5.2-CURRENT after changing the UMA kernel API to allow ctors/inits to fail.
+
+|502128
+|link:https://svnweb.freebsd.org/changeset/base/133306[133306]
+|August 8, 2004
+|5.2-CURRENT after the change of the vfs_mount signature as well as global replacement of PRISON_ROOT with SUSER_ALLOWJAIL for the man:suser[9] API.
+
+|503000
+|link:https://svnweb.freebsd.org/changeset/base/134189[134189]
+|August 23, 2004
+|5.3-BETA/RC before the pfil API change
+
+|503001
+|link:https://svnweb.freebsd.org/changeset/base/135580[135580]
+|September 22, 2004
+|5.3-RELEASE
+
+|503100
+|link:https://svnweb.freebsd.org/changeset/base/136595[136595]
+|October 16, 2004
+|5.3-STABLE after branching for RELENG_5_3
+
+|503101
+|link:https://svnweb.freebsd.org/changeset/base/138459[138459]
+|December 3, 2004
+|5.3-STABLE after addition of glibc style man:strftime[3] padding options.
+
+|503102
+|link:https://svnweb.freebsd.org/changeset/base/141788[141788]
+|February 13, 2005
+|5.3-STABLE after OpenBSD's man:nc[1] import MFC.
+
+|503103
+|link:https://svnweb.freebsd.org/changeset/base/142639[142639]
+|February 27, 2005
+|5.4-PRERELEASE after the MFC of the fixes in [.filename]#<src/include/stdbool.h># and [.filename]#<src/sys/i386/include/_types.h># for using the GCC-compatibility of the Intel C/C++ compiler.
+
+|503104
+|link:https://svnweb.freebsd.org/changeset/base/142835[142835]
+|February 28, 2005
+|5.4-PRERELEASE after the MFC of the change of ifi_epoch from wall clock time to uptime.
+
+|503105
+|link:https://svnweb.freebsd.org/changeset/base/143029[143029]
+|March 2, 2005
+|5.4-PRERELEASE after the MFC of the fix of EOVERFLOW check in man:vswprintf[3].
+
+|504000
+|link:https://svnweb.freebsd.org/changeset/base/144575[144575]
+|April 3, 2005
+|5.4-RELEASE.
+
+|504100
+|link:https://svnweb.freebsd.org/changeset/base/144581[144581]
+|April 3, 2005
+|5.4-STABLE after branching for RELENG_5_4
+
+|504101
+|link:https://svnweb.freebsd.org/changeset/base/146105[146105]
+|May 11, 2005
+|5.4-STABLE after increasing the default thread stacksizes
+
+|504102
+|link:https://svnweb.freebsd.org/changeset/base/504101[504101]
+|June 24, 2005
+|5.4-STABLE after the addition of sha256
+
+|504103
+|link:https://svnweb.freebsd.org/changeset/base/150892[150892]
+|October 3, 2005
+|5.4-STABLE after the MFC of if_bridge
+
+|504104
+|link:https://svnweb.freebsd.org/changeset/base/152370[152370]
+|November 13, 2005
+|5.4-STABLE after the MFC of bsdiff and portsnap
+
+|504105
+|link:https://svnweb.freebsd.org/changeset/base/154464[154464]
+|January 17, 2006
+|5.4-STABLE after MFC of ldconfig_local_dirs change.
+
+|505000
+|link:https://svnweb.freebsd.org/changeset/base/158481[158481]
+|May 12, 2006
+|5.5-RELEASE.
+
+|505100
+|link:https://svnweb.freebsd.org/changeset/base/158482[158482]
+|May 12, 2006
+|5.5-STABLE after branching for RELENG_5_5
+|===
+
+[[versions-4]]
+== FreeBSD 4 Versions
+
+[[freebsd-versions-table-4]]
+.FreeBSD 4 `__FreeBSD_version` Values
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Value
+| Revision
+| Date
+| Release
+
+|400000
+|link:https://svnweb.freebsd.org/changeset/base/43041[43041]
+|January 22, 1999
+|4.0-CURRENT after 3.4 branch
+
+|400001
+|link:https://svnweb.freebsd.org/changeset/base/44177[44177]
+|February 20, 1999
+|4.0-CURRENT after change in dynamic linker handling
+
+|400002
+|link:https://svnweb.freebsd.org/changeset/base/44699[44699]
+|March 13, 1999
+|4.0-CURRENT after C++ constructor/destructor order change
+
+|400003
+|link:https://svnweb.freebsd.org/changeset/base/45059[45059]
+|March 27, 1999
+|4.0-CURRENT after functioning man:dladdr[3]
+
+|400004
+|link:https://svnweb.freebsd.org/changeset/base/45321[45321]
+|April 5, 1999
+|4.0-CURRENT after __deregister_frame_info dynamic linker bug fix (also 4.0-CURRENT after EGCS 1.1.2 integration)
+
+|400005
+|link:https://svnweb.freebsd.org/changeset/base/46113[46113]
+|April 27, 1999
+|4.0-CURRENT after man:suser[9] API change (also 4.0-CURRENT after newbus)
+
+|400006
+|link:https://svnweb.freebsd.org/changeset/base/47640[47640]
+|May 31, 1999
+|4.0-CURRENT after cdevsw registration change
+
+|400007
+|link:https://svnweb.freebsd.org/changeset/base/47992[47992]
+|June 17, 1999
+|4.0-CURRENT after the addition of so_cred for socket level credentials
+
+|400008
+|link:https://svnweb.freebsd.org/changeset/base/48048[48048]
+|June 20, 1999
+|4.0-CURRENT after the addition of a poll syscall wrapper to libc_r
+
+|400009
+|link:https://svnweb.freebsd.org/changeset/base/48936[48936]
+|July 20, 1999
+|4.0-CURRENT after the change of the kernel's `dev_t` type to `struct specinfo` pointer
+
+|400010
+|link:https://svnweb.freebsd.org/changeset/base/51649[51649]
+|September 25, 1999
+|4.0-CURRENT after fixing a hole in man:jail[2]
+
+|400011
+|link:https://svnweb.freebsd.org/changeset/base/51791[51791]
+|September 29, 1999
+|4.0-CURRENT after the `sigset_t` datatype change
+
+|400012
+|link:https://svnweb.freebsd.org/changeset/base/53164[53164]
+|November 15, 1999
+|4.0-CURRENT after the cutover to the GCC 2.95.2 compiler
+
+|400013
+|link:https://svnweb.freebsd.org/changeset/base/54123[54123]
+|December 4, 1999
+|4.0-CURRENT after adding pluggable linux-mode ioctl handlers
+
+|400014
+|link:https://svnweb.freebsd.org/changeset/base/56216[56216]
+|January 18, 2000
+|4.0-CURRENT after importing OpenSSL
+
+|400015
+|link:https://svnweb.freebsd.org/changeset/base/56700[56700]
+|January 27, 2000
+|4.0-CURRENT after the C++ ABI change in GCC 2.95.2 from -fvtable-thunks to -fno-vtable-thunks by default
+
+|400016
+|link:https://svnweb.freebsd.org/changeset/base/57529[57529]
+|February 27, 2000
+|4.0-CURRENT after importing OpenSSH
+
+|400017
+|link:https://svnweb.freebsd.org/changeset/base/58005[58005]
+|March 13, 2000
+|4.0-RELEASE
+
+|400018
+|link:https://svnweb.freebsd.org/changeset/base/58170[58170]
+|March 17, 2000
+|4.0-STABLE after 4.0-RELEASE
+
+|400019
+|link:https://svnweb.freebsd.org/changeset/base/60047[60047]
+|May 5, 2000
+|4.0-STABLE after the introduction of delayed checksums.
+
+|400020
+|link:https://svnweb.freebsd.org/changeset/base/61262[61262]
+|June 4, 2000
+|4.0-STABLE after merging libxpg4 code into libc.
+
+|400021
+|link:https://svnweb.freebsd.org/changeset/base/62820[62820]
+|July 8, 2000
+|4.0-STABLE after upgrading Binutils to 2.10.0, ELF branding changes, and tcsh in the base system.
+
+|410000
+|link:https://svnweb.freebsd.org/changeset/base/63095[63095]
+|July 14, 2000
+|4.1-RELEASE
+
+|410001
+|link:https://svnweb.freebsd.org/changeset/base/64012[64012]
+|July 29, 2000
+|4.1-STABLE after 4.1-RELEASE
+
+|410002
+|link:https://svnweb.freebsd.org/changeset/base/65962[65962]
+|September 16, 2000
+|4.1-STABLE after man:setproctitle[3] moved from libutil to libc.
+
+|411000
+|link:https://svnweb.freebsd.org/changeset/base/66336[66336]
+|September 25, 2000
+|4.1.1-RELEASE
+
+|411001
+|
+|
+|4.1.1-STABLE after 4.1.1-RELEASE
+
+|420000
+|link:https://svnweb.freebsd.org/changeset/base/68066[68066]
+|October 31, 2000
+|4.2-RELEASE
+
+|420001
+|link:https://svnweb.freebsd.org/changeset/base/70895[70895]
+|January 10, 2001
+|4.2-STABLE after combining libgcc.a and libgcc_r.a, and associated GCC linkage changes.
+
+|430000
+|link:https://svnweb.freebsd.org/changeset/base/73800[73800]
+|March 6, 2001
+|4.3-RELEASE
+
+|430001
+|link:https://svnweb.freebsd.org/changeset/base/76779[76779]
+|May 18, 2001
+|4.3-STABLE after wint_t introduction.
+
+|430002
+|link:https://svnweb.freebsd.org/changeset/base/80157[80157]
+|July 22, 2001
+|4.3-STABLE after PCI powerstate API merge.
+
+|440000
+|link:https://svnweb.freebsd.org/changeset/base/80923[80923]
+|August 1, 2001
+|4.4-RELEASE
+
+|440001
+|link:https://svnweb.freebsd.org/changeset/base/85341[85341]
+|October 23, 2001
+|4.4-STABLE after d_thread_t introduction.
+
+|440002
+|link:https://svnweb.freebsd.org/changeset/base/86038[86038]
+|November 4, 2001
+|4.4-STABLE after mount structure changes (affects filesystem klds).
+
+|440003
+|link:https://svnweb.freebsd.org/changeset/base/88130[88130]
+|December 18, 2001
+|4.4-STABLE after the userland components of smbfs were imported.
+
+|450000
+|link:https://svnweb.freebsd.org/changeset/base/88271[88271]
+|December 20, 2001
+|4.5-RELEASE
+
+|450001
+|link:https://svnweb.freebsd.org/changeset/base/91203[91203]
+|February 24, 2002
+|4.5-STABLE after the usb structure element rename.
+
+|450002
+|link:https://svnweb.freebsd.org/changeset/base/92151[92151]
+|March 12, 2002
+|4.5-STABLE after locale changes.
+
+|450003
+|
+|
+|(Never created)
+
+|450004
+|link:https://svnweb.freebsd.org/changeset/base/94840[94840]
+|April 16, 2002
+|4.5-STABLE after the `sendmail_enable` man:rc.conf[5] variable was made to take the value `NONE`.
+
+|450005
+|link:https://svnweb.freebsd.org/changeset/base/95555[95555]
+|April 27, 2002
+|4.5-STABLE after moving to XFree86 4 by default for package builds.
+
+|450006
+|link:https://svnweb.freebsd.org/changeset/base/95846[95846]
+|May 1, 2002
+|4.5-STABLE after accept filtering was fixed so that is no longer susceptible to an easy DoS.
+
+|460000
+|link:https://svnweb.freebsd.org/changeset/base/97923[97923]
+|June 21, 2002
+|4.6-RELEASE
+
+|460001
+|link:https://svnweb.freebsd.org/changeset/base/98730[98730]
+|June 21, 2002
+|4.6-STABLE man:sendfile[2] fixed to comply with documentation, not to count any headers sent against the amount of data to be sent from the file.
+
+|460002
+|link:https://svnweb.freebsd.org/changeset/base/100366[100366]
+|July 19, 2002
+|4.6.2-RELEASE
+
+|460100
+|link:https://svnweb.freebsd.org/changeset/base/98857[98857]
+|June 26, 2002
+|4.6-STABLE
+
+|460101
+|link:https://svnweb.freebsd.org/changeset/base/98880[98880]
+|June 26, 2002
+|4.6-STABLE after MFC of `sed -i`.
+
+|460102
+|link:https://svnweb.freebsd.org/changeset/base/102759[102759]
+|September 1, 2002
+|4.6-STABLE after MFC of many new pkg_install features from the HEAD.
+
+|470000
+|link:https://svnweb.freebsd.org/changeset/base/104655[104655]
+|October 8, 2002
+|4.7-RELEASE
+
+|470100
+|link:https://svnweb.freebsd.org/changeset/base/104717[104717]
+|October 9, 2002
+|4.7-STABLE
+
+|470101
+|link:https://svnweb.freebsd.org/changeset/base/106732[106732]
+|November 10, 2002
+|Start generated __std{in,out,err}p references rather than __sF. This changes std{in,out,err} from a compile time expression to a runtime one.
+
+|470102
+|link:https://svnweb.freebsd.org/changeset/base/109753[109753]
+|January 23, 2003
+|4.7-STABLE after MFC of mbuf changes to replace m_aux mbufs by m_tag's
+
+|470103
+|link:https://svnweb.freebsd.org/changeset/base/110887[110887]
+|February 14, 2003
+|4.7-STABLE gets OpenSSL 0.9.7
+
+|480000
+|link:https://svnweb.freebsd.org/changeset/base/112852[112852]
+|March 30, 2003
+|4.8-RELEASE
+
+|480100
+|link:https://svnweb.freebsd.org/changeset/base/113107[113107]
+|April 5, 2003
+|4.8-STABLE
+
+|480101
+|link:https://svnweb.freebsd.org/changeset/base/115232[115232]
+|May 22, 2003
+|4.8-STABLE after man:realpath[3] has been made thread-safe
+
+|480102
+|link:https://svnweb.freebsd.org/changeset/base/118737[118737]
+|August 10, 2003
+|4.8-STABLE 3ware API changes to twe.
+
+|490000
+|link:https://svnweb.freebsd.org/changeset/base/121592[121592]
+|October 27, 2003
+|4.9-RELEASE
+
+|490100
+|link:https://svnweb.freebsd.org/changeset/base/121593[121593]
+|October 27, 2003
+|4.9-STABLE
+
+|490101
+|link:https://svnweb.freebsd.org/changeset/base/124264[124264]
+|January 8, 2004
+|4.9-STABLE after e_sid was added to struct kinfo_eproc.
+
+|490102
+|link:https://svnweb.freebsd.org/changeset/base/125417[125417]
+|February 4, 2004
+|4.9-STABLE after MFC of libmap functionality for rtld.
+
+|491000
+|link:https://svnweb.freebsd.org/changeset/base/129700[129700]
+|May 25, 2004
+|4.10-RELEASE
+
+|491100
+|link:https://svnweb.freebsd.org/changeset/base/129918[129918]
+|June 1, 2004
+|4.10-STABLE
+
+|491101
+|link:https://svnweb.freebsd.org/changeset/base/133506[133506]
+|August 11, 2004
+|4.10-STABLE after MFC of revision 20040629 of the package tools
+
+|491102
+|link:https://svnweb.freebsd.org/changeset/base/137786[137786]
+|November 16, 2004
+|4.10-STABLE after VM fix dealing with unwiring of fictitious pages
+
+|492000
+|link:https://svnweb.freebsd.org/changeset/base/138960[138960]
+|December 17, 2004
+|4.11-RELEASE
+
+|492100
+|link:https://svnweb.freebsd.org/changeset/base/138959[138959]
+|December 17, 2004
+|4.11-STABLE
+
+|492101
+|link:https://svnweb.freebsd.org/changeset/base/157843[157843]
+|April 18, 2006
+|4.11-STABLE after adding libdata/ldconfig directories to mtree files.
+|===
+
+[[versions-3]]
+== FreeBSD 3 Versions
+
+[[freebsd-versions-table-3]]
+.FreeBSD 3 `__FreeBSD_version` Values
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Value
+| Revision
+| Date
+| Release
+
+|300000
+|link:https://svnweb.freebsd.org/changeset/base/22917[22917]
+|February 19, 1996
+|3.0-CURRENT before man:mount[2] change
+
+|300001
+|link:https://svnweb.freebsd.org/changeset/base/36283[36283]
+|September 24, 1997
+|3.0-CURRENT after man:mount[2] change
+
+|300002
+|link:https://svnweb.freebsd.org/changeset/base/36592[36592]
+|June 2, 1998
+|3.0-CURRENT after man:semctl[2] change
+
+|300003
+|link:https://svnweb.freebsd.org/changeset/base/36735[36735]
+|June 7, 1998
+|3.0-CURRENT after ioctl arg changes
+
+|300004
+|link:https://svnweb.freebsd.org/changeset/base/38768[38768]
+|September 3, 1998
+|3.0-CURRENT after ELF conversion
+
+|300005
+|link:https://svnweb.freebsd.org/changeset/base/40438[40438]
+|October 16, 1998
+|3.0-RELEASE
+
+|300006
+|link:https://svnweb.freebsd.org/changeset/base/40445[40445]
+|October 16, 1998
+|3.0-CURRENT after 3.0-RELEASE
+
+|300007
+|link:https://svnweb.freebsd.org/changeset/base/43042[43042]
+|January 22, 1999
+|3.0-STABLE after 3/4 branch
+
+|310000
+|link:https://svnweb.freebsd.org/changeset/base/43807[43807]
+|February 9, 1999
+|3.1-RELEASE
+
+|310001
+|link:https://svnweb.freebsd.org/changeset/base/45060[45060]
+|March 27, 1999
+|3.1-STABLE after 3.1-RELEASE
+
+|310002
+|link:https://svnweb.freebsd.org/changeset/base/45689[45689]
+|April 14, 1999
+|3.1-STABLE after C++ constructor/destructor order change
+
+|320000
+|
+|
+|3.2-RELEASE
+
+|320001
+|link:https://svnweb.freebsd.org/changeset/base/46742[46742]
+|May 8, 1999
+|3.2-STABLE
+
+|320002
+|link:https://svnweb.freebsd.org/changeset/base/50563[50563]
+|August 29, 1999
+|3.2-STABLE after binary-incompatible IPFW and socket changes
+
+|330000
+|link:https://svnweb.freebsd.org/changeset/base/50813[50813]
+|September 2, 1999
+|3.3-RELEASE
+
+|330001
+|link:https://svnweb.freebsd.org/changeset/base/51328[51328]
+|September 16, 1999
+|3.3-STABLE
+
+|330002
+|link:https://svnweb.freebsd.org/changeset/base/53671[53671]
+|November 24, 1999
+|3.3-STABLE after adding man:mkstemp[3] to libc
+
+|340000
+|link:https://svnweb.freebsd.org/changeset/base/54166[54166]
+|December 5, 1999
+|3.4-RELEASE
+
+|340001
+|link:https://svnweb.freebsd.org/changeset/base/54730[54730]
+|December 17, 1999
+|3.4-STABLE
+
+|350000
+|link:https://svnweb.freebsd.org/changeset/base/61876[61876]
+|June 20, 2000
+|3.5-RELEASE
+
+|350001
+|link:https://svnweb.freebsd.org/changeset/base/63043[63043]
+|July 12, 2000
+|3.5-STABLE
+|===
+
+[[versions-2.2]]
+== FreeBSD 2.2 Versions
+
+[[freebsd-versions-table-2.2]]
+.FreeBSD 2.2 `__FreeBSD_version` Values
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Value
+| Revision
+| Date
+| Release
+
+|220000
+|link:https://svnweb.freebsd.org/changeset/base/22918[22918]
+|February 19, 1997
+|2.2-RELEASE
+
+|(not changed)
+|
+|
+|2.2.1-RELEASE
+
+|(not changed)
+|
+|
+|2.2-STABLE after 2.2.1-RELEASE
+
+|221001
+|link:https://svnweb.freebsd.org/changeset/base/24941[24941]
+|April 15, 1997
+|2.2-STABLE after texinfo-3.9
+
+|221002
+|link:https://svnweb.freebsd.org/changeset/base/25325[25325]
+|April 30, 1997
+|2.2-STABLE after top
+
+|222000
+|link:https://svnweb.freebsd.org/changeset/base/25851[25851]
+|May 16, 1997
+|2.2.2-RELEASE
+
+|222001
+|link:https://svnweb.freebsd.org/changeset/base/25921[25921]
+|May 19, 1997
+|2.2-STABLE after 2.2.2-RELEASE
+
+|225000
+|link:https://svnweb.freebsd.org/changeset/base/30053[30053]
+|October 2, 1997
+|2.2.5-RELEASE
+
+|225001
+|link:https://svnweb.freebsd.org/changeset/base/31300[31300]
+|November 20, 1997
+|2.2-STABLE after 2.2.5-RELEASE
+
+|225002
+|link:https://svnweb.freebsd.org/changeset/base/32019[32019]
+|December 27, 1997
+|2.2-STABLE after ldconfig -R merge
+
+|226000
+|link:https://svnweb.freebsd.org/changeset/base/34445[34445]
+|March 24, 1998
+|2.2.6-RELEASE
+
+|227000
+|link:https://svnweb.freebsd.org/changeset/base/37803[37803]
+|July 21, 1998
+|2.2.7-RELEASE
+
+|227001
+|link:https://svnweb.freebsd.org/changeset/base/37809[37809]
+|July 21, 1998
+|2.2-STABLE after 2.2.7-RELEASE
+
+|227002
+|link:https://svnweb.freebsd.org/changeset/base/39489[39489]
+|September 19, 1998
+|2.2-STABLE after man:semctl[2] change
+
+|228000
+|link:https://svnweb.freebsd.org/changeset/base/41403[41403]
+|November 29, 1998
+|2.2.8-RELEASE
+
+|228001
+|link:https://svnweb.freebsd.org/changeset/base/41418[41418]
+|November 29, 1998
+|2.2-STABLE after 2.2.8-RELEASE
+|===
+
+[NOTE]
+====
+Note that 2.2-STABLE sometimes identifies itself as "2.2.5-STABLE" after the 2.2.5-RELEASE. The pattern used to be year followed by the month, but we decided to change it to a more straightforward major/minor system starting from 2.2. This is because the parallel development on several branches made it infeasible to classify the releases merely by their real release dates. Do not worry about old -CURRENTs; they are listed here just for reference.
+====
+
+[[versions-2]]
+== FreeBSD 2 Before 2.2-RELEASE Versions
+
+[[freebsd-versions-table-2]]
+.FreeBSD 2 Before 2.2-RELEASE `__FreeBSD_version` Values
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Value
+| Revision
+| Date
+| Release
+
+|119411
+|
+|
+|2.0-RELEASE
+
+|199501
+|link:https://svnweb.freebsd.org/changeset/base/7153[7153]
+|March 19, 1995
+|2.1-CURRENT
+
+|199503
+|link:https://svnweb.freebsd.org/changeset/base/7310[7310]
+|March 24, 1995
+|2.1-CURRENT
+
+|199504
+|link:https://svnweb.freebsd.org/changeset/base/7704[7704]
+|April 9, 1995
+|2.0.5-RELEASE
+
+|199508
+|link:https://svnweb.freebsd.org/changeset/base/10297[10297]
+|August 26, 1995
+|2.2-CURRENT before 2.1
+
+|199511
+|link:https://svnweb.freebsd.org/changeset/base/12189[12189]
+|November 10, 1995
+|2.1.0-RELEASE
+
+|199512
+|link:https://svnweb.freebsd.org/changeset/base/12196[12196]
+|November 10, 1995
+|2.2-CURRENT before 2.1.5
+
+|199607
+|link:https://svnweb.freebsd.org/changeset/base/17067[17067]
+|July 10, 1996
+|2.1.5-RELEASE
+
+|199608
+|link:https://svnweb.freebsd.org/changeset/base/17127[17127]
+|July 12, 1996
+|2.2-CURRENT before 2.1.6
+
+|199612
+|link:https://svnweb.freebsd.org/changeset/base/19358[19358]
+|November 15, 1996
+|2.1.6-RELEASE
+
+|199612
+|
+|
+|2.1.7-RELEASE
+|===