diff --git a/documentation/content/ru/articles/pam/_index.adoc b/documentation/content/ru/articles/pam/_index.adoc index 52a2178aee..aa991b5154 100644 --- a/documentation/content/ru/articles/pam/_index.adoc +++ b/documentation/content/ru/articles/pam/_index.adoc @@ -1,614 +1,614 @@ --- authors: - author: 'Dag-Erling Smørgrav' copyright: '2001-2003 Networks Associates Technology, Inc.' description: 'Руководство по системе PAM и модулям в FreeBSD' tags: ["pam", "introduction", "authentication", "modules", "FreeBSD"] title: 'Подключаемые модули аутентификации (PAM)' trademarks: ["pam", "freebsd", "linux", "opengroup", "sun", "general"] --- //// Copyright (c) 2001-2003 Networks Associates Technology, Inc. All rights reserved. This software was developed for the FreeBSD Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA CHATS research program. 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. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. 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. //// = Подключаемые модули аутентификации (PAM) :doctype: article :toc: macro :toclevels: 1 :icons: font :sectnums: :source-highlighter: rouge :experimental: :images-path: articles/pam/ ifdef::env-beastie[] ifdef::backend-html5[] include::shared/authors.adoc[] include::shared/mirrors.adoc[] include::shared/releases.adoc[] include::shared/attributes/attributes-{{% lang %}}.adoc[] include::shared/{{% lang %}}/teams.adoc[] include::shared/{{% lang %}}/mailing-lists.adoc[] include::shared/{{% lang %}}/urls.adoc[] :imagesdir: ../../../images/{images-path} :include-path: static/source/articles/pam/ endif::[] ifdef::backend-pdf,backend-epub3[] :include-path: ../../../../static/source/articles/pam/ include::../../../../shared/asciidoctor.adoc[] endif::[] endif::[] ifndef::env-beastie[] :include-path: ../../../../static/source/articles/pam/ include::../../../../../shared/asciidoctor.adoc[] endif::[] [.abstract-title] Аннотация В этой статье описываются принципы и механизмы, лежащие в основе библиотеки Подключаемых Модулей Аутентификации (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. учётная запись (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, shell] .... % 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, shell] .... % 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 о том, что работа с ней завершена и какие-либо выделенные в течение сеанса ресурсы можно освободить. +. Наконец, сервер вызывает функцию 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, shell] .... # cd /etc/pam.d # ln -s su sudo .... Это работает, потому что имя сервиса определяется именем файла, а не его указанием в файле политики, так что один и тот же файл может использоваться для нескольких сервисов с разными названиями. Так как политика каждого сервиса хранится в отдельном файле, то механизм [.filename]#pam.d# делает установку дополнительных политик для программных пакетов сторонних разработчиков очень лёгкой задачей. [[pam-config-file-order]] ==== Порядок поиска политик Как вы видели выше, политики PAM могут находиться в нескольких местах. Что будет, если политики для одного и того же сервиса имеются в разных местах? Необходимо осознать, что система конфигурации PAM ориентирована на цепочки. [[pam-config-breakdown]] === Структура строки настройки Как это объяснено в <>, каждая строка файла [.filename]#/etc/pam.conf# состоит из четырёх или большего количества полей: имени сервиса, имени подсистемы, управляющего флага, имени модуля и дополнительных параметров модуля, которые могут отсутствовать. Имя сервиса обычно (хотя не всегда) является именем приложения, которое этот сервис обслуживает. Если вы не уверены, обратитесь к документации по конкретному приложению для определения используемого имени сервиса. Заметьте, что если вы используете [.filename]#/etc/pam.d/# вместо [.filename]#/etc/pam.conf#, то имя сервиса задается именем файла политики, и опускается из строк настройки, которые в таком случае начинаются с названия подсистемы. Имя подсистемы представляет собой одно из четырёх ключевых слов, описанных в <>. Точно также управляющий флаг является одним из четырёх ключевых слов, описанных в разделе crossref:pam[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-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, вам необходимо будет создать собственную функцию взаимодействия. Надёжную функцию взаимодействия неожиданно трудно написать; та, что находится в <>, хороша в качестве отправной точки, но в реальных приложениях использоваться не может. [.programlisting] .... include::{include-path}su.c[] .... :sectnums!: [appendix] [[pam-sample-module]] == Пример PAM-модуля Далее приведена минимальная реализация man:pam_unix[8], предоставляющая только сервисы аутентификации. Она должна строиться и работать с большинством из реализаций PAM, но использует возможности расширений OpenPAM, если они присутствуют: отметьте использование функции man:pam_get_authtok[3], которая кардинально упрощает организацию ввода пароля пользователем. [.programlisting] .... include::{include-path}pam_unix.c[] .... :sectnums!: [appendix] [[pam-sample-conv]] == Пример функции взаимодействия PAM Функция взаимодействия, приводимая ниже, является значительно упрощённой версией функции man:openpam_ttyconv[3] из OpenPAM. Она полнофункциональна, и должна послужить источником идей о том, как должна себя вести функция взаимодействия, однако она слишком проста для реальных приложений. Даже если вы не используете OpenPAM, можете сгрузить исходный код и использовать man:openpam_ttyconv[3] в своих целях; мы надеемся, что она достаточно надёжна в качестве функции для взаимодействия с терминальными устройствами. [.programlisting] .... include::{include-path}converse.c[] .... :sectnums!: [[pam-further]] == Для дальнейшего ознакомления === Статьи Making Login Services Independent of Authentication Technologies Vipin Samar. Charlie Lai. Sun Microsystems. _link:https://pubs.opengroup.org/onlinepubs/8329799/toc.htm[X/Open Single Sign-on Preliminary Specification]_. The Open Group. 1-85912-144-6. June 1997. _link:https://mirrors.kernel.org/pub/linux/libs/pam/pre/doc/draft-morgan-pam-07.txt[Pluggable Authentication Modules]_. Andrew G. Morgan. 1999-10-06. === Руководства пользователя _link:https://docs.oracle.com/cd/E26505_01/html/E27224/pam-1.html[Администрирование PAM]_. Sun Microsystems. === Веб страницы _link:https://www.openpam.org/[Домащняя страница OpenPAM]_ Dag-Erling Smørgrav. ThinkSec AS. _link:http://www.kernel.org/pub/linux/libs/pam/[Домашняя страница Linux-PAM]_ Andrew Morgan. _Домашняя страница Solaris PAM (Solaris PAM homepage)_. Sun Microsystems. diff --git a/documentation/content/ru/articles/pam/_index.po b/documentation/content/ru/articles/pam/_index.po index abbcc5c8ab..3b2c2eee3c 100644 --- a/documentation/content/ru/articles/pam/_index.po +++ b/documentation/content/ru/articles/pam/_index.po @@ -1,2153 +1,2153 @@ # SOME DESCRIPTIVE TITLE # Copyright (C) YEAR The FreeBSD Project # This file is distributed under the same license as the FreeBSD Documentation package. # Vladlen Popolitov , 2025, 2026. msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2026-02-22 15:58+0000\n" -"PO-Revision-Date: 2026-03-08 09:11+0000\n" +"POT-Creation-Date: 2026-08-06 22:55+0100\n" +"PO-Revision-Date: 2026-05-18 04:45+0000\n" "Last-Translator: Vladlen Popolitov \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 4.17\n" #. type: YAML Front Matter: description #: documentation/content/en/articles/pam/_index.adoc:1 #, no-wrap msgid "A guide to the PAM system and modules under FreeBSD" msgstr "Руководство по системе PAM и модулям в FreeBSD" #. Copyright (c) 2001-2003 Networks Associates Technology, Inc. #. All rights reserved. #. This software was developed for the FreeBSD Project by ThinkSec AS and #. Network Associates Laboratories, the Security Research Division of #. Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 #. ("CBOSS"), as part of the DARPA CHATS research program. #. 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. #. 3. The name of the author may not be used to endorse or promote #. products derived from this software without specific prior written #. permission. #. 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. #. type: Title = #: documentation/content/en/articles/pam/_index.adoc:1 #: documentation/content/en/articles/pam/_index.adoc:45 #, no-wrap msgid "Pluggable Authentication Modules" msgstr "Подключаемые модули аутентификации (PAM)" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:81 +#: documentation/content/en/articles/pam/_index.adoc:80 msgid "Abstract" msgstr "Аннотация" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:83 +#: documentation/content/en/articles/pam/_index.adoc:82 msgid "" "This article describes the underlying principles and mechanisms of the " "Pluggable Authentication Modules (PAM) library, and explains how to " "configure PAM, how to integrate PAM into applications, and how to write PAM " "modules." msgstr "" "В этой статье описываются принципы и механизмы, лежащие в основе библиотеки " "Подключаемых Модулей Аутентификации (PAM - Pluggable Authentication " "Modules), и рассказывается, как настроить PAM, как интегрировать PAM в " "приложения и как создавать модули PAM." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:85 +#: documentation/content/en/articles/pam/_index.adoc:84 msgid "'''" msgstr "'''" #. type: Title == -#: documentation/content/en/articles/pam/_index.adoc:89 +#: documentation/content/en/articles/pam/_index.adoc:88 #, no-wrap msgid "Introduction" msgstr "Введение" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:92 +#: documentation/content/en/articles/pam/_index.adoc:91 msgid "" "The Pluggable Authentication Modules (PAM) library is a generalized API for " "authentication-related services which allows a system administrator to add " "new authentication methods simply by installing new PAM modules, and to " "modify authentication policies by editing configuration files." msgstr "" "Библиотека Pluggable Authentication Modules (PAM) является обобщённым API " "для служб, связанных с аутентификацией, которые позволяют системному " "администратору добавлять новые методы аутентификации простой установкой " "новых модулей PAM, и изменять политику аутентификации посредством " "редактирования конфигурационных файлов." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:96 +#: documentation/content/en/articles/pam/_index.adoc:95 msgid "" "PAM was defined and developed in 1995 by Vipin Samar and Charlie Lai of Sun " "Microsystems, and has not changed much since. In 1997, the Open Group " "published the X/Open Single Sign-on (XSSO) preliminary specification, which " "standardized the PAM API and added extensions for single (or rather " "integrated) sign-on. At the time of this writing, this specification has " "not yet been adopted as a standard." msgstr "" "PAM описали и разработали Vipin Samar и Charlie Lai из Sun Microsystems в " "1995 году, с тех он сильно не менялся. В 1997 году Open Group опубликовала " "предварительные спецификации на X/Open Single Sign-on (XSSO), что " "стандартизовало API для PAM и добавило расширения для одноразовой (или " "достаточно интегрированной) подписи. На момент написания этого документа эта " "спецификация ещё не была принята за стандарт." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:98 +#: documentation/content/en/articles/pam/_index.adoc:97 msgid "" "Although this article focuses primarily on FreeBSD 5.x, which uses OpenPAM, " "it should be equally applicable to FreeBSD 4.x, which uses Linux-PAM, and " "other operating systems such as Linux and Solaris(TM)." msgstr "" "Хотя эта статья посвящена в основном FreeBSD 5.x, в которой используется " "OpenPAM, она подойдёт для FreeBSD 4.x, использующей Linux-PAM, а также для " "других операционных систем, таких как Linux и Solaris(TM)." #. type: Title == -#: documentation/content/en/articles/pam/_index.adoc:100 +#: documentation/content/en/articles/pam/_index.adoc:99 #, no-wrap msgid "Terms and Conventions" msgstr "Термины и соглашения" #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:103 +#: documentation/content/en/articles/pam/_index.adoc:102 #, no-wrap msgid "Definitions" msgstr "Определения" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:110 +#: documentation/content/en/articles/pam/_index.adoc:109 msgid "" "The terminology surrounding PAM is rather confused. Neither Samar and Lai's " "original paper nor the XSSO specification made any attempt at formally " "defining terms for the various actors and entities involved in PAM, and the " "terms that they do use (but do not define) are sometimes misleading and " "ambiguous. The first attempt at establishing a consistent and unambiguous " "terminology was a whitepaper written by Andrew G. Morgan (author of Linux-" "PAM) in 1999. While Morgan's choice of terminology was a huge leap forward, " "it is in this author's opinion by no means perfect. What follows is an " "attempt, heavily inspired by Morgan, to define precise and unambiguous terms " "for all actors and entities involved in PAM." msgstr "" "Терминология, используемая в PAM, достаточно запутанна. Ни оригинальная " "работа Samar и Lai, ни спецификация XSSO не делают никаких попыток формально " "определить термины для различных объектов и участвующих в PAM сторон, а " "термины, которые они используют (но не определяют) иногда неверны и " "неоднозначны. Первой попыткой создать однозначную и непротиворечивую " "терминологию была работа, которую написал Andrew G. Morgan (автор Linux-PAM) " "в 1999 году. Хотя выбор терминологии, которую сделал Морган, был гигантским " "скачком вперёд, это, по мнению автора данной статьи, не означает её " "правильность. Далее делается попытка, в значительной степени на основе " "работы Моргана, дать точные и недвусмысленные определения терминов для всех " "участников и объектов PAM." #. type: Labeled list -#: documentation/content/en/articles/pam/_index.adoc:111 +#: documentation/content/en/articles/pam/_index.adoc:110 #, no-wrap msgid "account" msgstr "учётная запись (account)" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:113 +#: documentation/content/en/articles/pam/_index.adoc:112 msgid "The set of credentials the applicant is requesting from the arbitrator." msgstr "Набор полномочий, которые аппликант запрашивает от арбитратора." #. type: Labeled list -#: documentation/content/en/articles/pam/_index.adoc:114 +#: documentation/content/en/articles/pam/_index.adoc:113 #, no-wrap msgid "applicant" msgstr "аппликант (applicant)" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:116 +#: documentation/content/en/articles/pam/_index.adoc:115 msgid "The user or entity requesting authentication." msgstr "Пользователь или объект, запрашивающие аутентификацию." #. type: Labeled list -#: documentation/content/en/articles/pam/_index.adoc:117 +#: documentation/content/en/articles/pam/_index.adoc:116 #, no-wrap msgid "arbitrator" msgstr "арбитратор (arbitrator)" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:119 +#: documentation/content/en/articles/pam/_index.adoc:118 msgid "" "The user or entity who has the privileges necessary to verify the " "applicant's credentials and the authority to grant or deny the request." msgstr "" "Пользователь или объект, имеющий привилегии, достаточные для проверки " "полномочий аппликанта и права подтвердить или отклонить запрос." #. type: Labeled list -#: documentation/content/en/articles/pam/_index.adoc:120 +#: documentation/content/en/articles/pam/_index.adoc:119 #, no-wrap msgid "chain" msgstr "цепочка (chain)" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:123 +#: documentation/content/en/articles/pam/_index.adoc:122 msgid "" "A sequence of modules that will be invoked in response to a PAM request. " "The chain includes information about the order in which to invoke the " "modules, what arguments to pass to them, and how to interpret the results." msgstr "" "Последовательность модулей, которые будут вызваны в ответ на запрос PAM. В " "цепочку включена информация о последовательности вызовов модулей, " "аргументах, которые нужно им передать, и о том, как интерпретировать " "результаты." #. type: Labeled list -#: documentation/content/en/articles/pam/_index.adoc:124 +#: documentation/content/en/articles/pam/_index.adoc:123 #, no-wrap msgid "client" msgstr "клиент (client)" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:126 +#: documentation/content/en/articles/pam/_index.adoc:125 msgid "" "The application responsible for initiating an authentication request on " "behalf of the applicant and for obtaining the necessary authentication " "information from him." msgstr "" "Приложение, отвечающее за инициирование запроса на аутентификацию от имени " "аппликанта и получающее от него необходимую для аутентификации информацию." #. type: Labeled list -#: documentation/content/en/articles/pam/_index.adoc:127 +#: documentation/content/en/articles/pam/_index.adoc:126 #, no-wrap msgid "facility" msgstr "подсистема (facility)" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:129 +#: documentation/content/en/articles/pam/_index.adoc:128 msgid "" "One of the four basic groups of functionality provided by PAM: " "authentication, account management, session management and authentication " "token update." msgstr "" "Одна из четырёх основных групп функциональности, которые даёт PAM: " "аутентификация, управление учётными записями, управление сеансом и " "обновление ключом аутентификации." #. type: Labeled list -#: documentation/content/en/articles/pam/_index.adoc:130 +#: documentation/content/en/articles/pam/_index.adoc:129 #, no-wrap msgid "module" msgstr "модуль (module)" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:132 +#: documentation/content/en/articles/pam/_index.adoc:131 msgid "" "A collection of one or more related functions implementing a particular " "authentication facility, gathered into a single (normally dynamically " "loadable) binary file and identified by a single name." msgstr "" "Набор из одной или большего количества связанных функций, реализующих " "определённую подсистему аутентификации, собранный в один (обычно динамически " "загружаемый) двоичный файл, идентифицируемый по имени." #. type: Labeled list -#: documentation/content/en/articles/pam/_index.adoc:133 +#: documentation/content/en/articles/pam/_index.adoc:132 #, no-wrap msgid "policy" msgstr "политика (policy)" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:136 +#: documentation/content/en/articles/pam/_index.adoc:135 msgid "" "The complete set of configuration statements describing how to handle PAM " "requests for a particular service. A policy normally consists of four " "chains, one for each facility, though some services do not use all four " "facilities." msgstr "" "Полный набор конфигурационных деклараций, описывающих, как обрабатывать " "запросы PAM к определённой услуге. Политика обычно состоит из четырёх " "цепочек, по одной для каждой подсистемы, хотя некоторые службы используют не " "все четыре подсистемы." #. type: Labeled list -#: documentation/content/en/articles/pam/_index.adoc:137 +#: documentation/content/en/articles/pam/_index.adoc:136 #, no-wrap msgid "server" msgstr "сервер (server)" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:139 +#: documentation/content/en/articles/pam/_index.adoc:138 msgid "" "The application acting on behalf of the arbitrator to converse with the " "client, retrieve authentication information, verify the applicant's " "credentials and grant or deny requests." msgstr "" "Приложение, выступающее от имени арбитратора для общения с клиентом, " "запрашивания аутентификационной информации, проверки полномочий аппликанта и " "подтверждающее или отклоняющее запрос." #. type: Labeled list -#: documentation/content/en/articles/pam/_index.adoc:140 +#: documentation/content/en/articles/pam/_index.adoc:139 #, no-wrap msgid "service" msgstr "сервис (service)" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:143 +#: documentation/content/en/articles/pam/_index.adoc:142 msgid "" "A class of servers providing similar or related functionality and requiring " "similar authentication. PAM policies are defined on a per-service basis, so " "all servers that claim the same service name will be subject to the same " "policy." msgstr "" "Класс серверов, предоставляющих похожую или связанную функциональность, и " "требующую подобную аутентификацию. Политики PAM задаются на основе сервисов, " "так что ко всем серверам, объявляющим одно и тоже имя сервиса, будет " "применяться одна и та же политика." #. type: Labeled list -#: documentation/content/en/articles/pam/_index.adoc:144 +#: documentation/content/en/articles/pam/_index.adoc:143 #, no-wrap msgid "session" msgstr "сеанс (session)" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:147 +#: documentation/content/en/articles/pam/_index.adoc:146 msgid "" "The context within which service is rendered to the applicant by the " "server. One of PAM's four facilities, session management, is concerned " "exclusively with setting up and tearing down this context." msgstr "" "Контекст, в котором сервис оказывается аппликанту сервером. Одна из четырёх " "подсистем PAM, управление сеансом, касается исключительно настройке и " "очистке этого контекста." #. type: Labeled list -#: documentation/content/en/articles/pam/_index.adoc:148 +#: documentation/content/en/articles/pam/_index.adoc:147 #, no-wrap msgid "token" msgstr "ключ (token)" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:150 +#: documentation/content/en/articles/pam/_index.adoc:149 msgid "" "A chunk of information associated with the account, such as a password or " "passphrase, which the applicant must provide to prove his identity." msgstr "" "Блок информации, связанный с учётной записью, например, пароль или ключевая " "фраза, которую аппликант должен предоставить для своей идентификации." #. type: Labeled list -#: documentation/content/en/articles/pam/_index.adoc:151 +#: documentation/content/en/articles/pam/_index.adoc:150 #, no-wrap msgid "transaction" msgstr "транзакция (transaction)" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:153 +#: documentation/content/en/articles/pam/_index.adoc:152 msgid "" "A sequence of requests from the same applicant to the same instance of the " "same server, beginning with authentication and session set-up and ending " "with session tear-down." msgstr "" "Последовательность запросов от одного и того же аппликанта к одному и тому " "же экземпляру того же самого сервера, начиная с аутентификации и " "установления сеанса и заканчивая закрытием сеанса." #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:155 +#: documentation/content/en/articles/pam/_index.adoc:154 #, no-wrap msgid "Usage Examples" msgstr "Примеры использования" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:158 +#: documentation/content/en/articles/pam/_index.adoc:157 msgid "" "This section aims to illustrate the meanings of some of the terms defined " "above by way of a handful of simple examples." msgstr "" "Этот раздел предназначен для иллюстрации значений некоторых терминов, " "определённых выше, при помощи простых примеров." #. type: Title ==== -#: documentation/content/en/articles/pam/_index.adoc:159 +#: documentation/content/en/articles/pam/_index.adoc:158 #, no-wrap msgid "Client and Server Are One" msgstr "Объединенные клиент и сервер" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:162 +#: documentation/content/en/articles/pam/_index.adoc:161 msgid "This simple example shows `alice` man:su[1]'ing to `root`." msgstr "" "В этом простом примере показывается пользователь `alice`, выполняющий " "команду man:su[1] для того, чтобы стать пользователем `root`." #. type: delimited block . 4 -#: documentation/content/en/articles/pam/_index.adoc:167 +#: documentation/content/en/articles/pam/_index.adoc:166 #, no-wrap msgid "" "% whoami\n" "alice\n" msgstr "" "% whoami\n" "alice\n" #. type: delimited block . 4 -#: documentation/content/en/articles/pam/_index.adoc:170 +#: documentation/content/en/articles/pam/_index.adoc:169 #, no-wrap msgid "" "% ls -l `which su`\n" "-r-sr-xr-x 1 root wheel 10744 Dec 6 19:06 /usr/bin/su\n" msgstr "" "% ls -l `which su`\n" "-r-sr-xr-x 1 root wheel 10744 Dec 6 19:06 /usr/bin/su\n" #. type: delimited block . 4 -#: documentation/content/en/articles/pam/_index.adoc:175 +#: documentation/content/en/articles/pam/_index.adoc:174 #, no-wrap msgid "" "% su -\n" "Password: xi3kiune\n" "# whoami\n" "root\n" msgstr "" "% su -\n" "Password: xi3kiune\n" "# whoami\n" "root\n" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:178 +#: documentation/content/en/articles/pam/_index.adoc:177 msgid "The applicant is `alice`." msgstr "Аппликантом является `alice`." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:179 +#: documentation/content/en/articles/pam/_index.adoc:178 msgid "The account is `root`." msgstr "Учётной записью является `root`." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:180 +#: documentation/content/en/articles/pam/_index.adoc:179 msgid "The man:su[1] process is both client and server." msgstr "Процесс man:su[1] является как клиентом, так и сервером." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:181 +#: documentation/content/en/articles/pam/_index.adoc:180 msgid "The authentication token is `xi3kiune`." msgstr "Аутентификационным ключом является `xi3kiune`." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:182 +#: documentation/content/en/articles/pam/_index.adoc:181 msgid "The arbitrator is `root`, which is why man:su[1] is setuid `root`." msgstr "" "Арбитратором выступает `root`, и именно поэтому у команды man:su[1] " "выставлен бит выполнения с правами `root`." #. type: Title ==== -#: documentation/content/en/articles/pam/_index.adoc:183 +#: documentation/content/en/articles/pam/_index.adoc:182 #, no-wrap msgid "Client and Server Are Separate" msgstr "Клиент и сервер разделены" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:187 +#: documentation/content/en/articles/pam/_index.adoc:186 msgid "" "The example below shows `eve` try to initiate an man:ssh[1] connection to " "`login.example.com`, ask to log in as `bob`, and succeed. Bob should have " "chosen a better password!" msgstr "" "В примере ниже рассматривается пользователь `eve`, пытающийся установить man:" "ssh[1]-соединение с `login.example.com`, и успешно входя как пользователь " "`bob`. Боб должен был выбрать пароль получше!" #. type: delimited block . 4 -#: documentation/content/en/articles/pam/_index.adoc:192 +#: documentation/content/en/articles/pam/_index.adoc:191 #, no-wrap msgid "" "% whoami\n" "eve\n" msgstr "" "% whoami\n" "eve\n" #. type: delimited block . 4 -#: documentation/content/en/articles/pam/_index.adoc:200 +#: documentation/content/en/articles/pam/_index.adoc:199 #, no-wrap msgid "" "% ssh bob@login.example.com\n" "bob@login.example.com's password:\n" "% god\n" "Last login: Thu Oct 11 09:52:57 2001 from 192.168.0.1\n" "Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994\n" "\tThe Regents of the University of California. All rights reserved.\n" "FreeBSD 4.4-STABLE (LOGIN) 4: Tue Nov 27 18:10:34 PST 2001\n" msgstr "" "% ssh bob@login.example.com\n" "bob@login.example.com's password:\n" "% god\n" "Last login: Thu Oct 11 09:52:57 2001 from 192.168.0.1\n" "Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994\n" "\tThe Regents of the University of California. All rights reserved.\n" "FreeBSD 4.4-STABLE (LOGIN) 4: Tue Nov 27 18:10:34 PST 2001\n" #. type: delimited block . 4 -#: documentation/content/en/articles/pam/_index.adoc:203 +#: documentation/content/en/articles/pam/_index.adoc:202 #, no-wrap msgid "" "Welcome to FreeBSD!\n" "%\n" msgstr "" "Welcome to FreeBSD!\n" "%\n" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:207 +#: documentation/content/en/articles/pam/_index.adoc:206 msgid "The applicant is `eve`." msgstr "Аппликантом является `eve`." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:208 +#: documentation/content/en/articles/pam/_index.adoc:207 msgid "The client is Eve's man:ssh[1] process." msgstr "Клиентом является процесс man:ssh[1] пользователя Eve." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:209 +#: documentation/content/en/articles/pam/_index.adoc:208 msgid "The server is the man:sshd[8] process on `login.example.com`" msgstr "Сервером является процесс man:sshd[8] на машине `login.example.com`" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:210 +#: documentation/content/en/articles/pam/_index.adoc:209 msgid "The account is `bob`." msgstr "Учётной записью является `bob`." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:211 +#: documentation/content/en/articles/pam/_index.adoc:210 msgid "The authentication token is `god`." msgstr "Ключом аутентификации является `god`." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:212 +#: documentation/content/en/articles/pam/_index.adoc:211 msgid "Although this is not shown in this example, the arbitrator is `root`." msgstr "Хотя этого не видно в примере, но арбитратором является `root`." #. type: Title ==== -#: documentation/content/en/articles/pam/_index.adoc:213 +#: documentation/content/en/articles/pam/_index.adoc:212 #, no-wrap msgid "Sample Policy" msgstr "Пример политики" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:216 +#: documentation/content/en/articles/pam/_index.adoc:215 msgid "The following is FreeBSD's default policy for `sshd`:" msgstr "" "Следующее является политикой, используемой во FreeBSD по умолчанию для " "`sshd`:" #. type: delimited block . 4 -#: documentation/content/en/articles/pam/_index.adoc:225 +#: documentation/content/en/articles/pam/_index.adoc:224 #, no-wrap msgid "" "sshd\tauth\t\trequired\tpam_nologin.so\tno_warn\n" "sshd\tauth\t\trequired\tpam_unix.so\tno_warn try_first_pass\n" "sshd\taccount\t\trequired\tpam_login_access.so\n" "sshd\taccount\t\trequired\tpam_unix.so\n" "sshd\tsession\t\trequired\tpam_lastlog.so\tno_fail\n" "sshd\tpassword\trequired\tpam_permit.so\n" msgstr "" "sshd\tauth\t\trequired\tpam_nologin.so\tno_warn\n" "sshd\tauth\t\trequired\tpam_unix.so\tno_warn try_first_pass\n" "sshd\taccount\t\trequired\tpam_login_access.so\n" "sshd\taccount\t\trequired\tpam_unix.so\n" "sshd\tsession\t\trequired\tpam_lastlog.so\tno_fail\n" "sshd\tpassword\trequired\tpam_permit.so\n" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:228 +#: documentation/content/en/articles/pam/_index.adoc:227 msgid "" "This policy applies to the `sshd` service (which is not necessarily " "restricted to the man:sshd[8] server.)" msgstr "" "Эта политика применяется к службе `sshd` (что не обязательно ограничено " "сервером man:sshd[8])." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:229 +#: documentation/content/en/articles/pam/_index.adoc:228 msgid "`auth`, `account`, `session` and `password` are facilities." msgstr "`auth`, `account`, `session` и `password` являются подсистемами." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:230 +#: documentation/content/en/articles/pam/_index.adoc:229 msgid "" "[.filename]#pam_nologin.so#, [.filename]#pam_unix.so#, [." "filename]#pam_login_access.so#, [.filename]#pam_lastlog.so# and [." "filename]#pam_permit.so# are modules. It is clear from this example that [." "filename]#pam_unix.so# provides at least two facilities (authentication and " "account management.)" msgstr "" "[.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# реализует по крайней мере две подсистемы " "(аутентификацию и управление учётными записями)." #. type: Title == -#: documentation/content/en/articles/pam/_index.adoc:232 +#: documentation/content/en/articles/pam/_index.adoc:231 #, no-wrap msgid "PAM Essentials" msgstr "Основы PAM" #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:235 +#: documentation/content/en/articles/pam/_index.adoc:234 #, no-wrap msgid "Facilities and Primitives" msgstr "Подсистемы и примитивы" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:238 +#: documentation/content/en/articles/pam/_index.adoc:237 msgid "" "The PAM API offers six different authentication primitives grouped in four " "facilities, which are described below." msgstr "" "API для PAM предоставляет шесть различных примитивов для аутентификации, " "сгруппированных в четыре подсистемы, каждая из которых описывается ниже." #. type: Labeled list -#: documentation/content/en/articles/pam/_index.adoc:239 +#: documentation/content/en/articles/pam/_index.adoc:238 #, no-wrap msgid "`auth`" msgstr "`auth`" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:242 +#: documentation/content/en/articles/pam/_index.adoc:241 msgid "" "_Authentication._ This facility concerns itself with authenticating the " "applicant and establishing the account credentials. It provides two " "primitives:" msgstr "" "_Аутентификация._ Эта подсистема, собственно говоря, реализует " "аутентификацию аппликанта и выяснение полномочий учётной записи. Она " "предоставляет два примитива:" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:244 +#: documentation/content/en/articles/pam/_index.adoc:243 msgid "" "man:pam_authenticate[3] authenticates the applicant, usually by requesting " "an authentication token and comparing it with a value stored in a database " "or obtained from an authentication server." msgstr "" "Функция man:pam_authenticate[3] аутентифицирует аппликанта, обычно " "запрашивая аутентификационный ключ и сравнивая его со значением, хранящимся " "в базе данных или получаемым от сервера аутентификации." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:245 +#: documentation/content/en/articles/pam/_index.adoc:244 msgid "" "man:pam_setcred[3] establishes account credentials such as user ID, group " "membership and resource limits." msgstr "" "Функция man:pam_setcred[3] устанавливает полномочия учётной записи, такие, " "как идентификатор пользователя, членство в группах и ограничения на " "использование ресурсов." #. type: Labeled list -#: documentation/content/en/articles/pam/_index.adoc:246 +#: documentation/content/en/articles/pam/_index.adoc:245 #, no-wrap msgid "`account`" msgstr "`account`" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:249 +#: documentation/content/en/articles/pam/_index.adoc:248 msgid "" "_Account management._ This facility handles non-authentication-related " "issues of account availability, such as access restrictions based on the " "time of day or the server's work load. It provides a single primitive:" msgstr "" "_Управление учётной записью._ Эта подсистема обрабатывает вопросы " "доступности учётной записи, не связанные с аутентификацией, такие как " "ограничения в доступе на основе времени суток или загрузки сервера. Он " "предоставляет единственный примитив:" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:251 +#: documentation/content/en/articles/pam/_index.adoc:250 msgid "man:pam_acct_mgmt[3] verifies that the requested account is available." msgstr "" "Функция man:pam_acct_mgmt[3] проверяет, доступна ли запрашиваемая учётная " "запись." #. type: Labeled list -#: documentation/content/en/articles/pam/_index.adoc:252 +#: documentation/content/en/articles/pam/_index.adoc:251 #, no-wrap msgid "`session`" msgstr "`session`" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:255 +#: documentation/content/en/articles/pam/_index.adoc:254 msgid "" "_Session management._ This facility handles tasks associated with session " "set-up and tear-down, such as login accounting. It provides two primitives:" msgstr "" "_Управление сеансом._ Эта подсистема отрабатывает задачи, связанные с " "установлением и закрытием сеанса, такие как учёт входов пользователей. Она " "предоставляет два примитива:" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:257 +#: documentation/content/en/articles/pam/_index.adoc:256 msgid "" "man:pam_open_session[3] performs tasks associated with session set-up: add " "an entry in the [.filename]#utmp# and [.filename]#wtmp# databases, start an " "SSH agent, etc." msgstr "" "Функция man:pam_open_session[3] выполняет действия, связанные с " "установлением сеанса: добавление записей в базы данных [.filename]#utmp# и [." "filename]#wtmp#, запуск агента SSH и так далее." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:258 +#: documentation/content/en/articles/pam/_index.adoc:257 msgid "" "man:pam_close_session[3] performs tasks associated with session tear-down: " "add an entry in the [.filename]#utmp# and [.filename]#wtmp# databases, stop " "the SSH agent, etc." msgstr "" "Функция man:pam_close_session[3] выполняет действия, связанные с закрытием " "сеанса: добавление записей в базы данных [.filename]#utmp# и [." "filename]#wtmp#, завершение работы агента SSH и так далее." #. type: Labeled list -#: documentation/content/en/articles/pam/_index.adoc:259 +#: documentation/content/en/articles/pam/_index.adoc:258 #, no-wrap msgid "`password`" msgstr "`password`" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:262 +#: documentation/content/en/articles/pam/_index.adoc:261 msgid "" "_Password management._ This facility is used to change the authentication " "token associated with an account, either because it has expired or because " "the user wishes to change it. It provides a single primitive:" msgstr "" "_Управление паролем._ Эта подсистема используется для изменения ключа " "аутентификации, связанного с учётной записью, по причине истечения его срока " "действия или желания пользователя изменить его. Она предоставляет " "единственный примитив:" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:264 +#: documentation/content/en/articles/pam/_index.adoc:263 msgid "" "man:pam_chauthtok[3] changes the authentication token, optionally verifying " "that it is sufficiently hard to guess, has not been used previously, etc." msgstr "" "Функция man:pam_chauthtok[3] изменяет ключ аутентификации, опционально " "проверяя, что он труден для подбора, не использовался ранее и так далее." #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:266 +#: documentation/content/en/articles/pam/_index.adoc:265 #, no-wrap msgid "Modules" msgstr "Модули" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:271 +#: documentation/content/en/articles/pam/_index.adoc:270 msgid "" "Modules are a very central concept in PAM; after all, they are the \"M\" in " "\"PAM\". A PAM module is a self-contained piece of program code that " "implements the primitives in one or more facilities for one particular " "mechanism; possible mechanisms for the authentication facility, for " "instance, include the UNIX(R) password database, NIS, LDAP and Radius." msgstr "" "Модули являются центральной концепцией в PAM; в конце концов, им " "соответствует буква \"M\" в сокращении \"PAM\". Модуль PAM представляет " "собой самодостаточный кусок программного кода, который реализует примитивы " "одной или большего количества подсистем одного конкретного механизма; к " "возможным механизмам для подсистемы аутентификации, к примеру, относятся " "базы данных паролей UNIX(R), системы NIS, LDAP или Radius." #. type: Title ==== -#: documentation/content/en/articles/pam/_index.adoc:273 +#: documentation/content/en/articles/pam/_index.adoc:272 #, no-wrap msgid "Module Naming" msgstr "Именование модулей" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:278 +#: documentation/content/en/articles/pam/_index.adoc:277 msgid "" "FreeBSD implements each mechanism in a single module, named `pam_mechanism." "so` (for instance, `pam_unix.so` for the UNIX(R) mechanism.) Other " "implementations sometimes have separate modules for separate facilities, and " "include the facility name as well as the mechanism name in the module name. " "To name one example, Solaris(TM) has a `pam_dial_auth.so.1` module which is " "commonly used to authenticate dialup users." msgstr "" "Во FreeBSD каждый механизм реализуется в отдельном модуле с именем " "`pam_mechanism.so` (например, `pam_unix.so` для механизма UNIX(R).) В других " "реализациях иногда отдельные модули используются для разных подсистем, и в " "их имя включается, кроме названия механизма, и имя подсистемы. К примеру, в " "Solaris(TM) имеется модуль `pam_dial_auth.so.1`, который часто используется " "для аутентификации пользователей, работающих по коммутируемым каналам связи." #. type: Title ==== -#: documentation/content/en/articles/pam/_index.adoc:280 +#: documentation/content/en/articles/pam/_index.adoc:279 #, no-wrap msgid "Module Versioning" msgstr "Версии модулей" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:284 +#: documentation/content/en/articles/pam/_index.adoc:283 msgid "" "FreeBSD's original PAM implementation, based on Linux-PAM, did not use " "version numbers for PAM modules. This would commonly cause problems with " "legacy applications, which might be linked against older versions of the " "system libraries, as there was no way to load a matching version of the " "required modules." msgstr "" "Изначальная реализация PAM во FreeBSD, которая была основана на Linux-PAM, " "не использовала номера версий для модулей PAM. Это будет приводить к " "проблемам при работе унаследованных приложений, которые могут быть " "скомпонованы со старыми версиями системных библиотек, так как способа " "подгрузить соответствующую версию требуемых модулей нет." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:287 +#: documentation/content/en/articles/pam/_index.adoc:286 msgid "" "OpenPAM, on the other hand, looks for modules that have the same version " "number as the PAM library (currently 2), and only falls back to an " "unversioned module if no versioned module could be loaded. Thus legacy " "modules can be provided for legacy applications, while allowing new (or " "newly built) applications to take advantage of the most recent modules." msgstr "" "OpenPAM, с другой стороны, ищет модули, которые имеют тот же самый номер " "версии, что и библиотека PAM (на данный момент 2), и использует модуль без " "версии, только если модуль с известной версией не был загружен. Поэтому для " "старых приложений могут предоставляться старые модули, при этом новые (или " "заново построенные) приложения будут использовать все возможности последних " "версий модулей." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:289 +#: documentation/content/en/articles/pam/_index.adoc:288 msgid "" "Although Solaris(TM) PAM modules commonly have a version number, they are " "not truly versioned, because the number is a part of the module name and " "must be included in the configuration." msgstr "" "Хотя модули PAM в Solaris(TM) имеют номер версии, по-настоящему номер версии " "в них не отслеживается, потому что номер является частью имени и должен " "включаться в конфигурацию." #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:291 +#: documentation/content/en/articles/pam/_index.adoc:290 #, no-wrap msgid "Chains and Policies" msgstr "Цепочки и политики" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:296 +#: documentation/content/en/articles/pam/_index.adoc:295 msgid "" "When a server initiates a PAM transaction, the PAM library tries to load a " "policy for the service specified in the man:pam_start[3] call. The policy " "specifies how authentication requests should be processed, and is defined in " "a configuration file. This is the other central concept in PAM: the " "possibility for the admin to tune the system security policy (in the wider " "sense of the word) simply by editing a text file." msgstr "" "Когда сервер инициирует PAM-транзакцию, библиотека PAM пытается загрузить " "политику для службы, указанной при вызове функции man:pam_start[3]. Политика " "определяет, как должны обрабатываться запросы на аутентификацию, и задаётся " "в конфигурационном файле. Это составляет другую основополагающую концепцию " "PAM: возможность администратору настраивать политику безопасности системы (в " "самом широком её понимании) простым редактированием текстового файла." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:299 +#: documentation/content/en/articles/pam/_index.adoc:298 msgid "" "A policy consists of four chains, one for each of the four PAM facilities. " "Each chain is a sequence of configuration statements, each specifying a " "module to invoke, some (optional) parameters to pass to the module, and a " "control flag that describes how to interpret the return code from the module." msgstr "" "Политика состоит из четырёх цепочек, по одной на каждый из методов PAM. " "Каждое звено представляет собой последовательность конфигурационных " "утверждений, задающих вызываемый модуль, некоторые (необязательные) " "параметры для передачи в модуль, и управляющий флаг, описывающий, как " "интерпретировать возвращаемый из модуля код." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:302 +#: documentation/content/en/articles/pam/_index.adoc:301 msgid "" "Understanding the control flags is essential to understanding PAM " "configuration files. There are five different control flags:" msgstr "" "Понимание смысла управляющего флага необходимо для понимания " "конфигурационных файлов PAM. Существуют пять различных управляющих флагов:" #. type: Labeled list -#: documentation/content/en/articles/pam/_index.adoc:303 +#: documentation/content/en/articles/pam/_index.adoc:302 #, no-wrap msgid "`binding`" msgstr "`binding`" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:306 +#: documentation/content/en/articles/pam/_index.adoc:305 msgid "" "If the module succeeds and no earlier module in the chain has failed, the " "chain is immediately terminated and the request is granted. If the module " "fails, the rest of the chain is executed, but the request is ultimately " "denied." msgstr "" "Если модуль отработал успешно, и ни один из предыдущих модулей в цепочке не " "сработал отрицательно, то цепочка прерывается, а запрос подтверждается. Если " "же модуль отработает неудачно, то выполняется оставшаяся часть цепочки, " "однако запрос отвергается." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:308 +#: documentation/content/en/articles/pam/_index.adoc:307 msgid "" "This control flag was introduced by Sun in Solaris(TM) 9 (SunOS(TM) 5.9), " "and is also supported by OpenPAM." msgstr "" "Этот управляющий флаг был добавлен компанией Sun в Solaris(TM) 9 (SunOS(TM) " "5.9), и поддерживается в OpenPAM." #. type: Labeled list -#: documentation/content/en/articles/pam/_index.adoc:308 +#: documentation/content/en/articles/pam/_index.adoc:307 #, no-wrap msgid "`required`" msgstr "`required`" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:311 +#: documentation/content/en/articles/pam/_index.adoc:310 msgid "" "If the module succeeds, the rest of the chain is executed, and the request " "is granted unless some other module fails. If the module fails, the rest of " "the chain is also executed, but the request is ultimately denied." msgstr "" "Если модуль возвратил положительный ответ, выполняется оставшаяся часть " "цепочки, запрос удовлетворяется, если никакой другой модуль не отработает " "отрицательно. Если же модуль возвратит отрицательный ответ, остаток цепочки " "тоже отрабатывается, но запрос отвергается." #. type: Labeled list -#: documentation/content/en/articles/pam/_index.adoc:312 +#: documentation/content/en/articles/pam/_index.adoc:311 #, no-wrap msgid "`requisite`" msgstr "`requisite`" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:315 +#: documentation/content/en/articles/pam/_index.adoc:314 msgid "" "If the module succeeds, the rest of the chain is executed, and the request " "is granted unless some other module fails. If the module fails, the chain " "is immediately terminated and the request is denied." msgstr "" "Если модуль возвращает положительный ответ, выполняется оставшаяся часть " "цепочки, запрос удовлетворяется, если никакой другой модуль не отработает " "отрицательно. Если же модуль отрабатывает отрицательно, то отработка цепочки " "немедленно прекращается, а запрос отвергается." #. type: Labeled list -#: documentation/content/en/articles/pam/_index.adoc:316 +#: documentation/content/en/articles/pam/_index.adoc:315 #, no-wrap msgid "`sufficient`" msgstr "`sufficient`" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:319 +#: documentation/content/en/articles/pam/_index.adoc:318 msgid "" "If the module succeeds and no earlier module in the chain has failed, the " "chain is immediately terminated and the request is granted. If the module " "fails, the module is ignored and the rest of the chain is executed." msgstr "" "Если модуль возвратит положительный ответ, и ни один из предыдущих модулей в " "цепочке на отработал отрицательно, то отработка цепочки немедленно " "прекращается, а запрос удовлетворяется. Если модуль отработал отрицательно, " "то результат игнорируется и цепочка отрабатывается дальше." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:321 +#: documentation/content/en/articles/pam/_index.adoc:320 msgid "" "As the semantics of this flag may be somewhat confusing, especially when it " "is used for the last module in a chain, it is recommended that the `binding` " "control flag be used instead if the implementation supports it." msgstr "" "Так как семантика этого флага может оказаться запутанной, особенно при его " "использовании с последним модулем в цепочке, рекомендуется вместо него " "использовать управляющий флаг `binding`, если реализация его поддерживает." #. type: Labeled list -#: documentation/content/en/articles/pam/_index.adoc:321 +#: documentation/content/en/articles/pam/_index.adoc:320 #, no-wrap msgid "`optional`" msgstr "`optional`" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:324 +#: documentation/content/en/articles/pam/_index.adoc:323 msgid "" "The module is executed, but its result is ignored. If all modules in a " "chain are marked `optional`, all requests will always be granted." msgstr "" "Модуль отрабатывается, но результат выполнения игнорируется. Если все модули " "в цепочке помечены как `optional`, то удовлетворяться будут все запросы." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:327 +#: documentation/content/en/articles/pam/_index.adoc:326 msgid "" "When a server invokes one of the six PAM primitives, PAM retrieves the chain " "for the facility the primitive belongs to, and invokes each of the modules " "listed in the chain, in the order they are listed, until it reaches the end, " "or determines that no further processing is necessary (either because a " "`binding` or `sufficient` module succeeded, or because a `requisite` module " "failed.) The request is granted if and only if at least one module was " "invoked, and all non-optional modules succeeded." msgstr "" "Когда сервер вызывает один из шести PAM-примитивов, PAM запрашивает цепочку " "подсистемы, к которой принадлежит примитив, и запускает каждый модуль, " "перечисленный в цепочке в порядке их перечисления, пока список не будет " "исчерпан либо не будет определено, что дальнейшей обработки не нужно (по " "причине достижение модуля, вернувшего положительный ответ при условии " "`binding` или `sufficient`, либо отрицательный с условием `requisite`). " "Запрос подтверждается, если только был вызван по крайней мере один модуль, и " "все неопциональные модули вернули положительный ответ." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:331 +#: documentation/content/en/articles/pam/_index.adoc:330 msgid "" "Note that it is possible, though not very common, to have the same module " "listed several times in the same chain. For instance, a module that looks " "up user names and passwords in a directory server could be invoked multiple " "times with different parameters specifying different directory servers to " "contact. PAM treat different occurrences of the same module in the same " "chain as different, unrelated modules." msgstr "" "Заметьте, что возможно, хотя это не распространено, перечислять один и тот " "же модуль несколько раз в одной цепочке. К примеру, модуль, просматривающий " "имена и пароли пользователя в сервере каталога может быть вызван несколько " "раз с различными параметрами, задающими различные серверы каталогов для " "связи. PAM считает различные появления одного модуля в той же самой цепочке " "разными и не связанными модулями." #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:333 +#: documentation/content/en/articles/pam/_index.adoc:332 #, no-wrap msgid "Transactions" msgstr "Транзакции" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:337 +#: documentation/content/en/articles/pam/_index.adoc:336 msgid "" "The lifecycle of a typical PAM transaction is described below. Note that if " "any of these steps fails, the server should report a suitable error message " "to the client and abort the transaction." msgstr "" "Жизненный цикл типичной PAM-транзакции описан ниже. Заметьте, что в случае, " "если любой из перечисленных шагов оканчивается неудачно, сервер должен " "выдать клиенту соответствующее сообщение об ошибке и прервать транзакцию." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:339 +#: documentation/content/en/articles/pam/_index.adoc:338 msgid "" "If necessary, the server obtains arbitrator credentials through a mechanism " "independent of PAM-most commonly by virtue of having been started by `root`, " "or of being setuid `root`." msgstr "" "Если это необходимо, сервер получает полномочия арбитратора через " "независимый от PAM механизм-чаще всего по факту запуска пользователем `root` " "или с установленным setuid-битом `root`." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:340 +#: documentation/content/en/articles/pam/_index.adoc:339 msgid "" "The server calls man:pam_start[3] to initialize the PAM library and specify " "its service name and the target account, and register a suitable " "conversation function." msgstr "" "Сервер вызывает функцию man:pam_start[3] для инициализации библиотеки PAM и " "задания имени сервиса и целевой учётной записи, а также регистрации " "подходящего способа общения." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:341 +#: documentation/content/en/articles/pam/_index.adoc:340 msgid "" "The server obtains various information relating to the transaction (such as " "the applicant's user name and the name of the host the client runs on) and " "submits it to PAM using man:pam_set_item[3]." msgstr "" "Сервер получает различную информацию, относящуюся к транзакции (такую, как " "имя пользователя аппликанта и имя хоста, на котором запущен клиент), и " "отправляет её в PAM при помощи функции man:pam_set_item[3]." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:342 +#: documentation/content/en/articles/pam/_index.adoc:341 msgid "The server calls man:pam_authenticate[3] to authenticate the applicant." msgstr "" "Сервер вызывает функцию man:pam_authenticate[3] для аутентификации " "аппликанта." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:343 +#: documentation/content/en/articles/pam/_index.adoc:342 msgid "" "The server calls man:pam_acct_mgmt[3] to verify that the requested account " "is available and valid. If the password is correct but has expired, man:" "pam_acct_mgmt[3] will return `PAM_NEW_AUTHTOK_REQD` instead of `PAM_SUCCESS`." msgstr "" "Сервер вызывает функцию man:pam_acct_mgmt[3] для проверки того, что " "запрошенная учётная запись доступна и корректна. Если пароль верен, но его " "срок истёк, man:pam_acct_mgmt[3] возвратит результат `PAM_NEW_AUTHTOK_REQD`, " "а не `PAM_SUCCESS`." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:344 +#: documentation/content/en/articles/pam/_index.adoc:343 msgid "" "If the previous step returned `PAM_NEW_AUTHTOK_REQD`, the server now calls " "man:pam_chauthtok[3] to force the client to change the authentication token " "for the requested account." msgstr "" "Если на предыдущем шаге был получен результат `PAM_NEW_AUTHTOK_REQD`, то " "сервер вызывает функцию man:pam_chauthtok[3] для того, чтобы вынудить " "клиента изменить ключ аутентификации для запрошенной учётной записи." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:345 +#: documentation/content/en/articles/pam/_index.adoc:344 msgid "" "Now that the applicant has been properly authenticated, the server calls man:" "pam_setcred[3] to establish the credentials of the requested account. It is " "able to do this because it acts on behalf of the arbitrator, and holds the " "arbitrator's credentials." msgstr "" "Теперь, когда аппликант полностью аутентифицирован, сервер вызывает функцию " "man:pam_setcred[3] для получения полномочий запрошенной учётной записи. " "Сделать это возможно, потому что он работает как арбитратор, и оставляет за " "собой полномочия арбитратора." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:346 +#: documentation/content/en/articles/pam/_index.adoc:345 msgid "" "Once the correct credentials have been established, the server calls man:" "pam_open_session[3] to set up the session." msgstr "" "После получения необходимых полномочий, сервер вызывает функцию man:" "pam_open_session[3] для установления сеанса." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:347 +#: documentation/content/en/articles/pam/_index.adoc:346 msgid "" "The server now performs whatever service the client requested-for instance, " "provide the applicant with a shell." msgstr "" "Теперь сервер выполняет тот сервис, который затребовал клиент-например, " "предоставляет аппликанту оболочку." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:348 +#: documentation/content/en/articles/pam/_index.adoc:347 msgid "" "Once the server is done serving the client, it calls man:" "pam_close_session[3] to tear down the session." msgstr "" "После того, как сервер закончил обслуживание клиента, он вызывает функцию " "man:pam_close_session[3] для закрытия сеанса." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:349 +#: documentation/content/en/articles/pam/_index.adoc:348 msgid "" "Finally, the server calls man:pam_end[3] to notify the PAM library that it " "is done and that it can release whatever resources it has allocated in the " "course of the transaction." msgstr "" "Наконец, сервер вызывает функцию man:pam_end[3] для оповещения библиотеки " -"PAM о том, что работа с ней завершена и какие-либо выделенные в течение " +"PAM о том, что работа с ней завершена и какие-либо выделённые в течение " "сеанса ресурсы можно освободить." #. type: Title == -#: documentation/content/en/articles/pam/_index.adoc:351 +#: documentation/content/en/articles/pam/_index.adoc:350 #, no-wrap msgid "PAM Configuration" msgstr "Настройка PAM" #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:354 +#: documentation/content/en/articles/pam/_index.adoc:353 #, no-wrap msgid "PAM Policy Files" msgstr "Файлы политик PAM" #. type: Title ==== -#: documentation/content/en/articles/pam/_index.adoc:357 +#: documentation/content/en/articles/pam/_index.adoc:356 #, no-wrap msgid "The [.filename]#/etc/pam.conf#" msgstr "Файл [.filename]#/etc/pam.conf#" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:362 +#: documentation/content/en/articles/pam/_index.adoc:361 msgid "" "The traditional PAM policy file is [.filename]#/etc/pam.conf#. This file " "contains all the PAM policies for your system. Each line of the file " "describes one step in a chain, as shown below:" msgstr "" "Традиционно файлом политик PAM является [.filename]#/etc/pam.conf#. Он " "содержит все политики PAM для вашей системы. Каждая строка файла описывает " "один шаг в цепочке, как показано ниже:" #. type: delimited block . 4 -#: documentation/content/en/articles/pam/_index.adoc:366 +#: documentation/content/en/articles/pam/_index.adoc:365 #, no-wrap msgid "login auth required pam_nologin.so no_warn\n" msgstr "login auth required pam_nologin.so no_warn\n" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:370 +#: documentation/content/en/articles/pam/_index.adoc:369 msgid "" "The fields are, in order: service name, facility name, control flag, module " "name, and module arguments. Any additional fields are interpreted as " "additional module arguments." msgstr "" "Поля следуют в таком порядке: имя службы, имя подсистемы, управляющий флаг, " "имя модуля и параметры модуля. Любые дополнительные поля интерпретируются " "как дополнительные параметры модуля." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:374 +#: documentation/content/en/articles/pam/_index.adoc:373 msgid "" "A separate chain is constructed for each service / facility pair, so while " "the order in which lines for the same service and facility appear is " "significant, the order in which the individual services and facilities are " "listed is not. The examples in the original PAM paper grouped configuration " "lines by facility, and the Solaris(TM) stock [.filename]#pam.conf# still " "does that, but FreeBSD's stock configuration groups configuration lines by " "service. Either way is fine; either way makes equal sense." msgstr "" "Для каждой пары сервис/подсистема составляется отдельная цепочка, и тогда " "получается, что, хотя порядок следования строк для одной и той же услуги и " "подсистемы является значимым, порядок перечисления отдельных сервисов не " "значим. В примерах из оригинальной работы по PAM строки конфигурации " "сгруппированы по подсистемам, в поставляемом с Solaris(TM) файле [." "filename]#pam.conf# именно так и сделано, но в стандартном конфигурационном " "файле из поставки FreeBSD строки настроек сгруппированы по сервисам. " "Подходит любой из этих способов; они имеют один и тот же смысл." #. type: Title ==== -#: documentation/content/en/articles/pam/_index.adoc:376 +#: documentation/content/en/articles/pam/_index.adoc:375 #, no-wrap msgid "The [.filename]#/etc/pam.d#" msgstr "Каталог [.filename]#/etc/pam.d#" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:381 +#: documentation/content/en/articles/pam/_index.adoc:380 msgid "" "OpenPAM and Linux-PAM support an alternate configuration mechanism, which is " "the preferred mechanism in FreeBSD. In this scheme, each policy is " "contained in a separate file bearing the name of the service it applies to. " "These files are stored in [.filename]#/etc/pam.d/#." msgstr "" "OpenPAM и Linux-PAM поддерживают альтернативный механизм настройки, который " "для FreeBSD является предпочтительным. В этой схеме каждая политика " "содержится в отдельном файле с именем, соответствующем сервису, к которому " "она применяется. Эти файлы размещаются в каталоге [.filename]#/etc/pam.d/#." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:384 +#: documentation/content/en/articles/pam/_index.adoc:383 msgid "" "These per-service policy files have only four fields instead of [." "filename]#pam.conf#'s five: the service name field is omitted. Thus, " "instead of the sample [.filename]#pam.conf# line from the previous section, " "one would have the following line in [.filename]#/etc/pam.d/login#:" msgstr "" "Такие файлы политик, ориентированные на сервисы, имеют только четыре поля, " "вместо пяти полей в файле [.filename]#pam.conf#: поле имени сервиса опущено. " "Таким образом, вместо примера строки файла [.filename]#pam.conf# из " "предыдущего раздела получится следующая строка в файле [.filename]#/etc/pam." "d/login#:" #. type: delimited block . 4 -#: documentation/content/en/articles/pam/_index.adoc:388 +#: documentation/content/en/articles/pam/_index.adoc:387 #, no-wrap msgid "auth required pam_nologin.so no_warn\n" msgstr "auth required pam_nologin.so no_warn\n" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:392 +#: documentation/content/en/articles/pam/_index.adoc:391 msgid "" "As a consequence of this simplified syntax, it is possible to use the same " "policy for multiple services by linking each service name to a same policy " "file. For instance, to use the same policy for the `su` and `sudo` " "services, one could do as follows:" msgstr "" "Как следствие такого упрощённого синтаксиса, возможно использование одних и " "тех же политик для нескольких сервисов, связывая каждое имя сервиса с тем же " "самым файлом политик. К примеру, для использования той же самой политики для " "сервисов `su` и `sudo`, можно сделать следующее:" #. type: delimited block . 4 -#: documentation/content/en/articles/pam/_index.adoc:397 +#: documentation/content/en/articles/pam/_index.adoc:396 #, no-wrap msgid "" "# cd /etc/pam.d\n" "# ln -s su sudo\n" msgstr "" "# cd /etc/pam.d\n" "# ln -s su sudo\n" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:400 +#: documentation/content/en/articles/pam/_index.adoc:399 msgid "" "This works because the service name is determined from the file name rather " "than specified in the policy file, so the same file can be used for multiple " "differently-named services." msgstr "" "Это работает, потому что имя сервиса определяется именем файла, а не его " "указанием в файле политики, так что один и тот же файл может использоваться " "для нескольких сервисов с разными названиями." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:402 +#: documentation/content/en/articles/pam/_index.adoc:401 msgid "" "Since each service's policy is stored in a separate file, the [." "filename]#pam.d# mechanism also makes it very easy to install additional " "policies for third-party software packages." msgstr "" "Так как политика каждого сервиса хранится в отдельном файле, то механизм [." "filename]#pam.d# делает установку дополнительных политик для программных " "пакетов сторонних разработчиков очень лёгкой задачей." #. type: Title ==== -#: documentation/content/en/articles/pam/_index.adoc:404 +#: documentation/content/en/articles/pam/_index.adoc:403 #, no-wrap msgid "The Policy Search Order" msgstr "Порядок поиска политик" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:408 +#: documentation/content/en/articles/pam/_index.adoc:407 msgid "" "As we have seen above, PAM policies can be found in a number of places. " "What happens if policies for the same service exist in multiple places?" msgstr "" "Как вы видели выше, политики PAM могут находиться в нескольких местах. Что " "будет, если политики для одного и того же сервиса имеются в разных местах?" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:410 +#: documentation/content/en/articles/pam/_index.adoc:409 msgid "" "It is essential to understand that PAM's configuration system is centered on " "chains." msgstr "" "Необходимо осознать, что система конфигурации PAM ориентирована на цепочки." #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:412 +#: documentation/content/en/articles/pam/_index.adoc:411 #, no-wrap msgid "Breakdown of a Configuration Line" msgstr "Структура строки настройки" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:415 +#: documentation/content/en/articles/pam/_index.adoc:414 msgid "" "As explained in crossref:pam[pam-config-file, PAM Policy Files], each line " "in [.filename]#/etc/pam.conf# consists of four or more fields: the service " "name, the facility name, the control flag, the module name, and zero or more " "module arguments." msgstr "" "Как это объяснено в <>, каждая строка файла [.filename]#/" "etc/pam.conf# состоит из четырёх или большего количества полей: имени " "сервиса, имени подсистемы, управляющего флага, имени модуля и дополнительных " "параметров модуля, которые могут отсутствовать." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:418 +#: documentation/content/en/articles/pam/_index.adoc:417 msgid "" "The service name is generally (though not always) the name of the " "application the statement applies to. If you are unsure, refer to the " "individual application's documentation to determine what service name it " "uses." msgstr "" "Имя сервиса обычно (хотя не всегда) является именем приложения, которое этот " "сервис обслуживает. Если вы не уверены, обратитесь к документации по " "конкретному приложению для определения используемого имени сервиса." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:420 +#: documentation/content/en/articles/pam/_index.adoc:419 msgid "" "Note that if you use [.filename]#/etc/pam.d/# instead of [.filename]#/etc/" "pam.conf#, the service name is specified by the name of the policy file, and " "omitted from the actual configuration lines, which then start with the " "facility name." msgstr "" "Заметьте, что если вы используете [.filename]#/etc/pam.d/# вместо [." "filename]#/etc/pam.conf#, то имя сервиса задается именем файла политики, и " "опускается из строк настройки, которые в таком случае начинаются с названия " "подсистемы." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:423 +#: documentation/content/en/articles/pam/_index.adoc:422 msgid "" "The facility is one of the four facility keywords described in crossref:" "pam[pam-facilities-primitives, Facilities and Primitives]." msgstr "" "Имя подсистемы представляет собой одно из четырёх ключевых слов, описанных в " "<>." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:428 +#: documentation/content/en/articles/pam/_index.adoc:427 #, no-wrap msgid "" "Likewise, the control flag is one of the four keywords described in\n" "\tcrossref:pam[pam-chains-policies, Chains and Policies], describing how to interpret the return code from the module. \n" "Linux-PAM supports an alternate syntax that lets you specify the action to associate with each possible return code, but this should be avoided as it is non-standard and closely tied in with the way Linux-PAM dispatches service calls (which differs greatly from the way Solaris(TM) and OpenPAM do it.) \n" "Unsurprisingly, OpenPAM does not support this syntax.\n" msgstr "" "Точно также управляющий флаг является одним из четырёх ключевых слов, описанных в разделе\n" "\tcrossref:pam[pam-chains-policies, Цепочки и политики], в котором рассказано, как интерпретировать возвращаемый из модуля код.\n" " В Linux-PAM поддерживается альтернативный синтаксис, который позволяет указать действие, связанной с каждый возможным кодом возврата, но этого следует избегать, так как он не является стандартным и тесно связан со способом диспетчеризации вызовов сервисов в Linux-PAM (а он значительно отличается от способа взаимодействия в Solaris(TM) и OpenPAM).\n" " Не вызывает удивления тот факт, что в OpenPAM этот синтаксис не поддерживается.\n" #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:430 +#: documentation/content/en/articles/pam/_index.adoc:429 #, no-wrap msgid "Policies" msgstr "Политики" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:433 +#: documentation/content/en/articles/pam/_index.adoc:432 msgid "" "To configure PAM correctly, it is essential to understand how policies are " "interpreted." msgstr "" "Для корректной настройки PAM необходимо понимать, как происходит " "интерпретация политик." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:436 +#: documentation/content/en/articles/pam/_index.adoc:435 msgid "" "When an application calls man:pam_start[3], the PAM library loads the policy " "for the specified service and constructs four module chains (one for each " "facility.) If one or more of these chains are empty, the corresponding " "chains from the policy for the `other` service are substituted." msgstr "" "В момент, когда приложение вызывает функцию man:pam_start[3], библиотека PAM " "загружает политику для указанного сервиса и выстраивает четыре цепочки " "модулей (по одной для каждой подсистемы). Если одна или большее количество " "этих цепочек являются пустыми, то будут выполняться подстановки " "соответствующих цепочек из политики для сервиса `other`." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:440 +#: documentation/content/en/articles/pam/_index.adoc:439 msgid "" "When the application later calls one of the six PAM primitives, the PAM " "library retrieves the chain for the corresponding facility and calls the " "appropriate service function in each module listed in the chain, in the " "order in which they were listed in the configuration. After each call to a " "service function, the module type and the error code returned by the service " "function are used to determine what happens next. With a few exceptions, " "which we discuss below, the following table applies:" msgstr "" "Когда затем приложение вызывает одну из шести примитивов PAM, библиотека PAM " "выделяет из цепочки нужную подсистему и вызывает функцию, соответствующую " "сервису, в каждом модуле, перечисленном в цепочке, в том порядке, в каком " "они перечислены в конфигурации. После каждого обращения к функции сервиса, " "тип модуля и возвращённый из этой функции код результата выполнения " "используются для того, что делать дальше. За некоторыми исключениями, " "которые будут описаны ниже, применяется такая таблица:" #. type: Block title -#: documentation/content/en/articles/pam/_index.adoc:441 +#: documentation/content/en/articles/pam/_index.adoc:440 #, no-wrap msgid "PAM Chain Execution Summary" msgstr "Сводная таблица отработки цепочек PAM" #. type: Table -#: documentation/content/en/articles/pam/_index.adoc:446 +#: documentation/content/en/articles/pam/_index.adoc:445 #, no-wrap msgid "PAM_SUCCESS" msgstr "PAM_SUCCESS" #. type: Table -#: documentation/content/en/articles/pam/_index.adoc:447 +#: documentation/content/en/articles/pam/_index.adoc:446 #, no-wrap msgid "PAM_IGNORE" msgstr "PAM_IGNORE" #. type: Table -#: documentation/content/en/articles/pam/_index.adoc:449 +#: documentation/content/en/articles/pam/_index.adoc:448 #, no-wrap msgid "other" msgstr "other" #. type: Table -#: documentation/content/en/articles/pam/_index.adoc:450 +#: documentation/content/en/articles/pam/_index.adoc:449 #, no-wrap msgid "binding" msgstr "binding" #. type: Table -#: documentation/content/en/articles/pam/_index.adoc:451 -#: documentation/content/en/articles/pam/_index.adoc:466 +#: documentation/content/en/articles/pam/_index.adoc:450 +#: documentation/content/en/articles/pam/_index.adoc:465 #, no-wrap msgid "if (!fail) break;" msgstr "if (!fail) break;" #. type: Table -#: documentation/content/en/articles/pam/_index.adoc:452 +#: documentation/content/en/articles/pam/_index.adoc:451 +#: documentation/content/en/articles/pam/_index.adoc:455 #: documentation/content/en/articles/pam/_index.adoc:456 -#: documentation/content/en/articles/pam/_index.adoc:457 +#: documentation/content/en/articles/pam/_index.adoc:460 #: documentation/content/en/articles/pam/_index.adoc:461 -#: documentation/content/en/articles/pam/_index.adoc:462 -#: documentation/content/en/articles/pam/_index.adoc:467 -#: documentation/content/en/articles/pam/_index.adoc:469 +#: documentation/content/en/articles/pam/_index.adoc:466 +#: documentation/content/en/articles/pam/_index.adoc:468 +#: documentation/content/en/articles/pam/_index.adoc:470 #: documentation/content/en/articles/pam/_index.adoc:471 #: documentation/content/en/articles/pam/_index.adoc:472 -#: documentation/content/en/articles/pam/_index.adoc:473 #, no-wrap msgid "-" msgstr "-" #. type: Table -#: documentation/content/en/articles/pam/_index.adoc:454 -#: documentation/content/en/articles/pam/_index.adoc:459 +#: documentation/content/en/articles/pam/_index.adoc:453 +#: documentation/content/en/articles/pam/_index.adoc:458 #, no-wrap msgid "fail = true;" msgstr "fail = true;" #. type: Table -#: documentation/content/en/articles/pam/_index.adoc:455 +#: documentation/content/en/articles/pam/_index.adoc:454 #, no-wrap msgid "required" msgstr "required" #. type: Table -#: documentation/content/en/articles/pam/_index.adoc:460 +#: documentation/content/en/articles/pam/_index.adoc:459 #, no-wrap msgid "requisite" msgstr "requisite" #. type: Table -#: documentation/content/en/articles/pam/_index.adoc:464 +#: documentation/content/en/articles/pam/_index.adoc:463 #, no-wrap msgid "fail = true; break;" msgstr "fail = true; break;" #. type: Table -#: documentation/content/en/articles/pam/_index.adoc:465 +#: documentation/content/en/articles/pam/_index.adoc:464 #, no-wrap msgid "sufficient" msgstr "sufficient" #. type: Table -#: documentation/content/en/articles/pam/_index.adoc:470 +#: documentation/content/en/articles/pam/_index.adoc:469 #, no-wrap msgid "optional" msgstr "optional" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:477 +#: documentation/content/en/articles/pam/_index.adoc:476 msgid "" "If `fail` is true at the end of a chain, or when a \"break\" is reached, the " "dispatcher returns the error code returned by the first module that failed. " "Otherwise, it returns `PAM_SUCCESS`." msgstr "" "Если переменная `fail` принимает истинное значение в конце отработки " "цепочки, или когда достигнут \"break\", диспетчер возвращает код ошибки, " "возвращённый первым модулем, отработавшим неудачно. В противном случае " "возвращается `PAM_SUCCESS`." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:479 +#: documentation/content/en/articles/pam/_index.adoc:478 msgid "" "The first exception of note is that the error code `PAM_NEW_AUTHTOK_REQD` is " "treated like a success, except that if no module failed, and at least one " "module returned `PAM_NEW_AUTHTOK_REQD`, the dispatcher will return " "`PAM_NEW_AUTHTOK_REQD`." msgstr "" "Первым исключением является то, что код ошибки `PAM_NEW_AUTHTOK_REQD` " "интерпретируется как успешный результат, кроме случая, когда модуль " "отработал успешно, и по крайней мере один модуль возвратил " "`PAM_NEW_AUTHTOK_REQD`, тогда диспетчер возвратит результат " "`PAM_NEW_AUTHTOK_REQD`." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:481 +#: documentation/content/en/articles/pam/_index.adoc:480 msgid "" "The second exception is that man:pam_setcred[3] treats `binding` and " "`sufficient` modules as if they were `required`." msgstr "" "Вторым исключением является то, что man:pam_setcred[3] считает, что модули " "`binding` и `sufficient` являются равнозначными `required`." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:483 +#: documentation/content/en/articles/pam/_index.adoc:482 msgid "" "The third and final exception is that man:pam_chauthtok[3] runs the entire " "chain twice (once for preliminary checks and once to actually set the " "password), and in the preliminary phase it treats `binding` and `sufficient` " "modules as if they were `required`." msgstr "" "Третьим и последним исключением является то, что функция man:" "pam_chauthtok[3] отрабатывает полную цепочку дважды (один раз для " "предварительных проверок, и ещё раз для реального задания пароля), и на " "подготовительной фазе она считает, что модули `binding` и `sufficient` " "являются равнозначными `required`." #. type: Title == -#: documentation/content/en/articles/pam/_index.adoc:485 +#: documentation/content/en/articles/pam/_index.adoc:484 #, no-wrap msgid "FreeBSD PAM Modules" msgstr "Модули PAM во FreeBSD" #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:488 +#: documentation/content/en/articles/pam/_index.adoc:487 #, no-wrap msgid "man:pam_deny[8]" msgstr "man:pam_deny[8]" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:492 +#: documentation/content/en/articles/pam/_index.adoc:491 msgid "" "The man:pam_deny[8] module is one of the simplest modules available; it " "responds to any request with `PAM_AUTH_ERR`. It is useful for quickly " "disabling a service (add it to the top of every chain), or for terminating " "chains of `sufficient` modules." msgstr "" "Модуль man:pam_deny[8] является одним из простейших доступных модулей; на " "любой запрос он возвращает результат `PAM_AUTH_ERR`. Он полезен для быстрого " "отключения сервиса (добавьте его на верх каждой цепочки) или завершения " "цепочек модулей `sufficient`." #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:494 +#: documentation/content/en/articles/pam/_index.adoc:493 #, no-wrap msgid "man:pam_echo[8]" msgstr "man:pam_echo[8]" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:498 +#: documentation/content/en/articles/pam/_index.adoc:497 msgid "" "The man:pam_echo[8] module simply passes its arguments to the conversation " "function as a `PAM_TEXT_INFO` message. It is mostly useful for debugging, " "but can also serve to display messages such as \"Unauthorized access will be " "prosecuted\" before starting the authentication procedure." msgstr "" "Модуль man:pam_echo[8] просто передаёт свои параметры в функцию " "взаимодействия как сообщение `PAM_TEXT_INFO`. В основном полезна для " "отладки, но также может использоваться для вывода сообщений, таких как " "\"Unauthorized access will be prosecuted\" до запуска процедуры " "аутентификации." #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:500 +#: documentation/content/en/articles/pam/_index.adoc:499 #, no-wrap msgid "man:pam_exec[8]" msgstr "man:pam_exec[8]" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:504 +#: documentation/content/en/articles/pam/_index.adoc:503 msgid "" "The man:pam_exec[8] module takes its first argument to be the name of a " "program to execute, and the remaining arguments are passed to that program " "as command-line arguments. One possible application is to use it to run a " "program at login time which mounts the user's home directory." msgstr "" "Модуль man:pam_exec[8] воспринимает первый переданный ему параметр как имя " "программы для выполнения, а остальные аргументы передаются этой программе в " "качестве параметров командной строки. Одним из возможных применений является " "его использование для запуска в момент регистрации в системе программы " "монтирования домашнего каталога пользователя." #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:506 +#: documentation/content/en/articles/pam/_index.adoc:505 #, no-wrap msgid "man:pam_ftpusers[8]" msgstr "man:pam_ftpusers[8]" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:509 +#: documentation/content/en/articles/pam/_index.adoc:508 msgid "The man:pam_ftpusers[8] module" msgstr "Модуль man:pam_ftpusers[8]" #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:511 +#: documentation/content/en/articles/pam/_index.adoc:510 #, no-wrap msgid "man:pam_group[8]" msgstr "man:pam_group[8]" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:515 +#: documentation/content/en/articles/pam/_index.adoc:514 msgid "" "The man:pam_group[8] module accepts or rejects applicants on the basis of " "their membership in a particular file group (normally `wheel` for man:" "su[1]). It is primarily intended for maintaining the traditional behavior " "of BSD man:su[1], but has many other uses, such as excluding certain groups " "of users from a particular service." msgstr "" "Модуль man:pam_group[8] принимает или отвергает аппликантов в зависимости от " "их членства в определённой файловой группе (обычно `wheel` для man:su[1]). В " "первую очередь предназначен для сохранения традиционного поведения утилиты " "BSD man:su[1], хотя имеет и много других применений, таких как отключение " "определённых групп пользователей от некоторого сервиса." #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:517 +#: documentation/content/en/articles/pam/_index.adoc:516 #, no-wrap msgid "man:pam_guest[8]" msgstr "man:pam_guest[8]" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:522 +#: documentation/content/en/articles/pam/_index.adoc:521 msgid "" "The man:pam_guest[8] module allows guest logins using fixed login names. " "Various requirements can be placed on the password, but the default behavior " "is to allow any password as long as the login name is that of a guest " "account. The man:pam_guest[8] module can easily be used to implement " "anonymous FTP logins." msgstr "" "Модуль man:pam_guest[8] позволяет осуществлять гостевые входы с " "использованием фиксированных имён входа в систему. На пароль могут " "накладываться различные ограничения, однако действием по умолчанию является " "ввод любого пароля при использовании имени, соответствующего гостевому " "входу. Модуль man:pam_guest[8] можно легко использовать для реализации " "анонимных входов на FTP." #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:524 +#: documentation/content/en/articles/pam/_index.adoc:523 #, no-wrap msgid "man:pam_krb5[8]" msgstr "man:pam_krb5[8]" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:527 +#: documentation/content/en/articles/pam/_index.adoc:526 msgid "The man:pam_krb5[8] module" msgstr "Модуль man:pam_krb5[8]" #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:529 +#: documentation/content/en/articles/pam/_index.adoc:528 #, no-wrap msgid "man:pam_ksu[8]" msgstr "man:pam_ksu[8]" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:532 +#: documentation/content/en/articles/pam/_index.adoc:531 msgid "The man:pam_ksu[8] module" msgstr "Модуль man:pam_ksu[8]" #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:534 +#: documentation/content/en/articles/pam/_index.adoc:533 #, no-wrap msgid "man:pam_lastlog[8]" msgstr "man:pam_lastlog[8]" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:537 +#: documentation/content/en/articles/pam/_index.adoc:536 msgid "The man:pam_lastlog[8] module" msgstr "Модуль man:pam_lastlog[8]" #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:539 +#: documentation/content/en/articles/pam/_index.adoc:538 #, no-wrap msgid "man:pam_login_access[8]" msgstr "man:pam_login_access[8]" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:542 +#: documentation/content/en/articles/pam/_index.adoc:541 msgid "" "The man:pam_login_access[8] module provides an implementation of the account " "management primitive which enforces the login restrictions specified in the " "man:login.access[5] table." msgstr "" "Модуль man:pam_login_access[8] предоставляет реализацию примитива для " "управления учётными записями, который вводит в действие ограничения на вход, " "задаваемые в таблице man:login.access[5]." #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:544 +#: documentation/content/en/articles/pam/_index.adoc:543 #, no-wrap msgid "man:pam_nologin[8]" msgstr "man:pam_nologin[8]" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:548 +#: documentation/content/en/articles/pam/_index.adoc:547 msgid "" "The man:pam_nologin[8] module refuses non-root logins when [.filename]#/var/" "run/nologin# exists. This file is normally created by man:shutdown[8] when " "less than five minutes remain until the scheduled shutdown time." msgstr "" "Модуль man:pam_nologin[8] отвергает любые входы не пользователем root, если " "существует файл [.filename]#/var/run/nologin#. Обычно этот файл создаётся " "утилитой man:shutdown[8], когда до запланированного завершения работы " "системы остаётся менее пяти минут." #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:550 +#: documentation/content/en/articles/pam/_index.adoc:549 #, no-wrap msgid "man:pam_passwdqc[8]" msgstr "man:pam_passwdqc[8]" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:553 +#: documentation/content/en/articles/pam/_index.adoc:552 msgid "The man:pam_passwdqc[8] module" msgstr "Модуль man:pam_passwdqc[8]" #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:555 +#: documentation/content/en/articles/pam/_index.adoc:554 #, no-wrap msgid "man:pam_permit[8]" msgstr "man:pam_permit[8]" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:559 +#: documentation/content/en/articles/pam/_index.adoc:558 msgid "" "The man:pam_permit[8] module is one of the simplest modules available; it " "responds to any request with `PAM_SUCCESS`. It is useful as a placeholder " "for services where one or more chains would otherwise be empty." msgstr "" "Модуль man:pam_permit[8] является одним из самых простым из имеющихся; на " "любой запрос он отвечает `PAM_SUCCESS`. Он полезен в качестве замены пустого " "места для сервисов, когда одна или большее количество цепочек в противном " "случае останутся пустыми." #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:561 +#: documentation/content/en/articles/pam/_index.adoc:560 #, no-wrap msgid "man:pam_radius[8]" msgstr "man:pam_radius[8]" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:564 +#: documentation/content/en/articles/pam/_index.adoc:563 msgid "The man:pam_radius[8] module" msgstr "Модуль man:pam_radius[8]" #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:566 +#: documentation/content/en/articles/pam/_index.adoc:565 #, no-wrap msgid "man:pam_rhosts[8]" msgstr "man:pam_rhosts[8]" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:569 +#: documentation/content/en/articles/pam/_index.adoc:568 msgid "The man:pam_rhosts[8] module" msgstr "Модуль man:pam_rhosts[8]" #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:571 +#: documentation/content/en/articles/pam/_index.adoc:570 #, no-wrap msgid "man:pam_rootok[8]" msgstr "man:pam_rootok[8]" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:575 +#: documentation/content/en/articles/pam/_index.adoc:574 msgid "" "The man:pam_rootok[8] module reports success if and only if the real user id " "of the process calling it (which is assumed to be run by the applicant) is " "0. This is useful for non-networked services such as man:su[1] or man:" "passwd[1], to which the `root` should have automatic access." msgstr "" "Модуль man:pam_rootok[8] возвращает положительный результат в том и только в " "том случае, если реальный id пользователя процесса, его вызвавшего " "(предполагается, что его запускает аппликант) равен 0. Это полезно для " "несетевых сервисов, таких как man:su[1] или man:passwd[1], к которым " "пользователь `root` должен иметь автоматический доступ." #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:577 +#: documentation/content/en/articles/pam/_index.adoc:576 #, no-wrap msgid "man:pam_securetty[8]" msgstr "man:pam_securetty[8]" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:580 +#: documentation/content/en/articles/pam/_index.adoc:579 msgid "The man:pam_securetty[8] module" msgstr "Модуль man:pam_securetty[8]" #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:582 +#: documentation/content/en/articles/pam/_index.adoc:581 #, no-wrap msgid "man:pam_self[8]" msgstr "man:pam_self[8]" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:586 +#: documentation/content/en/articles/pam/_index.adoc:585 msgid "" "The man:pam_self[8] module reports success if and only if the names of the " "applicant matches that of the target account. It is most useful for non-" "networked services such as man:su[1], where the identity of the applicant " "can be easily verified." msgstr "" "Модуль man:pam_self[8] возвращает положительный результат тогда и только " "тогда, когда имена аппликанта соответствуют целевой учётной записи. Больше " "всего это пригодится в несетевых сервисах, таких как man:su[1], в которых " "идентификация аппликанта может быть с лёгкостью проверена." #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:588 +#: documentation/content/en/articles/pam/_index.adoc:587 #, no-wrap msgid "man:pam_ssh[8]" msgstr "man:pam_ssh[8]" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:594 +#: documentation/content/en/articles/pam/_index.adoc:593 msgid "" "The man:pam_ssh[8] module provides both authentication and session " "services. The authentication service allows users who have passphrase-" "protected SSH secret keys in their [.filename]#~/.ssh# directory to " "authenticate themselves by typing their passphrase. The session service " "starts man:ssh-agent[1] and preloads it with the keys that were decrypted in " "the authentication phase. This feature is particularly useful for local " "logins, whether in X (using man:xdm[8] or another PAM-aware X login manager) " "or at the console." msgstr "" "Модуль man:pam_ssh[8] предоставляет как сервис аутентификации, так и сеанса. " "Сервис аутентификации позволяет пользователям, имеющим секретные ключи SSH, " "защищённые паролями, в своих каталогах [.filename]#~/.ssh#, " "аутентифицироваться посредством этих паролей. Сеансовый сервис запускает man:" "ssh-agent[1] и загружает ключи, которые были расшифрованы на фазе " "аутентификации. Такая возможность, в частности, полезна для локальных входов " "в систему, как в систему X (посредством man:xdm[1] или другого X-менеджера " "входов, умеющего работать с PAM), так и на консоль." #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:596 +#: documentation/content/en/articles/pam/_index.adoc:595 #, no-wrap msgid "man:pam_tacplus[8]" msgstr "man:pam_tacplus[8]" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:599 +#: documentation/content/en/articles/pam/_index.adoc:598 msgid "The man:pam_tacplus[8] module" msgstr "Модуль man:pam_tacplus[8]" #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:601 +#: documentation/content/en/articles/pam/_index.adoc:600 #, no-wrap msgid "man:pam_unix[8]" msgstr "man:pam_unix[8]" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:606 +#: documentation/content/en/articles/pam/_index.adoc:605 msgid "" "The man:pam_unix[8] module implements traditional UNIX(R) password " "authentication, using man:getpwnam[3] to obtain the target account's " "password and compare it with the one provided by the applicant. It also " "provides account management services (enforcing account and password " "expiration times) and password-changing services. This is probably the " "single most useful module, as the great majority of admins will want to " "maintain historical behavior for at least some services." msgstr "" "Модуль man:pam_unix[8] реализует традиционную аутентификацию UNIX(R) на " "основе паролей, использующую функцию man:getpwnam[3] для получения пароля " "целевой учётной записи и сравнивающую её с тем, что представил аппликант. Он " "также предоставляет средства управления учётными записями (отслеживая время " "действия учётной записи и пароля) и смены паролей. Наверное, это самый " "полезный модуль, так как подавляющее большинство администраторов хотят " "сохранить исторически сложившееся поведение по крайней мере некоторых " "сервисов." #. type: Title == -#: documentation/content/en/articles/pam/_index.adoc:608 +#: documentation/content/en/articles/pam/_index.adoc:607 #, no-wrap msgid "PAM Application Programming" msgstr "Программирование приложений с PAM" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:611 -#: documentation/content/en/articles/pam/_index.adoc:616 +#: documentation/content/en/articles/pam/_index.adoc:610 +#: documentation/content/en/articles/pam/_index.adoc:615 msgid "This section has not yet been written." msgstr "Этот раздел ещё не написан." #. type: Title == -#: documentation/content/en/articles/pam/_index.adoc:613 +#: documentation/content/en/articles/pam/_index.adoc:612 #, no-wrap msgid "PAM Module Programming" msgstr "Программирование модуля PAM" #. type: Title == -#: documentation/content/en/articles/pam/_index.adoc:621 +#: documentation/content/en/articles/pam/_index.adoc:620 #, no-wrap msgid "Sample PAM Application" msgstr "Пример PAM-приложения" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:628 +#: documentation/content/en/articles/pam/_index.adoc:627 msgid "" "The following is a minimal implementation of man:su[1] using PAM. Note that " "it uses the OpenPAM-specific man:openpam_ttyconv[3] conversation function, " "which is prototyped in [.filename]#security/openpam.h#. If you wish build " "this application on a system with a different PAM library, you will have to " "provide your own conversation function. A robust conversation function is " "surprisingly difficult to implement; the one presented in crossref:pam[pam-" "sample-conv, Sample PAM Conversation Function] is a good starting point, but " "should not be used in real-world applications." msgstr "" "Далее следует минимальная реализация программы man:su[1] с использованием " "PAM. Заметьте, что в ней используется специфичная для OpenPAM функция " "взаимодействия man:openpam_ttyconv[3], объявление которой расположено в " "файле [.filename]#security/openpam.h#. Если вы собираетесь строить это " "приложение в системе с другой библиотекой PAM, вам необходимо будет создать " "собственную функцию взаимодействия. Надёжную функцию взаимодействия " "неожиданно трудно написать; та, что находится в <>, хороша " "в качестве отправной точки, но в реальных приложениях использоваться не " "может." #. type: delimited block . 4 -#: documentation/content/en/articles/pam/_index.adoc:632 +#: documentation/content/en/articles/pam/_index.adoc:631 #, no-wrap msgid "include::{include-path}su.c[]\n" msgstr "include::{include-path}su.c[]\n" #. type: Title == -#: documentation/content/en/articles/pam/_index.adoc:638 +#: documentation/content/en/articles/pam/_index.adoc:637 #, no-wrap msgid "Sample PAM Module" msgstr "Пример PAM-модуля" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:642 +#: documentation/content/en/articles/pam/_index.adoc:641 msgid "" "The following is a minimal implementation of man:pam_unix[8], offering only " "authentication services. It should build and run with most PAM " "implementations, but takes advantage of OpenPAM extensions if available: " "note the use of man:pam_get_authtok[3], which enormously simplifies " "prompting the user for a password." msgstr "" "Далее приведена минимальная реализация man:pam_unix[8], предоставляющая " "только сервисы аутентификации. Она должна строиться и работать с " "большинством из реализаций PAM, но использует возможности расширений " "OpenPAM, если они присутствуют: отметьте использование функции man:" "pam_get_authtok[3], которая кардинально упрощает организацию ввода пароля " "пользователем." #. type: delimited block . 4 -#: documentation/content/en/articles/pam/_index.adoc:646 +#: documentation/content/en/articles/pam/_index.adoc:645 #, no-wrap msgid "include::{include-path}pam_unix.c[]\n" msgstr "include::{include-path}pam_unix.c[]\n" #. type: Title == -#: documentation/content/en/articles/pam/_index.adoc:652 +#: documentation/content/en/articles/pam/_index.adoc:651 #, no-wrap msgid "Sample PAM Conversation Function" msgstr "Пример функции взаимодействия PAM" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:657 +#: documentation/content/en/articles/pam/_index.adoc:656 msgid "" "The conversation function presented below is a greatly simplified version of " "OpenPAM's man:openpam_ttyconv[3]. It is fully functional, and should give " "the reader a good idea of how a conversation function should behave, but it " "is far too simple for real-world use. Even if you are not using OpenPAM, " "feel free to download the source code and adapt man:openpam_ttyconv[3] to " "your uses; we believe it to be as robust as a tty-oriented conversation " "function can reasonably get." msgstr "" "Функция взаимодействия, приводимая ниже, является значительно упрощённой " "версией функции man:openpam_ttyconv[3] из OpenPAM. Она полнофункциональна, и " "должна послужить источником идей о том, как должна себя вести функция " "взаимодействия, однако она слишком проста для реальных приложений. Даже если " "вы не используете OpenPAM, можете сгрузить исходный код и использовать man:" "openpam_ttyconv[3] в своих целях; мы надеемся, что она достаточно надёжна в " "качестве функции для взаимодействия с терминальными устройствами." #. type: delimited block . 4 -#: documentation/content/en/articles/pam/_index.adoc:661 +#: documentation/content/en/articles/pam/_index.adoc:660 #, no-wrap msgid "include::{include-path}converse.c[]\n" msgstr "include::{include-path}converse.c[]\n" #. type: Title == -#: documentation/content/en/articles/pam/_index.adoc:666 +#: documentation/content/en/articles/pam/_index.adoc:665 #, no-wrap msgid "Further Reading" msgstr "Для дальнейшего ознакомления" #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:668 +#: documentation/content/en/articles/pam/_index.adoc:667 #, no-wrap msgid "Papers" msgstr "Статьи" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:671 +#: documentation/content/en/articles/pam/_index.adoc:670 msgid "" "Making Login Services Independent of Authentication Technologies Vipin " "Samar. Charlie Lai. Sun Microsystems." msgstr "" "Making Login Services Independent of Authentication Technologies Vipin " "Samar. Charlie Lai. Sun Microsystems." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:673 +#: documentation/content/en/articles/pam/_index.adoc:672 msgid "" "_link:https://pubs.opengroup.org/onlinepubs/8329799/toc.htm[X/Open Single " "Sign-on Preliminary Specification]_. The Open Group. 1-85912-144-6. June " "1997." msgstr "" "_link:https://pubs.opengroup.org/onlinepubs/8329799/toc.htm[X/Open Single " "Sign-on Preliminary Specification]_. The Open Group. 1-85912-144-6. June " "1997." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:675 +#: documentation/content/en/articles/pam/_index.adoc:674 msgid "" "_link:https://mirrors.kernel.org/pub/linux/libs/pam/pre/doc/draft-morgan-" "pam-07.txt[Pluggable Authentication Modules]_. Andrew G. Morgan. 1999-10-06." msgstr "" "_link:https://mirrors.kernel.org/pub/linux/libs/pam/pre/doc/draft-morgan-" "pam-07.txt[Pluggable Authentication Modules]_. Andrew G. Morgan. 1999-10-06." #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:676 +#: documentation/content/en/articles/pam/_index.adoc:675 #, no-wrap msgid "User Manuals" msgstr "Руководства пользователя" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:679 +#: documentation/content/en/articles/pam/_index.adoc:678 msgid "" "_link:https://docs.oracle.com/cd/E26505_01/html/E27224/pam-1.html[PAM " "Administration]_. Sun Microsystems." msgstr "" "_link:https://docs.oracle.com/cd/E26505_01/html/E27224/pam-1." "html[Администрирование PAM]_. Sun Microsystems." #. type: Title === -#: documentation/content/en/articles/pam/_index.adoc:680 +#: documentation/content/en/articles/pam/_index.adoc:679 #, no-wrap msgid "Related Web Pages" msgstr "Веб страницы" #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:683 +#: documentation/content/en/articles/pam/_index.adoc:682 msgid "" "_link:https://www.openpam.org/[OpenPAM homepage]_ Dag-Erling Smørgrav. " "ThinkSec AS." msgstr "" "_link:https://www.openpam.org/[Домащняя страница OpenPAM]_ Dag-Erling " "Smørgrav. ThinkSec AS." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:685 +#: documentation/content/en/articles/pam/_index.adoc:684 msgid "" "_link:http://www.kernel.org/pub/linux/libs/pam/[Linux-PAM homepage]_ Andrew " "Morgan." msgstr "" "_link:http://www.kernel.org/pub/linux/libs/pam/[Домашняя страница Linux-" "PAM]_ Andrew Morgan." #. type: Plain text -#: documentation/content/en/articles/pam/_index.adoc:686 +#: documentation/content/en/articles/pam/_index.adoc:685 msgid "_Solaris PAM homepage_. Sun Microsystems." msgstr "" "_Домашняя страница Solaris PAM (Solaris PAM homepage)_. Sun Microsystems." diff --git a/documentation/content/ru/articles/pgpkeys/_index.adoc b/documentation/content/ru/articles/pgpkeys/_index.adoc index fabbea159c..19eb4997d1 100644 --- a/documentation/content/ru/articles/pgpkeys/_index.adoc +++ b/documentation/content/ru/articles/pgpkeys/_index.adoc @@ -1,1580 +1,1595 @@ --- description: 'Список OpenPGP-ключей, которые можно использовать для проверки подписей или отправки зашифрованной электронной почты офицерам или разработчикам FreeBSD.org.' tags: ["OpenPGP", "Developers", "Officers", "FreeBSD"] title: 'Ключи OpenPGP' --- = Ключи OpenPGP :doctype: article :toc: macro :toclevels: 1 :icons: font :sectnums: :source-highlighter: rouge :experimental: :images-path: articles/pgpkeys/ ifdef::env-beastie[] ifdef::backend-html5[] include::shared/authors.adoc[] include::shared/mirrors.adoc[] include::shared/releases.adoc[] include::shared/attributes/attributes-{{% lang %}}.adoc[] include::shared/{{% lang %}}/teams.adoc[] include::shared/{{% lang %}}/mailing-lists.adoc[] include::shared/{{% lang %}}/urls.adoc[] :imagesdir: ../../../images/{images-path} :include-path: static/pgpkeys/ endif::[] ifdef::backend-pdf,backend-epub3[] include::../../../../shared/asciidoctor.adoc[] // PGP keys are not included during the build // See 29e47423be969b7fcc7125977c1b22ddd33fc671 revision // (a wrong path is used as a workaround) :include-path: ../../../static/pgpkeys/ endif::[] endif::[] ifndef::env-beastie[] include::../../../../../shared/asciidoctor.adoc[] :include-path: ../../../static/pgpkeys/ endif::[] ''' toc::[] Эти OpenPGP-ключи можно использовать для проверки подписи или отправки зашифрованной электронной почты офицерам или разработчикам `FreeBSD.org`. Полный набор ключей можно загрузить по ссылке link:https://docs.FreeBSD.org/pgpkeys/pgpkeys.txt[pgpkeys.txt]. //// Do not edit this file except as instructed by the addkey.sh script. See the README file in /data/pgpkeys for instructions. This article contains all the keys. The officer keys are also shown in the Handbook PGP keys chapter. //// [[pgpkeys-officers]] == Офицеры === {security-officer-name} `<{security-officer-email}>` include::{include-path}security-officer.key[] === {core-secretary-name} `<{core-secretary-email}>` include::{include-path}core-secretary.key[] === {portmgr-secretary-name} `<{portmgr-secretary-email}>` include::{include-path}portmgr-secretary.key[] === {doceng-secretary-name} `<{doceng-secretary-email}>` include::{include-path}doceng-secretary.key[] [[pgpkeys-core]] == Участники Основной команды (Core Team) -=== `{allanjude}` -include::{include-path}allanjude.key[] +=== `{adamw}` +include::{include-path}adamw.key[] -=== `{dch}` -include::{include-path}dch.key[] +=== `{adrian}` +include::{include-path}adrian.key[] + +=== `{bapt}` +include::{include-path}bapt.key[] === `{glebius}` include::{include-path}glebius.key[] === `{hrs}` include::{include-path}hrs.key[] -=== `{lwhsu}` -include::{include-path}lwhsu.key[] +=== `{imp}` +include::{include-path}imp.key[] -=== `{mat}` -include::{include-path}mat.key[] +=== `{jrm}` +include::{include-path}jrm.key[] + +=== `{kevans}` +include::{include-path}kevans.key[] === `{olivier}` include::{include-path}olivier.key[] -=== `{tcberner}` -include::{include-path}tcberner.key[] - [[pgpkeys-developers]] == Разработчики === `{jgh}` include::{include-path}jgh.key[] === `{ariff}` include::{include-path}ariff.key[] === `{tabthorpe}` include::{include-path}tabthorpe.key[] === `{eadler}` include::{include-path}eadler.key[] === `{pauamma}` include::{include-path}pauamma.key[] === `{shaun}` include::{include-path}shaun.key[] === `{brix}` include::{include-path}brix.key[] === `{mandree}` include::{include-path}mandree.key[] === `{will}` include::{include-path}will.key[] === `{dim}` include::{include-path}dim.key[] === `{anholt}` include::{include-path}anholt.key[] === `{fernape}` include::{include-path}fernape.key[] === `{mva}` include::{include-path}mva.key[] === `{araujo}` include::{include-path}araujo.key[] === `{mat}` include::{include-path}mat.key[] === `{syuu}` include::{include-path}syuu.key[] === `{asami}` include::{include-path}asami.key[] === `{jsa}` include::{include-path}jsa.key[] === `{jadawin}` include::{include-path}jadawin.key[] === `{jwb}` include::{include-path}jwb.key[] === `{dbaio}` include::{include-path}dbaio.key[] === `{timur}` include::{include-path}timur.key[] === `{jhb}` include::{include-path}jhb.key[] === `{gjb}` include::{include-path}gjb.key[] === `{snb}` include::{include-path}snb.key[] === `{barner}` include::{include-path}barner.key[] === `{lbartoletti}` include::{include-path}lbartoletti.key[] === `{art}` include::{include-path}art.key[] === `{tobez}` include::{include-path}tobez.key[] === `{damien}` include::{include-path}damien.key[] === `{bdragon}` include::{include-path}bdragon.key[] === `{tcberner}` include::{include-path}tcberner.key[] === `{tdb}` include::{include-path}tdb.key[] === `{mbr}` include::{include-path}mbr.key[] === `{bvs}` include::{include-path}bvs.key[] === `{jbo}` include::{include-path}jbo.key[] === `{novel}` include::{include-path}novel.key[] === `{garga}` include::{include-path}garga.key[] === `{kbowling}` include::{include-path}kbowling.key[] === `{alexbl}` include::{include-path}alexbl.key[] === `{ebrandi}` include::{include-path}ebrandi.key[] === `{harti}` include::{include-path}harti.key[] === `{obraun}` include::{include-path}obraun.key[] === `{makc}` include::{include-path}makc.key[] === `{jmb}` include::{include-path}jmb.key[] === `{dab}` include::{include-path}dab.key[] === `{antoine}` include::{include-path}antoine.key[] === `{db}` include::{include-path}db.key[] === `{brueffer}` include::{include-path}brueffer.key[] === `{markus}` include::{include-path}markus.key[] === `{br}` include::{include-path}br.key[] === `{jch}` include::{include-path}jch.key[] === `{laurent}` include::{include-path}laurent.key[] +=== `{mchoo}` +include::{include-path}mchoo.key[] + === `{jchandra}` include::{include-path}jchandra.key[] === `{jcamou}` include::{include-path}jcamou.key[] === `{acm}` include::{include-path}acm.key[] === `{olce}` include::{include-path}olce.key[] === `{gahr}` include::{include-path}gahr.key[] === `{dchagin}` include::{include-path}dchagin.key[] === `{perky}` include::{include-path}perky.key[] === `{jon}` include::{include-path}jon.key[] === `{jonathan}` include::{include-path}jonathan.key[] === `{loader}` include::{include-path}loader.key[] === `{luoqi}` include::{include-path}luoqi.key[] === `{ache}` include::{include-path}ache.key[] === `{melifaro}` include::{include-path}melifaro.key[] === `{cjh}` include::{include-path}cjh.key[] === `{davidch}` include::{include-path}davidch.key[] === `{milki}` include::{include-path}milki.key[] === `{cjc}` include::{include-path}cjc.key[] === `{marcus}` include::{include-path}marcus.key[] === `{fuz}` include::{include-path}fuz.key[] === `{nik}` include::{include-path}nik.key[] === `{benjsc}` include::{include-path}benjsc.key[] === `{lcook}` include::{include-path}lcook.key[] === `{ngie}` include::{include-path}ngie.key[] === `{rakuco}` include::{include-path}rakuco.key[] === `{alc}` include::{include-path}alc.key[] === `{olivier}` include::{include-path}olivier.key[] === `{dch}` include::{include-path}dch.key[] +=== `{cracauer}` +include::{include-path}cracauer.key[] + === `{bcran}` include::{include-path}bcran.key[] === `{cc}` include::{include-path}cc.key[] === `{culot}` include::{include-path}culot.key[] === `{alfredo}` include::{include-path}alfredo.key[] === `{bapt}` include::{include-path}bapt.key[] === `{ceri}` include::{include-path}ceri.key[] === `{edavis}` include::{include-path}edavis.key[] === `{alexey}` include::{include-path}alexey.key[] === `{bsd}` include::{include-path}bsd.key[] === `{carl}` include::{include-path}carl.key[] === `{carlavilla}` include::{include-path}carlavilla.key[] === `{vd}` include::{include-path}vd.key[] === `{rdivacky}` include::{include-path}rdivacky.key[] === `{danfe}` include::{include-path}danfe.key[] === `{dd}` include::{include-path}dd.key[] === `{bdrewery}` include::{include-path}bdrewery.key[] === `{gad}` include::{include-path}gad.key[] === `{kd}` include::{include-path}kd.key[] === `{olivierd}` include::{include-path}olivierd.key[] === `{bruno}` include::{include-path}bruno.key[] === `{ale}` include::{include-path}ale.key[] === `{jlduran}` include::{include-path}jlduran.key[] === `{nemysis}` include::{include-path}nemysis.key[] === `{peadar}` include::{include-path}peadar.key[] === `{deischen}` include::{include-path}deischen.key[] === `{diizzy}` include::{include-path}diizzy.key[] === `{ue}` include::{include-path}ue.key[] === `{madpilot}` include::{include-path}madpilot.key[] === `{rafan}` include::{include-path}rafan.key[] === `{kami}` include::{include-path}kami.key[] === `{farrokhi}` include::{include-path}farrokhi.key[] === `{jedgar}` include::{include-path}jedgar.key[] === `{mfechner}` include::{include-path}mfechner.key[] === `{feld}` include::{include-path}feld.key[] === `{green}` include::{include-path}green.key[] === `{fanf}` include::{include-path}fanf.key[] === `{blackend}` include::{include-path}blackend.key[] === `{petef}` include::{include-path}petef.key[] === `{decke}` include::{include-path}decke.key[] === `{landonf}` include::{include-path}landonf.key[] === `{billf}` include::{include-path}billf.key[] === `{grembo}` include::{include-path}grembo.key[] === `{sgalabov}` include::{include-path}sgalabov.key[] === `{kgalazka}` include::{include-path}kgalazka.key[] === `{avg}` include::{include-path}avg.key[] === `{tiga}` include::{include-path}tiga.key[] === `{beat}` include::{include-path}beat.key[] === `{sjg}` include::{include-path}sjg.key[] === `{gibbs}` include::{include-path}gibbs.key[] === `{pfg}` include::{include-path}pfg.key[] === `{girgen}` include::{include-path}girgen.key[] === `{eugen}` include::{include-path}eugen.key[] === `{pgollucci}` include::{include-path}pgollucci.key[] === `{trociny}` include::{include-path}trociny.key[] === `{dmgk}` include::{include-path}dmgk.key[] === `{daichi}` include::{include-path}daichi.key[] === `{grehan}` include::{include-path}grehan.key[] === `{jamie}` include::{include-path}jamie.key[] === `{adridg}` include::{include-path}adridg.key[] === `{wg}` include::{include-path}wg.key[] === `{bar}` include::{include-path}bar.key[] === `{jmg}` include::{include-path}jmg.key[] === `{mjg}` include::{include-path}mjg.key[] === `{jhale}` include::{include-path}jhale.key[] === `{jah}` include::{include-path}jah.key[] === `{dannyboy}` include::{include-path}dannyboy.key[] === `{dhartmei}` include::{include-path}dhartmei.key[] === `{ohauer}` include::{include-path}ohauer.key[] === `{ehaupt}` include::{include-path}ehaupt.key[] === `{jhay}` include::{include-path}jhay.key[] === `{bhd}` include::{include-path}bhd.key[] === `{sheldonh}` include::{include-path}sheldonh.key[] === `{mikeh}` include::{include-path}mikeh.key[] === `{mheinen}` include::{include-path}mheinen.key[] === `{niels}` include::{include-path}niels.key[] === `{ghelmer}` include::{include-path}ghelmer.key[] === `{mux}` include::{include-path}mux.key[] === `{wen}` include::{include-path}wen.key[] === `{dhn}` include::{include-path}dhn.key[] === `{jhibbits}` include::{include-path}jhibbits.key[] === `{jhixson}` include::{include-path}jhixson.key[] === `{pho}` include::{include-path}pho.key[] === `{oh}` include::{include-path}oh.key[] === `{mhorne}` include::{include-path}mhorne.key[] === `{bhughes}` include::{include-path}bhughes.key[] === `{sunpoet}` include::{include-path}sunpoet.key[] === `{lwhsu}` include::{include-path}lwhsu.key[] === `{foxfair}` include::{include-path}foxfair.key[] === `{whu}` include::{include-path}whu.key[] === `{chinsan}` include::{include-path}chinsan.key[] === `{zlei}` include::{include-path}zlei.key[] === `{davide}` include::{include-path}davide.key[] === `{jkh}` include::{include-path}jkh.key[] === `{versus}` include::{include-path}versus.key[] === `{pi}` include::{include-path}pi.key[] === `{weongyo}` include::{include-path}weongyo.key[] === `{peterj}` include::{include-path}peterj.key[] === `{jinmei}` include::{include-path}jinmei.key[] === `{ahze}` include::{include-path}ahze.key[] === `{markj}` include::{include-path}markj.key[] === `{trevor}` include::{include-path}trevor.key[] === `{erj}` include::{include-path}erj.key[] === `{allanjude}` include::{include-path}allanjude.key[] === `{bjk}` include::{include-path}bjk.key[] === `{phk}` include::{include-path}phk.key[] === `{pluknet}` include::{include-path}pluknet.key[] === `{cokane}` include::{include-path}cokane.key[] === `{mce}` include::{include-path}mce.key[] === `{karels}` include::{include-path}karels.key[] === `{kato}` include::{include-path}kato.key[] === `{vkashyap}` include::{include-path}vkashyap.key[] === `{pkubaj}` include::{include-path}pkubaj.key[] === `{kris}` include::{include-path}kris.key[] === `{keramida}` include::{include-path}keramida.key[] === `{fjoe}` include::{include-path}fjoe.key[] === `{manolis}` include::{include-path}manolis.key[] === `{stevek}` include::{include-path}stevek.key[] === `{jkim}` include::{include-path}jkim.key[] === `{zack}` include::{include-path}zack.key[] === `{akiyano}` include::{include-path}akiyano.key[] === `{jceel}` include::{include-path}jceel.key[] === `{andreas}` include::{include-path}andreas.key[] === `{kai}` include::{include-path}kai.key[] === `{corvink}` include::{include-path}corvink.key[] === `{jkois}` include::{include-path}jkois.key[] === `{sergei}` include::{include-path}sergei.key[] === `{maxim}` include::{include-path}maxim.key[] === `{taras}` include::{include-path}taras.key[] === `{tobik}` include::{include-path}tobik.key[] === `{jkoshy}` include::{include-path}jkoshy.key[] === `{wkoszek}` include::{include-path}wkoszek.key[] === `{ak}` include::{include-path}ak.key[] === `{gabor}` include::{include-path}gabor.key[] === `{anchie}` include::{include-path}anchie.key[] === `{rushani}` include::{include-path}rushani.key[] === `{kuriyama}` include::{include-path}kuriyama.key[] === `{rene}` include::{include-path}rene.key[] === `{jlaffaye}` include::{include-path}jlaffaye.key[] === `{clement}` include::{include-path}clement.key[] === `{mlaier}` include::{include-path}mlaier.key[] === `{martymac}` include::{include-path}martymac.key[] === `{glarkin}` include::{include-path}glarkin.key[] === `{dru}` include::{include-path}dru.key[] === `{lawrance}` include::{include-path}lawrance.key[] === `{njl}` include::{include-path}njl.key[] === `{jlh}` include::{include-path}jlh.key[] === `{leeym}` include::{include-path}leeym.key[] === `{sam}` include::{include-path}sam.key[] === `{jylefort}` include::{include-path}jylefort.key[] === `{grog}` include::{include-path}grog.key[] === `{oliver}` include::{include-path}oliver.key[] === `{netchild}` include::{include-path}netchild.key[] === `{leitao}` include::{include-path}leitao.key[] === `{ae}` include::{include-path}ae.key[] === `{lesi}` include::{include-path}lesi.key[] === `{achim}` include::{include-path}achim.key[] === `{cel}` include::{include-path}cel.key[] === `{glewis}` include::{include-path}glewis.key[] === `{vishwin}` include::{include-path}vishwin.key[] === `{delphij}` include::{include-path}delphij.key[] === `{avatar}` include::{include-path}avatar.key[] === `{ijliao}` include::{include-path}ijliao.key[] === `{rlibby}` include::{include-path}rlibby.key[] === `{pclin}` include::{include-path}pclin.key[] === `{yzlin}` include::{include-path}yzlin.key[] === `{linimon}` include::{include-path}linimon.key[] === `{arved}` include::{include-path}arved.key[] === `{dryice}` include::{include-path}dryice.key[] === `{nemoliu}` include::{include-path}nemoliu.key[] === `{kevlo}` include::{include-path}kevlo.key[] === `{zml}` include::{include-path}zml.key[] === `{nox}` include::{include-path}nox.key[] === `{avl}` include::{include-path}avl.key[] === `{scottl}` include::{include-path}scottl.key[] === `{rmacklem}` include::{include-path}rmacklem.key[] === `{vmaffione}` include::{include-path}vmaffione.key[] === `{bmah}` include::{include-path}bmah.key[] === `{rm}` include::{include-path}rm.key[] === `{mtm}` include::{include-path}mtm.key[] === `{dwmalone}` include::{include-path}dwmalone.key[] === `{christos}` include::{include-path}christos.key[] === `{marino}` include::{include-path}marino.key[] === `{emaste}` include::{include-path}emaste.key[] === `{cherry}` include::{include-path}cherry.key[] === `{matusita}` include::{include-path}matusita.key[] === `{mm}` include::{include-path}mm.key[] === `{sem}` include::{include-path}sem.key[] === `{rcm}` include::{include-path}rcm.key[] === `{mckusick}` include::{include-path}mckusick.key[] === `{tmclaugh}` include::{include-path}tmclaugh.key[] === `{jmelo}` include::{include-path}jmelo.key[] === `{mmel}` include::{include-path}mmel.key[] === `{jmmv}` include::{include-path}jmmv.key[] === `{kadesai}` include::{include-path}kadesai.key[] === `{ken}` include::{include-path}ken.key[] === `{markm}` include::{include-path}markm.key[] === `{dinoex}` include::{include-path}dinoex.key[] === `{sanpei}` include::{include-path}sanpei.key[] === `{rmh}` include::{include-path}rmh.key[] === `{driesm}` include::{include-path}driesm.key[] === `{jrm}` include::{include-path}jrm.key[] === `{freqlabs}` include::{include-path}freqlabs.key[] === `{mmoll}` include::{include-path}mmoll.key[] === `{cmt}` include::{include-path}cmt.key[] === `{stephen}` include::{include-path}stephen.key[] === `{marcel}` include::{include-path}marcel.key[] === `{dougm}` include::{include-path}dougm.key[] === `{kmoore}` include::{include-path}kmoore.key[] === `{marck}` include::{include-path}marck.key[] === `{mav}` include::{include-path}mav.key[] === `{rich}` include::{include-path}rich.key[] === `{knu}` include::{include-path}knu.key[] === `{tmm}` include::{include-path}tmm.key[] === `{max}` include::{include-path}max.key[] === `{maho}` include::{include-path}maho.key[] === `{yoichi}` include::{include-path}yoichi.key[] === `{bland}` include::{include-path}bland.key[] === `{gnn}` include::{include-path}gnn.key[] === `{khng}` include::{include-path}khng.key[] === `{simon}` include::{include-path}simon.key[] === `{rnoland}` include::{include-path}rnoland.key[] === `{anders}` include::{include-path}anders.key[] === `{lofi}` include::{include-path}lofi.key[] === `{obrien}` include::{include-path}obrien.key[] === `{olgeni}` include::{include-path}olgeni.key[] === `{philip}` include::{include-path}philip.key[] === `{jpaetzel}` include::{include-path}jpaetzel.key[] === `{zirias}` include::{include-path}zirias.key[] === `{hiren}` include::{include-path}hiren.key[] === `{hmp}` include::{include-path}hmp.key[] === `{fluffy}` include::{include-path}fluffy.key[] === `{sat}` include::{include-path}sat.key[] === `{np}` include::{include-path}np.key[] === `{royger}` include::{include-path}royger.key[] === `{rpaulo}` include::{include-path}rpaulo.key[] === `{misha}` include::{include-path}misha.key[] +=== `{cperciva}` +include::{include-path}cperciva.key[] + === `{dumbbell}` include::{include-path}dumbbell.key[] === `{rpokala}` include::{include-path}rpokala.key[] === `{mp}` include::{include-path}mp.key[] === `{roam}` include::{include-path}roam.key[] === `{den}` include::{include-path}den.key[] === `{csjp}` include::{include-path}csjp.key[] === `{grahamperrin}` include::{include-path}grahamperrin.key[] === `{gerald}` include::{include-path}gerald.key[] === `{scottph}` include::{include-path}scottph.key[] === `{jacula}` include::{include-path}jacula.key[] === `{0mp}` include::{include-path}0mp.key[] === `{jdp}` include::{include-path}jdp.key[] === `{krion}` include::{include-path}krion.key[] === `{vladlen}` include::{include-path}vladlen.key[] === `{sepotvin}` include::{include-path}sepotvin.key[] === `{cpm}` include::{include-path}cpm.key[] === `{markp}` include::{include-path}markp.key[] === `{alepulver}` include::{include-path}alepulver.key[] === `{kp}` include::{include-path}kp.key[] === `{thomas}` include::{include-path}thomas.key[] === `{hq}` include::{include-path}hq.key[] === `{bofh}` include::{include-path}bofh.key[] === `{fox}` include::{include-path}fox.key[] === `{lbr}` include::{include-path}lbr.key[] === `{crees}` include::{include-path}crees.key[] === `{rees}` include::{include-path}rees.key[] === `{mr}` include::{include-path}mr.key[] === `{bcr}` include::{include-path}bcr.key[] === `{trhodes}` include::{include-path}trhodes.key[] === `{benno}` include::{include-path}benno.key[] === `{beech}` include::{include-path}beech.key[] === `{roberto}` include::{include-path}roberto.key[] === `{rodrigc}` include::{include-path}rodrigc.key[] === `{michaelo}` include::{include-path}michaelo.key[] === `{igoro}` include::{include-path}igoro.key[] === `{dtxdf}` include::{include-path}dtxdf.key[] === `{ler}` include::{include-path}ler.key[] === `{leres}` include::{include-path}leres.key[] === `{robak}` include::{include-path}robak.key[] === `{guido}` include::{include-path}guido.key[] === `{rea}` include::{include-path}rea.key[] === `{ray}` include::{include-path}ray.key[] === `{niklas}` include::{include-path}niklas.key[] === `{salvadore}` include::{include-path}salvadore.key[] === `{bsam}` include::{include-path}bsam.key[] === `{marks}` include::{include-path}marks.key[] === `{bschmidt}` include::{include-path}bschmidt.key[] === `{wosch}` include::{include-path}wosch.key[] === `{cy}` include::{include-path}cy.key[] === `{das}` include::{include-path}das.key[] === `{scheidell}` include::{include-path}scheidell.key[] === `{matthew}` include::{include-path}matthew.key[] === `{tmseck}` include::{include-path}tmseck.key[] === `{johans}` include::{include-path}johans.key[] === `{bakul}` include::{include-path}bakul.key[] === `{gshapiro}` include::{include-path}gshapiro.key[] === `{wxs}` include::{include-path}wxs.key[] === `{nork}` include::{include-path}nork.key[] === `{syrinx}` include::{include-path}syrinx.key[] === `{vanilla}` include::{include-path}vanilla.key[] === `{ashafer}` include::{include-path}ashafer.key[] === `{ashish}` include::{include-path}ashish.key[] === `{asiciliano}` include::{include-path}asiciliano.key[] === `{chs}` include::{include-path}chs.key[] === `{bms}` include::{include-path}bms.key[] === `{demon}` include::{include-path}demon.key[] === `{jesper}` include::{include-path}jesper.key[] === `{scop}` include::{include-path}scop.key[] === `{anray}` include::{include-path}anray.key[] === `{flo}` include::{include-path}flo.key[] === `{glebius}` include::{include-path}glebius.key[] === `{kensmith}` include::{include-path}kensmith.key[] === `{ben}` include::{include-path}ben.key[] === `{des}` include::{include-path}des.key[] === `{sobomax}` include::{include-path}sobomax.key[] === `{asomers}` include::{include-path}asomers.key[] === `{brian}` include::{include-path}brian.key[] === `{sson}` include::{include-path}sson.key[] === `{nsouch}` include::{include-path}nsouch.key[] === `{ssouhlal}` include::{include-path}ssouhlal.key[] === `{loos}` include::{include-path}loos.key[] === `{brnrd}` include::{include-path}brnrd.key[] === `{rink}` include::{include-path}rink.key[] === `{vsevolod}` include::{include-path}vsevolod.key[] === `{pstef}` include::{include-path}pstef.key[] === `{zi}` include::{include-path}zi.key[] === `{lstewart}` include::{include-path}lstewart.key[] === `{murray}` include::{include-path}murray.key[] === `{vs}` include::{include-path}vs.key[] === `{xride}` include::{include-path}xride.key[] === `{marius}` include::{include-path}marius.key[] === `{cs}` include::{include-path}cs.key[] === `{clsung}` include::{include-path}clsung.key[] === `{gsutter}` include::{include-path}gsutter.key[] === `{metal}` include::{include-path}metal.key[] === `{ryusuke}` include::{include-path}ryusuke.key[] === `{nyan}` include::{include-path}nyan.key[] === `{sahil}` include::{include-path}sahil.key[] === `{tota}` include::{include-path}tota.key[] === `{romain}` include::{include-path}romain.key[] === `{eduardo}` include::{include-path}eduardo.key[] === `{sylvio}` include::{include-path}sylvio.key[] === `{itetcu}` include::{include-path}itetcu.key[] === `{mi}` include::{include-path}mi.key[] === `{gordon}` include::{include-path}gordon.key[] === `{lth}` include::{include-path}lth.key[] === `{fabient}` include::{include-path}fabient.key[] === `{thierry}` include::{include-path}thierry.key[] === `{thompsa}` include::{include-path}thompsa.key[] === `{flz}` include::{include-path}flz.key[] === `{jilles}` include::{include-path}jilles.key[] === `{ganbold}` include::{include-path}ganbold.key[] === `{tuexen}` include::{include-path}tuexen.key[] +=== `{chuck}` +include::{include-path}chuck.key[] + === `{gonzo}` include::{include-path}gonzo.key[] === `{uzsolt}` include::{include-path}uzsolt.key[] === `{ume}` include::{include-path}ume.key[] === `{ups}` include::{include-path}ups.key[] === `{fsu}` include::{include-path}fsu.key[] === `{mikael}` include::{include-path}mikael.key[] === `{manu}` include::{include-path}manu.key[] === `{ram}` include::{include-path}ram.key[] === `{bryanv}` include::{include-path}bryanv.key[] === `{nectar}` include::{include-path}nectar.key[] === `{avilla}` include::{include-path}avilla.key[] === `{nivit}` include::{include-path}nivit.key[] === `{ivoras}` include::{include-path}ivoras.key[] === `{stefan}` include::{include-path}stefan.key[] === `{kaiw}` include::{include-path}kaiw.key[] === `{adamw}` include::{include-path}adamw.key[] === `{naddy}` include::{include-path}naddy.key[] === `{peter}` include::{include-path}peter.key[] === `{nwhitehorn}` include::{include-path}nwhitehorn.key[] === `{obiwac}` include::{include-path}obiwac.key[] === `{miwi}` include::{include-path}miwi.key[] === `{nate}` include::{include-path}nate.key[] === `{twinterg}` include::{include-path}twinterg.key[] === `{def}` include::{include-path}def.key[] === `{wollman}` include::{include-path}wollman.key[] === `{joerg}` include::{include-path}joerg.key[] === `{ygy}` include::{include-path}ygy.key[] === `{emax}` include::{include-path}emax.key[] === `{oshogbo}` include::{include-path}oshogbo.key[] === `{andy}` include::{include-path}andy.key[] === `{riggs}` include::{include-path}riggs.key[] === `{egypcio}` include::{include-path}egypcio.key[] === `{bz}` include::{include-path}bz.key[] === `{dsl}` include::{include-path}dsl.key[] === `{zeising}` include::{include-path}zeising.key[] === `{phantom}` include::{include-path}phantom.key[] === `{tz}` include::{include-path}tz.key[] === `{rigoletto}` include::{include-path}rigoletto.key[] === `{kaktus}` include::{include-path}kaktus.key[] === `{samm}` include::{include-path}samm.key[] === `{arrowd}` include::{include-path}arrowd.key[] === `{ronald}` include::{include-path}ronald.key[] === `{meta}` include::{include-path}meta.key[] === `{rnagy}` include::{include-path}rnagy.key[] === `{vvd}` include::{include-path}vvd.key[] === `{gbe}` include::{include-path}gbe.key[] === `{bnovkov}` include::{include-path}bnovkov.key[] === `{ivy}` include::{include-path}ivy.key[] === `{khorben}` include::{include-path}khorben.key[] === `{vexeduxr}` include::{include-path}vexeduxr.key[] === `{alven}` include::{include-path}alven.key[] === `{pouria}` include::{include-path}pouria.key[] === `{siva}` include::{include-path}siva.key[] === `{nxjoseph}` include::{include-path}nxjoseph.key[] === `{kenrap}` include::{include-path}kenrap.key[] [[pgpkeys-other]] == Другие владельцы учётных записей === `{bk}` include::{include-path}bk.key[] === `{deb}` include::{include-path}deb.key[] === `{debdrup}` include::{include-path}debdrup.key[] === `{dutchdaemon}` include::{include-path}dutchdaemon.key[] === `{keymaster}` include::{include-path}keymaster.key[] === `{mwlucas}` include::{include-path}mwlucas.key[] === `{dhw}` include::{include-path}dhw.key[] === `{tpearson}` include::{include-path}tpearson.key[] diff --git a/documentation/content/ru/articles/pgpkeys/_index.po b/documentation/content/ru/articles/pgpkeys/_index.po index 5278cffabb..b8296a2730 100644 --- a/documentation/content/ru/articles/pgpkeys/_index.po +++ b/documentation/content/ru/articles/pgpkeys/_index.po @@ -1,3069 +1,3108 @@ # SOME DESCRIPTIVE TITLE # Copyright (C) YEAR The FreeBSD Project # This file is distributed under the same license as the FreeBSD Documentation package. # Vladlen Popolitov , 2025, 2026. msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2026-05-09 23:29+0100\n" -"PO-Revision-Date: 2026-05-11 04:45+0000\n" +"POT-Creation-Date: 2026-08-06 22:55+0100\n" +"PO-Revision-Date: 2026-08-08 04:45+0000\n" "Last-Translator: Vladlen Popolitov \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 4.17\n" #. type: YAML Front Matter: description #: documentation/content/en/articles/pgpkeys/_index.adoc:1 #, no-wrap msgid "List of OpenPGP keys that can be used to verify a signature or send encrypted email to FreeBSD.org officers or developers." msgstr "Список OpenPGP-ключей, которые можно использовать для проверки подписей или отправки зашифрованной электронной почты офицерам или разработчикам FreeBSD.org." #. type: Title = #: documentation/content/en/articles/pgpkeys/_index.adoc:1 #: documentation/content/en/articles/pgpkeys/_index.adoc:7 #, no-wrap msgid "OpenPGP Keys" msgstr "Ключи OpenPGP" #. type: Plain text -#: documentation/content/en/articles/pgpkeys/_index.adoc:45 +#: documentation/content/en/articles/pgpkeys/_index.adoc:44 msgid "'''" msgstr "'''" #. type: Plain text -#: documentation/content/en/articles/pgpkeys/_index.adoc:50 +#: documentation/content/en/articles/pgpkeys/_index.adoc:49 msgid "" "These OpenPGP keys can be used to verify a signature or send encrypted email " "to `FreeBSD.org` officers or developers. The complete keyring can be " -"downloaded at link:https://docs.FreeBSD.org/pgpkeys/pgpkeys.txt[pgpkeyring." -"txt]." +"downloaded at link:https://docs.FreeBSD.org/pgpkeys/pgpkeys.txt[pgpkeys.txt]." msgstr "" "Эти OpenPGP-ключи можно использовать для проверки подписи или отправки " "зашифрованной электронной почты офицерам или разработчикам `FreeBSD.org`. " "Полный набор ключей можно загрузить по ссылке link:https://docs.FreeBSD.org/" "pgpkeys/pgpkeys.txt[pgpkeys.txt]." # # #. Do not edit this file except as instructed by the addkey.sh script. #. See the README file in /data/pgpkeys for instructions. #. This article contains all the keys. The officer keys are also #. shown in the Handbook PGP keys chapter. #. type: Title == -#: documentation/content/en/articles/pgpkeys/_index.adoc:61 +#: documentation/content/en/articles/pgpkeys/_index.adoc:60 #, no-wrap msgid "Officers" msgstr "Офицеры" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:63 +#: documentation/content/en/articles/pgpkeys/_index.adoc:62 #, no-wrap msgid "{security-officer-name} `<{security-officer-email}>`" msgstr "{security-officer-name} `<{security-officer-email}>`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:66 +#: documentation/content/en/articles/pgpkeys/_index.adoc:65 #, no-wrap msgid "{core-secretary-name} `<{core-secretary-email}>`" msgstr "{core-secretary-name} `<{core-secretary-email}>`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:69 +#: documentation/content/en/articles/pgpkeys/_index.adoc:68 #, no-wrap msgid "{portmgr-secretary-name} `<{portmgr-secretary-email}>`" msgstr "{portmgr-secretary-name} `<{portmgr-secretary-email}>`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:72 +#: documentation/content/en/articles/pgpkeys/_index.adoc:71 #, no-wrap msgid "{doceng-secretary-name} `<{doceng-secretary-email}>`" msgstr "{doceng-secretary-name} `<{doceng-secretary-email}>`" #. type: Title == -#: documentation/content/en/articles/pgpkeys/_index.adoc:76 +#: documentation/content/en/articles/pgpkeys/_index.adoc:75 #, no-wrap msgid "Core Team Members" msgstr "Участники Основной команды (Core Team)" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:78 -#: documentation/content/en/articles/pgpkeys/_index.adoc:651 +#: documentation/content/en/articles/pgpkeys/_index.adoc:77 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1451 #, no-wrap -msgid "`{allanjude}`" -msgstr "`{allanjude}`" +msgid "`{adamw}`" +msgstr "`{adamw}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:81 -#: documentation/content/en/articles/pgpkeys/_index.adoc:342 +#: documentation/content/en/articles/pgpkeys/_index.adoc:80 #, no-wrap -msgid "`{dch}`" -msgstr "`{dch}`" +msgid "`{adrian}`" +msgstr "`{adrian}`" + +#. type: Title === +#: documentation/content/en/articles/pgpkeys/_index.adoc:83 +#: documentation/content/en/articles/pgpkeys/_index.adoc:365 +#, no-wrap +msgid "`{bapt}`" +msgstr "`{bapt}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:84 -#: documentation/content/en/articles/pgpkeys/_index.adoc:1263 +#: documentation/content/en/articles/pgpkeys/_index.adoc:86 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1274 #, no-wrap msgid "`{glebius}`" msgstr "`{glebius}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:87 +#: documentation/content/en/articles/pgpkeys/_index.adoc:89 #, no-wrap msgid "`{hrs}`" msgstr "`{hrs}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:90 -#: documentation/content/en/articles/pgpkeys/_index.adoc:603 +#: documentation/content/en/articles/pgpkeys/_index.adoc:92 #, no-wrap -msgid "`{lwhsu}`" -msgstr "`{lwhsu}`" +msgid "`{imp}`" +msgstr "`{imp}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:93 -#: documentation/content/en/articles/pgpkeys/_index.adoc:147 +#: documentation/content/en/articles/pgpkeys/_index.adoc:95 +#: documentation/content/en/articles/pgpkeys/_index.adoc:953 #, no-wrap -msgid "`{mat}`" -msgstr "`{mat}`" +msgid "`{jrm}`" +msgstr "`{jrm}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:96 -#: documentation/content/en/articles/pgpkeys/_index.adoc:339 +#: documentation/content/en/articles/pgpkeys/_index.adoc:98 #, no-wrap -msgid "`{olivier}`" -msgstr "`{olivier}`" +msgid "`{kevans}`" +msgstr "`{kevans}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:99 -#: documentation/content/en/articles/pgpkeys/_index.adoc:198 +#: documentation/content/en/articles/pgpkeys/_index.adoc:101 +#: documentation/content/en/articles/pgpkeys/_index.adoc:344 #, no-wrap -msgid "`{tcberner}`" -msgstr "`{tcberner}`" +msgid "`{olivier}`" +msgstr "`{olivier}`" #. type: Title == -#: documentation/content/en/articles/pgpkeys/_index.adoc:103 +#: documentation/content/en/articles/pgpkeys/_index.adoc:105 #, no-wrap msgid "Developers" msgstr "Разработчики" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:105 +#: documentation/content/en/articles/pgpkeys/_index.adoc:107 #, no-wrap msgid "`{jgh}`" msgstr "`{jgh}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:108 +#: documentation/content/en/articles/pgpkeys/_index.adoc:110 #, no-wrap msgid "`{ariff}`" msgstr "`{ariff}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:111 +#: documentation/content/en/articles/pgpkeys/_index.adoc:113 #, no-wrap msgid "`{tabthorpe}`" msgstr "`{tabthorpe}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:114 +#: documentation/content/en/articles/pgpkeys/_index.adoc:116 #, no-wrap msgid "`{eadler}`" msgstr "`{eadler}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:117 +#: documentation/content/en/articles/pgpkeys/_index.adoc:119 #, no-wrap msgid "`{pauamma}`" msgstr "`{pauamma}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:120 +#: documentation/content/en/articles/pgpkeys/_index.adoc:122 #, no-wrap msgid "`{shaun}`" msgstr "`{shaun}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:123 +#: documentation/content/en/articles/pgpkeys/_index.adoc:125 #, no-wrap msgid "`{brix}`" msgstr "`{brix}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:126 +#: documentation/content/en/articles/pgpkeys/_index.adoc:128 #, no-wrap msgid "`{mandree}`" msgstr "`{mandree}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:129 +#: documentation/content/en/articles/pgpkeys/_index.adoc:131 #, no-wrap msgid "`{will}`" msgstr "`{will}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:132 +#: documentation/content/en/articles/pgpkeys/_index.adoc:134 #, no-wrap msgid "`{dim}`" msgstr "`{dim}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:135 +#: documentation/content/en/articles/pgpkeys/_index.adoc:137 #, no-wrap msgid "`{anholt}`" msgstr "`{anholt}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:138 +#: documentation/content/en/articles/pgpkeys/_index.adoc:140 #, no-wrap msgid "`{fernape}`" msgstr "`{fernape}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:141 +#: documentation/content/en/articles/pgpkeys/_index.adoc:143 #, no-wrap msgid "`{mva}`" msgstr "`{mva}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:144 +#: documentation/content/en/articles/pgpkeys/_index.adoc:146 #, no-wrap msgid "`{araujo}`" msgstr "`{araujo}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:150 +#: documentation/content/en/articles/pgpkeys/_index.adoc:149 +#, no-wrap +msgid "`{mat}`" +msgstr "`{mat}`" + +#. type: Title === +#: documentation/content/en/articles/pgpkeys/_index.adoc:152 #, no-wrap msgid "`{syuu}`" msgstr "`{syuu}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:153 +#: documentation/content/en/articles/pgpkeys/_index.adoc:155 #, no-wrap msgid "`{asami}`" msgstr "`{asami}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:156 +#: documentation/content/en/articles/pgpkeys/_index.adoc:158 #, no-wrap msgid "`{jsa}`" msgstr "`{jsa}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:159 +#: documentation/content/en/articles/pgpkeys/_index.adoc:161 #, no-wrap msgid "`{jadawin}`" msgstr "`{jadawin}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:162 +#: documentation/content/en/articles/pgpkeys/_index.adoc:164 #, no-wrap msgid "`{jwb}`" msgstr "`{jwb}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:165 +#: documentation/content/en/articles/pgpkeys/_index.adoc:167 #, no-wrap msgid "`{dbaio}`" msgstr "`{dbaio}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:168 +#: documentation/content/en/articles/pgpkeys/_index.adoc:170 #, no-wrap msgid "`{timur}`" msgstr "`{timur}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:171 +#: documentation/content/en/articles/pgpkeys/_index.adoc:173 #, no-wrap msgid "`{jhb}`" msgstr "`{jhb}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:174 +#: documentation/content/en/articles/pgpkeys/_index.adoc:176 #, no-wrap msgid "`{gjb}`" msgstr "`{gjb}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:177 +#: documentation/content/en/articles/pgpkeys/_index.adoc:179 #, no-wrap msgid "`{snb}`" msgstr "`{snb}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:180 +#: documentation/content/en/articles/pgpkeys/_index.adoc:182 #, no-wrap msgid "`{barner}`" msgstr "`{barner}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:183 +#: documentation/content/en/articles/pgpkeys/_index.adoc:185 #, no-wrap msgid "`{lbartoletti}`" msgstr "`{lbartoletti}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:186 +#: documentation/content/en/articles/pgpkeys/_index.adoc:188 #, no-wrap msgid "`{art}`" msgstr "`{art}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:189 +#: documentation/content/en/articles/pgpkeys/_index.adoc:191 #, no-wrap msgid "`{tobez}`" msgstr "`{tobez}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:192 +#: documentation/content/en/articles/pgpkeys/_index.adoc:194 #, no-wrap msgid "`{damien}`" msgstr "`{damien}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:195 +#: documentation/content/en/articles/pgpkeys/_index.adoc:197 #, no-wrap msgid "`{bdragon}`" msgstr "`{bdragon}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:201 +#: documentation/content/en/articles/pgpkeys/_index.adoc:200 +#, no-wrap +msgid "`{tcberner}`" +msgstr "`{tcberner}`" + +#. type: Title === +#: documentation/content/en/articles/pgpkeys/_index.adoc:203 #, no-wrap msgid "`{tdb}`" msgstr "`{tdb}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:204 +#: documentation/content/en/articles/pgpkeys/_index.adoc:206 #, no-wrap msgid "`{mbr}`" msgstr "`{mbr}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:207 +#: documentation/content/en/articles/pgpkeys/_index.adoc:209 #, no-wrap msgid "`{bvs}`" msgstr "`{bvs}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:210 +#: documentation/content/en/articles/pgpkeys/_index.adoc:212 #, no-wrap msgid "`{jbo}`" msgstr "`{jbo}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:213 +#: documentation/content/en/articles/pgpkeys/_index.adoc:215 #, no-wrap msgid "`{novel}`" msgstr "`{novel}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:216 +#: documentation/content/en/articles/pgpkeys/_index.adoc:218 #, no-wrap msgid "`{garga}`" msgstr "`{garga}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:219 +#: documentation/content/en/articles/pgpkeys/_index.adoc:221 #, no-wrap msgid "`{kbowling}`" msgstr "`{kbowling}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:222 +#: documentation/content/en/articles/pgpkeys/_index.adoc:224 #, no-wrap msgid "`{alexbl}`" msgstr "`{alexbl}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:225 +#: documentation/content/en/articles/pgpkeys/_index.adoc:227 #, no-wrap msgid "`{ebrandi}`" msgstr "`{ebrandi}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:228 +#: documentation/content/en/articles/pgpkeys/_index.adoc:230 #, no-wrap msgid "`{harti}`" msgstr "`{harti}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:231 +#: documentation/content/en/articles/pgpkeys/_index.adoc:233 #, no-wrap msgid "`{obraun}`" msgstr "`{obraun}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:234 +#: documentation/content/en/articles/pgpkeys/_index.adoc:236 #, no-wrap msgid "`{makc}`" msgstr "`{makc}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:237 +#: documentation/content/en/articles/pgpkeys/_index.adoc:239 #, no-wrap msgid "`{jmb}`" msgstr "`{jmb}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:240 +#: documentation/content/en/articles/pgpkeys/_index.adoc:242 #, no-wrap msgid "`{dab}`" msgstr "`{dab}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:243 +#: documentation/content/en/articles/pgpkeys/_index.adoc:245 #, no-wrap msgid "`{antoine}`" msgstr "`{antoine}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:246 +#: documentation/content/en/articles/pgpkeys/_index.adoc:248 #, no-wrap msgid "`{db}`" msgstr "`{db}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:249 +#: documentation/content/en/articles/pgpkeys/_index.adoc:251 #, no-wrap msgid "`{brueffer}`" msgstr "`{brueffer}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:252 +#: documentation/content/en/articles/pgpkeys/_index.adoc:254 #, no-wrap msgid "`{markus}`" msgstr "`{markus}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:255 +#: documentation/content/en/articles/pgpkeys/_index.adoc:257 #, no-wrap msgid "`{br}`" msgstr "`{br}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:258 +#: documentation/content/en/articles/pgpkeys/_index.adoc:260 #, no-wrap msgid "`{jch}`" msgstr "`{jch}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:261 +#: documentation/content/en/articles/pgpkeys/_index.adoc:263 #, no-wrap msgid "`{laurent}`" msgstr "`{laurent}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:264 +#: documentation/content/en/articles/pgpkeys/_index.adoc:266 +#, no-wrap +msgid "`{mchoo}`" +msgstr "`{mchoo}`" + +#. type: Title === +#: documentation/content/en/articles/pgpkeys/_index.adoc:269 #, no-wrap msgid "`{jchandra}`" msgstr "`{jchandra}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:267 +#: documentation/content/en/articles/pgpkeys/_index.adoc:272 #, no-wrap msgid "`{jcamou}`" msgstr "`{jcamou}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:270 +#: documentation/content/en/articles/pgpkeys/_index.adoc:275 #, no-wrap msgid "`{acm}`" msgstr "`{acm}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:273 +#: documentation/content/en/articles/pgpkeys/_index.adoc:278 #, no-wrap msgid "`{olce}`" msgstr "`{olce}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:276 +#: documentation/content/en/articles/pgpkeys/_index.adoc:281 #, no-wrap msgid "`{gahr}`" msgstr "`{gahr}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:279 +#: documentation/content/en/articles/pgpkeys/_index.adoc:284 #, no-wrap msgid "`{dchagin}`" msgstr "`{dchagin}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:282 +#: documentation/content/en/articles/pgpkeys/_index.adoc:287 #, no-wrap msgid "`{perky}`" msgstr "`{perky}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:285 +#: documentation/content/en/articles/pgpkeys/_index.adoc:290 #, no-wrap msgid "`{jon}`" msgstr "`{jon}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:288 +#: documentation/content/en/articles/pgpkeys/_index.adoc:293 #, no-wrap msgid "`{jonathan}`" msgstr "`{jonathan}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:291 +#: documentation/content/en/articles/pgpkeys/_index.adoc:296 #, no-wrap msgid "`{loader}`" msgstr "`{loader}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:294 +#: documentation/content/en/articles/pgpkeys/_index.adoc:299 #, no-wrap msgid "`{luoqi}`" msgstr "`{luoqi}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:297 +#: documentation/content/en/articles/pgpkeys/_index.adoc:302 #, no-wrap msgid "`{ache}`" msgstr "`{ache}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:300 +#: documentation/content/en/articles/pgpkeys/_index.adoc:305 #, no-wrap msgid "`{melifaro}`" msgstr "`{melifaro}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:303 +#: documentation/content/en/articles/pgpkeys/_index.adoc:308 #, no-wrap msgid "`{cjh}`" msgstr "`{cjh}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:306 +#: documentation/content/en/articles/pgpkeys/_index.adoc:311 #, no-wrap msgid "`{davidch}`" msgstr "`{davidch}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:309 +#: documentation/content/en/articles/pgpkeys/_index.adoc:314 #, no-wrap msgid "`{milki}`" msgstr "`{milki}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:312 +#: documentation/content/en/articles/pgpkeys/_index.adoc:317 #, no-wrap msgid "`{cjc}`" msgstr "`{cjc}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:315 +#: documentation/content/en/articles/pgpkeys/_index.adoc:320 #, no-wrap msgid "`{marcus}`" msgstr "`{marcus}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:318 +#: documentation/content/en/articles/pgpkeys/_index.adoc:323 #, no-wrap msgid "`{fuz}`" msgstr "`{fuz}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:321 +#: documentation/content/en/articles/pgpkeys/_index.adoc:326 #, no-wrap msgid "`{nik}`" msgstr "`{nik}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:324 +#: documentation/content/en/articles/pgpkeys/_index.adoc:329 #, no-wrap msgid "`{benjsc}`" msgstr "`{benjsc}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:327 +#: documentation/content/en/articles/pgpkeys/_index.adoc:332 #, no-wrap msgid "`{lcook}`" msgstr "`{lcook}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:330 +#: documentation/content/en/articles/pgpkeys/_index.adoc:335 #, no-wrap msgid "`{ngie}`" msgstr "`{ngie}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:333 +#: documentation/content/en/articles/pgpkeys/_index.adoc:338 #, no-wrap msgid "`{rakuco}`" msgstr "`{rakuco}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:336 +#: documentation/content/en/articles/pgpkeys/_index.adoc:341 #, no-wrap msgid "`{alc}`" msgstr "`{alc}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:345 +#: documentation/content/en/articles/pgpkeys/_index.adoc:347 +#, no-wrap +msgid "`{dch}`" +msgstr "`{dch}`" + +#. type: Title === +#: documentation/content/en/articles/pgpkeys/_index.adoc:350 +#, no-wrap +msgid "`{cracauer}`" +msgstr "`{cracauer}`" + +#. type: Title === +#: documentation/content/en/articles/pgpkeys/_index.adoc:353 #, no-wrap msgid "`{bcran}`" msgstr "`{bcran}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:348 +#: documentation/content/en/articles/pgpkeys/_index.adoc:356 #, no-wrap msgid "`{cc}`" msgstr "`{cc}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:351 +#: documentation/content/en/articles/pgpkeys/_index.adoc:359 #, no-wrap msgid "`{culot}`" msgstr "`{culot}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:354 +#: documentation/content/en/articles/pgpkeys/_index.adoc:362 #, no-wrap msgid "`{alfredo}`" msgstr "`{alfredo}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:357 -#, no-wrap -msgid "`{bapt}`" -msgstr "`{bapt}`" - -#. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:360 +#: documentation/content/en/articles/pgpkeys/_index.adoc:368 #, no-wrap msgid "`{ceri}`" msgstr "`{ceri}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:363 +#: documentation/content/en/articles/pgpkeys/_index.adoc:371 #, no-wrap msgid "`{edavis}`" msgstr "`{edavis}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:366 +#: documentation/content/en/articles/pgpkeys/_index.adoc:374 #, no-wrap msgid "`{alexey}`" msgstr "`{alexey}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:369 +#: documentation/content/en/articles/pgpkeys/_index.adoc:377 #, no-wrap msgid "`{bsd}`" msgstr "`{bsd}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:372 +#: documentation/content/en/articles/pgpkeys/_index.adoc:380 #, no-wrap msgid "`{carl}`" msgstr "`{carl}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:375 +#: documentation/content/en/articles/pgpkeys/_index.adoc:383 #, no-wrap msgid "`{carlavilla}`" msgstr "`{carlavilla}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:378 +#: documentation/content/en/articles/pgpkeys/_index.adoc:386 #, no-wrap msgid "`{vd}`" msgstr "`{vd}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:381 +#: documentation/content/en/articles/pgpkeys/_index.adoc:389 #, no-wrap msgid "`{rdivacky}`" msgstr "`{rdivacky}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:384 +#: documentation/content/en/articles/pgpkeys/_index.adoc:392 #, no-wrap msgid "`{danfe}`" msgstr "`{danfe}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:387 +#: documentation/content/en/articles/pgpkeys/_index.adoc:395 #, no-wrap msgid "`{dd}`" msgstr "`{dd}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:390 +#: documentation/content/en/articles/pgpkeys/_index.adoc:398 #, no-wrap msgid "`{bdrewery}`" msgstr "`{bdrewery}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:393 +#: documentation/content/en/articles/pgpkeys/_index.adoc:401 #, no-wrap msgid "`{gad}`" msgstr "`{gad}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:396 +#: documentation/content/en/articles/pgpkeys/_index.adoc:404 #, no-wrap msgid "`{kd}`" msgstr "`{kd}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:399 +#: documentation/content/en/articles/pgpkeys/_index.adoc:407 #, no-wrap msgid "`{olivierd}`" msgstr "`{olivierd}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:402 +#: documentation/content/en/articles/pgpkeys/_index.adoc:410 #, no-wrap msgid "`{bruno}`" msgstr "`{bruno}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:405 +#: documentation/content/en/articles/pgpkeys/_index.adoc:413 #, no-wrap msgid "`{ale}`" msgstr "`{ale}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:408 +#: documentation/content/en/articles/pgpkeys/_index.adoc:416 #, no-wrap msgid "`{jlduran}`" msgstr "`{jlduran}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:411 +#: documentation/content/en/articles/pgpkeys/_index.adoc:419 #, no-wrap msgid "`{nemysis}`" msgstr "`{nemysis}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:414 +#: documentation/content/en/articles/pgpkeys/_index.adoc:422 #, no-wrap msgid "`{peadar}`" msgstr "`{peadar}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:417 +#: documentation/content/en/articles/pgpkeys/_index.adoc:425 #, no-wrap msgid "`{deischen}`" msgstr "`{deischen}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:420 +#: documentation/content/en/articles/pgpkeys/_index.adoc:428 #, no-wrap msgid "`{diizzy}`" msgstr "`{diizzy}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:423 +#: documentation/content/en/articles/pgpkeys/_index.adoc:431 #, no-wrap msgid "`{ue}`" msgstr "`{ue}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:426 +#: documentation/content/en/articles/pgpkeys/_index.adoc:434 #, no-wrap msgid "`{madpilot}`" msgstr "`{madpilot}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:429 +#: documentation/content/en/articles/pgpkeys/_index.adoc:437 #, no-wrap msgid "`{rafan}`" msgstr "`{rafan}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:432 +#: documentation/content/en/articles/pgpkeys/_index.adoc:440 #, no-wrap msgid "`{kami}`" msgstr "`{kami}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:435 +#: documentation/content/en/articles/pgpkeys/_index.adoc:443 #, no-wrap msgid "`{farrokhi}`" msgstr "`{farrokhi}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:438 +#: documentation/content/en/articles/pgpkeys/_index.adoc:446 #, no-wrap msgid "`{jedgar}`" msgstr "`{jedgar}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:441 +#: documentation/content/en/articles/pgpkeys/_index.adoc:449 #, no-wrap msgid "`{mfechner}`" msgstr "`{mfechner}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:444 +#: documentation/content/en/articles/pgpkeys/_index.adoc:452 #, no-wrap msgid "`{feld}`" msgstr "`{feld}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:447 +#: documentation/content/en/articles/pgpkeys/_index.adoc:455 #, no-wrap msgid "`{green}`" msgstr "`{green}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:450 +#: documentation/content/en/articles/pgpkeys/_index.adoc:458 #, no-wrap msgid "`{fanf}`" msgstr "`{fanf}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:453 +#: documentation/content/en/articles/pgpkeys/_index.adoc:461 #, no-wrap msgid "`{blackend}`" msgstr "`{blackend}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:456 +#: documentation/content/en/articles/pgpkeys/_index.adoc:464 #, no-wrap msgid "`{petef}`" msgstr "`{petef}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:459 +#: documentation/content/en/articles/pgpkeys/_index.adoc:467 #, no-wrap msgid "`{decke}`" msgstr "`{decke}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:462 +#: documentation/content/en/articles/pgpkeys/_index.adoc:470 #, no-wrap msgid "`{landonf}`" msgstr "`{landonf}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:465 +#: documentation/content/en/articles/pgpkeys/_index.adoc:473 #, no-wrap msgid "`{billf}`" msgstr "`{billf}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:468 +#: documentation/content/en/articles/pgpkeys/_index.adoc:476 #, no-wrap msgid "`{grembo}`" msgstr "`{grembo}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:471 +#: documentation/content/en/articles/pgpkeys/_index.adoc:479 #, no-wrap msgid "`{sgalabov}`" msgstr "`{sgalabov}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:474 +#: documentation/content/en/articles/pgpkeys/_index.adoc:482 #, no-wrap msgid "`{kgalazka}`" msgstr "`{kgalazka}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:477 +#: documentation/content/en/articles/pgpkeys/_index.adoc:485 #, no-wrap msgid "`{avg}`" msgstr "`{avg}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:480 +#: documentation/content/en/articles/pgpkeys/_index.adoc:488 #, no-wrap msgid "`{tiga}`" msgstr "`{tiga}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:483 +#: documentation/content/en/articles/pgpkeys/_index.adoc:491 #, no-wrap msgid "`{beat}`" msgstr "`{beat}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:486 +#: documentation/content/en/articles/pgpkeys/_index.adoc:494 #, no-wrap msgid "`{sjg}`" msgstr "`{sjg}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:489 +#: documentation/content/en/articles/pgpkeys/_index.adoc:497 #, no-wrap msgid "`{gibbs}`" msgstr "`{gibbs}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:492 +#: documentation/content/en/articles/pgpkeys/_index.adoc:500 #, no-wrap msgid "`{pfg}`" msgstr "`{pfg}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:495 +#: documentation/content/en/articles/pgpkeys/_index.adoc:503 #, no-wrap msgid "`{girgen}`" msgstr "`{girgen}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:498 +#: documentation/content/en/articles/pgpkeys/_index.adoc:506 #, no-wrap msgid "`{eugen}`" msgstr "`{eugen}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:501 +#: documentation/content/en/articles/pgpkeys/_index.adoc:509 #, no-wrap msgid "`{pgollucci}`" msgstr "`{pgollucci}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:504 +#: documentation/content/en/articles/pgpkeys/_index.adoc:512 #, no-wrap msgid "`{trociny}`" msgstr "`{trociny}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:507 +#: documentation/content/en/articles/pgpkeys/_index.adoc:515 #, no-wrap msgid "`{dmgk}`" msgstr "`{dmgk}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:510 +#: documentation/content/en/articles/pgpkeys/_index.adoc:518 #, no-wrap msgid "`{daichi}`" msgstr "`{daichi}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:513 +#: documentation/content/en/articles/pgpkeys/_index.adoc:521 #, no-wrap msgid "`{grehan}`" msgstr "`{grehan}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:516 +#: documentation/content/en/articles/pgpkeys/_index.adoc:524 #, no-wrap msgid "`{jamie}`" msgstr "`{jamie}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:519 +#: documentation/content/en/articles/pgpkeys/_index.adoc:527 #, no-wrap msgid "`{adridg}`" msgstr "`{adridg}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:522 +#: documentation/content/en/articles/pgpkeys/_index.adoc:530 #, no-wrap msgid "`{wg}`" msgstr "`{wg}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:525 +#: documentation/content/en/articles/pgpkeys/_index.adoc:533 #, no-wrap msgid "`{bar}`" msgstr "`{bar}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:528 +#: documentation/content/en/articles/pgpkeys/_index.adoc:536 #, no-wrap msgid "`{jmg}`" msgstr "`{jmg}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:531 +#: documentation/content/en/articles/pgpkeys/_index.adoc:539 #, no-wrap msgid "`{mjg}`" msgstr "`{mjg}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:534 +#: documentation/content/en/articles/pgpkeys/_index.adoc:542 #, no-wrap msgid "`{jhale}`" msgstr "`{jhale}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:537 +#: documentation/content/en/articles/pgpkeys/_index.adoc:545 #, no-wrap msgid "`{jah}`" msgstr "`{jah}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:540 +#: documentation/content/en/articles/pgpkeys/_index.adoc:548 #, no-wrap msgid "`{dannyboy}`" msgstr "`{dannyboy}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:543 +#: documentation/content/en/articles/pgpkeys/_index.adoc:551 #, no-wrap msgid "`{dhartmei}`" msgstr "`{dhartmei}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:546 +#: documentation/content/en/articles/pgpkeys/_index.adoc:554 #, no-wrap msgid "`{ohauer}`" msgstr "`{ohauer}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:549 +#: documentation/content/en/articles/pgpkeys/_index.adoc:557 #, no-wrap msgid "`{ehaupt}`" msgstr "`{ehaupt}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:552 +#: documentation/content/en/articles/pgpkeys/_index.adoc:560 #, no-wrap msgid "`{jhay}`" msgstr "`{jhay}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:555 +#: documentation/content/en/articles/pgpkeys/_index.adoc:563 #, no-wrap msgid "`{bhd}`" msgstr "`{bhd}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:558 +#: documentation/content/en/articles/pgpkeys/_index.adoc:566 #, no-wrap msgid "`{sheldonh}`" msgstr "`{sheldonh}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:561 +#: documentation/content/en/articles/pgpkeys/_index.adoc:569 #, no-wrap msgid "`{mikeh}`" msgstr "`{mikeh}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:564 +#: documentation/content/en/articles/pgpkeys/_index.adoc:572 #, no-wrap msgid "`{mheinen}`" msgstr "`{mheinen}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:567 +#: documentation/content/en/articles/pgpkeys/_index.adoc:575 #, no-wrap msgid "`{niels}`" msgstr "`{niels}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:570 +#: documentation/content/en/articles/pgpkeys/_index.adoc:578 #, no-wrap msgid "`{ghelmer}`" msgstr "`{ghelmer}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:573 +#: documentation/content/en/articles/pgpkeys/_index.adoc:581 #, no-wrap msgid "`{mux}`" msgstr "`{mux}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:576 +#: documentation/content/en/articles/pgpkeys/_index.adoc:584 #, no-wrap msgid "`{wen}`" msgstr "`{wen}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:579 +#: documentation/content/en/articles/pgpkeys/_index.adoc:587 #, no-wrap msgid "`{dhn}`" msgstr "`{dhn}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:582 +#: documentation/content/en/articles/pgpkeys/_index.adoc:590 #, no-wrap msgid "`{jhibbits}`" msgstr "`{jhibbits}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:585 +#: documentation/content/en/articles/pgpkeys/_index.adoc:593 #, no-wrap msgid "`{jhixson}`" msgstr "`{jhixson}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:588 +#: documentation/content/en/articles/pgpkeys/_index.adoc:596 #, no-wrap msgid "`{pho}`" msgstr "`{pho}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:591 +#: documentation/content/en/articles/pgpkeys/_index.adoc:599 #, no-wrap msgid "`{oh}`" msgstr "`{oh}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:594 +#: documentation/content/en/articles/pgpkeys/_index.adoc:602 #, no-wrap msgid "`{mhorne}`" msgstr "`{mhorne}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:597 +#: documentation/content/en/articles/pgpkeys/_index.adoc:605 #, no-wrap msgid "`{bhughes}`" msgstr "`{bhughes}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:600 +#: documentation/content/en/articles/pgpkeys/_index.adoc:608 #, no-wrap msgid "`{sunpoet}`" msgstr "`{sunpoet}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:606 +#: documentation/content/en/articles/pgpkeys/_index.adoc:611 +#, no-wrap +msgid "`{lwhsu}`" +msgstr "`{lwhsu}`" + +#. type: Title === +#: documentation/content/en/articles/pgpkeys/_index.adoc:614 #, no-wrap msgid "`{foxfair}`" msgstr "`{foxfair}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:609 +#: documentation/content/en/articles/pgpkeys/_index.adoc:617 #, no-wrap msgid "`{whu}`" msgstr "`{whu}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:612 +#: documentation/content/en/articles/pgpkeys/_index.adoc:620 #, no-wrap msgid "`{chinsan}`" msgstr "`{chinsan}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:615 +#: documentation/content/en/articles/pgpkeys/_index.adoc:623 #, no-wrap msgid "`{zlei}`" msgstr "`{zlei}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:618 +#: documentation/content/en/articles/pgpkeys/_index.adoc:626 #, no-wrap msgid "`{davide}`" msgstr "`{davide}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:621 +#: documentation/content/en/articles/pgpkeys/_index.adoc:629 #, no-wrap msgid "`{jkh}`" msgstr "`{jkh}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:624 +#: documentation/content/en/articles/pgpkeys/_index.adoc:632 #, no-wrap msgid "`{versus}`" msgstr "`{versus}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:627 +#: documentation/content/en/articles/pgpkeys/_index.adoc:635 #, no-wrap msgid "`{pi}`" msgstr "`{pi}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:630 +#: documentation/content/en/articles/pgpkeys/_index.adoc:638 #, no-wrap msgid "`{weongyo}`" msgstr "`{weongyo}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:633 +#: documentation/content/en/articles/pgpkeys/_index.adoc:641 #, no-wrap msgid "`{peterj}`" msgstr "`{peterj}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:636 +#: documentation/content/en/articles/pgpkeys/_index.adoc:644 #, no-wrap msgid "`{jinmei}`" msgstr "`{jinmei}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:639 +#: documentation/content/en/articles/pgpkeys/_index.adoc:647 #, no-wrap msgid "`{ahze}`" msgstr "`{ahze}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:642 +#: documentation/content/en/articles/pgpkeys/_index.adoc:650 #, no-wrap msgid "`{markj}`" msgstr "`{markj}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:645 +#: documentation/content/en/articles/pgpkeys/_index.adoc:653 #, no-wrap msgid "`{trevor}`" msgstr "`{trevor}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:648 +#: documentation/content/en/articles/pgpkeys/_index.adoc:656 #, no-wrap msgid "`{erj}`" msgstr "`{erj}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:654 +#: documentation/content/en/articles/pgpkeys/_index.adoc:659 +#, no-wrap +msgid "`{allanjude}`" +msgstr "`{allanjude}`" + +#. type: Title === +#: documentation/content/en/articles/pgpkeys/_index.adoc:662 #, no-wrap msgid "`{bjk}`" msgstr "`{bjk}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:657 +#: documentation/content/en/articles/pgpkeys/_index.adoc:665 #, no-wrap msgid "`{phk}`" msgstr "`{phk}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:660 +#: documentation/content/en/articles/pgpkeys/_index.adoc:668 #, no-wrap msgid "`{pluknet}`" msgstr "`{pluknet}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:663 +#: documentation/content/en/articles/pgpkeys/_index.adoc:671 #, no-wrap msgid "`{cokane}`" msgstr "`{cokane}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:666 +#: documentation/content/en/articles/pgpkeys/_index.adoc:674 #, no-wrap msgid "`{mce}`" msgstr "`{mce}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:669 +#: documentation/content/en/articles/pgpkeys/_index.adoc:677 #, no-wrap msgid "`{karels}`" msgstr "`{karels}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:672 +#: documentation/content/en/articles/pgpkeys/_index.adoc:680 #, no-wrap msgid "`{kato}`" msgstr "`{kato}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:675 +#: documentation/content/en/articles/pgpkeys/_index.adoc:683 #, no-wrap msgid "`{vkashyap}`" msgstr "`{vkashyap}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:678 +#: documentation/content/en/articles/pgpkeys/_index.adoc:686 #, no-wrap msgid "`{pkubaj}`" msgstr "`{pkubaj}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:681 +#: documentation/content/en/articles/pgpkeys/_index.adoc:689 #, no-wrap msgid "`{kris}`" msgstr "`{kris}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:684 +#: documentation/content/en/articles/pgpkeys/_index.adoc:692 #, no-wrap msgid "`{keramida}`" msgstr "`{keramida}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:687 +#: documentation/content/en/articles/pgpkeys/_index.adoc:695 #, no-wrap msgid "`{fjoe}`" msgstr "`{fjoe}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:690 +#: documentation/content/en/articles/pgpkeys/_index.adoc:698 #, no-wrap msgid "`{manolis}`" msgstr "`{manolis}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:693 +#: documentation/content/en/articles/pgpkeys/_index.adoc:701 #, no-wrap msgid "`{stevek}`" msgstr "`{stevek}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:696 +#: documentation/content/en/articles/pgpkeys/_index.adoc:704 #, no-wrap msgid "`{jkim}`" msgstr "`{jkim}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:699 +#: documentation/content/en/articles/pgpkeys/_index.adoc:707 #, no-wrap msgid "`{zack}`" msgstr "`{zack}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:702 +#: documentation/content/en/articles/pgpkeys/_index.adoc:710 #, no-wrap msgid "`{akiyano}`" msgstr "`{akiyano}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:705 +#: documentation/content/en/articles/pgpkeys/_index.adoc:713 #, no-wrap msgid "`{jceel}`" msgstr "`{jceel}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:708 +#: documentation/content/en/articles/pgpkeys/_index.adoc:716 #, no-wrap msgid "`{andreas}`" msgstr "`{andreas}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:711 +#: documentation/content/en/articles/pgpkeys/_index.adoc:719 #, no-wrap msgid "`{kai}`" msgstr "`{kai}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:714 +#: documentation/content/en/articles/pgpkeys/_index.adoc:722 #, no-wrap msgid "`{corvink}`" msgstr "`{corvink}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:717 +#: documentation/content/en/articles/pgpkeys/_index.adoc:725 #, no-wrap msgid "`{jkois}`" msgstr "`{jkois}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:720 +#: documentation/content/en/articles/pgpkeys/_index.adoc:728 #, no-wrap msgid "`{sergei}`" msgstr "`{sergei}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:723 +#: documentation/content/en/articles/pgpkeys/_index.adoc:731 #, no-wrap msgid "`{maxim}`" msgstr "`{maxim}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:726 +#: documentation/content/en/articles/pgpkeys/_index.adoc:734 #, no-wrap msgid "`{taras}`" msgstr "`{taras}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:729 +#: documentation/content/en/articles/pgpkeys/_index.adoc:737 #, no-wrap msgid "`{tobik}`" msgstr "`{tobik}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:732 +#: documentation/content/en/articles/pgpkeys/_index.adoc:740 #, no-wrap msgid "`{jkoshy}`" msgstr "`{jkoshy}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:735 +#: documentation/content/en/articles/pgpkeys/_index.adoc:743 #, no-wrap msgid "`{wkoszek}`" msgstr "`{wkoszek}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:738 +#: documentation/content/en/articles/pgpkeys/_index.adoc:746 #, no-wrap msgid "`{ak}`" msgstr "`{ak}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:741 +#: documentation/content/en/articles/pgpkeys/_index.adoc:749 #, no-wrap msgid "`{gabor}`" msgstr "`{gabor}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:744 +#: documentation/content/en/articles/pgpkeys/_index.adoc:752 #, no-wrap msgid "`{anchie}`" msgstr "`{anchie}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:747 +#: documentation/content/en/articles/pgpkeys/_index.adoc:755 #, no-wrap msgid "`{rushani}`" msgstr "`{rushani}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:750 +#: documentation/content/en/articles/pgpkeys/_index.adoc:758 #, no-wrap msgid "`{kuriyama}`" msgstr "`{kuriyama}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:753 +#: documentation/content/en/articles/pgpkeys/_index.adoc:761 #, no-wrap msgid "`{rene}`" msgstr "`{rene}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:756 +#: documentation/content/en/articles/pgpkeys/_index.adoc:764 #, no-wrap msgid "`{jlaffaye}`" msgstr "`{jlaffaye}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:759 +#: documentation/content/en/articles/pgpkeys/_index.adoc:767 #, no-wrap msgid "`{clement}`" msgstr "`{clement}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:762 +#: documentation/content/en/articles/pgpkeys/_index.adoc:770 #, no-wrap msgid "`{mlaier}`" msgstr "`{mlaier}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:765 +#: documentation/content/en/articles/pgpkeys/_index.adoc:773 #, no-wrap msgid "`{martymac}`" msgstr "`{martymac}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:768 +#: documentation/content/en/articles/pgpkeys/_index.adoc:776 #, no-wrap msgid "`{glarkin}`" msgstr "`{glarkin}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:771 +#: documentation/content/en/articles/pgpkeys/_index.adoc:779 #, no-wrap msgid "`{dru}`" msgstr "`{dru}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:774 +#: documentation/content/en/articles/pgpkeys/_index.adoc:782 #, no-wrap msgid "`{lawrance}`" msgstr "`{lawrance}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:777 +#: documentation/content/en/articles/pgpkeys/_index.adoc:785 #, no-wrap msgid "`{njl}`" msgstr "`{njl}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:780 +#: documentation/content/en/articles/pgpkeys/_index.adoc:788 #, no-wrap msgid "`{jlh}`" msgstr "`{jlh}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:783 +#: documentation/content/en/articles/pgpkeys/_index.adoc:791 #, no-wrap msgid "`{leeym}`" msgstr "`{leeym}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:786 +#: documentation/content/en/articles/pgpkeys/_index.adoc:794 #, no-wrap msgid "`{sam}`" msgstr "`{sam}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:789 +#: documentation/content/en/articles/pgpkeys/_index.adoc:797 #, no-wrap msgid "`{jylefort}`" msgstr "`{jylefort}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:792 +#: documentation/content/en/articles/pgpkeys/_index.adoc:800 #, no-wrap msgid "`{grog}`" msgstr "`{grog}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:795 +#: documentation/content/en/articles/pgpkeys/_index.adoc:803 #, no-wrap msgid "`{oliver}`" msgstr "`{oliver}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:798 +#: documentation/content/en/articles/pgpkeys/_index.adoc:806 #, no-wrap msgid "`{netchild}`" msgstr "`{netchild}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:801 +#: documentation/content/en/articles/pgpkeys/_index.adoc:809 #, no-wrap msgid "`{leitao}`" msgstr "`{leitao}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:804 +#: documentation/content/en/articles/pgpkeys/_index.adoc:812 #, no-wrap msgid "`{ae}`" msgstr "`{ae}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:807 +#: documentation/content/en/articles/pgpkeys/_index.adoc:815 #, no-wrap msgid "`{lesi}`" msgstr "`{lesi}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:810 +#: documentation/content/en/articles/pgpkeys/_index.adoc:818 #, no-wrap msgid "`{achim}`" msgstr "`{achim}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:813 +#: documentation/content/en/articles/pgpkeys/_index.adoc:821 #, no-wrap msgid "`{cel}`" msgstr "`{cel}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:816 +#: documentation/content/en/articles/pgpkeys/_index.adoc:824 #, no-wrap msgid "`{glewis}`" msgstr "`{glewis}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:819 +#: documentation/content/en/articles/pgpkeys/_index.adoc:827 #, no-wrap msgid "`{vishwin}`" msgstr "`{vishwin}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:822 +#: documentation/content/en/articles/pgpkeys/_index.adoc:830 #, no-wrap msgid "`{delphij}`" msgstr "`{delphij}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:825 +#: documentation/content/en/articles/pgpkeys/_index.adoc:833 #, no-wrap msgid "`{avatar}`" msgstr "`{avatar}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:828 +#: documentation/content/en/articles/pgpkeys/_index.adoc:836 #, no-wrap msgid "`{ijliao}`" msgstr "`{ijliao}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:831 +#: documentation/content/en/articles/pgpkeys/_index.adoc:839 #, no-wrap msgid "`{rlibby}`" msgstr "`{rlibby}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:834 +#: documentation/content/en/articles/pgpkeys/_index.adoc:842 #, no-wrap msgid "`{pclin}`" msgstr "`{pclin}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:837 +#: documentation/content/en/articles/pgpkeys/_index.adoc:845 #, no-wrap msgid "`{yzlin}`" msgstr "`{yzlin}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:840 +#: documentation/content/en/articles/pgpkeys/_index.adoc:848 #, no-wrap msgid "`{linimon}`" msgstr "`{linimon}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:843 +#: documentation/content/en/articles/pgpkeys/_index.adoc:851 #, no-wrap msgid "`{arved}`" msgstr "`{arved}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:846 +#: documentation/content/en/articles/pgpkeys/_index.adoc:854 #, no-wrap msgid "`{dryice}`" msgstr "`{dryice}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:849 +#: documentation/content/en/articles/pgpkeys/_index.adoc:857 #, no-wrap msgid "`{nemoliu}`" msgstr "`{nemoliu}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:852 +#: documentation/content/en/articles/pgpkeys/_index.adoc:860 #, no-wrap msgid "`{kevlo}`" msgstr "`{kevlo}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:855 +#: documentation/content/en/articles/pgpkeys/_index.adoc:863 #, no-wrap msgid "`{zml}`" msgstr "`{zml}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:858 +#: documentation/content/en/articles/pgpkeys/_index.adoc:866 #, no-wrap msgid "`{nox}`" msgstr "`{nox}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:861 +#: documentation/content/en/articles/pgpkeys/_index.adoc:869 #, no-wrap msgid "`{avl}`" msgstr "`{avl}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:864 +#: documentation/content/en/articles/pgpkeys/_index.adoc:872 #, no-wrap msgid "`{scottl}`" msgstr "`{scottl}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:867 +#: documentation/content/en/articles/pgpkeys/_index.adoc:875 #, no-wrap msgid "`{rmacklem}`" msgstr "`{rmacklem}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:870 +#: documentation/content/en/articles/pgpkeys/_index.adoc:878 #, no-wrap msgid "`{vmaffione}`" msgstr "`{vmaffione}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:873 +#: documentation/content/en/articles/pgpkeys/_index.adoc:881 #, no-wrap msgid "`{bmah}`" msgstr "`{bmah}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:876 +#: documentation/content/en/articles/pgpkeys/_index.adoc:884 #, no-wrap msgid "`{rm}`" msgstr "`{rm}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:879 +#: documentation/content/en/articles/pgpkeys/_index.adoc:887 #, no-wrap msgid "`{mtm}`" msgstr "`{mtm}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:882 +#: documentation/content/en/articles/pgpkeys/_index.adoc:890 #, no-wrap msgid "`{dwmalone}`" msgstr "`{dwmalone}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:885 +#: documentation/content/en/articles/pgpkeys/_index.adoc:893 #, no-wrap msgid "`{christos}`" msgstr "`{christos}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:888 +#: documentation/content/en/articles/pgpkeys/_index.adoc:896 #, no-wrap msgid "`{marino}`" msgstr "`{marino}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:891 +#: documentation/content/en/articles/pgpkeys/_index.adoc:899 #, no-wrap msgid "`{emaste}`" msgstr "`{emaste}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:894 +#: documentation/content/en/articles/pgpkeys/_index.adoc:902 #, no-wrap msgid "`{cherry}`" msgstr "`{cherry}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:897 +#: documentation/content/en/articles/pgpkeys/_index.adoc:905 #, no-wrap msgid "`{matusita}`" msgstr "`{matusita}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:900 +#: documentation/content/en/articles/pgpkeys/_index.adoc:908 #, no-wrap msgid "`{mm}`" msgstr "`{mm}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:903 +#: documentation/content/en/articles/pgpkeys/_index.adoc:911 #, no-wrap msgid "`{sem}`" msgstr "`{sem}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:906 +#: documentation/content/en/articles/pgpkeys/_index.adoc:914 #, no-wrap msgid "`{rcm}`" msgstr "`{rcm}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:909 +#: documentation/content/en/articles/pgpkeys/_index.adoc:917 #, no-wrap msgid "`{mckusick}`" msgstr "`{mckusick}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:912 +#: documentation/content/en/articles/pgpkeys/_index.adoc:920 #, no-wrap msgid "`{tmclaugh}`" msgstr "`{tmclaugh}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:915 +#: documentation/content/en/articles/pgpkeys/_index.adoc:923 #, no-wrap msgid "`{jmelo}`" msgstr "`{jmelo}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:918 +#: documentation/content/en/articles/pgpkeys/_index.adoc:926 #, no-wrap msgid "`{mmel}`" msgstr "`{mmel}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:921 +#: documentation/content/en/articles/pgpkeys/_index.adoc:929 #, no-wrap msgid "`{jmmv}`" msgstr "`{jmmv}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:924 +#: documentation/content/en/articles/pgpkeys/_index.adoc:932 #, no-wrap msgid "`{kadesai}`" msgstr "`{kadesai}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:927 +#: documentation/content/en/articles/pgpkeys/_index.adoc:935 #, no-wrap msgid "`{ken}`" msgstr "`{ken}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:930 +#: documentation/content/en/articles/pgpkeys/_index.adoc:938 #, no-wrap msgid "`{markm}`" msgstr "`{markm}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:933 +#: documentation/content/en/articles/pgpkeys/_index.adoc:941 #, no-wrap msgid "`{dinoex}`" msgstr "`{dinoex}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:936 +#: documentation/content/en/articles/pgpkeys/_index.adoc:944 #, no-wrap msgid "`{sanpei}`" msgstr "`{sanpei}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:939 +#: documentation/content/en/articles/pgpkeys/_index.adoc:947 #, no-wrap msgid "`{rmh}`" msgstr "`{rmh}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:942 +#: documentation/content/en/articles/pgpkeys/_index.adoc:950 #, no-wrap msgid "`{driesm}`" msgstr "`{driesm}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:945 -#, no-wrap -msgid "`{jrm}`" -msgstr "`{jrm}`" - -#. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:948 +#: documentation/content/en/articles/pgpkeys/_index.adoc:956 #, no-wrap msgid "`{freqlabs}`" msgstr "`{freqlabs}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:951 +#: documentation/content/en/articles/pgpkeys/_index.adoc:959 #, no-wrap msgid "`{mmoll}`" msgstr "`{mmoll}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:954 +#: documentation/content/en/articles/pgpkeys/_index.adoc:962 #, no-wrap msgid "`{cmt}`" msgstr "`{cmt}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:957 +#: documentation/content/en/articles/pgpkeys/_index.adoc:965 #, no-wrap msgid "`{stephen}`" msgstr "`{stephen}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:960 +#: documentation/content/en/articles/pgpkeys/_index.adoc:968 #, no-wrap msgid "`{marcel}`" msgstr "`{marcel}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:963 +#: documentation/content/en/articles/pgpkeys/_index.adoc:971 #, no-wrap msgid "`{dougm}`" msgstr "`{dougm}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:966 +#: documentation/content/en/articles/pgpkeys/_index.adoc:974 #, no-wrap msgid "`{kmoore}`" msgstr "`{kmoore}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:969 +#: documentation/content/en/articles/pgpkeys/_index.adoc:977 #, no-wrap msgid "`{marck}`" msgstr "`{marck}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:972 +#: documentation/content/en/articles/pgpkeys/_index.adoc:980 #, no-wrap msgid "`{mav}`" msgstr "`{mav}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:975 +#: documentation/content/en/articles/pgpkeys/_index.adoc:983 #, no-wrap msgid "`{rich}`" msgstr "`{rich}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:978 +#: documentation/content/en/articles/pgpkeys/_index.adoc:986 #, no-wrap msgid "`{knu}`" msgstr "`{knu}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:981 +#: documentation/content/en/articles/pgpkeys/_index.adoc:989 #, no-wrap msgid "`{tmm}`" msgstr "`{tmm}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:984 +#: documentation/content/en/articles/pgpkeys/_index.adoc:992 #, no-wrap msgid "`{max}`" msgstr "`{max}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:987 +#: documentation/content/en/articles/pgpkeys/_index.adoc:995 #, no-wrap msgid "`{maho}`" msgstr "`{maho}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:990 +#: documentation/content/en/articles/pgpkeys/_index.adoc:998 #, no-wrap msgid "`{yoichi}`" msgstr "`{yoichi}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:993 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1001 #, no-wrap msgid "`{bland}`" msgstr "`{bland}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:996 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1004 #, no-wrap msgid "`{gnn}`" msgstr "`{gnn}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:999 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1007 #, no-wrap msgid "`{khng}`" msgstr "`{khng}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1002 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1010 #, no-wrap msgid "`{simon}`" msgstr "`{simon}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1005 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1013 #, no-wrap msgid "`{rnoland}`" msgstr "`{rnoland}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1008 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1016 #, no-wrap msgid "`{anders}`" msgstr "`{anders}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1011 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1019 #, no-wrap msgid "`{lofi}`" msgstr "`{lofi}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1014 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1022 #, no-wrap msgid "`{obrien}`" msgstr "`{obrien}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1017 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1025 #, no-wrap msgid "`{olgeni}`" msgstr "`{olgeni}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1020 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1028 #, no-wrap msgid "`{philip}`" msgstr "`{philip}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1023 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1031 #, no-wrap msgid "`{jpaetzel}`" msgstr "`{jpaetzel}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1026 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1034 #, no-wrap msgid "`{zirias}`" msgstr "`{zirias}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1029 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1037 #, no-wrap msgid "`{hiren}`" msgstr "`{hiren}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1032 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1040 #, no-wrap msgid "`{hmp}`" msgstr "`{hmp}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1035 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1043 #, no-wrap msgid "`{fluffy}`" msgstr "`{fluffy}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1038 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1046 #, no-wrap msgid "`{sat}`" msgstr "`{sat}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1041 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1049 #, no-wrap msgid "`{np}`" msgstr "`{np}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1044 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1052 #, no-wrap msgid "`{royger}`" msgstr "`{royger}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1047 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1055 #, no-wrap msgid "`{rpaulo}`" msgstr "`{rpaulo}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1050 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1058 #, no-wrap msgid "`{misha}`" msgstr "`{misha}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1053 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1061 +#, no-wrap +msgid "`{cperciva}`" +msgstr "`{cperciva}`" + +#. type: Title === +#: documentation/content/en/articles/pgpkeys/_index.adoc:1064 #, no-wrap msgid "`{dumbbell}`" msgstr "`{dumbbell}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1056 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1067 #, no-wrap msgid "`{rpokala}`" msgstr "`{rpokala}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1059 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1070 #, no-wrap msgid "`{mp}`" msgstr "`{mp}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1062 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1073 #, no-wrap msgid "`{roam}`" msgstr "`{roam}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1065 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1076 #, no-wrap msgid "`{den}`" msgstr "`{den}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1068 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1079 #, no-wrap msgid "`{csjp}`" msgstr "`{csjp}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1071 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1082 #, no-wrap msgid "`{grahamperrin}`" msgstr "`{grahamperrin}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1074 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1085 #, no-wrap msgid "`{gerald}`" msgstr "`{gerald}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1077 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1088 #, no-wrap msgid "`{scottph}`" msgstr "`{scottph}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1080 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1091 #, no-wrap msgid "`{jacula}`" msgstr "`{jacula}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1083 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1094 #, no-wrap msgid "`{0mp}`" msgstr "`{0mp}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1086 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1097 #, no-wrap msgid "`{jdp}`" msgstr "`{jdp}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1089 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1100 #, no-wrap msgid "`{krion}`" msgstr "`{krion}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1092 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1103 #, no-wrap msgid "`{vladlen}`" msgstr "`{vladlen}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1095 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1106 #, no-wrap msgid "`{sepotvin}`" msgstr "`{sepotvin}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1098 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1109 #, no-wrap msgid "`{cpm}`" msgstr "`{cpm}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1101 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1112 #, no-wrap msgid "`{markp}`" msgstr "`{markp}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1104 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1115 #, no-wrap msgid "`{alepulver}`" msgstr "`{alepulver}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1107 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1118 #, no-wrap msgid "`{kp}`" msgstr "`{kp}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1110 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1121 #, no-wrap msgid "`{thomas}`" msgstr "`{thomas}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1113 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1124 #, no-wrap msgid "`{hq}`" msgstr "`{hq}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1116 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1127 #, no-wrap msgid "`{bofh}`" msgstr "`{bofh}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1119 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1130 #, no-wrap msgid "`{fox}`" msgstr "`{fox}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1122 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1133 #, no-wrap msgid "`{lbr}`" msgstr "`{lbr}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1125 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1136 #, no-wrap msgid "`{crees}`" msgstr "`{crees}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1128 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1139 #, no-wrap msgid "`{rees}`" msgstr "`{rees}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1131 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1142 #, no-wrap msgid "`{mr}`" msgstr "`{mr}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1134 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1145 #, no-wrap msgid "`{bcr}`" msgstr "`{bcr}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1137 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1148 #, no-wrap msgid "`{trhodes}`" msgstr "`{trhodes}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1140 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1151 #, no-wrap msgid "`{benno}`" msgstr "`{benno}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1143 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1154 #, no-wrap msgid "`{beech}`" msgstr "`{beech}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1146 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1157 #, no-wrap msgid "`{roberto}`" msgstr "`{roberto}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1149 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1160 #, no-wrap msgid "`{rodrigc}`" msgstr "`{rodrigc}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1152 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1163 #, no-wrap msgid "`{michaelo}`" msgstr "`{michaelo}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1155 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1166 #, no-wrap msgid "`{igoro}`" msgstr "`{igoro}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1158 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1169 #, no-wrap msgid "`{dtxdf}`" msgstr "`{dtxdf}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1161 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1172 #, no-wrap msgid "`{ler}`" msgstr "`{ler}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1164 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1175 #, no-wrap msgid "`{leres}`" msgstr "`{leres}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1167 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1178 #, no-wrap msgid "`{robak}`" msgstr "`{robak}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1170 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1181 #, no-wrap msgid "`{guido}`" msgstr "`{guido}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1173 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1184 #, no-wrap msgid "`{rea}`" msgstr "`{rea}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1176 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1187 #, no-wrap msgid "`{ray}`" msgstr "`{ray}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1179 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1190 #, no-wrap msgid "`{niklas}`" msgstr "`{niklas}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1182 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1193 #, no-wrap msgid "`{salvadore}`" msgstr "`{salvadore}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1185 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1196 #, no-wrap msgid "`{bsam}`" msgstr "`{bsam}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1188 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1199 #, no-wrap msgid "`{marks}`" msgstr "`{marks}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1191 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1202 #, no-wrap msgid "`{bschmidt}`" msgstr "`{bschmidt}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1194 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1205 #, no-wrap msgid "`{wosch}`" msgstr "`{wosch}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1197 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1208 #, no-wrap msgid "`{cy}`" msgstr "`{cy}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1200 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1211 #, no-wrap msgid "`{das}`" msgstr "`{das}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1203 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1214 #, no-wrap msgid "`{scheidell}`" msgstr "`{scheidell}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1206 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1217 #, no-wrap msgid "`{matthew}`" msgstr "`{matthew}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1209 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1220 #, no-wrap msgid "`{tmseck}`" msgstr "`{tmseck}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1212 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1223 #, no-wrap msgid "`{johans}`" msgstr "`{johans}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1215 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1226 #, no-wrap msgid "`{bakul}`" msgstr "`{bakul}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1218 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1229 #, no-wrap msgid "`{gshapiro}`" msgstr "`{gshapiro}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1221 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1232 #, no-wrap msgid "`{wxs}`" msgstr "`{wxs}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1224 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1235 #, no-wrap msgid "`{nork}`" msgstr "`{nork}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1227 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1238 #, no-wrap msgid "`{syrinx}`" msgstr "`{syrinx}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1230 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1241 #, no-wrap msgid "`{vanilla}`" msgstr "`{vanilla}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1233 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1244 #, no-wrap msgid "`{ashafer}`" msgstr "`{ashafer}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1236 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1247 #, no-wrap msgid "`{ashish}`" msgstr "`{ashish}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1239 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1250 #, no-wrap msgid "`{asiciliano}`" msgstr "`{asiciliano}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1242 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1253 #, no-wrap msgid "`{chs}`" msgstr "`{chs}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1245 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1256 #, no-wrap msgid "`{bms}`" msgstr "`{bms}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1248 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1259 #, no-wrap msgid "`{demon}`" msgstr "`{demon}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1251 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1262 #, no-wrap msgid "`{jesper}`" msgstr "`{jesper}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1254 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1265 #, no-wrap msgid "`{scop}`" msgstr "`{scop}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1257 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1268 #, no-wrap msgid "`{anray}`" msgstr "`{anray}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1260 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1271 #, no-wrap msgid "`{flo}`" msgstr "`{flo}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1266 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1277 #, no-wrap msgid "`{kensmith}`" msgstr "`{kensmith}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1269 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1280 #, no-wrap msgid "`{ben}`" msgstr "`{ben}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1272 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1283 #, no-wrap msgid "`{des}`" msgstr "`{des}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1275 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1286 #, no-wrap msgid "`{sobomax}`" msgstr "`{sobomax}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1278 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1289 #, no-wrap msgid "`{asomers}`" msgstr "`{asomers}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1281 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1292 #, no-wrap msgid "`{brian}`" msgstr "`{brian}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1284 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1295 #, no-wrap msgid "`{sson}`" msgstr "`{sson}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1287 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1298 #, no-wrap msgid "`{nsouch}`" msgstr "`{nsouch}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1290 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1301 #, no-wrap msgid "`{ssouhlal}`" msgstr "`{ssouhlal}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1293 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1304 #, no-wrap msgid "`{loos}`" msgstr "`{loos}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1296 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1307 #, no-wrap msgid "`{brnrd}`" msgstr "`{brnrd}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1299 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1310 #, no-wrap msgid "`{rink}`" msgstr "`{rink}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1302 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1313 #, no-wrap msgid "`{vsevolod}`" msgstr "`{vsevolod}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1305 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1316 #, no-wrap msgid "`{pstef}`" msgstr "`{pstef}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1308 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1319 #, no-wrap msgid "`{zi}`" msgstr "`{zi}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1311 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1322 #, no-wrap msgid "`{lstewart}`" msgstr "`{lstewart}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1314 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1325 #, no-wrap msgid "`{murray}`" msgstr "`{murray}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1317 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1328 #, no-wrap msgid "`{vs}`" msgstr "`{vs}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1320 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1331 #, no-wrap msgid "`{xride}`" msgstr "`{xride}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1323 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1334 #, no-wrap msgid "`{marius}`" msgstr "`{marius}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1326 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1337 #, no-wrap msgid "`{cs}`" msgstr "`{cs}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1329 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1340 #, no-wrap msgid "`{clsung}`" msgstr "`{clsung}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1332 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1343 #, no-wrap msgid "`{gsutter}`" msgstr "`{gsutter}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1335 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1346 #, no-wrap msgid "`{metal}`" msgstr "`{metal}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1338 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1349 #, no-wrap msgid "`{ryusuke}`" msgstr "`{ryusuke}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1341 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1352 #, no-wrap msgid "`{nyan}`" msgstr "`{nyan}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1344 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1355 #, no-wrap msgid "`{sahil}`" msgstr "`{sahil}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1347 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1358 #, no-wrap msgid "`{tota}`" msgstr "`{tota}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1350 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1361 #, no-wrap msgid "`{romain}`" msgstr "`{romain}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1353 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1364 #, no-wrap msgid "`{eduardo}`" msgstr "`{eduardo}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1356 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1367 #, no-wrap msgid "`{sylvio}`" msgstr "`{sylvio}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1359 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1370 #, no-wrap msgid "`{itetcu}`" msgstr "`{itetcu}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1362 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1373 #, no-wrap msgid "`{mi}`" msgstr "`{mi}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1365 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1376 #, no-wrap msgid "`{gordon}`" msgstr "`{gordon}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1368 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1379 #, no-wrap msgid "`{lth}`" msgstr "`{lth}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1371 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1382 #, no-wrap msgid "`{fabient}`" msgstr "`{fabient}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1374 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1385 #, no-wrap msgid "`{thierry}`" msgstr "`{thierry}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1377 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1388 #, no-wrap msgid "`{thompsa}`" msgstr "`{thompsa}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1380 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1391 #, no-wrap msgid "`{flz}`" msgstr "`{flz}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1383 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1394 #, no-wrap msgid "`{jilles}`" msgstr "`{jilles}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1386 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1397 #, no-wrap msgid "`{ganbold}`" msgstr "`{ganbold}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1389 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1400 #, no-wrap msgid "`{tuexen}`" msgstr "`{tuexen}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1392 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1403 +#, no-wrap +msgid "`{chuck}`" +msgstr "`{chuck}`" + +#. type: Title === +#: documentation/content/en/articles/pgpkeys/_index.adoc:1406 #, no-wrap msgid "`{gonzo}`" msgstr "`{gonzo}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1395 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1409 #, no-wrap msgid "`{uzsolt}`" msgstr "`{uzsolt}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1398 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1412 #, no-wrap msgid "`{ume}`" msgstr "`{ume}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1401 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1415 #, no-wrap msgid "`{ups}`" msgstr "`{ups}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1404 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1418 #, no-wrap msgid "`{fsu}`" msgstr "`{fsu}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1407 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1421 #, no-wrap msgid "`{mikael}`" msgstr "`{mikael}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1410 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1424 #, no-wrap msgid "`{manu}`" msgstr "`{manu}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1413 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1427 #, no-wrap msgid "`{ram}`" msgstr "`{ram}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1416 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1430 #, no-wrap msgid "`{bryanv}`" msgstr "`{bryanv}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1419 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1433 #, no-wrap msgid "`{nectar}`" msgstr "`{nectar}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1422 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1436 #, no-wrap msgid "`{avilla}`" msgstr "`{avilla}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1425 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1439 #, no-wrap msgid "`{nivit}`" msgstr "`{nivit}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1428 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1442 #, no-wrap msgid "`{ivoras}`" msgstr "`{ivoras}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1431 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1445 #, no-wrap msgid "`{stefan}`" msgstr "`{stefan}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1434 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1448 #, no-wrap msgid "`{kaiw}`" msgstr "`{kaiw}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1437 -#, no-wrap -msgid "`{adamw}`" -msgstr "`{adamw}`" - -#. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1440 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1454 #, no-wrap msgid "`{naddy}`" msgstr "`{naddy}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1443 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1457 #, no-wrap msgid "`{peter}`" msgstr "`{peter}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1446 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1460 #, no-wrap msgid "`{nwhitehorn}`" msgstr "`{nwhitehorn}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1449 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1463 #, no-wrap msgid "`{obiwac}`" msgstr "`{obiwac}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1452 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1466 #, no-wrap msgid "`{miwi}`" msgstr "`{miwi}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1455 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1469 #, no-wrap msgid "`{nate}`" msgstr "`{nate}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1458 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1472 #, no-wrap msgid "`{twinterg}`" msgstr "`{twinterg}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1461 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1475 #, no-wrap msgid "`{def}`" msgstr "`{def}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1464 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1478 #, no-wrap msgid "`{wollman}`" msgstr "`{wollman}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1467 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1481 #, no-wrap msgid "`{joerg}`" msgstr "`{joerg}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1470 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1484 #, no-wrap msgid "`{ygy}`" msgstr "`{ygy}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1473 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1487 #, no-wrap msgid "`{emax}`" msgstr "`{emax}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1476 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1490 #, no-wrap msgid "`{oshogbo}`" msgstr "`{oshogbo}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1479 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1493 #, no-wrap msgid "`{andy}`" msgstr "`{andy}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1482 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1496 #, no-wrap msgid "`{riggs}`" msgstr "`{riggs}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1485 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1499 #, no-wrap msgid "`{egypcio}`" msgstr "`{egypcio}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1488 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1502 #, no-wrap msgid "`{bz}`" msgstr "`{bz}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1491 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1505 #, no-wrap msgid "`{dsl}`" msgstr "`{dsl}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1494 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1508 #, no-wrap msgid "`{zeising}`" msgstr "`{zeising}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1497 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1511 #, no-wrap msgid "`{phantom}`" msgstr "`{phantom}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1500 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1514 #, no-wrap msgid "`{tz}`" msgstr "`{tz}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1503 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1517 #, no-wrap msgid "`{rigoletto}`" msgstr "`{rigoletto}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1506 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1520 #, no-wrap msgid "`{kaktus}`" msgstr "`{kaktus}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1509 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1523 #, no-wrap msgid "`{samm}`" msgstr "`{samm}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1512 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1526 #, no-wrap msgid "`{arrowd}`" msgstr "`{arrowd}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1515 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1529 #, no-wrap msgid "`{ronald}`" msgstr "`{ronald}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1518 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1532 #, no-wrap msgid "`{meta}`" msgstr "`{meta}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1521 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1535 #, no-wrap msgid "`{rnagy}`" msgstr "`{rnagy}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1524 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1538 #, no-wrap msgid "`{vvd}`" msgstr "`{vvd}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1527 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1541 #, no-wrap msgid "`{gbe}`" msgstr "`{gbe}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1530 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1544 #, no-wrap msgid "`{bnovkov}`" msgstr "`{bnovkov}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1533 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1547 #, no-wrap msgid "`{ivy}`" msgstr "`{ivy}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1536 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1550 #, no-wrap msgid "`{khorben}`" msgstr "`{khorben}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1539 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1553 #, no-wrap msgid "`{vexeduxr}`" msgstr "`{vexeduxr}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1542 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1556 #, no-wrap msgid "`{alven}`" msgstr "`{alven}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1545 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1559 #, no-wrap msgid "`{pouria}`" msgstr "`{pouria}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1548 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1562 #, no-wrap msgid "`{siva}`" msgstr "`{siva}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1551 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1565 #, no-wrap msgid "`{nxjoseph}`" msgstr "`{nxjoseph}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1554 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1568 #, no-wrap msgid "`{kenrap}`" msgstr "`{kenrap}`" #. type: Title == -#: documentation/content/en/articles/pgpkeys/_index.adoc:1558 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1572 #, no-wrap msgid "Other Cluster Account Holders" msgstr "Другие владельцы учётных записей" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1560 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1574 #, no-wrap msgid "`{bk}`" msgstr "`{bk}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1563 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1577 #, no-wrap msgid "`{deb}`" msgstr "`{deb}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1566 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1580 #, no-wrap msgid "`{debdrup}`" msgstr "`{debdrup}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1569 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1583 #, no-wrap msgid "`{dutchdaemon}`" msgstr "`{dutchdaemon}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1572 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1586 #, no-wrap msgid "`{keymaster}`" msgstr "`{keymaster}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1575 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1589 #, no-wrap msgid "`{mwlucas}`" msgstr "`{mwlucas}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1578 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1592 #, no-wrap msgid "`{dhw}`" msgstr "`{dhw}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1581 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1595 #, no-wrap msgid "`{tpearson}`" msgstr "`{tpearson}`" diff --git a/documentation/content/ru/articles/problem-reports/_index.adoc b/documentation/content/ru/articles/problem-reports/_index.adoc index 06d41a2710..600261f7a3 100644 --- a/documentation/content/ru/articles/problem-reports/_index.adoc +++ b/documentation/content/ru/articles/problem-reports/_index.adoc @@ -1,264 +1,264 @@ --- authors: - author: 'Dag-Erling Smørgrav' - author: 'Mark Linimon' description: 'Как лучше сформулировать и отправить отчёт о проблеме в проект FreeBSD' tags: ["formulate", "submit", "FreeBSD", "PR"] title: 'Составление сообщений о проблеме во FreeBSD' trademarks: ["freebsd", "ibm", "intel", "sun", "general"] --- = Составление сообщений о проблеме во FreeBSD :doctype: article :toc: macro :toclevels: 1 :icons: font :sectnums: :source-highlighter: rouge :experimental: :images-path: articles/problem-reports/ ifdef::env-beastie[] ifdef::backend-html5[] include::shared/authors.adoc[] include::shared/mirrors.adoc[] include::shared/releases.adoc[] include::shared/attributes/attributes-{{% lang %}}.adoc[] include::shared/{{% lang %}}/teams.adoc[] include::shared/{{% lang %}}/mailing-lists.adoc[] include::shared/{{% lang %}}/urls.adoc[] :imagesdir: ../../../images/{images-path} endif::[] ifdef::backend-pdf,backend-epub3[] include::../../../../shared/asciidoctor.adoc[] endif::[] endif::[] ifndef::env-beastie[] include::../../../../../shared/asciidoctor.adoc[] endif::[] [.abstract-title] Аннотация Эта статья описывает, как наилучшим образом сформулировать и отправить сообщение о проблеме в Проект FreeBSD. ''' toc::[] [[pr-scope]] == Область применения данной статьи Изначально эта статья была написана для описания отправки отчётов о проблемах через Bugzilla, но некоторые её разделы также применимы при отправке через систему рецензирования Phabricator или через организацию FreeBSD на Github. [[pr-intro]] == Введение Одной из самых разочаровывающих практик, которую можно получить в качестве пользователя программного обеспечения, является отправка сообщения о проблеме, которое вскоре закрывается с кратким и ничему не помогающим объяснением типа "это не проблема" или "неправильный отчет". Подобным же образом одной из самых разочаровывающих практик, которую можно получить в качестве разработчика программного обеспечения, является получение массы сообщений о проблемах, которые на самом деле не являются сообщениями о проблемах, а запросами на получение поддержки, или которые содержат мало или вообще не содержат никакой информации о сути проблемы или способе её воспроизведения. В этом документе делается попытка описать то, как составлять хорошие сообщения о проблемах. Что же, спросите вы, является хорошим сообщением о проблеме? Ну, если перейти прямо к сути, то хорошим сообщением об проблеме является то, которое может быть быстро проанализировано и отработано, к обоюдному удовлетворению как пользователя, так и разработчика. Хотя в основном статья фокусируется на отправке сообщений о проблемах во FreeBSD с помощью Bagzilla, большей частью она должна хорошо подходить и другим случаям. Заметьте, что эта статья организована по тематическому принципу, а не хронологически, так что вы должны прочесть документ целиком прежде, чем посылать сообщение о проблеме, и не воспринимать статью как пошаговое руководство. [[pr-when]] == Когда нужно отправлять сообщение о проблеме Имеется много классов ошибок, и не все они должны приводить к появлению сообщения о проблеме. Конечно же, нет идеальных людей, и будут моменты, когда вы решите, что нашли ошибку в программе, а на самом деле вы неправильно поняли синтаксис команды или сделали опечатку в конфигурационном файле (хотя само по себе это иногда говорит о плохой документации или неправильной обработке ошибок в прикладной программе). Есть ещё много случаев, когда посылка сообщения о проблеме явно _не_ является правильным действием, а только приводит к разочарованию вас и разработчиков. И наоборот, есть случаи, когда может быть нужно послать сообщение о чем-то, не являющемся ошибкой - к примеру, запрос на доработку или расширение функциональности. Но как же определить, что является ошибкой, а что нет? Простым правилом, которому нужно следовать, является следующее - ваша проблема _не_ является ошибкой, если она формулируется как вопрос (обычно в форме "Как сделать X?" или "Где можно найти Y?"). Не всегда это так однозначно, но правило вопроса покрывает большинство случаев. Если Вам нужен ответ, лучше всего сначала проконсультироваться https://forums.freebsd.org[на форумах FreeBSD], в IRC или в {freebsd-questions}. Вот некоторые случаи, в которых может оказаться полезным отправить сообщение о чем-то, что не является ошибкой: * Уведомление об обновлении программного обеспечения, которое поддерживается сторонними разработчиками (в основном порты, но также и компоненты базовой системы, разрабатываемые сторонними организациями, такие, как BIND или различные утилиты GNU). * Для не поддерживаемых никем портов (переменная `MAINTAINER` содержит `ports@FreeBSD.org`) отчёт о проблеме без приложенного файла с исправлениями едва ли будет замечен коммиттером. Чтобы стать сопровождающим порта, у которого не было сопровождающего, отправьте отчёт с запросом (файл с исправлением желателен, но не обязателен). * В любом случае, следование процессу, описанному в extref:{porters-handbook}upgrading[Руководстве по созданию портов] даст наилучшие результаты. (Также можно ознакомиться с статьей extref:{contributing}[Вклад в коллекцию портов FreeBSD, ports-contributing].) Ошибка, которую нельзя воспроизвести, вряд ли будет исправлена. Если ошибка возникла только единожды, и вы не можете её воспроизвести, к тому же никто с ней больше не сталкивался, нет никаких шансов, что разработчики смогут её воспроизвести или понять, что делается неправильно. Это не значит, что такого не случается, но это значит, что шансов у вашего сообщения дойти когда-либо до стадии исправления ошибки очень малы. Часто эти виды ошибок возникают из-за неудовлетворительной работы жёстких дисков, перегревшихся процессоров. Всегда, когда это возможно вы должны отслеживать такие случаи перед посылкой сообщения об ошибке. Теперь, чтобы определить кому вы должны отправить ваше сообщение об ошибке, вы должны понимать, что программное обеспечение, которое входит во 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 - иначе отправляйте её авторам программного обеспечения. Затем вы должны убедиться, действительно ли проблема существует. Существует всего несколько вещей, которые раздражают разработчика больше, чем получение сообщения об ошибке, которую он уже исправил. Если проблема в базовой системе, то вам нужно сначала прочесть раздел extref:{handbook}cutting-edge[Руководства FreeBSD о версиях], если вы ещё не знакомы с данной темой. Для FreeBSD возможно исправлять проблемы только для некоторых недавних веток базовой системы, поэтому отправка сообщения об ошибке для более старой версии приведёт к тому, что разработчик посоветует вам обновиться до поддерживаемой версии, чтобы посмотреть присутствует ли в ней проблема. Команда офицеров безопасности поддерживает link:https://www.FreeBSD.org/ru/security/#sup[список поддерживаемых версий.]. Если проблема в порте, рассмотрите возможность сообщить об ошибке разработчикам исходного проекта. Проект FreeBSD не может исправлять все ошибки во всём программном обеспечении. [[pr-prep]] == Подготовка Нужно следовать хорошему правилу всегда сначала выполнять дополнительные исследования перед тем, как послать сообщение о проблеме. Может быть, о вашей проблеме уже сообщено; может быть, она недавно обсуждалась или обсуждается в списках рассылки; она может быть уже исправлена в более новой версии, чем та, что вы используете. Поэтому вы должны проверить все обычные места до того, как послать ваше сообщение о проблеме. Для FreeBSD это значит: * Во-первых, всегда проверяйте, не описан ли этот вопрос в extref:{handbook}[Руководстве]. * Список extref:{faq}[Часто задаваемых вопросов] (FAQ) по FreeBSD. FAQ содержит ответы на несколько вопросов, таких как вопросы, касающиеся extref:{faq}[совместимости оборудования, hardware]. * extref:{handbook}eresources/[Списки рассылки, eresources-mail] — если Вы не подписаны на них, воспользуйтесь https://www.FreeBSD.org/search/#mailinglists[поиском в архивах] на сайте FreeBSD. Если ваша проблема не обсуждалась в списках рассылки, вы можете попытаться опубликовать сообщение о ней и подождать несколько дней — возможно, кто-то заметит то, что было упущено. * Как отмечалось выше, форумы FreeBSD и IRC. * Как вариант, весь веб-используйте вашу любимую поисковую систему для поиска каких-либо ссылок по вашей проблеме. Вы можете даже увидеть ссылки на архивы списков рассылки или телеконференций, о которых вы не знали или не думали там искать. * Следующим пунктом должна быть https://bugs.freebsd.org/bugzilla/query.cgi[ база данных FreeBSD Bugzilla]. Если только ваша проблема не нова или редка, есть некоторый шанс, что о ней уже сообщено. * И самое важное, вы должны посмотреть не затрагивает ли документация в базовой системе вашу проблему. + Для основного кода FreeBSD вы должны тщательно изучить содержимое файла [.filename]#/usr/src/UPDATING# или его текущую версию по адресу https://cgit.freebsd.org/src/tree/UPDATING[https://cgit.freebsd.org/src/tree/UPDATING]. (Если вы переходите с одной версии на другую, особенно если вы обновляетесь до FreeBSD-CURRENT, то в этом файле вы можете найти много важной информации). + Если же ваша проблема связана с коллекцией портов FreeBSD, вы должны обратиться к файлу [.filename]#/usr/ports/UPDATING# (изменения, касающиеся индивидуальных портов) или к [.filename]#/usr/ports/CHANGES# (изменения, касающиеся всей коллекции портов). Они также доступны через интерфейс cgit: https://cgit.freebsd.org/ports/tree/UPDATING[https://cgit.freebsd.org/ports/tree/UPDATING] и https://cgit.freebsd.org/ports/tree/CHANGES[https://cgit.freebsd.org/ports/tree/CHANGES] . [[pr-writing]] == Написание сообщения о проблеме Теперь, после того, как вы решили, что ваш вопрос подпадает под категорию сообщения о проблеме, и это проблема FreeBSD, самое время написать собственно сообщение о проблеме (PR). Прежде чем мы углубимся в частности использования программы для создания и отправки PR в Bugzilla, вот несколько советов, которые помогут вам сделать сообщение более эффективным. [[pr-writing-tips]] == Как писать хорошие сообщения о проблемах в Bugzilla * _Не оставляйте поле "Summary" (краткое описание) пустым._ Сообщения о проблемах попадают как в списки рассылки, которые затем расходятся по всему миру (в них поле "Summary" определяет тему письма), так и в базу данных. Просматривающий эту базу, как правило, пройдет мимо PR с пустым кратким описанием. Не забудьте, что PR остаётся в базе до тех пор, пока кто-либо не закроет его; сообщение-аноним, скорее всего, просто потеряется на общем фоне. * __Избегайте туманных описаний в поле "Summary"__. Не стоит предполагать, что читающий ваше сообщение владеет контекстом; поэтому, чем подробнее вы опишете ситуацию, тем лучше. В частности, к какой части системы относится ваша проблема? Проявляется ли она на этапе установки или во время нормальной работы? Например, вместо строки `Summary: portupgrade is broken` следовало бы написать что-то вроде `Summary: port ports-mgmt/portupgrade coredumps on -current`. В случае портированных приложений в поле "Summary" полезно указывать не только имя порта, но и категорию. * _Если у вас есть патч, сообщите об этом._ Наличие патча значительно упрощает обработку отчёта. ** Не используйте ключевые слова `patch` или `patch-ready` — они устарели. Вместо этого прикрепите патч как вложение и отметьте флажок `[patch]`. Если флажок не отображается, нажмите `Show Advanced Fields` (Показать расширенные поля) в левом верхнем углу. ** Предпочтительны файлы с исправлениями с MIME-типом `text/plain`. ** Предпочтительны патчи, совместимые с `git`. * _Если вы сопровождаете порт, укажите это._ Если вы сопровождаете часть исходного кода (например, существующий порт), обязательно установите поле `maintainer-feedback` в вашем сообщении о проблеме в `+`. Таким образом, любой коммиттер, обрабатывающий ваш PR, не будет вынужден проверять это. * _Будьте точны в формулировках._ Чем больше информации вы можете предоставить о проблеме, тем больше у вас шансов получить ответ. ** Включите версию FreeBSD, которую вы используете (для этого есть специальное поле, см. ниже), и архитектуру. Укажите, используете ли вы релиз (например, с CD-ROM или загруженный) или систему, поддерживаемую через Git (и, если да, укажите хэш и ветку). Если вы используете ветку FreeBSD-CURRENT, укажите это в первую очередь, так как исправления (особенно для известных проблем) часто добавляются очень быстро, и пользователи 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. +* _Избегайте нечётких запросов о новых возможностях._ Сообщение типа "кто-то обязательно должен сделать так, чтобы такая-то утилита вела себя так-то" имеет куда меньше шансов встретить позитивный отклик, чем более чётко сформулированный запрос. Помните, что исходные тексты доступны всем, так что если вам нужна реализация какого-то нового свойства, лучший способ — взяться за работу самому! Не забудьте также, что такие моменты лучше обсуждать в списках рассылки, таких как `freebsd-questions`, чем делать это посредством базы данных PR. * _Убедитесь, что ваша проблема ещё никем не описана._ Мы уже говорили об этом, но стоит повториться. Потратьте пару минут на составление запросов в Bugzilla: https://bugs.freebsd.org/bugzilla/query.cgi[https://bugs.freebsd.org/bugzilla/query.cgi]. (Несмотря на повторы, об этом постоянно забывают) * _Сообщайте об одной проблеме в одном PR._ Избегайте описания двух и более проблем в одном сообщении (исключением являются взаимосвязанные проблемы). Оформляя патчи, не пытайтесь в них добавлять множество функциональных возможностей или исправлять ими несколько ошибок в одном и том же сообщении о проблеме (опять же, за исключением взаимосвязанных проблем) - для таких PR-ов потребуется значительно больше времени на обработку. * _Избегайте полемики._ Если ваше сообщение касается области или способов реализации, которые ранее вызвали разногласия, вам стоит быть готовым предоставить не только патчи, но и внятные аргументы, почему следует поступать именно так (то есть, это "Правильный Путь"). Как отмечалось выше, аккуратный поиск по архиву списков рассылки https://www.FreeBSD.org/search/#mailinglists[https://www.FreeBSD.org/search/#mailinglists] никогда не помешает. * _Будьте вежливы._ Почти каждый из тех, кто может заниматься вашим сообщением, является добровольцем. Никому не понравятся указания, как и что делать, когда он и так занимается этим, да ещё и по каким-либо причинам, отличным от финансовых. Вообще говоря, этого подхода следует придерживаться, имея дело с любым проектом с Открытыми Исходными текстами (Open Source). [[pr-writing-before-beginning]] == Прежде всего Следующие соображения применимы к использованию https://bugs.freebsd.org/bugzilla/enter_bug.cgi[веб-формы Bugzilla для отправки PR]. Будьте осторожны с операциями копирования и вставки, которые могут изменить пробелы или другое форматирование текста. И наконец, если ваше сообщение будет объёмным, вы должны приготовить его в offline, чтобы ничего не потерялось в случае, если будет проблема при его отправке. [[pr-writing-attaching-patches]] == Вложение патчей или файлов Следующие инструкции применимы не только к отправке отчётов о проблемах через Bugzilla, но также через Phabricator или организацию FreeBSD на Github (в виде пул-реквестов). В общем, мы настоятельно рекомендуем использовать `git format-patch` для создания одного или серии унифицированных diff-файлов относительно базовой ветки (например, `origin/main`). Патчи, созданные таким образом, будут содержать хеши Git, а также ваше имя и адрес электронной почты, что упростит применение вашего патча коммиттерами и правильное указание вас как автора (с помощью `git am`). Для небольших изменений, где вы предпочитаете не использовать git, убедитесь, что используете man:diff[1] с опцией `-u` для создания унифицированного diff-файла, так как это даст разработчикам больше контекста и сделает его более читаемым по сравнению с другими форматами diff. Убедитесь, что ваши патчи созданы от корня соответствующего дерева репозитория. Для проблем с ядром или базовыми утилитами предпочтителен патч для FreeBSD-CURRENT (основной ветки Git), поскольку весь новый код должен сначала применяться и тестироваться там. После проведения соответствующих или достаточных тестов код будет объединён/перенесён в ветку FreeBSD-STABLE. Мы предпочитаем, чтобы файлы с исправлениями отправлялись, как вложение к сообщению. Однако, если вы вставляете патч в тело сообщения, учтите, что некоторые почтовые программы имеют тенденцию заменять табуляции серией пробелов, что полностью разрушит, например, часть файла сборки (Makefile). Не отсылайте патчи в виде вложений, используя `Content-Transfer-Encoding: quoted-printable`. Это выполнит экранирование (escaping) символов и весь патч будет бесполезным. Пожалуйста, просто используйте тип MIME `text/plain'. Следует также заметить, что включение небольших патчей в запросах на изменение (pull request) Github является приемлемой практикой, в особенности если они решают проблему, описанную в запросе на изменение, большие же патчи, а в особенности новый код, который может требовать значительного просмотра перед тем, как он будет внесён в дерево исходных текстов, должны быть размещены на web- или ftp-сервере, а в запрос на изменение должен быть включён только URL указывающий на этот патч. Очень часто патчи, пересылаемые по электронной почте, бывают искажены, и, как следствие, чем больше патч, тем труднее будет для заинтересованных людей привести его к нормальному виду. Также то, что патч будет размещён отдельно от сообщения о проблеме, даёт возможность изменять его не отсылая полный патч в дополнение к изначальному сообщению о проблеме. И наконец, большие патчи просто увеличивают размер базы данных, так как закрытые сообщения об ошибках на самом деле не удаляются, а сохраняются и помечаются, как `closed`. -Вы должны также помнить, что пока вы явно не укажете обратного в вашем запросе или в самих патчах, будет предполагаться, что они подпадают под те же условия лицензирования, что и оригинальный файл, измененный вами. +Вы должны также помнить, что пока вы явно не укажете обратного в вашем запросе или в самих патчах, будет предполагаться, что они подпадают под те же условия лицензирования, что и оригинальный файл, изменённый вами. [[pr-writing-filling-template]] == Заполнение формы Bugzilla Следующие инструкции применимы только к отправке через Bugzilla. [NOTE] ==== Используемый вами адрес электронной почты станет общедоступной информацией и может попасть к спамерам. У вас должны быть процедуры обработки спама или следует использовать временный почтовый аккаунт. Однако учтите, что если вы вообще не используете действительный почтовый аккаунт, мы не сможем задать вам вопросы о вашем сообщении. ==== При подаче сообщения об ошибке вы увидите следующие поля: * _Краткое описание:_ Заполните это кратким и точным описанием проблемы. Краткое описание используется как тема письма с отчётом о проблеме, а также в списках и сводках отчётов; отчёты с неясными описаниями часто остаются без внимания. * _Серьезность:_ Одно из значений: `Затрагивает только меня (Affects only me)`, `Затрагивает некоторых людей (Affects some people)` или `Затрагивает многих людей (Affects many people)`. Не переоценивайте проблему; избегайте отмечать её как `Затрагивает многих людей`, если это не так. Разработчики FreeBSD не обязательно будут работать над вашей проблемой быстрее, если вы преувеличите её важность, поскольку многие другие уже поступали точно так же. * _Категория:_ Выберите подходящую категорию. + Первое, что вам нужно сделать, — это определить, в какой части системы находится ваша проблема. Помните, что 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`. + [NOTE] ==== Если проблема с чем-то из порта, называемого `www/_имяпорта_`, то она все же принадлежит к категории `ports`. ==== + Далее представлены более специализированные категории. ** Если проблема принадлежит к `kern`, но в то же время имеет дело с подсистемой USB, то правильным выбором будет `usb`. ** Если проблема принадлежит к `kern` и найдена в потоковых библиотеках, правильным выбором будет `threads`. ** Если проблема принадлежит к базовой системе и касается соблюдения стандартов, таких как POSIX(R), правильным выбором будет `standards`. ** Если вы уверены, что проблема возникнет только на используемой вами архитектуре процессора, выберите одну из архитектурно-зависимых категорий: обычно `i386` для Intel-совместимых машин в 32-битном режиме; `amd64` для машин AMD, работающих в 64-битном режиме (это также включает Intel-совместимые машины, работающие в режиме EMT64); и реже `arm`, `powerpc` или `riscv64`. + [NOTE] ==== Люди часто ошибаются в выборе категории. Если вы не уверены в правильности выбора, то лучше не гадать, а выбрать `misc`. ==== + .Правильное использование архитектурно-зависимых категорий [example] ==== У вас простой ПК, и вы подозреваете, что столкнулись с проблемой, специфичной для конкретного чипсета или материнской платы: верная категория - `i386`. ==== + .Некорректное использование категории, зависящей от архитектуры [example] ==== Если вы наблюдаете проблему с периферийной картой расширения на распространённой шине или неполадки с конкретного типа жёстким диском: в этом случае возможно, что неисправность наблюдается на более чем одной архитектуре, и верным выбором будет `kern`. ==== ** Если вы не знаете в чем проблема (или вам кажется, что описание не попадает ни под какую из вышеобозначенных), используйте категорию `misc`. Перед тем, как сделать так, можно для начала спросить помощи. Возможно, вам подскажут, какую из существующих категорий следует выбрать. * _Environment:_ Оно должно максимально точно описывать окружение, в котором встречается проблема. Сюда включается версия операционной системы, версия конкретной программы или файла, содержащего проблему, и любая другая информация, такая, как конфигурация системы, другое программное обеспечение, которое влияет на проблему, и так далее-просто все, что разработчик должен знать для создания условий появления проблемы. * _Описание:_ Полное и точное описание проблемы, с которой вы столкнулись. Старайтесь избегать предположений о причинах проблемы, если не уверены в своей правоте, так как это может ввести разработчика в заблуждение и привести к неверным выводам. В описании должны быть указаны действия, необходимые для воспроизведения проблемы. Если вам известен обходной путь, укажите его. Это не только поможет другим людям с той же проблемой временно её решить, но и может помочь разработчику понять причину возникновения проблемы. [[pr-followup]] == Отслеживание После того, как ваше сообщение будет принято, вы получите по электронной почте уведомление, в котором будет указан номер для отслеживания, который был назначен вашему сообщению о проблеме и URL, который вы можете использовать для проверки его состояния. В случае удачи кто-нибудь проявит интерес к вашей проблеме и попытается её решить, или, как это бывает, описать, почему это не является проблемой. Вы будете автоматически оповещаться о любом изменении состояния и получать копии всех комментариев или патчей, которые будут присоединяться в процессе отработки вашего сообщения о проблеме. Если кто-то запросит у вас дополнительную информацию, или вы вспомните или обнаружите что-то, что не упомянули в первоначальном отчёте, пожалуйста, отправьте уточнение. Основная причина, по которой ошибка не исправляется, — это отсутствие связи с автором отчёта. Проще всего воспользоваться опцией комментария на веб-странице Bugzilla конкретного PR, которую можно открыть с https://bugs.freebsd.org/bugzilla/query.cgi[страницы поиска PR Bugzilla]. Если проблема исчезла, но отчёт о ней остаётся открытым, просто добавьте комментарий с указанием, что отчёт можно закрыть, и, по возможности, объясните, как или когда проблема была устранена. Иногда возникает задержка в одну-две недели, когда отчёт о проблеме остаётся без внимания — никто не назначается на него и не оставляет комментариев. Такое может произойти при увеличении очереди отчётов о проблемах или во время праздничного сезона. Если отчёт о проблеме не получил внимания в течение нескольких недель, стоит найти коммиттера, особенно заинтересованного в работе над ним. Существует несколько способов сделать это, желательно в следующем порядке, с перерывом в несколько дней между попытками использования каждого канала связи: * Отправить письмо по электронной почте в extref:{handbook}eresources/[соответствующий список, eresources-summary] для получения комментариев к отчёту. * Присоединитесь к соответствующим IRC-каналам. Частичный список доступен здесь: https://wiki.freebsd.org/IRC/Channels[]. Сообщите участникам канала о проблеме и запросите помощь. Будьте терпеливы и оставайтесь в канале после отправки сообщения, чтобы у людей из разных часовых поясов была возможность отреагировать. * Найдите коммиттеров, заинтересованных в сообщенной проблеме. Если проблема касается конкретного инструмента, бинарного файла, порта, документа или исходного файла, проверьте https://cgit.FreeBSD.org[Git Repository]. Определите последних коммиттеров, внесших существенные изменения в файл, и попытайтесь связаться с ними через IRC или электронную почту. Список коммиттеров и их адреса электронной почты можно найти в статье extref:{contributors}[Участники проекта FreeBSD]. Помните, что эти люди — добровольцы, как и сопровождающие и пользователи, поэтому они могут быть не сразу доступны для помощи с отчётом о проблеме. Терпение и последовательность в дальнейших действиях крайне рекомендуются и ценятся. При достаточном внимании и усилиях, посвящённых этому процессу, найти коммиттера, который займётся отчётом о проблеме — лишь вопрос времени. [[pr-problems]] == Если возникли проблемы Если вы обнаружили проблему в системе отслеживания ошибок, сообщите об ошибке! Для этого существует специальная категория. Если у вас не получается это сделать, свяжитесь с ответственными за обработку ошибок по адресу mailto:bugmeister@FreeBSD.org[bugmeister@FreeBSD.org]. [[pr-further]] == Для дальнейшего ознакомления Это список информационных ресурсов, относящихся к правильному написанию и обработке сообщений о проблемах. Он, без сомнения, не полон. * https://github.com/smileytechguy/reporting-bugs-effectively/blob/master/ENGLISH.md[How to Report Bugs Effectively]-прекрасное эссе, которое написал Simon G. Tatham о составлении полезных (не специфичных для FreeBSD) сообщений о проблемах. * extref:{pr-guidelines}[Руководство по обработке отчётов о проблемах] — интересный взгляд на обработку сообщений о проблемах самими разработчиками FreeBSD. diff --git a/documentation/content/ru/articles/problem-reports/_index.po b/documentation/content/ru/articles/problem-reports/_index.po index 790a57fedf..5e0b446026 100644 --- a/documentation/content/ru/articles/problem-reports/_index.po +++ b/documentation/content/ru/articles/problem-reports/_index.po @@ -1,1506 +1,1506 @@ # SOME DESCRIPTIVE TITLE # Copyright (C) YEAR The FreeBSD Project # This file is distributed under the same license as the FreeBSD Documentation package. # Vladlen Popolitov , 2025, 2026. msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2026-02-22 15:58+0000\n" -"PO-Revision-Date: 2026-03-08 09:11+0000\n" +"POT-Creation-Date: 2026-08-06 22:55+0100\n" +"PO-Revision-Date: 2026-05-18 04:45+0000\n" "Last-Translator: Vladlen Popolitov \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 4.17\n" #. type: YAML Front Matter: description #: documentation/content/en/articles/problem-reports/_index.adoc:1 #, no-wrap msgid "How to best formulate and submit a problem report to the FreeBSD Project" msgstr "Как лучше сформулировать и отправить отчёт о проблеме в проект FreeBSD" #. type: Title = #: documentation/content/en/articles/problem-reports/_index.adoc:1 #: documentation/content/en/articles/problem-reports/_index.adoc:11 #, no-wrap msgid "Writing FreeBSD Problem Reports" msgstr "Составление сообщений о проблеме во FreeBSD" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:44 +#: documentation/content/en/articles/problem-reports/_index.adoc:43 msgid "Abstract" msgstr "Аннотация" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:46 +#: documentation/content/en/articles/problem-reports/_index.adoc:45 msgid "" "This article describes how to best formulate and submit a problem report to " "the FreeBSD Project." msgstr "" "Эта статья описывает, как наилучшим образом сформулировать и отправить " "сообщение о проблеме в Проект FreeBSD." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:48 +#: documentation/content/en/articles/problem-reports/_index.adoc:47 msgid "'''" msgstr "'''" #. type: Title == -#: documentation/content/en/articles/problem-reports/_index.adoc:52 +#: documentation/content/en/articles/problem-reports/_index.adoc:51 #, no-wrap msgid "Scope of this article" msgstr "Область применения данной статьи" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:55 +#: documentation/content/en/articles/problem-reports/_index.adoc:54 msgid "" "This article was originally written to cover Problem Report submissions via " "Bugzilla, but parts will also apply to submitting via Phabricator review " "system or the FreeBSD Github organization." msgstr "" "Изначально эта статья была написана для описания отправки отчётов о " "проблемах через Bugzilla, но некоторые её разделы также применимы при " "отправке через систему рецензирования Phabricator или через организацию " "FreeBSD на Github." #. type: Title == -#: documentation/content/en/articles/problem-reports/_index.adoc:57 +#: documentation/content/en/articles/problem-reports/_index.adoc:56 #, no-wrap msgid "Introduction" msgstr "Введение" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:61 +#: documentation/content/en/articles/problem-reports/_index.adoc:60 msgid "" "One of the most frustrating experiences one can have as a software user is " "to submit a problem report only to have it summarily closed with a terse and " "unhelpful explanation like \"not a bug\" or \"bogus report\". Similarly, " "one of the most frustrating experiences as a software developer is to be " "flooded with problem reports that are not really problem reports but " "requests for support, or that contain little or no information about what " "the problem is and how to reproduce it." msgstr "" "Одной из самых разочаровывающих практик, которую можно получить в качестве " "пользователя программного обеспечения, является отправка сообщения о " "проблеме, которое вскоре закрывается с кратким и ничему не помогающим " "объяснением типа \"это не проблема\" или \"неправильный отчет\". Подобным же " "образом одной из самых разочаровывающих практик, которую можно получить в " "качестве разработчика программного обеспечения, является получение массы " "сообщений о проблемах, которые на самом деле не являются сообщениями о " "проблемах, а запросами на получение поддержки, или которые содержат мало или " "вообще не содержат никакой информации о сути проблемы или способе её " "воспроизведения." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:64 +#: documentation/content/en/articles/problem-reports/_index.adoc:63 msgid "" "This document attempts to describe how to write good problem reports. What, " "one asks, is a good problem report? Well, to go straight to the bottom line, " "a good problem report is one that can be analyzed and dealt with swiftly, to " "the mutual satisfaction of both user and developer." msgstr "" "В этом документе делается попытка описать то, как составлять хорошие " "сообщения о проблемах. Что же, спросите вы, является хорошим сообщением о " "проблеме? Ну, если перейти прямо к сути, то хорошим сообщением об проблеме " "является то, которое может быть быстро проанализировано и отработано, к " "обоюдному удовлетворению как пользователя, так и разработчика." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:66 +#: documentation/content/en/articles/problem-reports/_index.adoc:65 msgid "" "Although the primary focus of this article is on submitting FreeBSD problem " "reports via Bugzilla, most of it should apply quite well in other cases." msgstr "" "Хотя в основном статья фокусируется на отправке сообщений о проблемах во " "FreeBSD с помощью Bagzilla, большей частью она должна хорошо подходить и " "другим случаям." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:69 +#: documentation/content/en/articles/problem-reports/_index.adoc:68 msgid "" "Note that this article is organized thematically, not chronologically. Read " "the entire document before submitting a problem report, rather than treating " "it as a step-by-step tutorial." msgstr "" "Заметьте, что эта статья организована по тематическому принципу, а не " "хронологически, так что вы должны прочесть документ целиком прежде, чем " "посылать сообщение о проблеме, и не воспринимать статью как пошаговое " "руководство." #. type: Title == -#: documentation/content/en/articles/problem-reports/_index.adoc:71 +#: documentation/content/en/articles/problem-reports/_index.adoc:70 #, no-wrap msgid "When to Submit a Problem Report" msgstr "Когда нужно отправлять сообщение о проблеме" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:77 +#: documentation/content/en/articles/problem-reports/_index.adoc:76 msgid "" "There are many types of problems, and not all of them should engender a " "problem report. Of course, nobody is perfect, and there will be times when " "what seems to be a bug in a program is, in fact, a misunderstanding of the " "syntax for a command or a typographical error in a configuration file " "(though that in itself may sometimes be indicative of poor documentation or " "poor error handling in the application). There are still many cases where " "submitting a problem report is clearly _not_ the right course of action, and " "will only serve to frustrate both the submitter and the developers. " "Conversely, there are cases where it might be appropriate to submit a " "problem report about something else than a bug—an enhancement or a new " "feature, for instance." msgstr "" "Имеется много классов ошибок, и не все они должны приводить к появлению " "сообщения о проблеме. Конечно же, нет идеальных людей, и будут моменты, " "когда вы решите, что нашли ошибку в программе, а на самом деле вы " "неправильно поняли синтаксис команды или сделали опечатку в конфигурационном " "файле (хотя само по себе это иногда говорит о плохой документации или " "неправильной обработке ошибок в прикладной программе). Есть ещё много " "случаев, когда посылка сообщения о проблеме явно _не_ является правильным " "действием, а только приводит к разочарованию вас и разработчиков. И " "наоборот, есть случаи, когда может быть нужно послать сообщение о чем-то, не " "являющемся ошибкой - к примеру, запрос на доработку или расширение " "функциональности." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:81 +#: documentation/content/en/articles/problem-reports/_index.adoc:80 msgid "" "So how does one determine what is a bug and what is not? As a simple rule of " "thumb, the problem is _not_ a bug if it can be expressed as a question " "(usually of the form \"How do I do X?\" or \"Where can I find Y?\"). It is " "not always quite so black and white, but the question rule covers a large " "majority of cases. When looking for an answer, consider first consulting " "the https://forums.freebsd.org[FreeBSD Forums], IRC, or the {freebsd-" "questions}." msgstr "" "Но как же определить, что является ошибкой, а что нет? Простым правилом, " "которому нужно следовать, является следующее - ваша проблема _не_ является " -"ошибкой, если она формулируется как вопрос (обычно в форме \"Как сделать X?\"" -" или \"Где можно найти Y?\"). Не всегда это так однозначно, но правило " +"ошибкой, если она формулируется как вопрос (обычно в форме \"Как сделать X?" +"\" или \"Где можно найти Y?\"). Не всегда это так однозначно, но правило " "вопроса покрывает большинство случаев. Если Вам нужен ответ, лучше всего " "сначала проконсультироваться https://forums.freebsd.org[на форумах FreeBSD], " "в IRC или в {freebsd-questions}." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:83 +#: documentation/content/en/articles/problem-reports/_index.adoc:82 msgid "" "Consider these factors when submitting reports about ports or other software " "that is not part of FreeBSD itself:" msgstr "" "Вот некоторые случаи, в которых может оказаться полезным отправить сообщение " "о чем-то, что не является ошибкой:" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:85 +#: documentation/content/en/articles/problem-reports/_index.adoc:84 msgid "" "Please do not submit problem reports that simply state that a newer version " "of an application is available. Ports maintainers are automatically notified " "by portscout when a new version of an application becomes available. Actual " "patches to update a port to the latest version are welcome." msgstr "" "Уведомление об обновлении программного обеспечения, которое поддерживается " "сторонними разработчиками (в основном порты, но также и компоненты базовой " "системы, разрабатываемые сторонними организациями, такие, как BIND или " "различные утилиты GNU)." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:86 +#: documentation/content/en/articles/problem-reports/_index.adoc:85 msgid "" "For unmaintained ports (`MAINTAINER` is `ports@FreeBSD.org`), a report " "without an included patch is unlikely to get picked up by a committer. To " "become the maintainer of an unmaintained port, submit a report with the " "request (patch preferred but not required)." msgstr "" "Для не поддерживаемых никем портов (переменная `MAINTAINER` содержит " "`ports@FreeBSD.org`) отчёт о проблеме без приложенного файла с исправлениями " "едва ли будет замечен коммиттером. Чтобы стать сопровождающим порта, у " "которого не было сопровождающего, отправьте отчёт с запросом (файл с " "исправлением желателен, но не обязателен)." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:87 +#: documentation/content/en/articles/problem-reports/_index.adoc:86 msgid "" "In either case, following the process described in extref:{porters-handbook}" "upgrading/[Porter's Handbook] will yield the best results. (You might also " "wish to read extref:{contributing}[Contributing to the FreeBSD Ports " "Collection, ports-contributing].)" msgstr "" "В любом случае, следование процессу, описанному в extref:{porters-handbook}" "upgrading[Руководстве по созданию портов] даст наилучшие результаты. (Также " "можно ознакомиться с статьей extref:{contributing}[Вклад в коллекцию портов " "FreeBSD, ports-contributing].)" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:92 +#: documentation/content/en/articles/problem-reports/_index.adoc:91 msgid "" "A bug that cannot be reproduced can rarely be fixed. If the bug only " "occurred once and you cannot reproduce it, and it does not seem to happen to " "anybody else, chances are none of the developers will be able to reproduce " "it or figure out what is wrong. That does not mean it did not happen, but " "it does mean that the chances of your problem report ever leading to a bug " "fix are very slim. To make matters worse, often these kinds of bugs are " "actually caused by failing hard drives or overheating processors—you should " "always try to rule out these causes, whenever possible, before submitting a " "report." msgstr "" "Ошибка, которую нельзя воспроизвести, вряд ли будет исправлена. Если ошибка " "возникла только единожды, и вы не можете её воспроизвести, к тому же никто с " "ней больше не сталкивался, нет никаких шансов, что разработчики смогут её " "воспроизвести или понять, что делается неправильно. Это не значит, что " "такого не случается, но это значит, что шансов у вашего сообщения дойти " "когда-либо до стадии исправления ошибки очень малы. Часто эти виды ошибок " "возникают из-за неудовлетворительной работы жёстких дисков, перегревшихся " "процессоров. Всегда, когда это возможно вы должны отслеживать такие случаи " "перед посылкой сообщения об ошибке." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:94 +#: documentation/content/en/articles/problem-reports/_index.adoc:93 msgid "" "Next, to decide to whom you should file your problem report, you need to " "understand that the software that makes up FreeBSD is composed of several " "different elements:" msgstr "" "Теперь, чтобы определить кому вы должны отправить ваше сообщение об ошибке, " "вы должны понимать, что программное обеспечение, которое входит во FreeBSD, " "составляется из нескольких различных частей:" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:96 +#: documentation/content/en/articles/problem-reports/_index.adoc:95 msgid "" "Code in the base system that is written and maintained by FreeBSD " "contributors, such as the kernel, the C library, and the device drivers " "(categorized as `kern`); the binary utilities (`bin`); the manual pages and " "documentation (`docs`); and the web pages (`www`). All bugs in these areas " "should be reported to the FreeBSD developers." msgstr "" "Код в базовой системе, который пишется и поддерживается контрибьюторами " "FreeBSD. Такой, как ядро, библиотека C, драйвера устройств (входят в " "категорию `kern`); утилиты (`bin`); страницы справочника и документация " "(`docs`); веб-страницы (`www`). Все ошибки в этих областях должны быть " "сообщены разработчикам FreeBSD." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:97 +#: documentation/content/en/articles/problem-reports/_index.adoc:96 msgid "" "Code in the base system that is written and maintained by others, and " "imported into FreeBSD and adapted. Examples include man:clang[1], and man:" "sendmail[8]. Most bugs in these areas should be reported to the FreeBSD " "developers; but in some cases they may need to be reported to the original " "authors instead if the problems are not FreeBSD-specific." msgstr "" "Код в базовой системе, который пишется и поддерживается другим, " "импортируется во FreeBSD и адаптируется. Примеры включают в себя: bind, man:" "gcc[1] и man:sendmail[8]. Большинство ошибок, попадающие в данные области " "должны быть сообщены разработчикам FreeBSD, но в некоторых случаях они " "должны быть отправлены изначальным разработчикам, если проблемы не являются " "специфичными для FreeBSD. Обычно ошибки такого рода попадают под категории " "`bin` или `gnu`." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:98 +#: documentation/content/en/articles/problem-reports/_index.adoc:97 msgid "" "Individual applications that are not in the base system but are instead part " "of the FreeBSD Ports Collection (category `ports`). Most of these " "applications are not written by FreeBSD developers; what FreeBSD provides is " "merely a framework for installing the application. Therefore, only report a " "problem to the FreeBSD developers when the problem is believed to be FreeBSD-" "specific; otherwise, report it to the authors of the software." msgstr "" "Отдельные приложения, не входящие в базовую систему, но являющиеся частью " "Коллекции Портов FreeBSD (категория `ports`). Большинство этих приложений не " "пишется разработчиками FreeBSD; что предоставляет FreeBSD, так это только " "лишь инфраструктуру для установки приложения. Следовательно, вы должны " "отправлять сообщение об ошибке разработчикам FreeBSD только тогда, когда вы " "уверены в том, что проблема специфична для FreeBSD - иначе отправляйте её " "авторам программного обеспечения." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:101 +#: documentation/content/en/articles/problem-reports/_index.adoc:100 msgid "" "Then, ascertain whether the problem is timely. There are few things that " "will annoy a developer more than receiving a problem report about a bug she " "has already fixed." msgstr "" "Затем вы должны убедиться, действительно ли проблема существует. Существует " "всего несколько вещей, которые раздражают разработчика больше, чем получение " "сообщения об ошибке, которую он уже исправил." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:105 +#: documentation/content/en/articles/problem-reports/_index.adoc:104 msgid "" "If the problem is in the base system, first read the extref:{handbook}/" "cutting-edge/[Handbook section on Versions], if you are not already familiar " "with the topic. It is not possible for FreeBSD to fix problems in anything " "other than certain recent branches of the base system, so filing a bug " "report about an older version will probably only result in a developer " "advising you to upgrade to a supported version to see if the problem still " "recurs. The Security Officer team maintains the link:https://www.FreeBSD." "org/security/#sup[list of supported versions]." msgstr "" -"Если проблема в базовой системе, то вам нужно сначала прочесть раздел " -"extref:{handbook}cutting-edge[Руководства FreeBSD о версиях], если вы ещё не " +"Если проблема в базовой системе, то вам нужно сначала прочесть раздел extref:" +"{handbook}cutting-edge[Руководства FreeBSD о версиях], если вы ещё не " "знакомы с данной темой. Для FreeBSD возможно исправлять проблемы только для " "некоторых недавних веток базовой системы, поэтому отправка сообщения об " "ошибке для более старой версии приведёт к тому, что разработчик посоветует " "вам обновиться до поддерживаемой версии, чтобы посмотреть присутствует ли в " "ней проблема. Команда офицеров безопасности поддерживает link:https://www." "FreeBSD.org/ru/security/#sup[список поддерживаемых версий.]." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:108 +#: documentation/content/en/articles/problem-reports/_index.adoc:107 msgid "" "If the problem is in a port, consider filing a bug with the upstream. The " "FreeBSD Project can not fix all bugs in all software." msgstr "" "Если проблема в порте, рассмотрите возможность сообщить об ошибке " "разработчикам исходного проекта. Проект FreeBSD не может исправлять все " "ошибки во всём программном обеспечении." #. type: Title == -#: documentation/content/en/articles/problem-reports/_index.adoc:110 +#: documentation/content/en/articles/problem-reports/_index.adoc:109 #, no-wrap msgid "Preparations" msgstr "Подготовка" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:116 +#: documentation/content/en/articles/problem-reports/_index.adoc:115 msgid "" "A good rule to follow is to always do a background search before submitting " "a problem report. Maybe the problem has already been reported; maybe it is " "being discussed on the mailing lists, or recently was; it may even already " "be fixed in a newer version than what you are running. You should therefore " "check all the obvious places before submitting your problem report. For " "FreeBSD, this means:" msgstr "" "Нужно следовать хорошему правилу всегда сначала выполнять дополнительные " "исследования перед тем, как послать сообщение о проблеме. Может быть, о " "вашей проблеме уже сообщено; может быть, она недавно обсуждалась или " "обсуждается в списках рассылки; она может быть уже исправлена в более новой " "версии, чем та, что вы используете. Поэтому вы должны проверить все обычные " "места до того, как послать ваше сообщение о проблеме. Для FreeBSD это значит:" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:118 +#: documentation/content/en/articles/problem-reports/_index.adoc:117 msgid "" "First, always check to see if the problem is covered in extref:{handbook}" "[Handbook]." msgstr "" -"Во-первых, всегда проверяйте, не описан ли этот вопрос в " -"extref:{handbook}[Руководстве]." +"Во-первых, всегда проверяйте, не описан ли этот вопрос в extref:{handbook}" +"[Руководстве]." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:119 +#: documentation/content/en/articles/problem-reports/_index.adoc:118 msgid "" "The FreeBSD extref:{faq}[Frequently Asked Questions] (FAQ) list. The FAQ " "attempts to provide answers for several questions, such as those concerning " "extref:{faq}[hardware compatibility, hardware]." msgstr "" "Список extref:{faq}[Часто задаваемых вопросов] (FAQ) по FreeBSD. FAQ " -"содержит ответы на несколько вопросов, таких как вопросы, касающиеся " -"extref:{faq}[совместимости оборудования, hardware]." +"содержит ответы на несколько вопросов, таких как вопросы, касающиеся extref:" +"{faq}[совместимости оборудования, hardware]." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:120 +#: documentation/content/en/articles/problem-reports/_index.adoc:119 msgid "" "The extref:{handbook}eresources/[mailing lists, eresources-mail]. If you are " "not subscribed, use https://www.FreeBSD.org/search/#mailinglists[the " "searchable archives] on the FreeBSD web site. If the problem has not been " "discussed on the lists, you might try posting a message about it and waiting " "a few days to see if someone can spot something that has been overlooked." msgstr "" "extref:{handbook}eresources/[Списки рассылки, eresources-mail] — если Вы не " "подписаны на них, воспользуйтесь https://www.FreeBSD.org/search/" "#mailinglists[поиском в архивах] на сайте FreeBSD. Если ваша проблема не " "обсуждалась в списках рассылки, вы можете попытаться опубликовать сообщение " "о ней и подождать несколько дней — возможно, кто-то заметит то, что было " "упущено." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:121 +#: documentation/content/en/articles/problem-reports/_index.adoc:120 msgid "As noted above, the FreeBSD Forums and IRC." msgstr "Как отмечалось выше, форумы FreeBSD и IRC." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:122 +#: documentation/content/en/articles/problem-reports/_index.adoc:121 msgid "" "Optionally, the entire web-use your favorite search engine to locate any " "references to the problem. You may even get hits from archived mailing lists " "or newsgroups you did not know of or had not thought to search through." msgstr "" "Как вариант, весь веб-используйте вашу любимую поисковую систему для поиска " "каких-либо ссылок по вашей проблеме. Вы можете даже увидеть ссылки на архивы " "списков рассылки или телеконференций, о которых вы не знали или не думали " "там искать." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:123 +#: documentation/content/en/articles/problem-reports/_index.adoc:122 msgid "" "Next, the searchable https://bugs.freebsd.org/bugzilla/query.cgi[FreeBSD " "Bugzilla database]. Unless the problem is recent or obscure, there is a fair " "chance it has already been reported." msgstr "" -"Следующим пунктом должна быть https://bugs.freebsd.org/bugzilla/query.cgi[ " -"база данных FreeBSD Bugzilla]. Если только ваша проблема не нова или редка, " -"есть некоторый шанс, что о ней уже сообщено." +"Следующим пунктом должна быть https://bugs.freebsd.org/bugzilla/query." +"cgi[ база данных FreeBSD Bugzilla]. Если только ваша проблема не нова или " +"редка, есть некоторый шанс, что о ней уже сообщено." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:124 +#: documentation/content/en/articles/problem-reports/_index.adoc:123 msgid "" "Most importantly, attempt to see if existing documentation in the source " "base addresses your problem." msgstr "" "И самое важное, вы должны посмотреть не затрагивает ли документация в " "базовой системе вашу проблему." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:127 +#: documentation/content/en/articles/problem-reports/_index.adoc:126 msgid "" "For the base FreeBSD code, you should carefully study the contents of [." "filename]#/usr/src/UPDATING# on your system or the latest version at https://" "cgit.freebsd.org/src/tree/UPDATING[https://cgit.freebsd.org/src/tree/" "UPDATING]. (This is vital information if you are upgrading from one version " "to another, especially if you are upgrading to the FreeBSD-CURRENT branch)." msgstr "" "Для основного кода FreeBSD вы должны тщательно изучить содержимое файла [." "filename]#/usr/src/UPDATING# или его текущую версию по адресу https://cgit." "freebsd.org/src/tree/UPDATING[https://cgit.freebsd.org/src/tree/UPDATING]. " "(Если вы переходите с одной версии на другую, особенно если вы обновляетесь " "до FreeBSD-CURRENT, то в этом файле вы можете найти много важной информации)." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:130 +#: documentation/content/en/articles/problem-reports/_index.adoc:129 msgid "" "However, if the problem is in something that was installed as a part of the " "FreeBSD Ports Collection, you should refer to [.filename]#/usr/ports/" "UPDATING# (for individual ports) or [.filename]#/usr/ports/CHANGES# (for " "changes that affect the entire Ports Collection). https://cgit.freebsd.org/" "ports/tree/UPDATING[https://cgit.freebsd.org/ports/tree/UPDATING] and " "https://cgit.freebsd.org/ports/tree/CHANGES[https://cgit.freebsd.org/ports/" "tree/CHANGES] are also available via cgit." msgstr "" "Если же ваша проблема связана с коллекцией портов FreeBSD, вы должны " "обратиться к файлу [.filename]#/usr/ports/UPDATING# (изменения, касающиеся " "индивидуальных портов) или к [.filename]#/usr/ports/CHANGES# (изменения, " "касающиеся всей коллекции портов). Они также доступны через интерфейс cgit: " "https://cgit.freebsd.org/ports/tree/UPDATING[https://cgit.freebsd.org/ports/" "tree/UPDATING] и https://cgit.freebsd.org/ports/tree/CHANGES[https://cgit." "freebsd.org/ports/tree/CHANGES] ." #. type: Title == -#: documentation/content/en/articles/problem-reports/_index.adoc:132 +#: documentation/content/en/articles/problem-reports/_index.adoc:131 #, no-wrap msgid "Writing the Problem Report" msgstr "Написание сообщения о проблеме" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:136 +#: documentation/content/en/articles/problem-reports/_index.adoc:135 msgid "" "Now that you have decided that your issue merits a problem report, and that " "it is a FreeBSD problem, it is time to write the actual problem report. " "Before we get into the mechanics of the program used to generate and submit " "Bugzilla PRs, here are some tips and tricks to help make sure that your " "report will be most effective." msgstr "" "Теперь, после того, как вы решили, что ваш вопрос подпадает под категорию " "сообщения о проблеме, и это проблема FreeBSD, самое время написать " "собственно сообщение о проблеме (PR). Прежде чем мы углубимся в частности " "использования программы для создания и отправки PR в Bugzilla, вот несколько " "советов, которые помогут вам сделать сообщение более эффективным." #. type: Title == -#: documentation/content/en/articles/problem-reports/_index.adoc:138 +#: documentation/content/en/articles/problem-reports/_index.adoc:137 #, no-wrap msgid "Tips and Tricks for Writing a Good Problem Report With Bugzilla" msgstr "Как писать хорошие сообщения о проблемах в Bugzilla" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:141 +#: documentation/content/en/articles/problem-reports/_index.adoc:140 msgid "" "_Do not leave the \"Summary\" line empty._ The reports go both onto a " "mailing list that goes all over the world (where the \"Summary\" is used for " "the `Subject:` line), but also into a database. Anyone who comes along later " "and browses the database by synopsis, and finds a PR with a blank subject " "line, tends just to skip over it. Remember that PRs stay in this database " "until they are closed by someone; an anonymous one will usually just " "disappear in the noise." msgstr "" "_Не оставляйте поле \"Summary\" (краткое описание) пустым._ Сообщения о " "проблемах попадают как в списки рассылки, которые затем расходятся по всему " "миру (в них поле \"Summary\" определяет тему письма), так и в базу данных. " "Просматривающий эту базу, как правило, пройдет мимо PR с пустым кратким " "описанием. Не забудьте, что PR остаётся в базе до тех пор, пока кто-либо не " "закроет его; сообщение-аноним, скорее всего, просто потеряется на общем фоне." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:142 +#: documentation/content/en/articles/problem-reports/_index.adoc:141 msgid "" "_Avoid using a weak \"Summary\" line._ You should not assume that anyone " "reading your PR has any context for your submission, so the more you " "provide, the better. For instance, what part of the system does the problem " "apply to? Do you only see the problem while installing, or while running? To " "illustrate, instead of `Summary: portupgrade is broken`, see how much more " "informative this seems: `Summary: port ports-mgmt/portupgrade coredumps on -" "current`. (In the case of ports, it is especially helpful to have both the " "category and portname in the \"Summary\" line.)" msgstr "" "__Избегайте туманных описаний в поле \"Summary\"__. Не стоит предполагать, " "что читающий ваше сообщение владеет контекстом; поэтому, чем подробнее вы " "опишете ситуацию, тем лучше. В частности, к какой части системы относится " "ваша проблема? Проявляется ли она на этапе установки или во время нормальной " "работы? Например, вместо строки `Summary: portupgrade is broken` следовало " "бы написать что-то вроде `Summary: port ports-mgmt/portupgrade coredumps on -" "current`. В случае портированных приложений в поле \"Summary\" полезно " "указывать не только имя порта, но и категорию." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:144 +#: documentation/content/en/articles/problem-reports/_index.adoc:143 msgid "" "_If you have a patch, say so._ The presence of a patch makes it much easier " "to progress a report." msgstr "" "_Если у вас есть патч, сообщите об этом._ Наличие патча значительно упрощает " "обработку отчёта." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:145 +#: documentation/content/en/articles/problem-reports/_index.adoc:144 msgid "" "Do not use the `patch` or `patch-ready` keywords – they are deprecated. " "Instead, include your patch as an Attachment, and click the `[patch]` " "checkbox. If you do not see the checkbox, click `Show Advanced Fields` in " "the upper left corner." msgstr "" "Не используйте ключевые слова `patch` или `patch-ready` — они устарели. " "Вместо этого прикрепите патч как вложение и отметьте флажок `[patch]`. Если " "флажок не отображается, нажмите `Show Advanced Fields` (Показать расширенные " "поля) в левом верхнем углу." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:146 +#: documentation/content/en/articles/problem-reports/_index.adoc:145 msgid "Patches with MIME type `text/plain` are preferred." msgstr "Предпочтительны файлы с исправлениями с MIME-типом `text/plain`." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:147 +#: documentation/content/en/articles/problem-reports/_index.adoc:146 msgid "Patches compatible with `git` are preferred." msgstr "Предпочтительны патчи, совместимые с `git`." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:148 +#: documentation/content/en/articles/problem-reports/_index.adoc:147 msgid "" "_If you are a ports maintainer, say so._ If you are maintaining a part of " "the source code (for instance, an existing port), you definitely should set " "the `maintainer-feedback?` of your PR to `+`. This way any committer that " "handles your PR will not have to check." msgstr "" "_Если вы сопровождаете порт, укажите это._ Если вы сопровождаете часть " "исходного кода (например, существующий порт), обязательно установите поле " "`maintainer-feedback` в вашем сообщении о проблеме в `+`. Таким образом, " "любой коммиттер, обрабатывающий ваш PR, не будет вынужден проверять это." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:149 +#: documentation/content/en/articles/problem-reports/_index.adoc:148 msgid "" "_Be specific._ The more information you supply about what problem you are " "having, the better your chance of getting a response." msgstr "" "_Будьте точны в формулировках._ Чем больше информации вы можете предоставить " "о проблеме, тем больше у вас шансов получить ответ." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:151 +#: documentation/content/en/articles/problem-reports/_index.adoc:150 msgid "" "Include the version of FreeBSD you are running (there is a place to put " "that, see below) and on which architecture. You should include whether you " "are running from a release (e.g., from a CD-ROM or download), or from a " "system maintained by Git (and, if so, what hash and branch you are at). If " "you are tracking the FreeBSD-CURRENT branch, that is the very first thing " "someone will ask, because fixes (especially for high-profile problems) tend " "to get committed very quickly, and FreeBSD-CURRENT users are expected to " "keep up." msgstr "" "Включите версию FreeBSD, которую вы используете (для этого есть специальное " "поле, см. ниже), и архитектуру. Укажите, используете ли вы релиз (например, " "с CD-ROM или загруженный) или систему, поддерживаемую через Git (и, если да, " "укажите хэш и ветку). Если вы используете ветку FreeBSD-CURRENT, укажите это " "в первую очередь, так как исправления (особенно для известных проблем) часто " "добавляются очень быстро, и пользователи FreeBSD-CURRENT должны следить за " "обновлениями." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:152 +#: documentation/content/en/articles/problem-reports/_index.adoc:151 msgid "" "Include which global options you have specified in your [.filename]#make." "conf#, [.filename]#src.conf#, and [.filename]#src-env.conf#. Given the " "infinite number of options, not every combination may be fully supported." msgstr "" "Включите информацию о том, какие глобальные опции вы указали в [." "filename]#make.conf#. На заметку: Объявление опций наподобие `-02` и других, " "описанных в man:gcc[1] во многих случаях может быть причиной ошибок. Хотя и " "разработчики FreeBSD будут принимать патчи, у них не будет желания " "исследовать такие случаи из-за отсутствия времени и добровольцев, и вместо " "этого они могут ответить, что это не поддерживается." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:153 +#: documentation/content/en/articles/problem-reports/_index.adoc:152 msgid "" "If the problem can be reproduced easily, include information that will help " "a developer to reproduce it themselves. If a problem can be demonstrated " "with specific input then include an example of that input if possible, and " "include both the actual and the expected output. If this data is large or " "cannot be made public, then do try to create a minimal file that exhibits " "the same issue and that can be included within the PR." msgstr "" "Если проблему можно легко повторить, включите необходимую информацию, чтобы " "разработчик смог воспроизвести её самостоятельно. Если проблема проявляется " "при некоторых вводимых данных, то, по возможности, приведите их вместе с " "получаемым и ожидаемым выводом. Если же вводимых данных много или же их " "нельзя разглашать, то попробуйте выделить из них лишь небольшой фрагмент, " "приводящий к возникновению проблемы, и включите его в PR." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:154 +#: documentation/content/en/articles/problem-reports/_index.adoc:153 msgid "" "If this is a kernel problem, then be prepared to supply the following " "information. (You do not have to include these by default, which only tends " "to fill up the database, but you should include excerpts that you think " "might be relevant):" msgstr "" "Если ваша проблема связана с ядром, будьте готовы предоставить следующую " "информацию (вам не обязательно включать её всю, она пойдёт лишь на " "заполнение базы данных, но вы должны включить информацию, которая по вашему " "мнению актуальна):" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:156 +#: documentation/content/en/articles/problem-reports/_index.adoc:155 msgid "" "your kernel configuration (including which hardware devices you have " "installed)" msgstr "Вашу конфигурацию ядра, включая то, какие устройства у вас установлены" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:157 +#: documentation/content/en/articles/problem-reports/_index.adoc:156 msgid "" "whether or not you have debugging options enabled (such as `WITNESS`), and " "if so, whether the problem persists when you change the sense of that option" msgstr "" "Включены ли у вас опции отладки (например, `WITNESS`), и если так, то " "существует ли проблема после изменения значения этой опции" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:158 +#: documentation/content/en/articles/problem-reports/_index.adoc:157 msgid "" "the full text of any backtrace, panic or other console output, or entries in " "[.filename]#/var/log/messages#, if any were generated" msgstr "" "Полный вывод обратной трассировки (backtrace), паники или иного консольного " "вывода, или же записи из [.filename]#/var/log/messages#, если они были " "сгенерированы" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:159 +#: documentation/content/en/articles/problem-reports/_index.adoc:158 msgid "" "the output of `pciconf -l` and relevant parts of your `dmesg` output if your " "problem relates to a specific piece of hardware" msgstr "" "Вывод команды `pciconf -l`, а также соответствующие части вывода `dmesg`, в " "случае, если проблема связана с конкретным оборудованием" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:160 +#: documentation/content/en/articles/problem-reports/_index.adoc:159 msgid "" "the fact that you have read [.filename]#src/UPDATING# and that your problem " "is not listed there (someone is guaranteed to ask)" msgstr "" "Прочли ли вы [.filename]#src/UPDATING#, описана ли там ваша проблема (кто-" "нибудь спросит обязательно)" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:161 +#: documentation/content/en/articles/problem-reports/_index.adoc:160 msgid "" "whether or not you can run any other kernel as a fallback (this is to rule " "out hardware-related issues such as failing disks and overheating CPUs, " "which can masquerade as kernel problems)" msgstr "" "Запускается ли другое ядро (это для тех случаев, когда причиной сбоя стало " "оборудование, например отказывающие винчестеры или перегревшиеся процессоры, " "что может маскировать проблемы ядра)" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:163 +#: documentation/content/en/articles/problem-reports/_index.adoc:162 msgid "" "If this is a ports problem, then be prepared to supply the following " "information. (You do not have to include these by default, which only tends " "to fill up the database, but you should include excerpts that you think " "might be relevant):" msgstr "" "Если же ваша проблема связана с портами, то предоставьте следующую " "информацию (вам не обязательно включать её всю, она пойдет лишь на " "заполнение базы данных, но вы должны включить информацию, которая по вашему " "мнению актуальна):" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:165 +#: documentation/content/en/articles/problem-reports/_index.adoc:164 msgid "which ports you have installed" msgstr "Какие порты вы устанавливали" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:166 +#: documentation/content/en/articles/problem-reports/_index.adoc:165 msgid "" "any environment variables that override the defaults in [.filename]#bsd.port." "mk#, such as `PORTSDIR`" msgstr "" "Имеются ли какие-либо переменные окружения, которые переписывают " "первоначально-установленные в [.filename]#bsd.port.mk#, такие как, " "`PORTSDIR`)" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:167 +#: documentation/content/en/articles/problem-reports/_index.adoc:166 msgid "" "the fact that you have read [.filename]#ports/UPDATING# and that your " "problem is not listed there (someone is guaranteed to ask)" msgstr "" "Прочли ли вы [.filename]#ports/UPDATING#, и описана ли там ваша проблема " "(кто-нибудь спросит обязательно)" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:169 +#: documentation/content/en/articles/problem-reports/_index.adoc:168 msgid "" "_Avoid vague requests for features._ Problem Reports of the form \"someone " "should really implement something that does so-and-so\" are less likely to " "get results than very specific requests. Remember, the source is available " "to everyone, so if you want a feature, the best way to ensure it being " "included is to get to work! Also consider the fact that many things like " "this would make a better topic for discussion on `freebsd-questions` than an " "entry in the PR database, as discussed above." msgstr "" -"_Избегайте нечетких запросов о новых возможностях._ Сообщение типа \"кто-то " +"_Избегайте нечётких запросов о новых возможностях._ Сообщение типа \"кто-то " "обязательно должен сделать так, чтобы такая-то утилита вела себя так-то\" " -"имеет куда меньше шансов встретить позитивный отклик, чем более четко " +"имеет куда меньше шансов встретить позитивный отклик, чем более чётко " "сформулированный запрос. Помните, что исходные тексты доступны всем, так что " "если вам нужна реализация какого-то нового свойства, лучший способ — взяться " "за работу самому! Не забудьте также, что такие моменты лучше обсуждать в " "списках рассылки, таких как `freebsd-questions`, чем делать это посредством " "базы данных PR." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:170 +#: documentation/content/en/articles/problem-reports/_index.adoc:169 msgid "" "_Make sure no one else has already submitted a similar PR._ Although this " "has already been mentioned above, it bears repeating here. It only take a " "minute or two to use the Bugzilla web-based search engine at https://bugs." "freebsd.org/bugzilla/query.cgi[https://bugs.freebsd.org/bugzilla/query.cgi]. " "(Of course, everyone is guilty of forgetting to do this now and then.)" msgstr "" "_Убедитесь, что ваша проблема ещё никем не описана._ Мы уже говорили об " "этом, но стоит повториться. Потратьте пару минут на составление запросов в " "Bugzilla: https://bugs.freebsd.org/bugzilla/query.cgi[https://bugs.freebsd." "org/bugzilla/query.cgi]. (Несмотря на повторы, об этом постоянно забывают)" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:171 +#: documentation/content/en/articles/problem-reports/_index.adoc:170 msgid "" "_Report only one issue per Problem Report._ Avoid including two or more " "problems within the same report unless they are related. When submitting " "patches, avoid adding multiple features or fixing multiple bugs in the same " "PR unless they are closely related-such PRs often take longer to resolve." msgstr "" "_Сообщайте об одной проблеме в одном PR._ Избегайте описания двух и более " "проблем в одном сообщении (исключением являются взаимосвязанные проблемы). " "Оформляя патчи, не пытайтесь в них добавлять множество функциональных " "возможностей или исправлять ими несколько ошибок в одном и том же сообщении " "о проблеме (опять же, за исключением взаимосвязанных проблем) - для таких PR-" "ов потребуется значительно больше времени на обработку." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:172 +#: documentation/content/en/articles/problem-reports/_index.adoc:171 msgid "" "_Avoid controversial requests._ If your PR addresses an area that has been " "controversial in the past, you should probably be prepared to not only offer " "patches, but also justification for why the patches are \"The Right Thing To " "Do\". As noted above, a careful search of the mailing lists using the " "archives at https://www.FreeBSD.org/search/#mailinglists[https://www.FreeBSD." "org/search/#mailinglists] is always good preparation." msgstr "" "_Избегайте полемики._ Если ваше сообщение касается области или способов " "реализации, которые ранее вызвали разногласия, вам стоит быть готовым " "предоставить не только патчи, но и внятные аргументы, почему следует " "поступать именно так (то есть, это \"Правильный Путь\"). Как отмечалось " "выше, аккуратный поиск по архиву списков рассылки https://www.FreeBSD.org/" "search/#mailinglists[https://www.FreeBSD.org/search/#mailinglists] никогда " "не помешает." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:173 +#: documentation/content/en/articles/problem-reports/_index.adoc:172 msgid "" "_Be polite._ Almost anyone who would potentially work on your PR is a " "volunteer. No one likes to be told that they have to do something when they " "are already doing it for some motivation other than monetary gain. This is a " "good thing to keep in mind at all times on Open Source projects." msgstr "" "_Будьте вежливы._ Почти каждый из тех, кто может заниматься вашим " "сообщением, является добровольцем. Никому не понравятся указания, как и что " "делать, когда он и так занимается этим, да ещё и по каким-либо причинам, " "отличным от финансовых. Вообще говоря, этого подхода следует придерживаться, " "имея дело с любым проектом с Открытыми Исходными текстами (Open Source)." #. type: Title == -#: documentation/content/en/articles/problem-reports/_index.adoc:175 +#: documentation/content/en/articles/problem-reports/_index.adoc:174 #, no-wrap msgid "Before Beginning" msgstr "Прежде всего" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:179 +#: documentation/content/en/articles/problem-reports/_index.adoc:178 msgid "" "The following considerations apply to use of the https://bugs.freebsd.org/" "bugzilla/enter_bug.cgi[Bugzilla web-based PR submission form]. Be careful " "of cut-and-paste operations that might change whitespace or other text " "formatting." msgstr "" "Следующие соображения применимы к использованию https://bugs.freebsd.org/" "bugzilla/enter_bug.cgi[веб-формы Bugzilla для отправки PR]. Будьте осторожны " "с операциями копирования и вставки, которые могут изменить пробелы или " "другое форматирование текста." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:181 +#: documentation/content/en/articles/problem-reports/_index.adoc:180 msgid "" "Finally, if the submission is lengthy, prepare the work offline so that " "nothing will be lost if there is a problem submitting it." msgstr "" "И наконец, если ваше сообщение будет объёмным, вы должны приготовить его в " "offline, чтобы ничего не потерялось в случае, если будет проблема при его " "отправке." #. type: Title == -#: documentation/content/en/articles/problem-reports/_index.adoc:183 +#: documentation/content/en/articles/problem-reports/_index.adoc:182 #, no-wrap msgid "Attaching Patches or Files" msgstr "Вложение патчей или файлов" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:187 +#: documentation/content/en/articles/problem-reports/_index.adoc:186 msgid "" "The following instructions apply not only to Problem Report submissions via " "Bugzilla, but also via Phabricator or the FreeBSD Github instance (as Pull " "Requests)." msgstr "" "Следующие инструкции применимы не только к отправке отчётов о проблемах " "через Bugzilla, но также через Phabricator или организацию FreeBSD на Github " "(в виде пул-реквестов)." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:195 +#: documentation/content/en/articles/problem-reports/_index.adoc:194 msgid "" "In general, we strongly prefer using `git format-patch` to generate one or a " "series of unified diffs against the base branch (e.g. `origin/main`). " "Patches generated this way would include the Git hashes and will include " "your name and email address, making it easier for committers to apply your " "patch and properly credit you as the author (using `git am`). For minor " "changes where you prefer not to use git, please be sure to use man:diff[1] " "with the `-u` option to create a unified diff, as this would give developers " "more context and are more readable than other diff formats. Please base " "your patch(es) at the base of the appropriate tree." msgstr "" "В общем, мы настоятельно рекомендуем использовать `git format-patch` для " "создания одного или серии унифицированных diff-файлов относительно базовой " "ветки (например, `origin/main`). Патчи, созданные таким образом, будут " "содержать хеши Git, а также ваше имя и адрес электронной почты, что упростит " "применение вашего патча коммиттерами и правильное указание вас как автора (с " "помощью `git am`). Для небольших изменений, где вы предпочитаете не " "использовать git, убедитесь, что используете man:diff[1] с опцией `-u` для " "создания унифицированного diff-файла, так как это даст разработчикам больше " "контекста и сделает его более читаемым по сравнению с другими форматами " "diff. Убедитесь, что ваши патчи созданы от корня соответствующего дерева " "репозитория." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:198 +#: documentation/content/en/articles/problem-reports/_index.adoc:197 msgid "" "For problems with the kernel or the base utilities, a patch against FreeBSD-" "CURRENT (the main Git branch) is preferred since all new code should be " "applied and tested there first. After appropriate or substantial testing " "has been done, the code will be merged/migrated to the FreeBSD-STABLE branch." msgstr "" "Для проблем с ядром или базовыми утилитами предпочтителен патч для FreeBSD-" "CURRENT (основной ветки Git), поскольку весь новый код должен сначала " "применяться и тестироваться там. После проведения соответствующих или " "достаточных тестов код будет объединён/перенесён в ветку FreeBSD-STABLE." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:200 +#: documentation/content/en/articles/problem-reports/_index.adoc:199 msgid "" "We prefer patches as attachments. However, if you attach a patch inline, " "note that the most common problem by far is the tendency of some email " "programs to render tabs as spaces, which will completely ruin anything " "intended to be part of a Makefile." msgstr "" "Мы предпочитаем, чтобы файлы с исправлениями отправлялись, как вложение к " "сообщению. Однако, если вы вставляете патч в тело сообщения, учтите, что " "некоторые почтовые программы имеют тенденцию заменять табуляции серией " "пробелов, что полностью разрушит, например, часть файла сборки (Makefile)." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:204 +#: documentation/content/en/articles/problem-reports/_index.adoc:203 msgid "" "Do not send patches as attachments using `Content-Transfer-Encoding: quoted-" "printable`. These will perform character escaping and the entire patch will " "be useless. Please simply use MIME type `text/plain'." msgstr "" "Не отсылайте патчи в виде вложений, используя `Content-Transfer-Encoding: " "quoted-printable`. Это выполнит экранирование (escaping) символов и весь " "патч будет бесполезным. Пожалуйста, просто используйте тип MIME `text/plain'." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:209 +#: documentation/content/en/articles/problem-reports/_index.adoc:208 msgid "" "Also note that while including small patches in a Github Pull Request is " "generally all right—particularly when they fix the problem described in the " "Pull Request-large patches and especially new code which may require " "substantial review before committing should be placed on a web or ftp " "server, and the URL should be included in the Pull Request instead of the " "patch. Patches in email tend to get mangled, and the larger the patch, the " "harder it will be for interested parties to unmangle it. Also, posting a " "patch on the web allows you to modify it without having to resubmit the " "entire patch in a followup. Finally, large patches simply increase the size " "of the database, since closed reports are not actually deleted but instead " "kept and simply marked as complete." msgstr "" "Следует также заметить, что включение небольших патчей в запросах на " "изменение (pull request) Github является приемлемой практикой, в особенности " "если они решают проблему, описанную в запросе на изменение, большие же " "патчи, а в особенности новый код, который может требовать значительного " "просмотра перед тем, как он будет внесён в дерево исходных текстов, должны " "быть размещены на web- или ftp-сервере, а в запрос на изменение должен быть " "включён только URL указывающий на этот патч. Очень часто патчи, пересылаемые " "по электронной почте, бывают искажены, и, как следствие, чем больше патч, " "тем труднее будет для заинтересованных людей привести его к нормальному " "виду. Также то, что патч будет размещён отдельно от сообщения о проблеме, " "даёт возможность изменять его не отсылая полный патч в дополнение к " "изначальному сообщению о проблеме. И наконец, большие патчи просто " "увеличивают размер базы данных, так как закрытые сообщения об ошибках на " "самом деле не удаляются, а сохраняются и помечаются, как `closed`." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:211 +#: documentation/content/en/articles/problem-reports/_index.adoc:210 msgid "" "You should also take note that unless you explicitly specify otherwise in " "your request or in the patch itself, any patches you submit will be assumed " "to be licensed under the same terms as the original file you modified." msgstr "" "Вы должны также помнить, что пока вы явно не укажете обратного в вашем " "запросе или в самих патчах, будет предполагаться, что они подпадают под те " -"же условия лицензирования, что и оригинальный файл, измененный вами." +"же условия лицензирования, что и оригинальный файл, изменённый вами." #. type: Title == -#: documentation/content/en/articles/problem-reports/_index.adoc:213 +#: documentation/content/en/articles/problem-reports/_index.adoc:212 #, no-wrap msgid "Filling out the Bugzilla Form" msgstr "Заполнение формы Bugzilla" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:216 +#: documentation/content/en/articles/problem-reports/_index.adoc:215 msgid "The following instructions apply only to submissions via Bugzilla." msgstr "Следующие инструкции применимы только к отправке через Bugzilla." #. type: delimited block = 4 -#: documentation/content/en/articles/problem-reports/_index.adoc:222 +#: documentation/content/en/articles/problem-reports/_index.adoc:221 msgid "" "The email address you use will become public information and may become " "available to spammers. You should either have spam handling procedures in " "place, or use a temporary email account. However, please note that if you " "do not use a valid email account at all, we will not be able to ask you " "questions about your submission." msgstr "" "Используемый вами адрес электронной почты станет общедоступной информацией и " "может попасть к спамерам. У вас должны быть процедуры обработки спама или " "следует использовать временный почтовый аккаунт. Однако учтите, что если вы " "вообще не используете действительный почтовый аккаунт, мы не сможем задать " "вам вопросы о вашем сообщении." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:225 +#: documentation/content/en/articles/problem-reports/_index.adoc:224 msgid "When you file a bug, you will find the following fields:" msgstr "При подаче сообщения об ошибке вы увидите следующие поля:" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:227 +#: documentation/content/en/articles/problem-reports/_index.adoc:226 msgid "" "_Summary:_ Fill this out with a short and accurate description of the " "problem. The synopsis is used as the subject of the problem report email, " "and is used in problem report listings and summaries; problem reports with " "obscure synopses tend to get ignored." msgstr "" "_Краткое описание:_ Заполните это кратким и точным описанием проблемы. " "Краткое описание используется как тема письма с отчётом о проблеме, а также " "в списках и сводках отчётов; отчёты с неясными описаниями часто остаются без " "внимания." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:228 +#: documentation/content/en/articles/problem-reports/_index.adoc:227 msgid "" "_Severity:_ One of `Affects only me`, `Affects some people` or `Affects many " "people`. Do not overreact; refrain from labeling your problem `Affects many " "people` unless it really does. FreeBSD developers will not necessarily work " "on your problem faster if you inflate its importance since there are so many " "other people who have done exactly that." msgstr "" "_Серьезность:_ Одно из значений: `Затрагивает только меня (Affects only " "me)`, `Затрагивает некоторых людей (Affects some people)` или `Затрагивает " "многих людей (Affects many people)`. Не переоценивайте проблему; избегайте " "отмечать её как `Затрагивает многих людей`, если это не так. Разработчики " "FreeBSD не обязательно будут работать над вашей проблемой быстрее, если вы " "преувеличите её важность, поскольку многие другие уже поступали точно так же." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:229 +#: documentation/content/en/articles/problem-reports/_index.adoc:228 msgid "_Category:_ Choose an appropriate category." msgstr "_Категория:_ Выберите подходящую категорию." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:234 +#: documentation/content/en/articles/problem-reports/_index.adoc:233 msgid "" "The first thing you need to do is to decide what part of the system your " "problem lies in. Remember, FreeBSD is a complete operating system, which " "installs both a kernel, the standard libraries, many peripheral drivers, and " "a large number of utilities (the \"base system\"). However, there are " "thousands of additional applications in the Ports Collection. You'll first " "need to decide if the problem is in the base system or something installed " "via the Ports Collection." msgstr "" "Первое, что вам нужно сделать, — это определить, в какой части системы " "находится ваша проблема. Помните, что FreeBSD — это полноценная операционная " "система, которая включает в себя ядро, стандартные библиотеки, множество " "драйверов периферийных устройств и большое количество утилит («базовая " "система»). Однако в Коллекции портов доступны тысячи дополнительных " "приложений. Сначала вам нужно выяснить, связана ли проблема с базовой " "системой или с чем-то, установленным через Коллекцию портов." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:236 +#: documentation/content/en/articles/problem-reports/_index.adoc:235 msgid "Here is a description of the major categories:" msgstr "Вот описание основных категорий:" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:238 +#: documentation/content/en/articles/problem-reports/_index.adoc:237 msgid "" "If a problem is with the kernel, the libraries (such as standard C library " "`libc`), or a peripheral driver in the base system, in general you will use " "the `kern` category. (There are a few exceptions; see below). In general " "these are things that are described in section 2, 3, or 4 of the manual " "pages." msgstr "" "Если проблема в ядре, в библиотеках (таких как стандартная библиотека С " "`libc`) или в драйвере из базовой системы, то используйте категорию `kern`. " "(Есть несколько исключений, описанных ниже). В общем, это всё, что описано в " "разделах 2, 3 или 4 справочника." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:239 +#: documentation/content/en/articles/problem-reports/_index.adoc:238 msgid "" "If a problem is with a binary program such as man:sh[1] or man:mount[8], you " "will first need to determine whether these programs are in the base system " "or were added via the Ports Collection. If you are unsure, you can do " "`whereis _programname_`. FreeBSD's convention for the Ports Collection is to " "install everything underneath [.filename]#/usr/local#, although this can be " "overridden by a system administrator. For these, you will use the `ports` " "category (yes, even if the port's category is `www`; see below). If the " "location is [.filename]#/bin#, [.filename]#/usr/bin#, [.filename]#/sbin#, or " "[.filename]#/usr/sbin#, it is part of the base system, and you should use " "the `bin` category. These are all things that are described in section 1 or " "8 of the manual pages." msgstr "" "Если проблема с бинарной программой, например с 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 справочной системы." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:240 +#: documentation/content/en/articles/problem-reports/_index.adoc:239 msgid "" "If you believe that the error is in the startup `(rc)` scripts, or in some " "kind of other non-executable configuration file, then the right category is " "`conf` (configuration). These are things that are described in section 5 of " "the manual pages." msgstr "" "Если вы уверены, что в стартовых скриптах `(rc)` или в каком-то ином " "неисполняемом конфигурационном файле присутствует ошибка, тогда верной " "категорией будет `conf` (configuration). Эти сущности описываются в разделе " "5 справочной системы." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:241 +#: documentation/content/en/articles/problem-reports/_index.adoc:240 msgid "" "If you have found a problem in the documentation set (articles, books, man " "pages) or website the correct choice is `docs`." msgstr "" "Если вы нашли проблему в наборе документации (статьи, книги, страницы " "справочной системы), правильным выбором будет `docs`." #. type: delimited block = 4 -#: documentation/content/en/articles/problem-reports/_index.adoc:245 +#: documentation/content/en/articles/problem-reports/_index.adoc:244 msgid "" "if you are having a problem with something from a port named `www/" "_someportname_`, this nevertheless goes in the `ports` category." msgstr "" "Если проблема с чем-то из порта, называемого `www/_имяпорта_`, то она все же " "принадлежит к категории `ports`." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:248 +#: documentation/content/en/articles/problem-reports/_index.adoc:247 msgid "There are a few more specialized categories." msgstr "Далее представлены более специализированные категории." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:250 +#: documentation/content/en/articles/problem-reports/_index.adoc:249 msgid "" "If the problem would otherwise be filed in `kern` but has to do with the USB " "subsystem, the correct choice is `usb`." msgstr "" "Если проблема принадлежит к `kern`, но в то же время имеет дело с " "подсистемой USB, то правильным выбором будет `usb`." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:251 +#: documentation/content/en/articles/problem-reports/_index.adoc:250 msgid "" "If the problem would otherwise be filed in `kern` but has to do with the " "threading libraries, the correct choice is `threads`." msgstr "" "Если проблема принадлежит к `kern` и найдена в потоковых библиотеках, " "правильным выбором будет `threads`." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:252 +#: documentation/content/en/articles/problem-reports/_index.adoc:251 msgid "" "If the problem would otherwise be in the base system, but has to do with our " "adherence to standards such as POSIX(R), the correct choice is `standards`." msgstr "" "Если проблема принадлежит к базовой системе и касается соблюдения " "стандартов, таких как POSIX(R), правильным выбором будет `standards`." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:253 +#: documentation/content/en/articles/problem-reports/_index.adoc:252 msgid "" "If you are convinced that the problem will only occur under the processor " "architecture you are using, select one of the architecture-specific " "categories: commonly `i386` for Intel-compatible machines in 32-bit mode; " "`amd64` for AMD machines running in 64-bit mode (this also includes Intel-" "compatible machines running in EMT64 mode); and less commonly `arm`, " "`powerpc`, or `riscv64`." msgstr "" "Если вы уверены, что проблема возникнет только на используемой вами " "архитектуре процессора, выберите одну из архитектурно-зависимых категорий: " "обычно `i386` для Intel-совместимых машин в 32-битном режиме; `amd64` для " "машин AMD, работающих в 64-битном режиме (это также включает Intel-" "совместимые машины, работающие в режиме EMT64); и реже `arm`, `powerpc` или " "`riscv64`." #. type: delimited block = 4 -#: documentation/content/en/articles/problem-reports/_index.adoc:257 +#: documentation/content/en/articles/problem-reports/_index.adoc:256 msgid "" "These categories are quite often misused for \"I do not know\" problems. " "Rather than guessing, please just use `misc`." msgstr "" "Люди часто ошибаются в выборе категории. Если вы не уверены в правильности " "выбора, то лучше не гадать, а выбрать `misc`." #. type: Block title -#: documentation/content/en/articles/problem-reports/_index.adoc:259 +#: documentation/content/en/articles/problem-reports/_index.adoc:258 #, no-wrap msgid "Correct Use of Arch-Specific Category" msgstr "Правильное использование архитектурно-зависимых категорий" #. type: delimited block = 4 -#: documentation/content/en/articles/problem-reports/_index.adoc:263 +#: documentation/content/en/articles/problem-reports/_index.adoc:262 msgid "" "You have a common PC-based machine, and think you have encountered a problem " "specific to a particular chipset or a particular motherboard: `i386` is the " "right category." msgstr "" "У вас простой ПК, и вы подозреваете, что столкнулись с проблемой, " "специфичной для конкретного чипсета или материнской платы: верная категория " "- `i386`." #. type: Block title -#: documentation/content/en/articles/problem-reports/_index.adoc:265 +#: documentation/content/en/articles/problem-reports/_index.adoc:264 #, no-wrap msgid "Incorrect Use of Arch-Specific Category" msgstr "Некорректное использование категории, зависящей от архитектуры" #. type: delimited block = 4 -#: documentation/content/en/articles/problem-reports/_index.adoc:269 +#: documentation/content/en/articles/problem-reports/_index.adoc:268 msgid "" "You are having a problem with an add-in peripheral card on a commonly seen " "bus, or a problem with a particular type of hard disk drive: in this case, " "it probably applies to more than one architecture, and `kern` is the right " "category." msgstr "" "Если вы наблюдаете проблему с периферийной картой расширения на " "распространённой шине или неполадки с конкретного типа жёстким диском: в " "этом случае возможно, что неисправность наблюдается на более чем одной " "архитектуре, и верным выбором будет `kern`." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:271 +#: documentation/content/en/articles/problem-reports/_index.adoc:270 msgid "" "If you really do not know where the problem lies (or the explanation does " "not seem to fit into the ones above), use the `misc` category. Before you do " "so, you may wish to ask for help first. You may be advised that one of the " "existing categories really is a better choice." msgstr "" "Если вы не знаете в чем проблема (или вам кажется, что описание не попадает " "ни под какую из вышеобозначенных), используйте категорию `misc`. Перед тем, " "как сделать так, можно для начала спросить помощи. Возможно, вам подскажут, " "какую из существующих категорий следует выбрать." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:272 +#: documentation/content/en/articles/problem-reports/_index.adoc:271 msgid "" "_Environment:_ This should describe, as accurately as possible, the " "environment in which the problem has been observed. This includes the " "operating system version, the version of the specific program or file that " "contains the problem, and any other relevant items such as system " "configuration, other installed software that influences the problem, etc.—" "quite simply everything a developer needs to know to reconstruct the " "environment in which the problem occurs." msgstr "" "_Environment:_ Оно должно максимально точно описывать окружение, в котором " "встречается проблема. Сюда включается версия операционной системы, версия " "конкретной программы или файла, содержащего проблему, и любая другая " "информация, такая, как конфигурация системы, другое программное обеспечение, " "которое влияет на проблему, и так далее-просто все, что разработчик должен " "знать для создания условий появления проблемы." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:273 +#: documentation/content/en/articles/problem-reports/_index.adoc:272 msgid "" "_Description:_ A complete and accurate description of the problem you are " "experiencing. Try to avoid speculating about the causes of the problem " "unless you are certain that you are on the right track, as it may mislead a " "developer into making incorrect assumptions about the problem. It should " "include the actions you need to take to reproduce the problem. If you know " "any workaround, include it. It not only helps other people with the same " "problem work around it, but may also help a developer understand the cause " "for the problem." msgstr "" "_Описание:_ Полное и точное описание проблемы, с которой вы столкнулись. " "Старайтесь избегать предположений о причинах проблемы, если не уверены в " "своей правоте, так как это может ввести разработчика в заблуждение и " "привести к неверным выводам. В описании должны быть указаны действия, " "необходимые для воспроизведения проблемы. Если вам известен обходной путь, " "укажите его. Это не только поможет другим людям с той же проблемой временно " "её решить, но и может помочь разработчику понять причину возникновения " "проблемы." #. type: Title == -#: documentation/content/en/articles/problem-reports/_index.adoc:275 +#: documentation/content/en/articles/problem-reports/_index.adoc:274 #, no-wrap msgid "Follow-up" msgstr "Отслеживание" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:280 +#: documentation/content/en/articles/problem-reports/_index.adoc:279 msgid "" "Once the problem report has been filed, you will receive a confirmation by " "email which will include the tracking number that was assigned to your " "problem report and a URL you can use to check its status. With a little " "luck, someone will take an interest in your problem and try to address it, " "or, as the case may be, explain why it is not a problem. You will be " "automatically notified of any change of status, and you will receive copies " "of any comments or patches someone may attach to your problem report's audit " "trail." msgstr "" "После того, как ваше сообщение будет принято, вы получите по электронной " "почте уведомление, в котором будет указан номер для отслеживания, который " "был назначен вашему сообщению о проблеме и URL, который вы можете " "использовать для проверки его состояния. В случае удачи кто-нибудь проявит " "интерес к вашей проблеме и попытается её решить, или, как это бывает, " "описать, почему это не является проблемой. Вы будете автоматически " "оповещаться о любом изменении состояния и получать копии всех комментариев " "или патчей, которые будут присоединяться в процессе отработки вашего " "сообщения о проблеме." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:284 +#: documentation/content/en/articles/problem-reports/_index.adoc:283 msgid "" "If someone requests additional information from you, or you remember or " "discover something you did not mention in the initial report, please submit " "a follow up. The number one reason for a bug not getting fixed is lack of " "communication with the originator. The easiest way is to use the comment " "option on the individual Bugzilla PR's web page, which you can reach from " "the https://bugs.freebsd.org/bugzilla/query.cgi[Bugzilla PR search page]." msgstr "" "Если кто-то запросит у вас дополнительную информацию, или вы вспомните или " "обнаружите что-то, что не упомянули в первоначальном отчёте, пожалуйста, " "отправьте уточнение. Основная причина, по которой ошибка не исправляется, — " "это отсутствие связи с автором отчёта. Проще всего воспользоваться опцией " "комментария на веб-странице Bugzilla конкретного PR, которую можно открыть с " "https://bugs.freebsd.org/bugzilla/query.cgi[страницы поиска PR Bugzilla]." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:286 +#: documentation/content/en/articles/problem-reports/_index.adoc:285 msgid "" "If the problem report remains open after the problem has gone away, just add " "a comment saying that the problem report can be closed, and, if possible, " "explaining how or when the problem was fixed." msgstr "" "Если проблема исчезла, но отчёт о ней остаётся открытым, просто добавьте " "комментарий с указанием, что отчёт можно закрыть, и, по возможности, " "объясните, как или когда проблема была устранена." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:290 +#: documentation/content/en/articles/problem-reports/_index.adoc:289 msgid "" "Sometimes there is a delay of a week or two where the problem report remains " "untouched, not assigned or commented on by anyone. This can happen when " "there is an increased problem report backlog or during a holiday season. " "When a problem report has not received attention after several weeks, it is " "worth finding a committer particularly interested in working on it." msgstr "" "Иногда возникает задержка в одну-две недели, когда отчёт о проблеме остаётся " "без внимания — никто не назначается на него и не оставляет комментариев. " "Такое может произойти при увеличении очереди отчётов о проблемах или во " "время праздничного сезона. Если отчёт о проблеме не получил внимания в " "течение нескольких недель, стоит найти коммиттера, особенно " "заинтересованного в работе над ним." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:292 +#: documentation/content/en/articles/problem-reports/_index.adoc:291 msgid "" "There are a few ways to do so, ideally in the following order, with a few " "days between attempting each communication channel:" msgstr "" "Существует несколько способов сделать это, желательно в следующем порядке, с " "перерывом в несколько дней между попытками использования каждого канала " "связи:" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:294 +#: documentation/content/en/articles/problem-reports/_index.adoc:293 msgid "" "Send an e-mail to extref:{handbook}eresources/[the relevant list, eresources-" "summary] seeking comments on the report." msgstr "" "Отправить письмо по электронной почте в extref:{handbook}eresources/" "[соответствующий список, eresources-summary] для получения комментариев к " "отчёту." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:295 +#: documentation/content/en/articles/problem-reports/_index.adoc:294 msgid "" "Join the relevant IRC channels. A partial listing is here: https://wiki." "freebsd.org/IRC/Channels[]. Inform the people in that channel about the " "problem report and ask for assistance. Be patient and stay in the channel " "after posting, so that the people from different time zones around the world " "have a chance to catch up." msgstr "" "Присоединитесь к соответствующим IRC-каналам. Частичный список доступен " "здесь: https://wiki.freebsd.org/IRC/Channels[]. Сообщите участникам канала о " "проблеме и запросите помощь. Будьте терпеливы и оставайтесь в канале после " "отправки сообщения, чтобы у людей из разных часовых поясов была возможность " "отреагировать." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:296 +#: documentation/content/en/articles/problem-reports/_index.adoc:295 msgid "" "Find committers interested in the problem that was reported. If the problem " "was in a particular tool, binary, port, document, or source file, check the " "https://cgit.FreeBSD.org[Git Repository]. Locate the last few committers who " "made substantive changes to the file, and try to reach them via IRC or " "email. A list of committers and their emails can be found in the extref:" "{contributors}[Contributors to FreeBSD] article." msgstr "" "Найдите коммиттеров, заинтересованных в сообщенной проблеме. Если проблема " "касается конкретного инструмента, бинарного файла, порта, документа или " "исходного файла, проверьте https://cgit.FreeBSD.org[Git Repository]. " "Определите последних коммиттеров, внесших существенные изменения в файл, и " "попытайтесь связаться с ними через IRC или электронную почту. Список " "коммиттеров и их адреса электронной почты можно найти в статье extref:" "{contributors}[Участники проекта FreeBSD]." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:300 +#: documentation/content/en/articles/problem-reports/_index.adoc:299 msgid "" "Remember that these people are volunteers, just like maintainers and users, " "so they might not be immediately available to assist with the problem " "report. Patience and consistency in the follow-ups is highly advised and " "appreciated. With enough care and effort dedicated to that follow-up " "process, finding a committer to take care of the problem report is just a " "matter of time." msgstr "" "Помните, что эти люди — добровольцы, как и сопровождающие и пользователи, " "поэтому они могут быть не сразу доступны для помощи с отчётом о проблеме. " "Терпение и последовательность в дальнейших действиях крайне рекомендуются и " "ценятся. При достаточном внимании и усилиях, посвящённых этому процессу, " "найти коммиттера, который займётся отчётом о проблеме — лишь вопрос времени." #. type: Title == -#: documentation/content/en/articles/problem-reports/_index.adoc:302 +#: documentation/content/en/articles/problem-reports/_index.adoc:301 #, no-wrap msgid "If There Are Problems" msgstr "Если возникли проблемы" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:306 +#: documentation/content/en/articles/problem-reports/_index.adoc:305 msgid "" "If you found an issue with the bug system, file a bug! There is a category " "for exactly this purpose. If you are unable to do so, contact the bug " "wranglers at mailto:bugmeister@FreeBSD.org[bugmeister@FreeBSD.org]." msgstr "" "Если вы обнаружили проблему в системе отслеживания ошибок, сообщите об " "ошибке! Для этого существует специальная категория. Если у вас не получается " "это сделать, свяжитесь с ответственными за обработку ошибок по адресу mailto:" "bugmeister@FreeBSD.org[bugmeister@FreeBSD.org]." #. type: Title == -#: documentation/content/en/articles/problem-reports/_index.adoc:308 +#: documentation/content/en/articles/problem-reports/_index.adoc:307 #, no-wrap msgid "Further Reading" msgstr "Для дальнейшего ознакомления" #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:312 +#: documentation/content/en/articles/problem-reports/_index.adoc:311 msgid "" "This is a list of resources relevant to the proper writing and processing of " "problem reports. It is by no means complete." msgstr "" "Это список информационных ресурсов, относящихся к правильному написанию и " "обработке сообщений о проблемах. Он, без сомнения, не полон." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:314 +#: documentation/content/en/articles/problem-reports/_index.adoc:313 msgid "" "https://github.com/smileytechguy/reporting-bugs-effectively/blob/master/" "ENGLISH.md[How to Report Bugs Effectively]: An excellent essay by Simon G. " "Tatham on composing useful (non-FreeBSD-specific) problem reports." msgstr "" "https://github.com/smileytechguy/reporting-bugs-effectively/blob/master/" "ENGLISH.md[How to Report Bugs Effectively]-прекрасное эссе, которое написал " "Simon G. Tatham о составлении полезных (не специфичных для FreeBSD) " "сообщений о проблемах." #. type: Plain text -#: documentation/content/en/articles/problem-reports/_index.adoc:314 +#: documentation/content/en/articles/problem-reports/_index.adoc:313 msgid "" "extref:{pr-guidelines}[Problem Report Handling Guidelines]: Valuable insight " "into how problem reports are handled by the FreeBSD developers." msgstr "" "extref:{pr-guidelines}[Руководство по обработке отчётов о проблемах] — " "интересный взгляд на обработку сообщений о проблемах самими разработчиками " "FreeBSD." #~ msgid "" #~ "Do not use the `patch` or `patch-ready` keywords – they are deprecated." #~ msgstr "" #~ "Не используйте ключевые слова `patch` или `patch-ready` — они устарели." diff --git a/documentation/content/ru/articles/releng/_index.adoc b/documentation/content/ru/articles/releng/_index.adoc index 37ff938507..3a7188adae 100644 --- a/documentation/content/ru/articles/releng/_index.adoc +++ b/documentation/content/ru/articles/releng/_index.adoc @@ -1,357 +1,357 @@ --- authors: - author: 'Murray Stokely' email: murray@FreeBSD.org webpage: https://people.FreeBSD.org/~murray/ description: 'В этом документе описывается подход, ранее использовавшийся командой разработки релизов FreeBSD для создания релизов операционной системы FreeBSD производственного качества' tags: ["Release", "Engineering", "Historical", "FreeBSD"] title: 'Устаревшая разработка релизов FreeBSD' trademarks: ["freebsd", "intel", "general"] --- = Подготовка релизов FreeBSD :doctype: article :toc: macro :toclevels: 1 :icons: font :sectnums: :source-highlighter: rouge :experimental: :images-path: articles/releng/ ifdef::env-beastie[] ifdef::backend-html5[] include::shared/authors.adoc[] include::shared/mirrors.adoc[] include::shared/releases.adoc[] include::shared/attributes/attributes-{{% lang %}}.adoc[] include::shared/{{% lang %}}/teams.adoc[] include::shared/{{% lang %}}/mailing-lists.adoc[] include::shared/{{% lang %}}/urls.adoc[] :imagesdir: ../../../images/{images-path} endif::[] ifdef::backend-pdf,backend-epub3[] include::../../../../shared/asciidoctor.adoc[] endif::[] endif::[] ifndef::env-beastie[] include::../../../../../shared/asciidoctor.adoc[] endif::[] [.abstract-title] Аннотация [NOTE] ==== Этот документ устарел и не точно описывает текущие процедуры выпуска релизов команды FreeBSD Release Engineering. Он сохранен в исторических целях. Текущие процедуры, используемые командой FreeBSD Release Engineering, доступны в статье extref:{freebsd-releng}[FreeBSD Release Engineering]. ==== В этом документе описывается подход, используемый командой разработки релизов FreeBSD для создания релизов операционной системы FreeBSD производственного качества. Подробно излагается методология, применяемая для официальных выпусков FreeBSD, а также описываются инструменты, доступные тем, кто заинтересован в создании собственных релизов FreeBSD для корпоративного внедрения или использования в коммерческой деятельности. ''' toc::[] [[introduction]] == Введение Разработка FreeBSD — это очень открытый процесс. FreeBSD создаётся благодаря вкладу тысяч людей по всему миру. Проект FreeBSD предоставляет доступ к Subversion footnote:[Subversion, http://subversion.apache.org] для широкой публики, чтобы другие могли просматривать сообщения журнала, различия (патчи) между ветками разработки и другие улучшения производительности, которые предоставляет система управления исходным кодом. Это значительно помогло привлечь больше талантливых разработчиков в FreeBSD. Однако, я думаю, все согласятся, что хаос быстро воцарился бы, если бы право записи в основной репозиторий было открыто для всех в Интернете. Поэтому только «избранная» группа из почти 300 человек имеет право записи в репозиторий Subversion. Эти extref:{contributors}[коммиттеры FreeBSD, staff-committers]footnote:[extref:{contributors}[коммиттеры FreeBSD, staff-committers]] обычно являются людьми, которые выполняют основную часть разработки FreeBSD. Выбранная группа разработчиков — link:https://www.FreeBSD.org/administration/#t-core[Основная команда (Core Team)]footnote:[link:https://www.FreeBSD.org/administration/#t-core[Основная команда FreeBSD]] — обеспечивает некоторый уровень руководства проектом. Быстрый темп разработки `FreeBSD` делает основную ветку разработки непригодной для повседневного использования широкой публикой. В частности, требуются усилия по стабилизации для доведения системы разработки до релиза производственного качества. Для решения этого конфликта разработка продолжается по нескольким параллельным направлениям. Основная ветка разработки — это _HEAD_ или _trunk_ нашего дерева Subversion, известная как "FreeBSD-CURRENT" или сокращённо "-CURRENT". Набор более стабильных ветвей поддерживается под названием "FreeBSD-STABLE" или сокращённо "-STABLE". Все ветви находятся в главном хранилище Subversion, которое поддерживается проектом FreeBSD. FreeBSD-CURRENT — это "передний край" разработки FreeBSD, куда сначала попадают все новые изменения. FreeBSD-STABLE — это ветвь разработки, на основе которой выпускаются основные релизы. Изменения попадают в эту ветвь с другой скоростью и с общим предположением, что они сначала попали в FreeBSD-CURRENT и были тщательно протестированы сообществом пользователей. Термин _stable_ в названии ветки относится к предполагаемой стабильности бинарного интерфейса приложений (ABI), которую гарантирует проект. Это означает, что пользовательское приложение, скомпилированное на более старой версии системы из той же ветки, будет работать на более новой системе из той же ветки. Стабильность ABI значительно улучшилась по сравнению с предыдущими выпусками. В большинстве случаев бинарные файлы со старых систем _STABLE_ работают без изменений на более новых системах, включая __HEAD__, при условии, что не используются интерфейсы управления системой. В промежуточный период между выпусками еженедельные снимки состояния системы автоматически создаются сборщиками FreeBSD Project и доступны для загрузки по адресу `https:/download.FreeBSD.org/snapshots/`. Широкое распространение бинарных снимков выпусков, а также склонность нашего сообщества пользователей следить за разработкой -STABLE с помощью Subversion и команды "`make buildworld`" footnote:[extref:{handbook}cutting-edge[Пересборка world, makeworld]] помогает поддерживать FreeBSD-STABLE в очень надёжном состоянии даже до того, как будут запущены мероприятия по обеспечению качества перед основным выпуском. Помимо снимков установочных ISO, также предоставляются еженедельные образы виртуальных машин для использования с VirtualBox, qemu или другим популярным эмуляционным программным обеспечением. Образы виртуальных машин можно загрузить с `https://download.FreeBSD.org/snapshots/VM-IMAGES/`. Образы виртуальных машин сжаты с помощью man:xz[1] и занимают примерно 150 МБ, а при подключении к виртуальной машине содержат разреженную файловую систему размером 10 ГБ. Отчёты об ошибках и запросы функций постоянно отправляются пользователями в течение цикла выпуска. Сообщения о проблемах вносятся в нашу базу данных Bugzilla через веб-интерфейс, доступный по адресу https://www.freebsd.org/support/bugreports/[https://www.freebsd.org/support/bugreports/]. Для обслуживания наиболее консервативных пользователей, начиная с FreeBSD 4.3, были введены индивидуальные ветки релизов. Эти ветки создаются незадолго до выпуска финального релиза. После выхода релиза на ветку вносятся только самые критические исправления безопасности и дополнения. Помимо обновлений исходного кода через Subversion, доступны бинарные патч-наборы для поддержания актуальности систем на ветках _releng/X.Y_. === Что описывает эта статья Следующие разделы этой статьи описывают: crossref:releng[release-proc, Процесс выпуска релиза]:: Различные этапы процесса разработки релиза, предшествующие непосредственной сборке системы. crossref:releng[release-build, Сборка релиза]:: Фактический процесс сборки. crossref:releng[extensibility, Расширяемость]:: Как базовый выпуск может быть расширен третьими сторонами. -crossref:releng[lessons-learned, Уроки, извлеченные из FreeBSD 4.4]:: +crossref:releng[lessons-learned, "Уроки, извлеченные из FreeBSD 4.4"]:: Некоторые уроки, извлеченные в процессе выпуска FreeBSD 4.4. crossref:releng[future, Перспективы развития]:: Перспективные направления развития. [[release-proc]] == Процесс выпуска релиза Новые выпуски FreeBSD выходят из ветки -STABLE примерно с интервалом в четыре месяца. Процесс выпуска FreeBSD начинает набирать обороты за 70-80 дней до предполагаемой даты выпуска, когда инженер выпуска отправляет электронное письмо в списки рассылки разработчиков, напоминая им, что у них осталось всего 15 дней для интеграции новых изменений до заморозки кода. В это время многие разработчики выполняют так называемые "MFC-проверки". MFC означает "Merge From CURRENT" и описывает процесс переноса проверенного изменения из нашей ветки разработки -CURRENT в ветку -STABLE. Политика проекта требует, чтобы любое изменение сначала было применено к основной ветке, а затем перенесено в ветки -STABLE после достаточного внешнего тестирования пользователями -CURRENT (ожидается, что разработчики тщательно проверят изменение перед внесением в -CURRENT, но невозможно для одного человека проверить все варианты использования универсальной операционной системы). Минимальный срок для MFC составляет 3 дня, который обычно используется только для тривиальных или критических исправлений ошибок. === Проверка кода За шестьдесят дней до предполагаемого релиза репозиторий исходного кода переходит в режим «заморозки кода». В этот период все коммиты в ветку -STABLE должны быть одобрены `{re}`. Процесс утверждения технически обеспечивается предкоммитным хуком. В этот период допускаются следующие виды изменений: * Исправления ошибок. * Обновления документации. * Исправления, связанные с безопасностью, любого рода. * Незначительные изменения в драйверах устройств, такие как добавление новых идентификаторов устройств. * Обновления драйверов от поставщиков. * Любое дополнительное изменение, которое команда разработки релизов сочтет оправданным, учитывая потенциальный риск. Вскоре после начала заморозки кода создаётся образ _BETA1_ и выпускается для широкого тестирования. В период заморозки кода не реже чем раз в две недели выпускается как минимум один бета-образ или кандидат в релизы, пока не будет готов финальный выпуск. В дни, предшествующие финальному релизу, команда разработки выпусков постоянно взаимодействует с командой security-officer, сопровождающими документации и сопровождающими портов, чтобы убедиться, что все необходимые компоненты для успешного релиза доступны. После того, как качество BETA-образов становится достаточно удовлетворительным и не планируется крупных и потенциально рискованных изменений, создаётся ветка релиза, и образы _Release Candidate_ (RC) собираются из ветки релиза, вместо BETA-образов из ветки STABLE. Также снимается заморозка изменений в ветке STABLE, а ветка релиза переходит в режим "жёсткой заморозки кода", когда становится значительно сложнее обосновать новые изменения в системе, за исключением исправления серьезных ошибок или проблем безопасности. === Контрольный список финального выпуска Когда несколько образов BETA станут доступны для широкого тестирования и все основные проблемы будут устранены, можно приступать к финальной "доводке" выпуска. [[rel-branch]] ==== Создание ветки релиза [NOTE] ==== Во всех примерах ниже `$FSVN` указывает на расположение репозитория Subversion FreeBSD, `svn+ssh://svn.FreeBSD.org/base/`. ==== Расположение веток FreeBSD в Subversion описано в extref:{committers-guide}[Руководстве коммиттера, subversion-primer-base-layout]. Первым шагом в создании ветки является определение ревизии исходников `stable/_X_`, от которой вы хотите сделать _ответвление_. [source, shell] .... # svn log -v $FSVN/stable/9 .... Следующий шаг — создание _ветки релиза_ [source, shell] .... # svn cp $FSVN/stable/9@REVISION $FSVN/releng/9.2 .... Эту ветку можно извлечь: [source, shell] .... # svn co $FSVN/releng/9.2 src .... [NOTE] ==== Создание ветки `releng` и тегов `release` выполняется командой link:https://www.FreeBSD.org/administration/#t-re[Release Engineering Team]. ==== image::branches-head.png["Ветка разработки FreeBSD"] image::branches-releng3.png["Ветка STABLE FreeBSD 3.x"] image::branches-releng4.png["Ветка FreeBSD 4.x STABLE"] image::branches-releng5.png["Ветка STABLE FreeBSD 5.x"] 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/en_US.ISO8859-1/books/handbook/mirrors/chapter.xml# * [.filename]#doc/en_US.ISO8859-1/books/porters-handbook/book.xml# * [.filename]#doc/en_US.ISO8859-1/htdocs/cgi/ports.cgi# * [.filename]#ports/Tools/scripts/release/config# * [.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/sys/conf/newvers.sh# * [.filename]#src/sys/sys/param.h# * [.filename]#src/usr.sbin/pkg_install/add/main.c# * [.filename]#doc/en_US.ISO8859-1/htdocs/search/opensearch/man.xml# Заметки о выпуске и файлы с опечатками также необходимо адаптировать для нового выпуска (в ветке выпуска) и соответствующим образом обрезать (в ветке 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 следует добавить информацию о количестве доступных портов и объёме дискового пространства, необходимого для коллекции портов. footnote:[Коллекция портов FreeBSD https://ports.FreeBSD.org] В настоящее время эта информация хранится в [.filename]#src/usr.sbin/bsdinstall/dist.c#. После сборки выпуска следует обновить ряд файлов, чтобы объявить о выпуске. Эти файлы находятся относительно `head/` в поддереве `doc/` Subversion. * [.filename]#share/images/articles/releng/branches-relengX.pic# * [.filename]#head/shared/xml/release.ent# * [.filename]#en_US.ISO8859-1/htdocs/releases/*# * [.filename]#en_US.ISO8859-1/htdocs/releng/index.xml# * [.filename]#share/xml/news.xml# Кроме того, обновите файл "Генеалогическое древо BSD": * [.filename]#src/shared/misc/bsd-family-tree# ==== Создание тега релиза Когда финальный выпуск будет готов, следующая команда создаст тег `release/9.2.0`. [source, shell] .... # svn cp $FSVN/releng/9.2 $FSVN/release/9.2.0 .... Менеджеры документации и портов ответственны за добавление тега `tags/RELEASE_9_2_0` в соответствующие деревья. Когда команда Subversion `svn cp` используется для создания __тега релиза (release tag)__, это идентифицирует исходный код на определённый момент времени. Создавая теги, мы гарантируем, что будущие сборщики релизов всегда смогут использовать тот же исходный код, который использовался для создания официальных релизов проекта FreeBSD. [[release-build]] == Сборка релиза Сборка "релизов" FreeBSD может быть выполнена любым пользователем, имеющим быстрый компьютер и доступ к репозиторию исходного кода. (Это должно быть доступно каждому, так как мы предоставляем доступ через Subversion! Подробности см. в extref:{handbook}[разделе Subversion в Руководстве, svn].) _Единственное_ специальное требование — доступность устройства man:md[4]. Если устройство не загружено в ваше ядро, то модуль ядра должен автоматически загрузиться при выполнении man:mdconfig[8] во время этапа создания загрузочного носителя. Все необходимые инструменты для сборки релиза доступны в репозитории Subversion в [.filename]#src/release#. Эти инструменты предназначены для обеспечения единообразного способа сборки релизов FreeBSD. Полный релиз может быть собран всего одной командой, включая создание ISO-образов, пригодных для записи на CDROM или DVD, а также каталога для установки по FTP. man:release[7] полностью документирует скрипт `src/release/generate-release.sh`, который используется для сборки релиза. `generate-release.sh` является обёрткой для цели Makefile: `make release`. === Сборка релиза man:release[7] документирует точные команды, необходимые для сборки релиза FreeBSD. Следующая последовательность команд может собрать релиз 9.2.0: [source, shell] .... # cd /usr/src/release # sh generate-release.sh release/9.2.0 /local3/release .... После выполнения этих команд все подготовленные файлы релиза будут доступны в каталоге [.filename]#/local3/release/R#. Файл [.filename]#Makefile# для выпуска можно разбить на несколько отдельных этапов. * Создание изолированного окружения системы в отдельной иерархии каталогов с помощью "`make installworld`". * Извлечение из Subversion чистой версии исходного кода системы, документации и портов в иерархию сборки релиза. * Заполнение каталогов [.filename]#/etc# и [.filename]#/dev# в chroot-окружении. * Изменение корневого каталога на верхний каталог иерархии сборки релиза с помощью `chroot`, чтобы усложнить влияние внешней среды на эту сборку. * Запуск `make world` в окружении `chroot`. * Сборка связанных с Kerberos бинарных файлов. * Сборка ядра [.filename]#GENERIC#. * Создание промежуточной структуры каталогов, в которой будут собираться и упаковываться бинарные дистрибутивы. * Сборка и установка инструментария для документации, необходимого для преобразования исходников документации (SGML) в HTML и текстовые документы, которые будут поставляться с релизом. * Сборка и установка непосредственно документации (руководства пользователя, учебные пособия, примечания к выпуску, списки совместимого оборудования и так далее). * Создание распространяемых tar-архивов с бинарными файлами и исходными кодами. * Создание иерархии установки FTP. * _(необязательно)_ Создание ISO-образов для носителей CDROM/DVD. Для получения дополнительной информации о инфраструктуре сборки релизов, обратитесь к man:release[7]. [NOTE] ==== Важно удалить все специфичные для сайта настройки из [.filename]#/etc/make.conf#. Например, было бы неразумно распространять бинарные файлы, собранные на системе с установленным `CPUTYPE` для конкретного процессора. ==== === Предоставленное программное обеспечение ("порты") https://ports.FreeBSD.org[Коллекция портов FreeBSD] представляет собой набор из более чем {numports} сторонних программных пакетов, доступных для FreeBSD. `{portmgr}` отвечает за поддержание согласованного дерева портов, которое может быть использовано для создания бинарных пакетов, поставляемых с официальными выпусками FreeBSD. === Релизные ISO-образы Начиная с FreeBSD 4.4, проект FreeBSD решил выпустить все четыре образа ISO, которые ранее продавались на «официальных» дистрибутивах CDROM от _BSDi/Wind River Systems/FreeBSD Mall_. Каждый из четырёх дисков должен содержать файл [.filename]#README.TXT#, объясняющий содержимое диска, файл [.filename]#CDROM.INF#, предоставляющий метаданные для диска, чтобы man:bsdinstall[8] мог проверить и использовать содержимое, и файл [.filename]#filename.txt#, содержащий манифест диска. Этот _манифест_ можно создать простой командой: [source, shell] .... /stage/cdrom# find . -type f | sed -e 's/^\.\///' | sort > filename.txt .... Конкретные требования для каждого CD приведены ниже. ==== Диск 1 Первый диск почти полностью создаётся командой `make release`. Единственные изменения, которые следует внести в каталог [.filename]#disc1#, — это добавление каталога [.filename]#tools# и как можно большего количества популярных сторонних программных пакетов, которые поместятся на диск. В каталоге [.filename]#tools# содержится программное обеспечение, позволяющее пользователям создавать установочные дискеты из других операционных систем. Этот диск должен быть загрузочным, чтобы пользователям современных ПК не требовалось создавать установочные дискеты. Если требуется включить пользовательское ядро FreeBSD, необходимо обновить man:bsdinstall[8] и man:release[7], чтобы включить инструкции по установке. Соответствующий код содержится в [.filename]#src/release# и [.filename]#src/usr.sbin/bsdinstall#. В частности, потребуется обновить файл [.filename]#src/release/Makefile#, а также [.filename]#dist.c#, [.filename]#dist.h#, [.filename]#menus.c#, [.filename]#install.c# и [.filename]#Makefile# в каталоге [.filename]#src/usr.sbin/bsdinstall#. При желании можно также обновить [.filename]#bsdinstall.8#. ==== Диск 2 Второй диск также в основном создаётся командой `make release`. Этот диск содержит «живую файловую систему», которая может использоваться через man:bsdinstall[8] для диагностики установки FreeBSD. Этот диск должен быть загрузочным и также содержать сжатую копию репозитория CVS в каталоге [.filename]#CVSROOT# и демонстрационные версии коммерческого ПО в каталоге [.filename]#commerce#. ==== Поддержка нескольких томов Sysinstall поддерживает установку пакетов с нескольких томов. Для этого каждый диск должен содержать файл [.filename]#INDEX#, в котором перечислены все пакеты на всех томах набора, а также дополнительное поле, указывающее, на каком именно томе находится конкретный пакет. Каждый том в наборе также должен иметь установленную переменную `CD_VOLUME` в файле [.filename]#cdrom.inf#, чтобы bsdinstall мог определить, какой том является каким. Когда пользователь пытается установить пакет, которого нет на текущем диске, bsdinstall предложит ему вставить соответствующий диск. [[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, пожалуйста, ознакомьтесь со статьей extref:{hubs}[Поддержка зеркал FreeBSD]. Может потребоваться от нескольких часов до двух дней после обновления `ftp-master`, прежде чем большинство FTP-сайтов Tier-1 получат новое программное обеспечение, в зависимости от того, был ли загружен набор пакетов одновременно. Крайне важно, чтобы инженеры по выпуску скоординировались с {mirror-announce} перед объявлением общей доступности нового программного обеспечения на FTP-сайтах. В идеале набор пакетов для выпуска должен быть загружен как минимум за четыре дня до дня выпуска. Выпускные файлы должны быть загружены за 24–48 часов до запланированного времени выпуска с отключёнными разрешениями для "других" пользователей. Это позволит зеркальным сайтам загрузить их, но широкая публика не сможет скачать их с зеркальных сайтов. Письмо должно быть отправлено в {mirror-announce} в момент публикации выпускных файлов, уведомляя о том, что выпуск подготовлен, и указывая время, когда зеркальные сайты должны начать разрешать доступ. Обязательно укажите часовой пояс для указанного времени, например, относительно GMT. [[dist-cdrom]] === Репликация CD-ROM Скоро: Советы по отправке ISO-образов FreeBSD репликатору и меры по обеспечению качества. [[extensibility]] == Расширяемость Хотя FreeBSD представляет собой законченную операционную систему, ничто не обязывает вас использовать её именно в том виде, в каком мы упаковали её для распространения. Мы постарались разработать систему максимально расширяемой, чтобы она могла служить платформой для создания других коммерческих продуктов. Единственное «правило», которое у нас есть на этот счёт, — если вы собираетесь распространять FreeBSD с существенными изменениями, мы рекомендуем документировать ваши улучшения! Сообщество FreeBSD может оказывать поддержку только пользователям того программного обеспечения, которое мы предоставляем. Мы, безусловно, приветствуем инновации, такие как продвинутые инструменты установки и администрирования, но не можем отвечать на вопросы о них. === Скриптинг `bsdinstall` Инструмент установки и настройки системы FreeBSD, man:bsdinstall[8], может быть настроен для автоматизированной установки на крупных площадках. Эта функциональность может использоваться совместно с Intel(R) PXE footnote:[extref:{handbook}advanced-networking[Запуск системы по сети (PXE) без использования локальных накопителей, network-diskless]] для загрузки систем по сети. [[lessons-learned]] == Уроки, извлеченные из FreeBSD 4.4 Процесс разработки релиза 4.4 официально начался 1 августа 2001 года. После этой даты все коммиты в ветку `RELENG_4` FreeBSD должны были быть явно одобрены `{re}`. Первый релиз-кандидат для архитектуры x86 был выпущен 16 августа, за ним последовали ещё 4 релиз-кандидата, что привело к финальному релизу 18 сентября. Сотрудник по безопасности был очень вовлечён в последнюю неделю процесса, так как несколько проблем безопасности было обнаружено в ранних релиз-кандидатах. Всего за чуть более месяца было отправлено более _500_ писем `{re}`. Наше сообщество пользователей ясно дало понять, что безопасность и стабильность выпуска FreeBSD не должны приноситься в жертву из-за самостоятельно установленных сроков или целевых дат выпуска. Проект FreeBSD значительно вырос за время своего существования, и необходимость стандартизированных процедур управления выпусками никогда не была столь очевидной. Это станет ещё более важным по мере переноса FreeBSD на новые платформы. [[future]] == Перспективы развития Для обеспечения масштабирования наших процессов релиз-инжиниринга с растущей пользовательской базой мы прилагаем значительные усилия по документированию процедур, связанных с созданием выпусков FreeBSD. * _Параллелизм_ — Некоторые этапы сборки релиза действительно "тривиально параллельны". Большинство задач очень интенсивно используют ввод-вывод, поэтому наличие нескольких высокоскоростных дисков важнее, чем использование нескольких процессоров для ускорения процесса `make release`. Если в среде man:chroot[2] разные иерархии размещены на разных дисках, то выгрузка CVS для деревьев [.filename]#ports# и [.filename]#doc# может происходить одновременно с выполнением `make world` на другом диске. Использование RAID (аппаратного или программного) может значительно сократить общее время сборки. * _Кросс-сборка релизов_ - Сборка релиза для IA-64 или Alpha на x86 оборудовании? `make TARGET=ia64 release`. * _Регрессионное тестирование_ - Нам необходимы более совершенные автоматизированные тесты на корректность для FreeBSD. * _Инструменты установки_ - Наша программа установки уже давно вышла за рамки своего первоначального срока службы. В разработке находится несколько проектов, призванных обеспечить более продвинутый механизм установки. Проект libh был одним из таких проектов, целью которого было создание интеллектуальной новой системы управления пакетами и программы установки с графическим интерфейсом. [[ackno]] == Благодарности Я хотел бы поблагодарить Джордана Хаббарда за предоставленную мне возможность взять на себя часть обязанностей по управлению выпусками для FreeBSD 4.4, а также за всю его работу на протяжении многих лет, которая сделала FreeBSD такой, какая она есть сегодня. Конечно, выпуск не состоялся бы без всей работы, связанной с выпуском, выполненной `{asami}`, `{steve}`, `{bmah}`, `{nik}`, `{obrien}`, `{kris}`, `{jhb}` и остальным сообществом разработчиков FreeBSD. Я также хотел бы поблагодарить `{rgrimes}`, `{phk}` и других, кто работал над инструментами управления выпусками в самые ранние дни FreeBSD. На эту статью повлияли документы по управлению выпусками от CSRG footnote:[Маршалл Кирк МакКузик, Майкл Дж. Карелс и Кит Бостик: link:http://docs.FreeBSD.org/44doc/papers/releng.html[Управление выпусками 4.3BSD]], проекта NetBSD footnote:[Документация разработчика NetBSD: Управление выпусками http://www.NetBSD.org/developers/releng/index.html] и заметки Джона Болдуина с предложениями по процессу управления выпусками. footnote:[Предложение Джона Болдуина по управлению выпусками FreeBSD https://people.FreeBSD.org/~jhb/docs/releng.txt] diff --git a/documentation/content/ru/articles/releng/_index.po b/documentation/content/ru/articles/releng/_index.po index 6b4ace4815..49b56835ce 100644 --- a/documentation/content/ru/articles/releng/_index.po +++ b/documentation/content/ru/articles/releng/_index.po @@ -1,1596 +1,1596 @@ # SOME DESCRIPTIVE TITLE # Copyright (C) YEAR The FreeBSD Project # This file is distributed under the same license as the FreeBSD Documentation package. # Vladlen Popolitov , 2025, 2026. msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-11-08 16:17+0000\n" -"PO-Revision-Date: 2026-04-05 04:45+0000\n" +"POT-Creation-Date: 2026-08-06 22:55+0100\n" +"PO-Revision-Date: 2026-07-06 04:45+0000\n" "Last-Translator: Vladlen Popolitov \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 4.17\n" #. type: YAML Front Matter: description #: documentation/content/en/articles/releng/_index.adoc:1 #, no-wrap msgid "This paper describes the approach previously used by the FreeBSD release engineering team to make production quality releases of the FreeBSD Operating System" msgstr "В этом документе описывается подход, ранее использовавшийся командой разработки релизов FreeBSD для создания релизов операционной системы FreeBSD производственного качества" #. type: YAML Front Matter: title #: documentation/content/en/articles/releng/_index.adoc:1 #, no-wrap msgid "Legacy FreeBSD Release Engineering" msgstr "Устаревшая разработка релизов FreeBSD" #. type: Title = #: documentation/content/en/articles/releng/_index.adoc:12 #, no-wrap msgid "FreeBSD Release Engineering" msgstr "Подготовка релизов FreeBSD" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:45 +#: documentation/content/en/articles/releng/_index.adoc:44 msgid "Abstract" msgstr "Аннотация" #. type: delimited block = 4 -#: documentation/content/en/articles/releng/_index.adoc:51 +#: documentation/content/en/articles/releng/_index.adoc:50 msgid "" "This document is outdated and does not accurately describe the current " "release procedures of the FreeBSD Release Engineering team. It is retained " "for historical purposes. The current procedures used by the FreeBSD Release " "Engineering team are available in the extref:{freebsd-releng}[FreeBSD " "Release Engineering] article." msgstr "" "Этот документ устарел и не точно описывает текущие процедуры выпуска релизов " "команды FreeBSD Release Engineering. Он сохранен в исторических целях. " "Текущие процедуры, используемые командой FreeBSD Release Engineering, " "доступны в статье extref:{freebsd-releng}[FreeBSD Release Engineering]." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:55 +#: documentation/content/en/articles/releng/_index.adoc:54 msgid "" "This paper describes the approach used by the FreeBSD release engineering " "team to make production quality releases of the FreeBSD Operating System. " "It details the methodology used for the official FreeBSD releases and " "describes the tools available for those interested in producing customized " "FreeBSD releases for corporate rollouts or commercial productization." msgstr "" "В этом документе описывается подход, используемый командой разработки " "релизов FreeBSD для создания релизов операционной системы FreeBSD " "производственного качества. Подробно излагается методология, применяемая для " "официальных выпусков FreeBSD, а также описываются инструменты, доступные " "тем, кто заинтересован в создании собственных релизов FreeBSD для " "корпоративного внедрения или использования в коммерческой деятельности." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:57 +#: documentation/content/en/articles/releng/_index.adoc:56 msgid "'''" msgstr "'''" #. type: Title == -#: documentation/content/en/articles/releng/_index.adoc:61 +#: documentation/content/en/articles/releng/_index.adoc:60 #, no-wrap msgid "Introduction" msgstr "Введение" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:71 +#: documentation/content/en/articles/releng/_index.adoc:70 msgid "" "The development of FreeBSD is a very open process. FreeBSD is comprised of " "contributions from thousands of people around the world. The FreeBSD " "Project provides Subversion footnote:[Subversion, http://subversion.apache." "org] access to the general public so that others can have access to log " "messages, diffs (patches) between development branches, and other " "productivity enhancements that formal source code management provides. This " "has been a huge help in attracting more talented developers to FreeBSD. " "However, I think everyone would agree that chaos would soon manifest if " "write access to the main repository was opened up to everyone on the " "Internet. Therefore only a \"select\" group of nearly 300 people are given " "write access to the Subversion repository. These extref:{contributors}" "[FreeBSD committers, staff-committers]footnote:[extref:{contributors}" "[FreeBSD committers, staff-committers]] are usually the people who do the " "bulk of FreeBSD development. An elected link:https://www.FreeBSD.org/" "administration/#t-core[Core Team]footnote:[link:https://www.FreeBSD.org/" "administration/#t-core[FreeBSD Core Team]] of developers provide some level " "of direction over the project." msgstr "" "Разработка FreeBSD — это очень открытый процесс. FreeBSD создаётся благодаря " "вкладу тысяч людей по всему миру. Проект FreeBSD предоставляет доступ к " "Subversion footnote:[Subversion, http://subversion.apache.org] для широкой " -"публики, чтобы другие могли просматривать сообщения журнала, различия (патчи)" -" между ветками разработки и другие улучшения производительности, которые " -"предоставляет система управления исходным кодом. Это значительно помогло " -"привлечь больше талантливых разработчиков в FreeBSD. Однако, я думаю, все " -"согласятся, что хаос быстро воцарился бы, если бы право записи в основной " -"репозиторий было открыто для всех в Интернете. Поэтому только «избранная» " -"группа из почти 300 человек имеет право записи в репозиторий Subversion. Эти " -"extref:{contributors}[коммиттеры FreeBSD, staff-" +"публики, чтобы другие могли просматривать сообщения журнала, различия " +"(патчи) между ветками разработки и другие улучшения производительности, " +"которые предоставляет система управления исходным кодом. Это значительно " +"помогло привлечь больше талантливых разработчиков в FreeBSD. Однако, я " +"думаю, все согласятся, что хаос быстро воцарился бы, если бы право записи в " +"основной репозиторий было открыто для всех в Интернете. Поэтому только " +"«избранная» группа из почти 300 человек имеет право записи в репозиторий " +"Subversion. Эти extref:{contributors}[коммиттеры FreeBSD, staff-" "committers]footnote:[extref:{contributors}[коммиттеры FreeBSD, staff-" "committers]] обычно являются людьми, которые выполняют основную часть " -"разработки FreeBSD. Выбранная группа разработчиков — link:https://www.FreeBSD" -".org/administration/#t-core[Основная команда (Core " -"Team)]footnote:[link:https://www.FreeBSD.org/administration/#t-core[Основная " -"команда FreeBSD]] — обеспечивает некоторый уровень руководства проектом." +"разработки FreeBSD. Выбранная группа разработчиков — link:https://www." +"FreeBSD.org/administration/#t-core[Основная команда (Core Team)]footnote:" +"[link:https://www.FreeBSD.org/administration/#t-core[Основная команда " +"FreeBSD]] — обеспечивает некоторый уровень руководства проектом." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:76 +#: documentation/content/en/articles/releng/_index.adoc:75 msgid "" "The rapid pace of `FreeBSD` development makes the main development branch " "unsuitable for the everyday use by the general public. In particular, " "stabilizing efforts are required for polishing the development system into a " "production quality release. To solve this conflict, development continues " "on several parallel tracks. The main development branch is the _HEAD_ or " "_trunk_ of our Subversion tree, known as \"FreeBSD-CURRENT\" or \"-CURRENT\" " "for short." msgstr "" "Быстрый темп разработки `FreeBSD` делает основную ветку разработки " "непригодной для повседневного использования широкой публикой. В частности, " "требуются усилия по стабилизации для доведения системы разработки до релиза " "производственного качества. Для решения этого конфликта разработка " "продолжается по нескольким параллельным направлениям. Основная ветка " "разработки — это _HEAD_ или _trunk_ нашего дерева Subversion, известная как " "\"FreeBSD-CURRENT\" или сокращённо \"-CURRENT\"." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:82 +#: documentation/content/en/articles/releng/_index.adoc:81 msgid "" "A set of more stable branches are maintained, known as \"FreeBSD-STABLE\" or " "\"-STABLE\" for short. All branches live in a master Subversion repository " "maintained by the FreeBSD Project. FreeBSD-CURRENT is the \"bleeding-edge\" " "of FreeBSD development where all new changes first enter the system. " "FreeBSD-STABLE is the development branch from which major releases are " "made. Changes go into this branch at a different pace, and with the general " "assumption that they have first gone into FreeBSD-CURRENT and have been " "thoroughly tested by our user community." msgstr "" "Набор более стабильных ветвей поддерживается под названием \"FreeBSD-STABLE" "\" или сокращённо \"-STABLE\". Все ветви находятся в главном хранилище " "Subversion, которое поддерживается проектом FreeBSD. FreeBSD-CURRENT — это " "\"передний край\" разработки FreeBSD, куда сначала попадают все новые " "изменения. FreeBSD-STABLE — это ветвь разработки, на основе которой " "выпускаются основные релизы. Изменения попадают в эту ветвь с другой " "скоростью и с общим предположением, что они сначала попали в FreeBSD-CURRENT " "и были тщательно протестированы сообществом пользователей." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:87 +#: documentation/content/en/articles/releng/_index.adoc:86 msgid "" "The term _stable_ in the name of the branch refers to the presumed " "Application Binary Interface stability, which is promised by the project. " "This means that a user application compiled on an older version of the " "system from the same branch works on a newer system from the same branch. " "The ABI stability has improved greatly from the compared to previous " "releases. In most cases, binaries from the older _STABLE_ systems run " "unmodified on newer systems, including __HEAD__, assuming that the system " "management interfaces are not used." msgstr "" "Термин _stable_ в названии ветки относится к предполагаемой стабильности " "бинарного интерфейса приложений (ABI), которую гарантирует проект. Это " "означает, что пользовательское приложение, скомпилированное на более старой " "версии системы из той же ветки, будет работать на более новой системе из той " "же ветки. Стабильность ABI значительно улучшилась по сравнению с предыдущими " "выпусками. В большинстве случаев бинарные файлы со старых систем _STABLE_ " "работают без изменений на более новых системах, включая __HEAD__, при " "условии, что не используются интерфейсы управления системой." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:90 +#: documentation/content/en/articles/releng/_index.adoc:89 msgid "" "In the interim period between releases, weekly snapshots are built " "automatically by the FreeBSD Project build machines and made available for " "download from `https:/download.FreeBSD.org/snapshots/`. The widespread " "availability of binary release snapshots, and the tendency of our user " "community to keep up with -STABLE development with Subversion and \"`make " "buildworld`\" footnote:[extref:{handbook}cutting-edge[Rebuilding world, " "makeworld]] helps to keep FreeBSD-STABLE in a very reliable condition even " "before the quality assurance activities ramp up pending a major release." msgstr "" "В промежуточный период между выпусками еженедельные снимки состояния системы " "автоматически создаются сборщиками FreeBSD Project и доступны для загрузки " "по адресу `https:/download.FreeBSD.org/snapshots/`. Широкое распространение " "бинарных снимков выпусков, а также склонность нашего сообщества " "пользователей следить за разработкой -STABLE с помощью Subversion и команды " "\"`make buildworld`\" footnote:[extref:{handbook}cutting-edge[Пересборка " "world, makeworld]] помогает поддерживать FreeBSD-STABLE в очень надёжном " "состоянии даже до того, как будут запущены мероприятия по обеспечению " "качества перед основным выпуском." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:93 +#: documentation/content/en/articles/releng/_index.adoc:92 msgid "" "In addition to installation ISO snapshots, weekly virtual machine images are " "also provided for use with VirtualBox, qemu, or other popular emulation " "software. The virtual machine images can be downloaded from `https://" "download.FreeBSD.org/snapshots/VM-IMAGES/`." msgstr "" "Помимо снимков установочных ISO, также предоставляются еженедельные образы " "виртуальных машин для использования с VirtualBox, qemu или другим популярным " "эмуляционным программным обеспечением. Образы виртуальных машин можно " "загрузить с `https://download.FreeBSD.org/snapshots/VM-IMAGES/`." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:95 +#: documentation/content/en/articles/releng/_index.adoc:94 msgid "" "The virtual machine images are approximately 150MB man:xz[1] compressed, and " "contain a 10GB sparse filesystem when attached to a virtual machine." msgstr "" "Образы виртуальных машин сжаты с помощью man:xz[1] и занимают примерно 150 " "МБ, а при подключении к виртуальной машине содержат разреженную файловую " "систему размером 10 ГБ." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:98 +#: documentation/content/en/articles/releng/_index.adoc:97 msgid "" "Bug reports and feature requests are continuously submitted by users " "throughout the release cycle. Problems reports are entered into our " "Bugzilla database through the web interface provided at https://www.freebsd." "org/support/bugreports/[https://www.freebsd.org/support/bugreports/]." msgstr "" "Отчёты об ошибках и запросы функций постоянно отправляются пользователями в " "течение цикла выпуска. Сообщения о проблемах вносятся в нашу базу данных " "Bugzilla через веб-интерфейс, доступный по адресу https://www.freebsd.org/" "support/bugreports/[https://www.freebsd.org/support/bugreports/]." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:103 +#: documentation/content/en/articles/releng/_index.adoc:102 msgid "" "To service our most conservative users, individual release branches were " "introduced with FreeBSD 4.3. These release branches are created shortly " "before a final release is made. After the release goes out, only the most " "critical security fixes and additions are merged onto the release branch. " "In addition to source updates via Subversion, binary patchkits are available " "to keep systems on the _releng/X.Y_ branches updated." msgstr "" "Для обслуживания наиболее консервативных пользователей, начиная с FreeBSD " "4.3, были введены индивидуальные ветки релизов. Эти ветки создаются " "незадолго до выпуска финального релиза. После выхода релиза на ветку " "вносятся только самые критические исправления безопасности и дополнения. " "Помимо обновлений исходного кода через Subversion, доступны бинарные патч-" "наборы для поддержания актуальности систем на ветках _releng/X.Y_." #. type: Title === -#: documentation/content/en/articles/releng/_index.adoc:104 +#: documentation/content/en/articles/releng/_index.adoc:103 #, no-wrap msgid "What This Article Describes" msgstr "Что описывает эта статья" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:107 +#: documentation/content/en/articles/releng/_index.adoc:106 msgid "The following sections of this article describe:" msgstr "Следующие разделы этой статьи описывают:" #. type: Labeled list -#: documentation/content/en/articles/releng/_index.adoc:108 +#: documentation/content/en/articles/releng/_index.adoc:107 #, no-wrap msgid "crossref:releng[release-proc, Release Process]" msgstr "crossref:releng[release-proc, Процесс выпуска релиза]" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:110 +#: documentation/content/en/articles/releng/_index.adoc:109 msgid "" "The different phases of the release engineering process leading up to the " "actual system build." msgstr "" "Различные этапы процесса разработки релиза, предшествующие непосредственной " "сборке системы." #. type: Labeled list -#: documentation/content/en/articles/releng/_index.adoc:111 +#: documentation/content/en/articles/releng/_index.adoc:110 #, no-wrap msgid "crossref:releng[release-build, Release Building]" msgstr "crossref:releng[release-build, Сборка релиза]" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:113 +#: documentation/content/en/articles/releng/_index.adoc:112 msgid "The actual build process." msgstr "Фактический процесс сборки." #. type: Labeled list -#: documentation/content/en/articles/releng/_index.adoc:114 +#: documentation/content/en/articles/releng/_index.adoc:113 #, no-wrap msgid "crossref:releng[extensibility, Extensibility]" msgstr "crossref:releng[extensibility, Расширяемость]" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:116 +#: documentation/content/en/articles/releng/_index.adoc:115 msgid "How the base release may be extended by third parties." msgstr "Как базовый выпуск может быть расширен третьими сторонами." #. type: Labeled list -#: documentation/content/en/articles/releng/_index.adoc:117 +#: documentation/content/en/articles/releng/_index.adoc:116 #, no-wrap msgid "crossref:releng[lessons-learned, Lessons Learned from FreeBSD 4.4]" -msgstr "crossref:releng[lessons-learned, Уроки, извлеченные из FreeBSD 4.4]" +msgstr "crossref:releng[lessons-learned, \"Уроки, извлеченные из FreeBSD 4.4\"]" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:119 +#: documentation/content/en/articles/releng/_index.adoc:118 msgid "Some of the lessons learned through the release of FreeBSD 4.4." msgstr "Некоторые уроки, извлеченные в процессе выпуска FreeBSD 4.4." #. type: Labeled list -#: documentation/content/en/articles/releng/_index.adoc:120 +#: documentation/content/en/articles/releng/_index.adoc:119 #, no-wrap msgid "crossref:releng[future, Future Directions]" msgstr "crossref:releng[future, Перспективы развития]" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:122 +#: documentation/content/en/articles/releng/_index.adoc:121 msgid "Future directions of development." msgstr "Перспективные направления развития." #. type: Title == -#: documentation/content/en/articles/releng/_index.adoc:124 +#: documentation/content/en/articles/releng/_index.adoc:123 #, no-wrap msgid "Release Process" msgstr "Процесс выпуска релиза" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:129 +#: documentation/content/en/articles/releng/_index.adoc:128 msgid "" "New releases of FreeBSD are released from the -STABLE branch at " "approximately four month intervals. The FreeBSD release process begins to " "ramp up 70-80 days before the anticipated release date when the release " "engineer sends an email to the development mailing lists to remind " "developers that they only have 15 days to integrate new changes before the " "code freeze. During this time, many developers perform what have become " "known as \"MFC sweeps\"." msgstr "" "Новые выпуски FreeBSD выходят из ветки -STABLE примерно с интервалом в " "четыре месяца. Процесс выпуска FreeBSD начинает набирать обороты за 70-80 " "дней до предполагаемой даты выпуска, когда инженер выпуска отправляет " "электронное письмо в списки рассылки разработчиков, напоминая им, что у них " "осталось всего 15 дней для интеграции новых изменений до заморозки кода. В " "это время многие разработчики выполняют так называемые \"MFC-проверки\"." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:133 +#: documentation/content/en/articles/releng/_index.adoc:132 msgid "" "MFC stands for \"Merge From CURRENT\" and it describes the process of " "merging a tested change from our -CURRENT development branch to our -STABLE " "branch. Project policy requires any change to be first applied to trunk, " "and merged to the -STABLE branches after sufficient external testing was " "done by -CURRENT users (developers are expected to extensively test the " "change before committing to -CURRENT, but it is impossible for a person to " "exercise all usages of the general-purpose operating system). Minimal MFC " "period is 3 days, which is typically used only for trivial or critical " "bugfixes." msgstr "" "MFC означает \"Merge From CURRENT\" и описывает процесс переноса " "проверенного изменения из нашей ветки разработки -CURRENT в ветку -STABLE. " "Политика проекта требует, чтобы любое изменение сначала было применено к " "основной ветке, а затем перенесено в ветки -STABLE после достаточного " "внешнего тестирования пользователями -CURRENT (ожидается, что разработчики " "тщательно проверят изменение перед внесением в -CURRENT, но невозможно для " "одного человека проверить все варианты использования универсальной " "операционной системы). Минимальный срок для MFC составляет 3 дня, который " "обычно используется только для тривиальных или критических исправлений " "ошибок." #. type: Title === -#: documentation/content/en/articles/releng/_index.adoc:134 +#: documentation/content/en/articles/releng/_index.adoc:133 #, no-wrap msgid "Code Review" msgstr "Проверка кода" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:140 +#: documentation/content/en/articles/releng/_index.adoc:139 msgid "" "Sixty days before the anticipated release, the source repository enters a " "\"code freeze\". During this time, all commits to the -STABLE branch must " "be approved by `{re}`. The approval process is technically enforced by a " "pre-commit hook. The kinds of changes that are allowed during this period " "include:" msgstr "" "За шестьдесят дней до предполагаемого релиза репозиторий исходного кода " "переходит в режим «заморозки кода». В этот период все коммиты в ветку -" "STABLE должны быть одобрены `{re}`. Процесс утверждения технически " "обеспечивается предкоммитным хуком. В этот период допускаются следующие виды " "изменений:" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:142 +#: documentation/content/en/articles/releng/_index.adoc:141 msgid "Bug fixes." msgstr "Исправления ошибок." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:143 +#: documentation/content/en/articles/releng/_index.adoc:142 msgid "Documentation updates." msgstr "Обновления документации." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:144 +#: documentation/content/en/articles/releng/_index.adoc:143 msgid "Security-related fixes of any kind." msgstr "Исправления, связанные с безопасностью, любого рода." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:145 +#: documentation/content/en/articles/releng/_index.adoc:144 msgid "Minor changes to device drivers, such as adding new Device IDs." msgstr "" "Незначительные изменения в драйверах устройств, такие как добавление новых " "идентификаторов устройств." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:146 +#: documentation/content/en/articles/releng/_index.adoc:145 msgid "Driver updates from the vendors." msgstr "Обновления драйверов от поставщиков." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:147 +#: documentation/content/en/articles/releng/_index.adoc:146 msgid "" "Any additional change that the release engineering team feels is justified, " "given the potential risk." msgstr "" "Любое дополнительное изменение, которое команда разработки релизов сочтет " "оправданным, учитывая потенциальный риск." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:151 +#: documentation/content/en/articles/releng/_index.adoc:150 msgid "" "Shortly after the code freeze is started, a _BETA1_ image is built and " "released for widespread testing. During the code freeze, at least one beta " "image or release candidate is released every two weeks until the final " "release is ready. During the days preceding the final release, the release " "engineering team is in constant communication with the security-officer " "team, the documentation maintainers, and the port maintainers to ensure that " "all of the different components required for a successful release are " "available." msgstr "" "Вскоре после начала заморозки кода создаётся образ _BETA1_ и выпускается для " "широкого тестирования. В период заморозки кода не реже чем раз в две недели " "выпускается как минимум один бета-образ или кандидат в релизы, пока не будет " "готов финальный выпуск. В дни, предшествующие финальному релизу, команда " "разработки выпусков постоянно взаимодействует с командой security-officer, " "сопровождающими документации и сопровождающими портов, чтобы убедиться, что " "все необходимые компоненты для успешного релиза доступны." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:154 +#: documentation/content/en/articles/releng/_index.adoc:153 msgid "" "After the quality of the BETA images is satisfying enough, and no large and " "potentially risky changes are planned, the release branch is created and " "_Release Candidate_ (RC) images are built from the release branch, instead " "of the BETA images from the STABLE branch. Also, the freeze on the STABLE " "branch is lifted and release branch enters a \"hard code freeze\" where it " "becomes much harder to justify new changes to the system unless a serious " "bug-fix or security issue is involved." msgstr "" "После того, как качество BETA-образов становится достаточно " "удовлетворительным и не планируется крупных и потенциально рискованных " "изменений, создаётся ветка релиза, и образы _Release Candidate_ (RC) " "собираются из ветки релиза, вместо BETA-образов из ветки STABLE. Также " "снимается заморозка изменений в ветке STABLE, а ветка релиза переходит в " "режим \"жёсткой заморозки кода\", когда становится значительно сложнее " "обосновать новые изменения в системе, за исключением исправления серьезных " "ошибок или проблем безопасности." #. type: Title === -#: documentation/content/en/articles/releng/_index.adoc:155 +#: documentation/content/en/articles/releng/_index.adoc:154 #, no-wrap msgid "Final Release Checklist" msgstr "Контрольный список финального выпуска" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:158 +#: documentation/content/en/articles/releng/_index.adoc:157 msgid "" "When several BETA images have been made available for widespread testing and " "all major issues have been resolved, the final release \"polishing\" can " "begin." msgstr "" "Когда несколько образов BETA станут доступны для широкого тестирования и все " "основные проблемы будут устранены, можно приступать к финальной \"доводке\" " "выпуска." #. type: Title ==== -#: documentation/content/en/articles/releng/_index.adoc:160 +#: documentation/content/en/articles/releng/_index.adoc:159 #, no-wrap msgid "Creating the Release Branch" msgstr "Создание ветки релиза" #. type: delimited block = 4 -#: documentation/content/en/articles/releng/_index.adoc:165 +#: documentation/content/en/articles/releng/_index.adoc:164 msgid "" "In all examples below, `$FSVN` refers to the location of the FreeBSD " "Subversion repository, `svn+ssh://svn.FreeBSD.org/base/`." msgstr "" "Во всех примерах ниже `$FSVN` указывает на расположение репозитория " "Subversion FreeBSD, `svn+ssh://svn.FreeBSD.org/base/`." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:169 +#: documentation/content/en/articles/releng/_index.adoc:168 msgid "" "The layout of FreeBSD branches in Subversion is described in the extref:" "{committers-guide}[Committer's Guide, subversion-primer-base-layout]. The " "first step in creating a branch is to identify the revision of the `stable/" "_X_` sources that you want to branch _from_." msgstr "" "Расположение веток FreeBSD в Subversion описано в extref:{committers-guide}" "[Руководстве коммиттера, subversion-primer-base-layout]. Первым шагом в " "создании ветки является определение ревизии исходников `stable/_X_`, от " "которой вы хотите сделать _ответвление_." #. type: delimited block . 4 -#: documentation/content/en/articles/releng/_index.adoc:173 +#: documentation/content/en/articles/releng/_index.adoc:172 #, no-wrap msgid "# svn log -v $FSVN/stable/9\n" msgstr "# svn log -v $FSVN/stable/9\n" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:176 +#: documentation/content/en/articles/releng/_index.adoc:175 msgid "The next step is to create the _release branch_" msgstr "Следующий шаг — создание _ветки релиза_" #. type: delimited block . 4 -#: documentation/content/en/articles/releng/_index.adoc:180 +#: documentation/content/en/articles/releng/_index.adoc:179 #, no-wrap msgid "# svn cp $FSVN/stable/9@REVISION $FSVN/releng/9.2\n" msgstr "# svn cp $FSVN/stable/9@REVISION $FSVN/releng/9.2\n" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:183 +#: documentation/content/en/articles/releng/_index.adoc:182 msgid "This branch can be checked out:" msgstr "Эту ветку можно извлечь:" #. type: delimited block . 4 -#: documentation/content/en/articles/releng/_index.adoc:187 +#: documentation/content/en/articles/releng/_index.adoc:186 #, no-wrap msgid "# svn co $FSVN/releng/9.2 src\n" msgstr "# svn co $FSVN/releng/9.2 src\n" #. type: delimited block = 4 -#: documentation/content/en/articles/releng/_index.adoc:192 +#: documentation/content/en/articles/releng/_index.adoc:191 msgid "" "Creating the `releng` branch and `release` tags is done by the link:https://" "www.FreeBSD.org/administration/#t-re[Release Engineering Team]." msgstr "" "Создание ветки `releng` и тегов `release` выполняется командой link:https://" "www.FreeBSD.org/administration/#t-re[Release Engineering Team]." #. type: Positional ($1) AttributeList argument for macro 'image' -#: documentation/content/en/articles/releng/_index.adoc:194 +#: documentation/content/en/articles/releng/_index.adoc:193 #, no-wrap msgid "FreeBSD Development Branch" msgstr "Ветка разработки FreeBSD" #. type: Target for macro image -#: documentation/content/en/articles/releng/_index.adoc:194 +#: documentation/content/en/articles/releng/_index.adoc:193 #, no-wrap msgid "branches-head.png" msgstr "branches-head.png" #. type: Positional ($1) AttributeList argument for macro 'image' -#: documentation/content/en/articles/releng/_index.adoc:196 +#: documentation/content/en/articles/releng/_index.adoc:195 #, no-wrap msgid "FreeBSD 3.x STABLE Branch" msgstr "Ветка STABLE FreeBSD 3.x" #. type: Target for macro image -#: documentation/content/en/articles/releng/_index.adoc:196 +#: documentation/content/en/articles/releng/_index.adoc:195 #, no-wrap msgid "branches-releng3.png" msgstr "branches-releng3.png" #. type: Positional ($1) AttributeList argument for macro 'image' -#: documentation/content/en/articles/releng/_index.adoc:198 +#: documentation/content/en/articles/releng/_index.adoc:197 #, no-wrap msgid "FreeBSD 4.x STABLE Branch" msgstr "Ветка FreeBSD 4.x STABLE" #. type: Target for macro image -#: documentation/content/en/articles/releng/_index.adoc:198 +#: documentation/content/en/articles/releng/_index.adoc:197 #, no-wrap msgid "branches-releng4.png" msgstr "branches-releng4.png" #. type: Positional ($1) AttributeList argument for macro 'image' -#: documentation/content/en/articles/releng/_index.adoc:200 +#: documentation/content/en/articles/releng/_index.adoc:199 #, no-wrap msgid "FreeBSD 5.x STABLE Branch" msgstr "Ветка STABLE FreeBSD 5.x" #. type: Target for macro image -#: documentation/content/en/articles/releng/_index.adoc:200 +#: documentation/content/en/articles/releng/_index.adoc:199 #, no-wrap msgid "branches-releng5.png" msgstr "branches-releng5.png" #. type: Positional ($1) AttributeList argument for macro 'image' -#: documentation/content/en/articles/releng/_index.adoc:202 +#: documentation/content/en/articles/releng/_index.adoc:201 #, no-wrap msgid "FreeBSD 6.x STABLE Branch" msgstr "Ветка FreeBSD 6.x STABLE" #. type: Target for macro image -#: documentation/content/en/articles/releng/_index.adoc:202 +#: documentation/content/en/articles/releng/_index.adoc:201 #, no-wrap msgid "branches-releng6.png" msgstr "branches-releng6.png" #. type: Positional ($1) AttributeList argument for macro 'image' -#: documentation/content/en/articles/releng/_index.adoc:204 +#: documentation/content/en/articles/releng/_index.adoc:203 #, no-wrap msgid "FreeBSD 7.x STABLE Branch" msgstr "Ветка FreeBSD 7.x STABLE" #. type: Target for macro image -#: documentation/content/en/articles/releng/_index.adoc:204 +#: documentation/content/en/articles/releng/_index.adoc:203 #, no-wrap msgid "branches-releng7.png" msgstr "branches-releng7.png" #. type: Positional ($1) AttributeList argument for macro 'image' -#: documentation/content/en/articles/releng/_index.adoc:206 +#: documentation/content/en/articles/releng/_index.adoc:205 #, no-wrap msgid "FreeBSD 8.x STABLE Branch" msgstr "Ветка FreeBSD 8.x STABLE" #. type: Target for macro image -#: documentation/content/en/articles/releng/_index.adoc:206 +#: documentation/content/en/articles/releng/_index.adoc:205 #, no-wrap msgid "branches-releng8.png" msgstr "branches-releng8.png" #. type: Positional ($1) AttributeList argument for macro 'image' -#: documentation/content/en/articles/releng/_index.adoc:208 +#: documentation/content/en/articles/releng/_index.adoc:207 #, no-wrap msgid "FreeBSD 9.x STABLE Branch" msgstr "Ветка FreeBSD 9.x STABLE" #. type: Target for macro image -#: documentation/content/en/articles/releng/_index.adoc:208 +#: documentation/content/en/articles/releng/_index.adoc:207 #, no-wrap msgid "branches-releng9.png" msgstr "branches-releng9.png" #. type: Title ==== -#: documentation/content/en/articles/releng/_index.adoc:211 +#: documentation/content/en/articles/releng/_index.adoc:210 #, no-wrap msgid "Bumping up the Version Number" msgstr "Увеличение номера версии" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:214 +#: documentation/content/en/articles/releng/_index.adoc:213 msgid "" "Before the final release can be tagged, built, and released, the following " "files need to be modified to reflect the correct version of FreeBSD:" msgstr "" "Перед тем как финальный выпуск может быть помечен, собран и выпущен, " "следующие файлы должны быть изменены, чтобы отражать корректную версию " "FreeBSD:" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:216 +#: documentation/content/en/articles/releng/_index.adoc:215 msgid "[.filename]#doc/en_US.ISO8859-1/books/handbook/mirrors/chapter.xml#" msgstr "[.filename]#doc/en_US.ISO8859-1/books/handbook/mirrors/chapter.xml#" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:217 +#: documentation/content/en/articles/releng/_index.adoc:216 msgid "[.filename]#doc/en_US.ISO8859-1/books/porters-handbook/book.xml#" msgstr "[.filename]#doc/en_US.ISO8859-1/books/porters-handbook/book.xml#" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:218 +#: documentation/content/en/articles/releng/_index.adoc:217 msgid "[.filename]#doc/en_US.ISO8859-1/htdocs/cgi/ports.cgi#" msgstr "[.filename]#doc/en_US.ISO8859-1/htdocs/cgi/ports.cgi#" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:219 +#: documentation/content/en/articles/releng/_index.adoc:218 msgid "[.filename]#ports/Tools/scripts/release/config#" msgstr "[.filename]#ports/Tools/scripts/release/config#" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:220 +#: documentation/content/en/articles/releng/_index.adoc:219 msgid "[.filename]#doc/shared/xml/freebsd.ent#" msgstr "[.filename]#doc/shared/xml/freebsd.ent#" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:221 +#: documentation/content/en/articles/releng/_index.adoc:220 msgid "[.filename]#src/Makefile.inc1#" msgstr "[.filename]#src/Makefile.inc1#" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:222 +#: documentation/content/en/articles/releng/_index.adoc:221 msgid "[.filename]#src/UPDATING#" msgstr "[.filename]#src/UPDATING#" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:223 +#: documentation/content/en/articles/releng/_index.adoc:222 msgid "[.filename]#src/gnu/usr.bin/groff/tmac/mdoc.local#" msgstr "[.filename]#src/gnu/usr.bin/groff/tmac/mdoc.local#" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:224 +#: documentation/content/en/articles/releng/_index.adoc:223 msgid "[.filename]#src/release/Makefile#" msgstr "[.filename]#src/release/Makefile#" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:225 +#: documentation/content/en/articles/releng/_index.adoc:224 msgid "[.filename]#src/release/doc/en_US.ISO8859-1/shared/xml/release.dsl#" msgstr "[.filename]#src/release/doc/en_US.ISO8859-1/shared/xml/release.dsl#" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:226 +#: documentation/content/en/articles/releng/_index.adoc:225 msgid "[.filename]#src/release/doc/shared/examples/Makefile.relnotesng#" msgstr "[.filename]#src/release/doc/shared/examples/Makefile.relnotesng#" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:227 +#: documentation/content/en/articles/releng/_index.adoc:226 msgid "[.filename]#src/release/doc/shared/xml/release.ent#" msgstr "[.filename]#src/release/doc/shared/xml/release.ent#" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:228 +#: documentation/content/en/articles/releng/_index.adoc:227 msgid "[.filename]#src/sys/conf/newvers.sh#" msgstr "[.filename]#src/sys/conf/newvers.sh#" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:229 +#: documentation/content/en/articles/releng/_index.adoc:228 msgid "[.filename]#src/sys/sys/param.h#" msgstr "[.filename]#src/sys/sys/param.h#" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:230 +#: documentation/content/en/articles/releng/_index.adoc:229 msgid "[.filename]#src/usr.sbin/pkg_install/add/main.c#" msgstr "[.filename]#src/usr.sbin/pkg_install/add/main.c#" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:231 +#: documentation/content/en/articles/releng/_index.adoc:230 msgid "[.filename]#doc/en_US.ISO8859-1/htdocs/search/opensearch/man.xml#" msgstr "[.filename]#doc/en_US.ISO8859-1/htdocs/search/opensearch/man.xml#" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:233 +#: documentation/content/en/articles/releng/_index.adoc:232 msgid "" "The release notes and errata files also need to be adjusted for the new " "release (on the release branch) and truncated appropriately (on the stable/" "current branch):" msgstr "" "Заметки о выпуске и файлы с опечатками также необходимо адаптировать для " "нового выпуска (в ветке выпуска) и соответствующим образом обрезать (в ветке " "stable/current):" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:235 +#: documentation/content/en/articles/releng/_index.adoc:234 msgid "[.filename]#src/release/doc/en_US.ISO8859-1/relnotes/common/new.xml#" msgstr "[.filename]#src/release/doc/en_US.ISO8859-1/relnotes/common/new.xml#" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:236 +#: documentation/content/en/articles/releng/_index.adoc:235 msgid "[.filename]#src/release/doc/en_US.ISO8859-1/errata/article.xml#" msgstr "[.filename]#src/release/doc/en_US.ISO8859-1/errata/article.xml#" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:240 +#: documentation/content/en/articles/releng/_index.adoc:239 msgid "" "Sysinstall should be updated to note the number of available ports and the " "amount of disk space required for the Ports Collection. footnote:[FreeBSD " "Ports Collection https://ports.FreeBSD.org] This information is currently " "kept in [.filename]#src/usr.sbin/bsdinstall/dist.c#." msgstr "" "В Sysinstall следует добавить информацию о количестве доступных портов и " -"объёме дискового пространства, необходимого для коллекции портов. footnote:[" -"Коллекция портов FreeBSD https://ports.FreeBSD.org] В настоящее время эта " +"объёме дискового пространства, необходимого для коллекции портов. footnote:" +"[Коллекция портов FreeBSD https://ports.FreeBSD.org] В настоящее время эта " "информация хранится в [.filename]#src/usr.sbin/bsdinstall/dist.c#." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:243 +#: documentation/content/en/articles/releng/_index.adoc:242 msgid "" "After the release has been built, a number of files should be updated to " "announce the release to the world. These files are relative to `head/` " "within the `doc/` subversion tree." msgstr "" "После сборки выпуска следует обновить ряд файлов, чтобы объявить о выпуске. " "Эти файлы находятся относительно `head/` в поддереве `doc/` Subversion." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:245 +#: documentation/content/en/articles/releng/_index.adoc:244 msgid "[.filename]#share/images/articles/releng/branches-relengX.pic#" msgstr "[.filename]#share/images/articles/releng/branches-relengX.pic#" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:246 +#: documentation/content/en/articles/releng/_index.adoc:245 msgid "[.filename]#head/shared/xml/release.ent#" msgstr "[.filename]#head/shared/xml/release.ent#" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:247 +#: documentation/content/en/articles/releng/_index.adoc:246 msgid "[.filename]#en_US.ISO8859-1/htdocs/releases/*#" msgstr "[.filename]#en_US.ISO8859-1/htdocs/releases/*#" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:248 +#: documentation/content/en/articles/releng/_index.adoc:247 msgid "[.filename]#en_US.ISO8859-1/htdocs/releng/index.xml#" msgstr "[.filename]#en_US.ISO8859-1/htdocs/releng/index.xml#" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:249 +#: documentation/content/en/articles/releng/_index.adoc:248 msgid "[.filename]#share/xml/news.xml#" msgstr "[.filename]#share/xml/news.xml#" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:251 +#: documentation/content/en/articles/releng/_index.adoc:250 msgid "Additionally, update the \"BSD Family Tree\" file:" msgstr "Кроме того, обновите файл \"Генеалогическое древо BSD\":" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:253 +#: documentation/content/en/articles/releng/_index.adoc:252 msgid "[.filename]#src/shared/misc/bsd-family-tree#" msgstr "[.filename]#src/shared/misc/bsd-family-tree#" #. type: Title ==== -#: documentation/content/en/articles/releng/_index.adoc:254 +#: documentation/content/en/articles/releng/_index.adoc:253 #, no-wrap msgid "Creating the Release Tag" msgstr "Создание тега релиза" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:257 +#: documentation/content/en/articles/releng/_index.adoc:256 msgid "" "When the final release is ready, the following command will create the " "`release/9.2.0` tag." msgstr "" "Когда финальный выпуск будет готов, следующая команда создаст тег " "`release/9.2.0`." #. type: delimited block . 4 -#: documentation/content/en/articles/releng/_index.adoc:261 +#: documentation/content/en/articles/releng/_index.adoc:260 #, no-wrap msgid "# svn cp $FSVN/releng/9.2 $FSVN/release/9.2.0\n" msgstr "# svn cp $FSVN/releng/9.2 $FSVN/release/9.2.0\n" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:264 +#: documentation/content/en/articles/releng/_index.adoc:263 msgid "" "The Documentation and Ports managers are responsible for tagging their " "respective trees with the `tags/RELEASE_9_2_0` tag." msgstr "" "Менеджеры документации и портов ответственны за добавление тега `tags/" "RELEASE_9_2_0` в соответствующие деревья." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:267 +#: documentation/content/en/articles/releng/_index.adoc:266 msgid "" "When the Subversion `svn cp` command is used to create a __release tag__, " "this identifies the source at a specific point in time. By creating tags, " "we ensure that future release builders will always be able to use the same " "source we used to create the official FreeBSD Project releases." msgstr "" "Когда команда Subversion `svn cp` используется для создания __тега релиза " "(release tag)__, это идентифицирует исходный код на определённый момент " "времени. Создавая теги, мы гарантируем, что будущие сборщики релизов всегда " "смогут использовать тот же исходный код, который использовался для создания " "официальных релизов проекта FreeBSD." #. type: Title == -#: documentation/content/en/articles/releng/_index.adoc:269 +#: documentation/content/en/articles/releng/_index.adoc:268 #, no-wrap msgid "Release Building" msgstr "Сборка релиза" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:280 +#: documentation/content/en/articles/releng/_index.adoc:279 msgid "" "FreeBSD \"releases\" can be built by anyone with a fast machine and access " "to a source repository. (That should be everyone, since we offer Subversion " "access! See the extref:{handbook}[Subversion section in the Handbook, svn] " "for details.) The _only_ special requirement is that the man:md[4] device " "must be available. If the device is not loaded into your kernel, then the " "kernel module should be automatically loaded when man:mdconfig[8] is " "executed during the boot media creation phase. All of the tools necessary " "to build a release are available from the Subversion repository in [." "filename]#src/release#. These tools aim to provide a consistent way to " "build FreeBSD releases. A complete release can actually be built with only " "a single command, including the creation of ISO images suitable for burning " "to CDROM or DVD, and an FTP install directory. man:release[7] fully " "documents the `src/release/generate-release.sh` script which is used to " "build a release. `generate-release.sh` is a wrapper around the Makefile " "target: `make release`." msgstr "" "Сборка \"релизов\" FreeBSD может быть выполнена любым пользователем, имеющим " "быстрый компьютер и доступ к репозиторию исходного кода. (Это должно быть " "доступно каждому, так как мы предоставляем доступ через Subversion! " "Подробности см. в extref:{handbook}[разделе Subversion в Руководстве, svn].) " "_Единственное_ специальное требование — доступность устройства man:md[4]. " "Если устройство не загружено в ваше ядро, то модуль ядра должен " "автоматически загрузиться при выполнении man:mdconfig[8] во время этапа " "создания загрузочного носителя. Все необходимые инструменты для сборки " "релиза доступны в репозитории Subversion в [.filename]#src/release#. Эти " "инструменты предназначены для обеспечения единообразного способа сборки " "релизов FreeBSD. Полный релиз может быть собран всего одной командой, " "включая создание ISO-образов, пригодных для записи на CDROM или DVD, а также " "каталога для установки по FTP. man:release[7] полностью документирует скрипт " "`src/release/generate-release.sh`, который используется для сборки релиза. " "`generate-release.sh` является обёрткой для цели Makefile: `make release`." #. type: Title === -#: documentation/content/en/articles/releng/_index.adoc:281 +#: documentation/content/en/articles/releng/_index.adoc:280 #, no-wrap msgid "Building a Release" msgstr "Сборка релиза" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:285 +#: documentation/content/en/articles/releng/_index.adoc:284 msgid "" "man:release[7] documents the exact commands required to build a FreeBSD " "release. The following sequences of commands can build an 9.2.0 release:" msgstr "" "man:release[7] документирует точные команды, необходимые для сборки релиза " "FreeBSD. Следующая последовательность команд может собрать релиз 9.2.0:" #. type: delimited block . 4 -#: documentation/content/en/articles/releng/_index.adoc:290 +#: documentation/content/en/articles/releng/_index.adoc:289 #, no-wrap msgid "" "# cd /usr/src/release\n" "# sh generate-release.sh release/9.2.0 /local3/release\n" msgstr "" "# cd /usr/src/release\n" "# sh generate-release.sh release/9.2.0 /local3/release\n" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:293 +#: documentation/content/en/articles/releng/_index.adoc:292 msgid "" "After running these commands, all prepared release files are available in [." "filename]#/local3/release/R# directory." msgstr "" "После выполнения этих команд все подготовленные файлы релиза будут доступны " "в каталоге [.filename]#/local3/release/R#." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:295 +#: documentation/content/en/articles/releng/_index.adoc:294 msgid "" "The release [.filename]#Makefile# can be broken down into several distinct " "steps." msgstr "" "Файл [.filename]#Makefile# для выпуска можно разбить на несколько отдельных " "этапов." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:297 +#: documentation/content/en/articles/releng/_index.adoc:296 msgid "" "Creation of a sanitized system environment in a separate directory hierarchy " "with \"`make installworld`\"." msgstr "" "Создание изолированного окружения системы в отдельной иерархии каталогов с " "помощью \"`make installworld`\"." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:298 +#: documentation/content/en/articles/releng/_index.adoc:297 msgid "" "Checkout from Subversion of a clean version of the system source, " "documentation, and ports into the release build hierarchy." msgstr "" "Извлечение из Subversion чистой версии исходного кода системы, документации " "и портов в иерархию сборки релиза." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:299 +#: documentation/content/en/articles/releng/_index.adoc:298 msgid "" "Population of [.filename]#/etc# and [.filename]#/dev# in the chrooted " "environment." msgstr "" "Заполнение каталогов [.filename]#/etc# и [.filename]#/dev# в chroot-" "окружении." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:300 +#: documentation/content/en/articles/releng/_index.adoc:299 msgid "" "chroot into the release build hierarchy, to make it harder for the outside " "environment to taint this build." msgstr "" "Изменение корневого каталога на верхний каталог иерархии сборки релиза с " "помощью `chroot`, чтобы усложнить влияние внешней среды на эту сборку." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:301 +#: documentation/content/en/articles/releng/_index.adoc:300 msgid "`make world` in the chrooted environment." msgstr "Запуск `make world` в окружении `chroot`." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:302 +#: documentation/content/en/articles/releng/_index.adoc:301 msgid "Build of Kerberos-related binaries." msgstr "Сборка связанных с Kerberos бинарных файлов." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:303 +#: documentation/content/en/articles/releng/_index.adoc:302 msgid "Build [.filename]#GENERIC# kernel." msgstr "Сборка ядра [.filename]#GENERIC#." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:304 +#: documentation/content/en/articles/releng/_index.adoc:303 msgid "" "Creation of a staging directory tree where the binary distributions will be " "built and packaged." msgstr "" "Создание промежуточной структуры каталогов, в которой будут собираться и " "упаковываться бинарные дистрибутивы." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:305 +#: documentation/content/en/articles/releng/_index.adoc:304 msgid "" "Build and installation of the documentation toolchain needed to convert the " "documentation source (SGML) into HTML and text documents that will accompany " "the release." msgstr "" "Сборка и установка инструментария для документации, необходимого для " "преобразования исходников документации (SGML) в HTML и текстовые документы, " "которые будут поставляться с релизом." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:306 +#: documentation/content/en/articles/releng/_index.adoc:305 msgid "" "Build and installation of the actual documentation (user manuals, tutorials, " "release notes, hardware compatibility lists, and so on.)" msgstr "" "Сборка и установка непосредственно документации (руководства пользователя, " "учебные пособия, примечания к выпуску, списки совместимого оборудования и " "так далее)." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:307 +#: documentation/content/en/articles/releng/_index.adoc:306 msgid "Package up distribution tarballs of the binaries and sources." msgstr "" "Создание распространяемых tar-архивов с бинарными файлами и исходными кодами." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:308 +#: documentation/content/en/articles/releng/_index.adoc:307 msgid "Create FTP installation hierarchy." msgstr "Создание иерархии установки FTP." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:309 +#: documentation/content/en/articles/releng/_index.adoc:308 msgid "_(optionally)_ Create ISO images for CDROM/DVD media." msgstr "_(необязательно)_ Создание ISO-образов для носителей CDROM/DVD." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:311 +#: documentation/content/en/articles/releng/_index.adoc:310 msgid "" "For more information about the release build infrastructure, please see man:" "release[7]." msgstr "" "Для получения дополнительной информации о инфраструктуре сборки релизов, " "обратитесь к man:release[7]." #. type: delimited block = 4 -#: documentation/content/en/articles/releng/_index.adoc:316 +#: documentation/content/en/articles/releng/_index.adoc:315 msgid "" "It is important to remove any site-specific settings from [.filename]#/etc/" "make.conf#. For example, it would be unwise to distribute binaries that " "were built on a system with `CPUTYPE` set to a specific processor." msgstr "" "Важно удалить все специфичные для сайта настройки из [.filename]#/etc/make." "conf#. Например, было бы неразумно распространять бинарные файлы, собранные " "на системе с установленным `CPUTYPE` для конкретного процессора." #. type: Title === -#: documentation/content/en/articles/releng/_index.adoc:318 +#: documentation/content/en/articles/releng/_index.adoc:317 #, no-wrap msgid "Contributed Software (\"ports\")" msgstr "Предоставленное программное обеспечение (\"порты\")" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:322 +#: documentation/content/en/articles/releng/_index.adoc:321 msgid "" "The https://ports.FreeBSD.org[FreeBSD Ports collection] is a collection of " "over {numports} third-party software packages available for FreeBSD. The " "`{portmgr}` is responsible for maintaining a consistent ports tree that can " "be used to create the binary packages that accompany official FreeBSD " "releases." msgstr "" "https://ports.FreeBSD.org[Коллекция портов FreeBSD] представляет собой набор " "из более чем {numports} сторонних программных пакетов, доступных для " "FreeBSD. `{portmgr}` отвечает за поддержание согласованного дерева портов, " "которое может быть использовано для создания бинарных пакетов, поставляемых " "с официальными выпусками FreeBSD." #. type: Title === -#: documentation/content/en/articles/releng/_index.adoc:323 +#: documentation/content/en/articles/releng/_index.adoc:322 #, no-wrap msgid "Release ISOs" msgstr "Релизные ISO-образы" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:328 +#: documentation/content/en/articles/releng/_index.adoc:327 msgid "" "Starting with FreeBSD 4.4, the FreeBSD Project decided to release all four " "ISO images that were previously sold on the _BSDi/Wind River Systems/FreeBSD " "Mall_ \"official\" CDROM distributions. Each of the four discs must contain " "a [.filename]#README.TXT# file that explains the contents of the disc, a [." "filename]#CDROM.INF# file that provides meta-data for the disc so that man:" "bsdinstall[8] can validate and use the contents, and a [.filename]#filename." "txt# file that provides a manifest for the disc. This _manifest_ can be " "created with a simple command:" msgstr "" "Начиная с FreeBSD 4.4, проект FreeBSD решил выпустить все четыре образа ISO, " "которые ранее продавались на «официальных» дистрибутивах CDROM от _BSDi/Wind " "River Systems/FreeBSD Mall_. Каждый из четырёх дисков должен содержать файл " "[.filename]#README.TXT#, объясняющий содержимое диска, файл [." "filename]#CDROM.INF#, предоставляющий метаданные для диска, чтобы man:" "bsdinstall[8] мог проверить и использовать содержимое, и файл [." "filename]#filename.txt#, содержащий манифест диска. Этот _манифест_ можно " "создать простой командой:" #. type: delimited block . 4 -#: documentation/content/en/articles/releng/_index.adoc:332 +#: documentation/content/en/articles/releng/_index.adoc:331 #, no-wrap msgid "/stage/cdrom# find . -type f | sed -e 's/^\\.\\///' | sort > filename.txt\n" msgstr "/stage/cdrom# find . -type f | sed -e 's/^\\.\\///' | sort > filename.txt\n" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:335 +#: documentation/content/en/articles/releng/_index.adoc:334 msgid "The specific requirements of each CD are outlined below." msgstr "Конкретные требования для каждого CD приведены ниже." #. type: Title ==== -#: documentation/content/en/articles/releng/_index.adoc:336 +#: documentation/content/en/articles/releng/_index.adoc:335 #, no-wrap msgid "Disc 1" msgstr "Диск 1" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:342 +#: documentation/content/en/articles/releng/_index.adoc:341 msgid "" "The first disc is almost completely created by `make release`. The only " "changes that should be made to the [.filename]#disc1# directory are the " "addition of a [.filename]#tools# directory, and as many popular third party " "software packages as will fit on the disc. The [.filename]#tools# directory " "contains software that allow users to create installation floppies from " "other operating systems. This disc should be made bootable so that users of " "modern PCs do not need to create installation floppy disks." msgstr "" "Первый диск почти полностью создаётся командой `make release`. Единственные " "изменения, которые следует внести в каталог [.filename]#disc1#, — это " "добавление каталога [.filename]#tools# и как можно большего количества " "популярных сторонних программных пакетов, которые поместятся на диск. В " "каталоге [.filename]#tools# содержится программное обеспечение, позволяющее " "пользователям создавать установочные дискеты из других операционных систем. " "Этот диск должен быть загрузочным, чтобы пользователям современных ПК не " "требовалось создавать установочные дискеты." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:347 +#: documentation/content/en/articles/releng/_index.adoc:346 msgid "" "If a custom kernel of FreeBSD is to be included, then man:bsdinstall[8] and " "man:release[7] must be updated to include installation instructions. The " "relevant code is contained in [.filename]#src/release# and [.filename]#src/" "usr.sbin/bsdinstall#. Specifically, the file [.filename]#src/release/" "Makefile#, and [.filename]#dist.c#, [.filename]#dist.h#, [.filename]#menus." "c#, [.filename]#install.c#, and [.filename]#Makefile# will need to be " "updated under [.filename]#src/usr.sbin/bsdinstall#. Optionally, you may " "choose to update [.filename]#bsdinstall.8#." msgstr "" "Если требуется включить пользовательское ядро FreeBSD, необходимо обновить " "man:bsdinstall[8] и man:release[7], чтобы включить инструкции по установке. " "Соответствующий код содержится в [.filename]#src/release# и [.filename]#src/" "usr.sbin/bsdinstall#. В частности, потребуется обновить файл [.filename]#src/" "release/Makefile#, а также [.filename]#dist.c#, [.filename]#dist.h#, [." "filename]#menus.c#, [.filename]#install.c# и [.filename]#Makefile# в " "каталоге [.filename]#src/usr.sbin/bsdinstall#. При желании можно также " "обновить [.filename]#bsdinstall.8#." #. type: Title ==== -#: documentation/content/en/articles/releng/_index.adoc:348 +#: documentation/content/en/articles/releng/_index.adoc:347 #, no-wrap msgid "Disc 2" msgstr "Диск 2" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:353 +#: documentation/content/en/articles/releng/_index.adoc:352 msgid "" "The second disc is also largely created by `make release`. This disc " "contains a \"live filesystem\" that can be used from man:bsdinstall[8] to " "troubleshoot a FreeBSD installation. This disc should be bootable and " "should also contain a compressed copy of the CVS repository in the [." "filename]#CVSROOT# directory and commercial software demos in the [." "filename]#commerce# directory." msgstr "" "Второй диск также в основном создаётся командой `make release`. Этот диск " -"содержит «живую файловую систему», которая может использоваться через " -"man:bsdinstall[8] для диагностики установки FreeBSD. Этот диск должен быть " +"содержит «живую файловую систему», которая может использоваться через man:" +"bsdinstall[8] для диагностики установки FreeBSD. Этот диск должен быть " "загрузочным и также содержать сжатую копию репозитория CVS в каталоге [." "filename]#CVSROOT# и демонстрационные версии коммерческого ПО в каталоге [." "filename]#commerce#." #. type: Title ==== -#: documentation/content/en/articles/releng/_index.adoc:354 +#: documentation/content/en/articles/releng/_index.adoc:353 #, no-wrap msgid "Multi-volume Support" msgstr "Поддержка нескольких томов" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:360 +#: documentation/content/en/articles/releng/_index.adoc:359 msgid "" "Sysinstall supports multiple volume package installations. This requires " "that each disc have an [.filename]#INDEX# file containing all of the " "packages on all volumes of a set, along with an extra field that indicates " "which volume that particular package is on. Each volume in the set must " "also have the `CD_VOLUME` variable set in the [.filename]#cdrom.inf# file so " "that bsdinstall can tell which volume is which. When a user attempts to " "install a package that is not on the current disc, bsdinstall will prompt " "the user to insert the appropriate one." msgstr "" "Sysinstall поддерживает установку пакетов с нескольких томов. Для этого " "каждый диск должен содержать файл [.filename]#INDEX#, в котором перечислены " "все пакеты на всех томах набора, а также дополнительное поле, указывающее, " "на каком именно томе находится конкретный пакет. Каждый том в наборе также " "должен иметь установленную переменную `CD_VOLUME` в файле [.filename]#cdrom." "inf#, чтобы bsdinstall мог определить, какой том является каким. Когда " "пользователь пытается установить пакет, которого нет на текущем диске, " "bsdinstall предложит ему вставить соответствующий диск." #. type: Title == -#: documentation/content/en/articles/releng/_index.adoc:362 +#: documentation/content/en/articles/releng/_index.adoc:361 #, no-wrap msgid "Distribution" msgstr "Распространение" #. type: Title === -#: documentation/content/en/articles/releng/_index.adoc:365 +#: documentation/content/en/articles/releng/_index.adoc:364 #, no-wrap msgid "FTP Sites" msgstr "Сайты FTP" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:371 +#: documentation/content/en/articles/releng/_index.adoc:370 msgid "" "When the release has been thoroughly tested and packaged for distribution, " "the master FTP site must be updated. The official FreeBSD public FTP sites " "are all mirrors of a master server that is open only to other FTP sites. " "This site is known as `ftp-master`. When the release is ready, the " "following files must be modified on `ftp-master`:" msgstr "" "Когда выпуск тщательно протестирован и упакован для распространения, " "необходимо обновить главный FTP-сайт. Официальные публичные FTP-сайты " "FreeBSD являются зеркалами главного сервера, который доступен только другим " "FTP-сайтам. Этот сервер известен как `ftp-master`. Когда выпуск готов, " "следующие файлы должны быть изменены на `ftp-master`:" #. type: Labeled list -#: documentation/content/en/articles/releng/_index.adoc:372 +#: documentation/content/en/articles/releng/_index.adoc:371 #, no-wrap msgid "[.filename]#/pub/FreeBSD/releases/arch/X.Y-RELEASE/#" msgstr "[.filename]#/pub/FreeBSD/releases/arch/X.Y-RELEASE/#" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:374 +#: documentation/content/en/articles/releng/_index.adoc:373 msgid "The installable FTP directory as output from `make release`." msgstr "" "Устанавливаемый каталог FTP, полученный в результате выполнения `make " "release`." #. type: Labeled list -#: documentation/content/en/articles/releng/_index.adoc:375 +#: documentation/content/en/articles/releng/_index.adoc:374 #, no-wrap msgid "[.filename]#/pub/FreeBSD/ports/arch/packages-X.Y-release/#" msgstr "[.filename]#/pub/FreeBSD/ports/arch/packages-X.Y-release/#" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:377 +#: documentation/content/en/articles/releng/_index.adoc:376 msgid "The complete package build for this release." msgstr "Полная сборка пакетов для этого выпуска." #. type: Labeled list -#: documentation/content/en/articles/releng/_index.adoc:378 +#: documentation/content/en/articles/releng/_index.adoc:377 #, no-wrap msgid "[.filename]#/pub/FreeBSD/releases/arch/X.Y-RELEASE/tools#" msgstr "[.filename]#/pub/FreeBSD/releases/arch/X.Y-RELEASE/tools#" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:380 +#: documentation/content/en/articles/releng/_index.adoc:379 msgid "A symlink to [.filename]#../../../tools#." msgstr "Символическая ссылка на [.filename]#../../../tools#." #. type: Labeled list -#: documentation/content/en/articles/releng/_index.adoc:381 +#: documentation/content/en/articles/releng/_index.adoc:380 #, no-wrap msgid "[.filename]#/pub/FreeBSD/releases/arch/X.Y-RELEASE/packages#" msgstr "[.filename]#/pub/FreeBSD/releases/arch/X.Y-RELEASE/packages#" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:383 +#: documentation/content/en/articles/releng/_index.adoc:382 msgid "A symlink to [.filename]#../../../ports/arch/packages-X.Y-release#." msgstr "" "Символическая ссылка на [.filename]#../../../ports/arch/packages-X.Y-" "release#." #. type: Labeled list -#: documentation/content/en/articles/releng/_index.adoc:384 +#: documentation/content/en/articles/releng/_index.adoc:383 #, no-wrap msgid "[.filename]#/pub/FreeBSD/releases/arch/ISO-IMAGES/X.Y/X.Y-RELEASE-arch-*.iso#" msgstr "[.filename]#/pub/FreeBSD/releases/arch/ISO-IMAGES/X.Y/X.Y-RELEASE-arch-*.iso#" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:387 +#: documentation/content/en/articles/releng/_index.adoc:386 msgid "" "The ISO images. The \"*\" is [.filename]#disc1#, [.filename]#disc2#, etc. " "Only if there is a [.filename]#disc1# and there is an alternative first " "installation CD (for example a stripped-down install with no windowing " "system) there may be a [.filename]#mini# as well." msgstr "" "Образы ISO. Символ \"*\" обозначает [.filename]#disc1#, [.filename]#disc2# и " "так далее. Только если существует [.filename]#disc1# и есть альтернативный " "первый установочный CD (например, упрощённая установка без графической " "оболочки), может также присутствовать [.filename]#mini#." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:389 +#: documentation/content/en/articles/releng/_index.adoc:388 msgid "" "For more information about the distribution mirror architecture of the " "FreeBSD FTP sites, please see the extref:{hubs}[Mirroring FreeBSD] article." msgstr "" "Для получения дополнительной информации об архитектуре зеркал " "распространения FTP-сайтов FreeBSD, пожалуйста, ознакомьтесь со статьей " "extref:{hubs}[Поддержка зеркал FreeBSD]." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:397 +#: documentation/content/en/articles/releng/_index.adoc:396 msgid "" "It may take many hours to two days after updating `ftp-master` before a " "majority of the Tier-1 FTP sites have the new software depending on whether " "or not a package set got loaded at the same time. It is imperative that the " "release engineers coordinate with the {mirror-announce} before announcing " "the general availability of new software on the FTP sites. Ideally the " "release package set should be loaded at least four days prior to release " "day. The release bits should be loaded between 24 and 48 hours before the " "planned release time with \"other\" file permissions turned off. This will " "allow the mirror sites to download it but the general public will not be " "able to download it from the mirror sites. Mail should be sent to {mirror-" "announce} at the time the release bits get posted saying the release has " "been staged and giving the time that the mirror sites should begin allowing " "access. Be sure to include a time zone with the time, for example make it " "relative to GMT." msgstr "" "Может потребоваться от нескольких часов до двух дней после обновления `ftp-" "master`, прежде чем большинство FTP-сайтов Tier-1 получат новое программное " "обеспечение, в зависимости от того, был ли загружен набор пакетов " "одновременно. Крайне важно, чтобы инженеры по выпуску скоординировались с " "{mirror-announce} перед объявлением общей доступности нового программного " "обеспечения на FTP-сайтах. В идеале набор пакетов для выпуска должен быть " "загружен как минимум за четыре дня до дня выпуска. Выпускные файлы должны " "быть загружены за 24–48 часов до запланированного времени выпуска с " "отключёнными разрешениями для \"других\" пользователей. Это позволит " "зеркальным сайтам загрузить их, но широкая публика не сможет скачать их с " "зеркальных сайтов. Письмо должно быть отправлено в {mirror-announce} в " "момент публикации выпускных файлов, уведомляя о том, что выпуск подготовлен, " "и указывая время, когда зеркальные сайты должны начать разрешать доступ. " "Обязательно укажите часовой пояс для указанного времени, например, " "относительно GMT." #. type: Title === -#: documentation/content/en/articles/releng/_index.adoc:399 +#: documentation/content/en/articles/releng/_index.adoc:398 #, no-wrap msgid "CD-ROM Replication" msgstr "Репликация CD-ROM" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:402 +#: documentation/content/en/articles/releng/_index.adoc:401 msgid "" "Coming soon: Tips for sending FreeBSD ISOs to a replicator and quality " "assurance measures to be taken." msgstr "" "Скоро: Советы по отправке ISO-образов FreeBSD репликатору и меры по " "обеспечению качества." #. type: Title == -#: documentation/content/en/articles/releng/_index.adoc:404 +#: documentation/content/en/articles/releng/_index.adoc:403 #, no-wrap msgid "Extensibility" msgstr "Расширяемость" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:411 +#: documentation/content/en/articles/releng/_index.adoc:410 msgid "" "Although FreeBSD forms a complete operating system, there is nothing that " "forces you to use the system exactly as we have packaged it up for " "distribution. We have tried to design the system to be as extensible as " "possible so that it can serve as a platform that other commercial products " "can be built on top of. The only \"rule\" we have about this is that if you " "are going to distribute FreeBSD with non-trivial changes, we encourage you " "to document your enhancements! The FreeBSD community can only help support " "users of the software we provide. We certainly encourage innovation in the " "form of advanced installation and administration tools, for example, but we " "cannot be expected to answer questions about it." msgstr "" "Хотя FreeBSD представляет собой законченную операционную систему, ничто не " "обязывает вас использовать её именно в том виде, в каком мы упаковали её для " "распространения. Мы постарались разработать систему максимально расширяемой, " "чтобы она могла служить платформой для создания других коммерческих " "продуктов. Единственное «правило», которое у нас есть на этот счёт, — если " "вы собираетесь распространять FreeBSD с существенными изменениями, мы " "рекомендуем документировать ваши улучшения! Сообщество FreeBSD может " "оказывать поддержку только пользователям того программного обеспечения, " "которое мы предоставляем. Мы, безусловно, приветствуем инновации, такие как " "продвинутые инструменты установки и администрирования, но не можем отвечать " "на вопросы о них." #. type: Title === -#: documentation/content/en/articles/releng/_index.adoc:412 +#: documentation/content/en/articles/releng/_index.adoc:411 #, no-wrap msgid "Scripting `bsdinstall`" msgstr "Скриптинг `bsdinstall`" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:416 +#: documentation/content/en/articles/releng/_index.adoc:415 msgid "" "The FreeBSD system installation and configuration tool, man:bsdinstall[8], " "can be scripted to provide automated installs for large sites. This " "functionality can be used in conjunction with Intel(R) PXE footnote:[extref:" "{handbook}advanced-networking[Diskless Operation with PXE, network-" "diskless]] to bootstrap systems from the network." msgstr "" "Инструмент установки и настройки системы FreeBSD, man:bsdinstall[8], может " "быть настроен для автоматизированной установки на крупных площадках. Эта " -"функциональность может использоваться совместно с Intel(R) PXE " -"footnote:[extref:{handbook}advanced-networking[Запуск системы по сети (PXE) " -"без использования локальных накопителей, network-diskless]] для загрузки " -"систем по сети." +"функциональность может использоваться совместно с Intel(R) PXE footnote:" +"[extref:{handbook}advanced-networking[Запуск системы по сети (PXE) без " +"использования локальных накопителей, network-diskless]] для загрузки систем " +"по сети." #. type: Title == -#: documentation/content/en/articles/releng/_index.adoc:418 +#: documentation/content/en/articles/releng/_index.adoc:417 #, no-wrap msgid "Lessons Learned from FreeBSD 4.4" msgstr "Уроки, извлеченные из FreeBSD 4.4" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:425 +#: documentation/content/en/articles/releng/_index.adoc:424 msgid "" "The release engineering process for 4.4 formally began on August 1st, 2001. " "After that date all commits to the `RELENG_4` branch of FreeBSD had to be " "explicitly approved by the `{re}`. The first release candidate for the x86 " "architecture was released on August 16, followed by 4 more release " "candidates leading up to the final release on September 18th. The security " "officer was very involved in the last week of the process as several " "security issues were found in the earlier release candidates. A total of " "over _500_ emails were sent to the `{re}` in little over a month." msgstr "" "Процесс разработки релиза 4.4 официально начался 1 августа 2001 года. После " "этой даты все коммиты в ветку `RELENG_4` FreeBSD должны были быть явно " "одобрены `{re}`. Первый релиз-кандидат для архитектуры x86 был выпущен 16 " "августа, за ним последовали ещё 4 релиз-кандидата, что привело к финальному " "релизу 18 сентября. Сотрудник по безопасности был очень вовлечён в последнюю " "неделю процесса, так как несколько проблем безопасности было обнаружено в " "ранних релиз-кандидатах. Всего за чуть более месяца было отправлено более " "_500_ писем `{re}`." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:429 +#: documentation/content/en/articles/releng/_index.adoc:428 msgid "" "Our user community has made it very clear that the security and stability of " "a FreeBSD release should not be sacrificed for any self-imposed deadlines or " "target release dates. The FreeBSD Project has grown tremendously over its " "lifetime and the need for standardized release engineering procedures has " "never been more apparent. This will become even more important as FreeBSD " "is ported to new platforms." msgstr "" "Наше сообщество пользователей ясно дало понять, что безопасность и " "стабильность выпуска FreeBSD не должны приноситься в жертву из-за " "самостоятельно установленных сроков или целевых дат выпуска. Проект FreeBSD " "значительно вырос за время своего существования, и необходимость " "стандартизированных процедур управления выпусками никогда не была столь " "очевидной. Это станет ещё более важным по мере переноса FreeBSD на новые " "платформы." #. type: Title == -#: documentation/content/en/articles/releng/_index.adoc:431 +#: documentation/content/en/articles/releng/_index.adoc:430 #, no-wrap msgid "Future Directions" msgstr "Перспективы развития" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:435 +#: documentation/content/en/articles/releng/_index.adoc:434 msgid "" "It is imperative for our release engineering activities to scale with our " "growing userbase. Along these lines we are working very hard to document " "the procedures involved in producing FreeBSD releases." msgstr "" "Для обеспечения масштабирования наших процессов релиз-инжиниринга с растущей " "пользовательской базой мы прилагаем значительные усилия по документированию " "процедур, связанных с созданием выпусков FreeBSD." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:437 +#: documentation/content/en/articles/releng/_index.adoc:436 msgid "" "_Parallelism_ - Certain portions of the release build are actually " "\"embarrassingly parallel\". Most of the tasks are very I/O intensive, so " "having multiple high-speed disk drives is actually more important than using " "multiple processors in speeding up the `make release` process. If multiple " "disks are used for different hierarchies in the man:chroot[2] environment, " "then the CVS checkout of the [.filename]#ports# and [.filename]#doc# trees " "can be happening simultaneously as the `make world` on another disk. Using a " "RAID solution (hardware or software) can significantly decrease the overall " "build time." msgstr "" "_Параллелизм_ — Некоторые этапы сборки релиза действительно \"тривиально " "параллельны\". Большинство задач очень интенсивно используют ввод-вывод, " "поэтому наличие нескольких высокоскоростных дисков важнее, чем использование " "нескольких процессоров для ускорения процесса `make release`. Если в среде " "man:chroot[2] разные иерархии размещены на разных дисках, то выгрузка CVS " "для деревьев [.filename]#ports# и [.filename]#doc# может происходить " "одновременно с выполнением `make world` на другом диске. Использование RAID " "(аппаратного или программного) может значительно сократить общее время " "сборки." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:438 +#: documentation/content/en/articles/releng/_index.adoc:437 msgid "" "_Cross-building releases_ - Building IA-64 or Alpha release on x86 hardware? " "`make TARGET=ia64 release`." msgstr "" "_Кросс-сборка релизов_ - Сборка релиза для IA-64 или Alpha на x86 " "оборудовании? `make TARGET=ia64 release`." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:439 +#: documentation/content/en/articles/releng/_index.adoc:438 msgid "" "_Regression Testing_ - We need better automated correctness testing for " "FreeBSD." msgstr "" "_Регрессионное тестирование_ - Нам необходимы более совершенные " "автоматизированные тесты на корректность для FreeBSD." #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:440 +#: documentation/content/en/articles/releng/_index.adoc:439 msgid "" "_Installation Tools_ - Our installation program has long since outlived its " "intended life span. Several projects are under development to provide a more " "advanced installation mechanism. The libh project was one such project that " "aimed to provide an intelligent new package framework and GUI installation " "program." msgstr "" "_Инструменты установки_ - Наша программа установки уже давно вышла за рамки " "своего первоначального срока службы. В разработке находится несколько " "проектов, призванных обеспечить более продвинутый механизм установки. Проект " "libh был одним из таких проектов, целью которого было создание " "интеллектуальной новой системы управления пакетами и программы установки с " "графическим интерфейсом." #. type: Title == -#: documentation/content/en/articles/releng/_index.adoc:442 +#: documentation/content/en/articles/releng/_index.adoc:441 #, no-wrap msgid "Acknowledgements" msgstr "Благодарности" #. type: Plain text -#: documentation/content/en/articles/releng/_index.adoc:447 +#: documentation/content/en/articles/releng/_index.adoc:446 msgid "" "I would like to thank Jordan Hubbard for giving me the opportunity to take " "on some of the release engineering responsibilities for FreeBSD 4.4 and also " "for all of his work throughout the years making FreeBSD what it is today. " "Of course the release would not have been possible without all of the " "release-related work done by `{asami}`, `{steve}`, `{bmah}`, `{nik}`, " "`{obrien}`, `{kris}`, `{jhb}` and the rest of the FreeBSD development " "community. I would also like to thank `{rgrimes}`, `{phk}`, and others who " "worked on the release engineering tools in the very early days of FreeBSD. " "This article was influenced by release engineering documents from the CSRG " "footnote:[Marshall Kirk McKusick, Michael J. Karels, and Keith Bostic: link:" "http://docs.FreeBSD.org/44doc/papers/releng.html[The Release Engineering of " "4.3BSD]] , the NetBSD Project, footnote:[NetBSD Developer Documentation: " "Release Engineering http://www.NetBSD.org/developers/releng/index.html] , " "and John Baldwin's proposed release engineering process notes. footnote:" "[John Baldwin's FreeBSD Release Engineering Proposal https://people.FreeBSD." "org/~jhb/docs/releng.txt]" msgstr "" "Я хотел бы поблагодарить Джордана Хаббарда за предоставленную мне " "возможность взять на себя часть обязанностей по управлению выпусками для " "FreeBSD 4.4, а также за всю его работу на протяжении многих лет, которая " "сделала FreeBSD такой, какая она есть сегодня. Конечно, выпуск не состоялся " "бы без всей работы, связанной с выпуском, выполненной `{asami}`, `{steve}`, " "`{bmah}`, `{nik}`, `{obrien}`, `{kris}`, `{jhb}` и остальным сообществом " "разработчиков FreeBSD. Я также хотел бы поблагодарить `{rgrimes}`, `{phk}` и " "других, кто работал над инструментами управления выпусками в самые ранние " "дни FreeBSD. На эту статью повлияли документы по управлению выпусками от " "CSRG footnote:[Маршалл Кирк МакКузик, Майкл Дж. Карелс и Кит Бостик: link:" "http://docs.FreeBSD.org/44doc/papers/releng.html[Управление выпусками " "4.3BSD]], проекта NetBSD footnote:[Документация разработчика NetBSD: " "Управление выпусками http://www.NetBSD.org/developers/releng/index.html] и " "заметки Джона Болдуина с предложениями по процессу управления выпусками. " "footnote:[Предложение Джона Болдуина по управлению выпусками FreeBSD https://" "people.FreeBSD.org/~jhb/docs/releng.txt]" diff --git a/documentation/content/ru/articles/serial-uart/_index.adoc b/documentation/content/ru/articles/serial-uart/_index.adoc index 6c0ce09f79..c860bbfa40 100644 --- a/documentation/content/ru/articles/serial-uart/_index.adoc +++ b/documentation/content/ru/articles/serial-uart/_index.adoc @@ -1,1033 +1,1033 @@ --- authors: - author: 'Frank Durda' email: uhclem@FreeBSD.org description: 'Подробная информация об использовании последовательных портов и UART в FreeBSD' tags: ["Serial", "hardware", "UART", "Tutorial", "FreeBSD"] title: 'Учебное руководство по последовательному интерфейсу и UART' trademarks: ["freebsd", "microsoft", "general"] --- = Учебное руководство по последовательному интерфейсу и UART :doctype: article :toc: macro :toclevels: 1 :icons: font :sectnums: :source-highlighter: rouge :experimental: :images-path: articles/serial-uart/ ifdef::env-beastie[] ifdef::backend-html5[] include::shared/authors.adoc[] include::shared/mirrors.adoc[] include::shared/releases.adoc[] include::shared/attributes/attributes-{{% lang %}}.adoc[] include::shared/{{% lang %}}/teams.adoc[] include::shared/{{% lang %}}/mailing-lists.adoc[] include::shared/{{% lang %}}/urls.adoc[] :imagesdir: ../../../images/{images-path} endif::[] ifdef::backend-pdf,backend-epub3[] include::../../../../shared/asciidoctor.adoc[] endif::[] endif::[] ifndef::env-beastie[] include::../../../../../shared/asciidoctor.adoc[] endif::[] [.abstract-title] Аннотация Эта статья рассказывает об использовании последовательного оборудования с FreeBSD. ''' toc::[] [[uart]] == UART: Что это и как работает _Copyright (R) 1996 `{uhclem}`, All Rights Reserved. 13 января 1996 год_ Универсальный асинхронный приёмопередатчик (UART) — это ключевой компонент подсистемы последовательной передачи данных компьютера. UART принимает байты данных и передаёт отдельные биты последовательно. На стороне приёмника второй UART собирает биты обратно в полные байты. Последовательная передача данных обычно используется с модемами и для не сетевого взаимодействия между компьютерами, терминалами и другими устройствами. Существует две основные формы последовательной передачи данных: синхронная и асинхронная. В зависимости от режимов, поддерживаемых оборудованием, название подсистемы связи обычно включает букву `A`, если она поддерживает асинхронную передачу, и букву `S`, если поддерживается синхронная передача. Обе формы описаны ниже. Некоторые распространённые сокращения: [.blockquote] UART Universal Asynchronous Receiver/Transmitter — Универсальный асинхронный приёмопередатчик [.blockquote] USART Universal Synchronous-Asynchronous Receiver/Transmitter — Универсальный синхронно-асинхронный приёмопередатчик === Синхронная последовательная передача Синхронная последовательная передача данных требует, чтобы отправитель и получатель имели общий тактовый сигнал, либо чтобы отправитель предоставлял строб-сигнал или другой сигнал синхронизации, чтобы получатель знал, когда "считывать" следующий бит данных. В большинстве форм синхронной последовательной связи, если в данный момент нет доступных данных для передачи, вместо них должен быть отправлен заполняющий символ, чтобы передача данных не прерывалась. Синхронная связь обычно более эффективна, так как между отправителем и получателем передаются только биты данных, однако она может быть более затратной, если требуются дополнительные провода и схемы для обмена тактовым сигналом между отправителем и получателем. Форма синхронной передачи используется с принтерами и устройствами с жёсткими дисками, где данные передаются по одному набору проводов, а тактовый сигнал или строб — по другому проводу. Принтеры и устройства с жёсткими дисками обычно не являются последовательными устройствами, так как большинство стандартов интерфейсов жёстких дисков передают целое слово данных для каждого тактового сигнала или строба, используя отдельный провод для каждого бита слова. В индустрии ПК такие устройства известны как параллельные. Стандартное оборудование для последовательной связи в ПК не поддерживает синхронные операции. Этот режим описан здесь только для сравнения. === Асинхронная последовательная передача Асинхронная передача позволяет передавать данные без необходимости отправки тактового сигнала от отправителя к получателю. Вместо этого отправитель и получатель заранее согласовывают параметры синхронизации, а к каждому слову добавляются специальные биты, которые используются для синхронизации передающего и принимающего устройств. При передаче слова через UART в асинхронном режиме к началу каждого передаваемого слова добавляется бит, называемый "стартовым битом". Стартовый бит используется для оповещения приёмника о начале передачи слова данных, а также для синхронизации тактового сигнала приёмника с тактовым сигналом передатчика. Эти два тактовых сигнала должны быть достаточно точными, чтобы их расхождение по частоте не превышало 10% во время передачи оставшихся битов слова. (Данное требование было установлено во времена механических телетайпов и легко выполняется современным электронным оборудованием.) После стартового бита передаются отдельные биты слова данных, начиная с младшего значащего бита (LSB). Каждый бит передаётся в течение точно такого же времени, как и все остальные биты, и приемник "проверяет" состояние линии примерно на середине интервала, отведенного для каждого бита, чтобы определить, является ли бит `1` или `0`. Например, если передача каждого бита занимает две секунды, приемник проверит сигнал, чтобы определить, является ли он `1` или `0`, через одну секунду, затем подождет две секунды и проверит значение следующего бита, и так далее. Отправитель не знает, когда получатель «посмотрел» значение бита. Отправитель знает только, когда по тактовому сигналу нужно начать передачу следующего бита слова. Когда все слово данных отправлено, передатчик может добавить бит чётности, который он генерирует. Бит чётности может быть использован приемником для выполнения простой проверки на ошибки. Затем передатчик отправляет как минимум один стоповый бит. Когда приемник получил все биты в слове данных, он может проверить биты чётности (как отправитель, так и приемник должны договориться о том, будет ли использоваться бит чётности), а затем приемник ищет стоповый бит. Если стоповый бит не появляется, когда должен, UART считает все слово искаженным и сообщит об ошибке кадрирования главному процессору при чтении слова данных. Обычная причина ошибки кадрирования — несовпадение скорости тактовых сигналов отправителя и приемника или прерывание сигнала. Независимо от того, были ли данные получены правильно или нет, UART автоматически отбрасывает бит чётности, стартовый и стоповый биты. Если отправитель и получатель настроены одинаково, эти биты не передаются хосту. Если готово следующее слово для передачи, стартовый бит нового слова может быть отправлен сразу после того, как будет отправлен стоповый бит предыдущего слова. Поскольку асинхронные данные являются "самосинхронизирующимися", если нет данных для передачи, линия передачи может быть неактивна. === Другие функции UART -Помимо основной задачи преобразования данных из параллельного формата в последовательный для передачи и из последовательного в параллельный при приеме, UART обычно предоставляет дополнительные схемы для сигналов, которые могут использоваться для указания состояния среды передачи и регулирования потока данных в случае, если удалённое устройство не готово принимать больше данных. Например, когда устройство, подключенное к UART, является модемом, модем может сообщать о наличии несущей на телефонной линии, в то время как компьютер может дать команду модему сбросить себя или не принимать вызовы, поднимая или опуская один или несколько из этих дополнительных сигналов. Функция каждого из этих дополнительных сигналов определена в стандарте EIA RS232-C. +Помимо основной задачи преобразования данных из параллельного формата в последовательный для передачи и из последовательного в параллельный при приеме, UART обычно предоставляет дополнительные схемы для сигналов, которые могут использоваться для указания состояния среды передачи и регулирования потока данных в случае, если удалённое устройство не готово принимать больше данных. Например, когда устройство, подключённое к UART, является модемом, модем может сообщать о наличии несущей на телефонной линии, в то время как компьютер может дать команду модему сбросить себя или не принимать вызовы, поднимая или опуская один или несколько из этих дополнительных сигналов. Функция каждого из этих дополнительных сигналов определена в стандарте EIA RS232-C. === Стандарты RS232-C и V.24 -В большинстве компьютерных систем UART подключен к схеме, которая генерирует сигналы, соответствующие спецификации EIA RS232-C. Также существует стандарт CCITT под названием V.24, который отражает спецификации, включенные в RS232-C. +В большинстве компьютерных систем UART подключен к схеме, которая генерирует сигналы, соответствующие спецификации EIA RS232-C. Также существует стандарт CCITT под названием V.24, который отражает спецификации, включённые в RS232-C. ==== Назначения битов RS232-C (метки и пробелы) В стандарте RS232-C значение `1` называется `Маркер` (Mark), а значение `0` — `Пробел` (Space). Когда линия связи находится в состоянии покоя, говорят, что она "маркирует" (Marking), то есть передаёт непрерывные значения `1`. Стартовый бит всегда имеет значение `0` (пробел). Стоповый бит всегда имеет значение `1` (метка). Это означает, что на линии всегда будет переход от метки (1) к пробелу (0) в начале каждого слова, даже при передаче нескольких слов подряд. Это гарантирует, что отправитель и получатель могут синхронизировать свои тактовые сигналы независимо от содержимого передаваемых битов данных. Время простоя между стоповым и стартовым битами не обязательно должно быть точным кратным (включая ноль) скорости передачи данных коммуникационного канала, однако большинство UART спроектированы таким образом для простоты. В стандарте RS232-C сигнал «Marking» (логическая `1`) представлен напряжением от -2 В до -12 В, а сигнал «Spacing» (логический `0`) — напряжением от 0 В до +12 В. Передатчик должен выдавать +12 В или -12 В, а приёмник должен учитывать возможные потери напряжения в длинных кабелях. Некоторые маломощные передатчики (например, в портативных компьютерах) иногда используют только +5 В и -5 В, но эти значения всё ещё допустимы для приёмника RS232-C при условии использования коротких кабелей. ==== Сигнал Break в RS232-C RS232-C также определяет сигнал под названием `Break`, который вызывается передачей непрерывных значений Spacing (без стартовых или стоповых битов). Когда на линии данных отсутствует напряжение, считается, что линия передаёт `Break`. Сигнал `Break` должен иметь длительность больше, чем время, необходимое для передачи полного байта, включая стартовый, стоповый и биты чётности. Большинство UART способны различить ошибку кадрирования и сигнал Break, но если UART не поддерживает эту функцию, для определения Break можно использовать обнаружение ошибки кадрирования. Во времена телетайпов, когда множество принтеров по всей стране были соединены последовательно (например, в службах новостей), любое устройство могло вызвать `Break`, временно размыкая всю цепь, чтобы ток не протекал. Это использовалось для того, чтобы место с срочными новостями могло прервать устройство в другом месте, которое в данный момент передавало информацию. В современных системах существует два типа сигналов Break. Если Break длится дольше 1,6 секунд, он считается "Модемным Break", и некоторые модемы можно запрограммировать на завершение соединения и переход в режим ожидания или вход в командный режим модема при обнаружении этого сигнала. Если Break короче 1,6 секунд, это означает "Break данных", и удалённый компьютер должен решить, как реагировать на этот сигнал. Иногда такая форма Break используется как сигнал "Внимание" или "Прерывание", а иногда принимается как замена символу ASCII CONTROL-C. Метки и пробелы также эквивалентны "дыркам" и "отсутствию дырок" в системах с бумажной лентой. [NOTE] ==== Разрывы не могут быть сгенерированы с перфоленты или из любого другого байтового значения, поскольку байты всегда отправляются со стартовым и стоповым битами. UART обычно способен генерировать непрерывный сигнал Spacing в ответ на специальную команду от главного управляющего устройства (процессора передачи). ==== ==== RS232-C устройства DTE и DCE Спецификация RS232-C определяет два типа оборудования: оконечное оборудование данных (DTE — Data Terminal Equipment) и оборудование передачи данных (DCE — Data Carrier Equipment). Обычно устройство DTE — это терминал (или компьютер), а DCE — модем. На другом конце телефонной линии в разговоре принимающий модем также является устройством DCE, а компьютер, подключённый к этому модему, — устройством DTE. Устройство DCE принимает сигналы на тех контактах, на которых устройство DTE передаёт, и наоборот. Когда два устройства, оба являющиеся DTE или DCE, должны быть соединены вместе без модема или аналогичного преобразователя среды между ними, необходимо использовать NULL модем. NULL модем электрически перестраивает кабель так, что выход передатчика подключается ко входу приемника на другом устройстве, и наоборот. Аналогичные преобразования выполняются для всех управляющих сигналов, чтобы каждое устройство видело то, что оно считает сигналами DCE (или DTE) от другого устройства. Количество сигналов, генерируемых устройствами DTE и DCE, не симметрично. Устройство DTE генерирует меньше сигналов для устройства DCE, чем получает от него. ==== Назначение контактов RS232-C Спецификация EIA RS232-C (и её эквивалент ITU, V.24) предусматривает использование двадцатипятиконтактного разъёма (обычно DB25) и определяет назначение большинства контактов в этом разъёме. В IBM Personal Computer и подобных системах подмножество сигналов RS232-C предоставляется через девятиконтактные разъемы (DB9). Сигналы, которые не включены в разъем ПК, в основном связаны с синхронной работой, и этот режим передачи не поддерживается UART, выбранным IBM для использования в IBM PC. В зависимости от производителя компьютера, для связи по RS232-C могут использоваться разъемы DB25, DB9 или оба типа. (В IBM PC также используется разъем DB25 для параллельного интерфейса принтера, что иногда вызывает путаницу.) Ниже представлена таблица назначений сигналов RS232-C в разъемах DB25 и DB9. [.informaltable] [cols="1,1,1,1,1,1,1", frame="none", options="header"] |=== | Контакт в DB25 RS232-C | Контакт в DB9 IBM PC | Символ цепи по EIA | Символ цепи по CCITT | Общее имя | Источник сигнала | Описание |1 |- |AA |101 |PG/FG |- |Защитное заземление (Frame/Protective Ground) |2 |3 |BA |103 |TD |DTE |Передача Данных (Transmit Data) |3 |2 |BB |104 |RD |DCE |Прием данных (Receive Data) |4 |7 |CA |105 |RTS |DTE |Запрос на передачу (Request to Send) |5 |8 |CB |106 |CTS |DCE |Готовность к приёму (Clear to Send) |6 |6 |CC |107 |DSR |DCE |Готовность терминального оборудования (Data Set Ready) |7 |5 |AV |102 |SG/GND |- |Сигнальная земля (Signal Ground) |8 |1 |CF |109 |DCD/CD |DCE |Обнаружение несущей (Data Carrier Detect) |9 |- |- |- |- |- |Зарезервировано для Теста |10 |- |- |- |- |- |Зарезервировано для Теста |11 |- |- |- |- |- |Зарезервировано для Теста |12 |- |CI |122 |SRLSD |DCE |Детектор сигнала вторичной линии приёма |13 |- |SCB |121 |SCTS |DCE |Вторичный сигнал готовности к приёму |14 |- |SBA |118 |STD |DTE |Вторичная линия передачи данных |15 |- |DB |114 |TSET |DCE |Тактирование элементов сигнала передатчика (Trans. Sig. Element Timing) |16 |- |SBB |119 |SRD |DCE |Вторичная линия приема данных |17 |- |DD |115 |RSET |DCE |Тактирование элементов сигнала приёмника (Receiver Signal Element Timing) |18 |- |- |141 |LOOP |DTE |Локальная петля |19 |- |SCA |120 |SRS |DTE |Вторичный запрос на передачу |20 |4 |CD |108.2 |DTR |DTE |Готовность терминального оборудования (Data Terminal Ready) |21 |- |- |- |RDL |DTE |Режим удалённой цифровой петли (Remote Digital Loopback) |22 |9 |CE |125 |RI |DCE |Индикатор передачи данных (Ring Indicator) |23 |- |CH |111 |DSRS |DTE |Селектор скорости передачи данных |24 |- |DA |113 |TSET |DTE |Тактирование элементов сигнала передатчика (Trans. Sig. Element Timing) |25 |- |- |142 |- |DCE |Режим тестирования |=== === Биты, боды и символы Скорость передачи данных (Baud) — это единица измерения скорости передачи в асинхронной связи. Из-за развития технологий модемной связи этот термин часто ошибочно используют для описания скорости передачи данных в современных устройствах. Традиционно, скорость передачи (Baud Rate) представляет количество битов, фактически передаваемых по среде, а не объём данных, которые действительно перемещаются от одного устройства DTE к другому. Подсчет Baud включает служебные биты — Start, Stop и Parity, которые генерируются передающим UART и удаляются принимающим UART. Это означает, что 7-битные слова данных на самом деле занимают 10 бит для полной передачи. Следовательно, модем, способный передавать 300 бит в секунду, обычно может передавать только 30 7-битных слов, если используется Parity и присутствуют один бит Start и один бит Stop. Если используются 8-битные слова данных и биты чётности, скорость передачи данных снижается до 27,27 слов в секунду, так как теперь для передачи восьмибитных слов требуется 11 бит, а модем по-прежнему передаёт только 300 бит в секунду. Формула преобразования байтов в секунду в бодовую скорость и наоборот была простой до появления модемов с коррекцией ошибок. Эти модемы принимают последовательный поток битов от UART в компьютере (даже внутренние модемы часто работают с последовательными данными) и преобразуют биты обратно в байты. Затем эти байты объединяются в пакеты и передаются по телефонной линии с использованием синхронного метода передачи. Это означает, что стоповые, стартовые и биты чётности, добавленные UART в DTE (компьютере), удаляются модемом перед передачей отправляющим модемом. Когда эти байты принимаются удалённым модемом, он добавляет стартовые, стоповые и биты чётности к словам, преобразует их в последовательный формат и отправляет на принимающий UART в удалённом компьютере, который затем удаляет стартовые, стоповые и биты чётности. Причина, по которой выполняются все эти дополнительные преобразования, заключается в том, чтобы два модема могли осуществлять коррекцию ошибок. Это означает, что принимающий модем может запросить у передающего модема повторную отправку блока данных, который был получен с некорректной контрольной суммой. Эта проверка обрабатывается модемами, и устройства DTE обычно не осознают, что этот процесс происходит. Удаляя стартовые, стоповые и биты чётности, дополнительные биты данных, которые два модема должны обмениваться между собой для выполнения коррекции ошибок, в основном скрываются от эффективной скорости передачи, наблюдаемой отправляющим и принимающим оборудованием DTE. Например, если модем отправляет десять 7-битных слов другому модему без включения стартовых, стоповых и битов чётности, отправляющий модем сможет добавить 30 бит своей собственной информации, которую принимающий модем может использовать для коррекции ошибок, не влияя на скорость передачи реальных данных. Использование термина "Бод" дополнительно осложняется модемами, выполняющими сжатие. Одно 8-битное слово, переданное по телефонной линии, может представлять собой дюжину слов, переданных на отправляющий модем. Принимающий модем развернёт данные обратно в их исходное содержимое и передаст эти данные принимающему DTE. Современные модемы также включают буферы, которые позволяют скорости передачи битов по телефонной линии (DCE к DCE) отличаться от скорости передачи битов между DTE и DCE на обоих концах соединения. Обычно скорость между DTE и DCE выше, чем скорость между DCE и DCE, из-за использования сжатия модемами. Поскольку количество битов, необходимых для описания байта, менялось во время передачи между двумя машинами, а также из-за различающихся скоростей передачи в битах в секунду на линиях DTE-DCE и DCE-DCE, использование термина «Бод» для описания общей скорости связи вызывает проблемы и может искажать реальную скорость передачи. Таким образом, термин «Биты в секунду» (bps) является корректным для описания скорости передачи на интерфейсе DCE-DCE, а термины «Бод» или «Биты в секунду» допустимы, когда соединение устанавливается между двумя системами с проводным подключением или используется модем, не выполняющий коррекцию ошибок или сжатие. Современные высокоскоростные модемы (2400, 9600, 14,400 и 19,200 бит/с) на самом деле всё ещё работают на скорости 2400 бод или ниже, или, точнее, 2400 символов в секунду. Высокоскоростные модемы способны кодировать больше бит данных в каждый символ с использованием техники, называемой "Заполнение созвездия (Constellation Stuffing)", поэтому эффективная скорость передачи данных в битах в секунду у модема выше, но модем продолжает работать в ограниченной полосе пропускания звуковых частот, предоставляемой телефонной системой. Модемы, работающие на скоростях 28,800 и выше, имеют переменную скорость передачи символов, но техника остаётся той же. === UART в IBM PC Начиная с оригинального IBM Personal Computer, IBM выбрала UART INS8250 от National Semiconductor для использования в адаптере Parallel/Serial IBM PC. Последующие поколения совместимых компьютеров от IBM и других производителей продолжали использовать INS8250 или улучшенные версии UART из семейства National Semiconductor. ==== Генеалогическое дерево National Semiconductor UART Существует несколько версий и последующих поколений UART INS8250. Основные версии описаны ниже. [.programlisting] .... INS8250 -> INS8250B \ \ \-> INS8250A -> INS82C50A \ \ \-> NS16450 -> NS16C450 \ \ \-> NS16550 -> NS16550A -> PC16550D .... INS8250:: Эта часть использовалась в оригинальном IBM PC и IBM PC/XT. Первоначальное название этой части — INS8250 ACE (Asynchronous Communications Element), и она изготовлена по NMOS-технологии. + 8250 использует восемь портов ввода-вывода и имеет однобайтовый буфер передачи и однобайтовый буфер приема. Этот оригинальный UART имеет несколько состояний гонки и другие недостатки. Оригинальный BIOS IBM включает код для обхода этих недостатков, но это сделало BIOS зависимым от их наличия, поэтому последующие модели, такие как 8250A, 16450 или 16550, не могли быть использованы в оригинальном IBM PC или IBM PC/XT. INS8250-B:: Это более медленная скорость INS8250, созданная по NMOS-технологии. Она имеет те же проблемы, что и оригинальный INS8250. INS8250A:: Улучшенная версия INS8250 с использованием технологии XMOS, в которой исправлены различные функциональные недостатки. INS8250A изначально использовалась в клонах ПК от производителей, применявших "чистые" проекты BIOS. Из-за исправлений в микросхеме этот чип не мог использоваться с BIOS, совместимой с INS8250 или INS8250B. INS82C50A:: Это CMOS-версия (с низким энергопотреблением) INS8250A и имеет схожие функциональные характеристики. NS16450:: Так же, как NS8250A, но с улучшениями для работы с более быстрыми шинами CPU. IBM использовала этот компонент в IBM AT и обновила IBM BIOS, чтобы она больше не зависела от ошибок в INS8250. NS16C450:: Это версия NS16450 с технологией CMOS (низкое энергопотребление). NS16550:: То же, что и NS16450, с 16-байтовым буфером передачи и приема, но конструкция буфера была неудачной и не могла быть надёжно использована. NS16550A:: То же, что и NS16550, но с исправленными недостатками буфера. 16550A и его преемники стали наиболее популярными UART-устройствами в индустрии ПК, в основном благодаря их способности надёжно работать на высоких скоростях передачи данных в операционных системах с медленным временем отклика прерываний. NS16C552:: Этот компонент состоит из двух CMOS UART NS16C550A в одном корпусе. PC16550D:: Так же, как NS16550A, с исправленными незначительными недостатками. Это ревизия D семейства 16550 и последняя доступная версия от National Semiconductor. ==== NS16550AF и PC16550D — это одно и то же Компания National реорганизовала свою систему нумерации деталей несколько лет назад, и чип NS16550AFN больше не существует под этим названием. (Если у вас есть NS16550AFN, посмотрите на дату изготовления на корпусе — это четырёхзначное число, обычно начинающееся с девятки. Первые две цифры обозначают год, а последние две — неделю года, когда чип был упакован. Если у вас есть NS16550AFN, скорее всего, он уже довольно старый.) Новые номера выглядят как PC16550DV, с незначительными отличиями в суффиксных буквах в зависимости от материала корпуса и его формы. (Описание системы нумерации можно найти ниже.) Важно понимать, что в некоторых магазинах можно заплатить $15 (США) за микросхему NS16550AFN, выпущенную в 1990 году, а в соседнем ящике могут лежать новые PC16550DN с небольшими исправлениями, которые National внесла с момента выпуска AFN. PC16550DN, вероятно, произведены в последние полгода и стоят вдвое дешевле (от $5 (США) при оптовой покупке), чем NS16550AFN, поскольку они легко доступны. Поскольку поставки чипов NS16550AFN продолжают сокращаться, цена, вероятно, будет расти до тех пор, пока больше людей не узнают и не примут тот факт, что PC16550DN действительно выполняет ту же функцию, что и старый номер детали. ==== Система нумерации компонентов National Semiconductor Старые номера деталей NS``__nnnnnrqp__`` теперь имеют формат PC``__nnnnnrgp__``. `_r_` — это поле ревизии. Текущая ревизия 16550 от National Semiconductor — `D`. `_p_` — это поле типа пакета. Типы: [.informaltable] [cols="1,1,1", frame="none"] |=== |"F" |QFP |(quad flat pack - квадратный плоский корпус) с L-образными выводами |"N" |DIP |(dual inline package — корпус с двусторонним расположением выводов) для сквозного монтажа с прямыми выводами |"V" |LPCC |(lead plastic chip carrier — пластиковый корпус) с J-образными выводами |=== Поле _g_ обозначает класс изделия. Если перед буквой типа пакета стоит `I`, это указывает на «промышленный» класс детали, который имеет более высокие характеристики, чем стандартная деталь, но не такие высокие, как компонент военного назначения (Milspec). Это необязательное поле. То, что мы раньше называли NS16550AFN (DIP-корпус), теперь называется PC16550DN или PC16550DIN. === Другие производители и аналогичные UART На протяжении многих лет чипы 8250, 8250A, 16450 и 16550 лицензировались или копировались другими производителями. В случае с 8250, 8250A и 16450 точная схема ("мегаячейка") была лицензирована многими производителями, включая Western Digital и Intel. Другие производители проводили обратную разработку чипа или создавали эмуляции с аналогичным поведением. Во внутренних модемах разработчик модема часто эмулирует 8250A/16450 с помощью микропроцессора модема, и эмулированный UART часто имеет скрытый буфер размером в несколько сотен байт. Благодаря размеру буфера, эти эмуляции могут быть такими же надёжными, как 16550A, в способности обрабатывать высокоскоростные данные. Однако большинство операционных систем по-прежнему сообщают, что UART является только 8250A или 16450, и могут не эффективно использовать дополнительную буферизацию, присутствующую в эмулированном UART, если не используются специальные драйверы. Некоторые производители модемов под давлением рыночных сил отказываются от конструкции с буфером в сотни байт и вместо этого используют UART 16550A, чтобы их продукция выглядела выигрышно в рыночных сравнениях, даже если это может снизить фактическую производительность. Распространённое заблуждение заключается в том, что все микросхемы с маркировкой "16550A" одинаковы по производительности. Однако между ними существуют различия, а в некоторых клонах 16550A даже встречаются серьёзные недостатки. Когда компания National Semiconductor разработала NS16550, она получила несколько патентов на эту конструкцию и также ограничила лицензирование, что затруднило для других производителей выпуск чипов с аналогичными характеристиками. В результате патентов обратно спроектированные конструкции и эмуляции должны были избегать нарушения пунктов, охватываемых патентами. Впоследствии эти копии почти никогда не работают точно так же, как NS16550A или PC16550D, которые являются компонентами, наиболее востребованными производителями компьютеров и модемов, но иногда они не готовы платить цену, необходимую для получения оригинальных деталей. Некоторые различия в клонах микросхем 16550A несущественны, в то время как другие могут полностью препятствовать использованию устройства с определённой операционной системой или драйвером. Эти различия могут проявиться при использовании других драйверов или при возникновении определённых комбинаций событий, которые не были хорошо протестированы или учтены в драйвере Windows(R). Это происходит потому, что большинство производителей модемов и клонов 16550 используют драйверы Microsoft из Windows(R) for Workgroups 3.11 и утилиту Microsoft(R) MS-DOS(R) в качестве основных тестов на совместимость с NS16550A. Этот чрезмерно упрощенный критерий означает, что при использовании другой операционной системы могут возникнуть проблемы из-за тонких различий между клонами и оригинальными компонентами. National Semiconductor предоставила программу под названием COMTEST, которая выполняет тесты совместимости независимо от каких-либо драйверов ОС. Следует помнить, что цель такого типа программ — демонстрация недостатков в продуктах конкурентов, поэтому программа будет сообщать как о значительных, так и о крайне незначительных различиях в поведении тестируемого компонента. -В серии тестов, проведенных автором этого документа в 1994 году, компоненты производства National Semiconductor, TI, StarTech и CMD, а также мегаячейки и эмуляции, встроенные во внутренние модемы, были протестированы с помощью COMTEST. Ниже приведен счетчик различий для некоторых из этих компонентов. Поскольку эти тесты проводились в 1994 году, они могут не отражать текущую производительность данного продукта от поставщика. +В серии тестов, проведенных автором этого документа в 1994 году, компоненты производства National Semiconductor, TI, StarTech и CMD, а также мегаячейки и эмуляции, встроенные во внутренние модемы, были протестированы с помощью COMTEST. Ниже приведён счетчик различий для некоторых из этих компонентов. Поскольку эти тесты проводились в 1994 году, они могут не отражать текущую производительность данного продукта от поставщика. Следует отметить, что COMTEST обычно завершает работу при обнаружении чрезмерного количества или определённых типов проблем. В рамках этого тестирования COMTEST был изменён так, чтобы он не завершал работу независимо от количества обнаруженных различий. [.informaltable] [cols="1,1,1", frame="none", options="header"] |=== | Поставщик | Номер детали | Ошибки (также известные как "различия" в отчётах) |National |(PC16550DV) |0 |National |(NS16550AFN) |0 |National |(NS16C552V) |0 |TI |(TL16550AFN) |3 |CMD |(16C550PE) |19 |StarTech |(ST16C550J) |23 |Rockwell |Стандартный модем с внутренним 16550 или его эмуляцией (RC144DPi/C3000-25) |117 |Sierra |Модем с внутренним 16550 (SC11951/SC11351) |91 |=== [NOTE] ==== На сегодняшний день автор данного документа не обнаружил ни одного не-National компонента, который бы показывал нулевые различия при использовании программы COMTEST. Также следует отметить, что у National было пять версий 16550 за эти годы, и новейшие компоненты ведут себя несколько иначе, чем классический NS16550AFN, который считается эталоном функциональности. COMTEST, по-видимому, закрывает глаза на различия внутри линейки продуктов National и не сообщает об ошибках в компонентах National (за исключением оригинальной 16550), даже когда существуют официальные errata, описывающие ошибки в ревизиях A, B и C этих компонентов, поэтому эту предвзятость COMTEST необходимо учитывать. ==== Важно понимать, что простое подсчитывание различий с COMTEST не даёт полного представления о том, какие различия существенны, а какие нет. Например, около половины различий, обнаруженных в двух вышеупомянутых модемах с внутренними UART, были вызваны тем, что клоновые UART не поддерживают режимы пяти- и шестибитных символов. Настоящие UART 16550, 16450 и 8250 поддерживают эти режимы, и COMTEST проверяет их функциональность, поэтому фиксируется более пятидесяти различий. Однако почти ни один современный модем не поддерживает пяти- или шестибитные символы, особенно те, что обладают функциями коррекции ошибок и сжатия. Это означает, что различия, связанные с режимами пяти- и шестибитных символов, можно не учитывать. Многие различия, о которых сообщает COMTEST, связаны с временными характеристиками. Во многих клонированных конструкциях, когда хост читает из одного порта, статусные биты в другом порте могут обновляться с иной скоростью (быстрее или медленнее), чем у _настоящего_ NS16550AFN, и COMTEST выявляет эти различия. Это означает, что количество различий может вводить в заблуждение: одно устройство может иметь всего одно или два различия, но они крайне критичны, тогда как другое устройство, обновляющее статусные регистры быстрее или медленнее эталонной части (что, вероятно, никогда не повлияет на работу правильно написанного драйвера), может иметь десятки зарегистрированных различий. COMTEST можно использовать в качестве инструмента проверки, чтобы предупредить администратора о наличии потенциально несовместимых компонентов, которые могут вызвать проблемы или потребуют особого подхода. Если вы запускаете COMTEST на 16550, который находится в модеме или к модему подключён последовательный порт, необходимо сначала отправить модему команду ATE0&W, чтобы модем не эхо-повторял ни один из тестовых символов. Если вы забудете это сделать, COMTEST сообщит как минимум об одном различии: [source, shell] .... Error (6)...Timeout interrupt failed: IIR = c1 LSR = 61 .... === Регистры 8250/16450/16550 UART 8250/16450/16550 занимает восемь последовательных адресов портов ввода-вывода. В IBM PC определены два расположения для этих восьми портов, которые вместе известны как [.filename]#COM1# и [.filename]#COM2#. Производители PC-клонов и дополнительных карт создали два дополнительных области, известных как [.filename]#COM3# и [.filename]#COM4#, но эти дополнительные COM-порты конфликтуют с другим оборудованием на некоторых системах. Наиболее распространённый конфликт возникает с видеоадаптерами, обеспечивающими эмуляцию IBM 8514. [.filename]#COM1# находится в диапазоне от 0x3f8 до 0x3ff и обычно использует IRQ 4. [.filename]#COM2# находится в диапазоне от 0x2f8 до 0x2ff и обычно использует IRQ 3. [.filename]#COM3# находится в диапазоне от 0x3e8 до 0x3ef и не имеет стандартного IRQ. [.filename]#COM4# находится в диапазоне от 0x2e8 до 0x2ef и не имеет стандартного IRQ. Описание портов ввода-вывода UART 8250/16450/16550 представлено ниже. [.informaltable] [cols="10%,10%,80%", frame="none", options="header"] |=== | Порт ввода/вывода | Доступ Разрешен | Описание |+0x00 |запись (DLAB==0) | Регистр передачи данных (THR). Информация, записанная в этот порт, обрабатывается как слова данных и передаётся через UART. |+0x00 |чтение (DLAB==0) | Регистр буфера приема (RBR). Любые слова данных, полученные UART из последовательного соединения, доступны для чтения хостом через этот порт. |+0x00 |запись/чтение (DLAB==1) | Младший байт защелки делителя (DLL — Divisor Latch LSB) Это значение будет поделено от основного входного тактового сигнала (в IBM PC основной тактовый сигнал равен 1,8432 МГц), и полученный тактовый сигнал будет определять скорость передачи UART. Этот регистр содержит биты с 0 по 7 делителя. |+0x01 |запись/чтение (DLAB==1) | Старший байт защелки делителя (DLH — Divisor Latch MSB) Это значение будет разделено от основного входного тактового сигнала (в IBM PC основной тактовый сигнал равен 1,8432 МГц), и полученный тактовый сигнал будет определять скорость передачи данных UART. Этот регистр содержит биты с 8 по 15 делителя. |+0x01 |запись/чтение (DLAB==0) |Регистр разрешения прерываний (IER) + UART 8250/16450/1655 классифицирует события на четыре категории. Каждая категория может быть настроена на генерацию прерывания при возникновении любого из событий. UART 8250/16450/16550 генерирует единый внешний сигнал прерывания независимо от того, сколько событий в разрешённых категориях произошло. Задача главного процессора — обработать прерывание и затем опросить разрешённые категории прерываний (обычно прерывания разрешены для всех категорий), чтобы определить истинную причину(ы) прерывания. + Бит 7 -> Зарезервирован, всегда 0. + Бит 6 -> Зарезервирован, всегда 0. + Бит 5 -> Зарезервирован, всегда 0. + Бит 4 -> Зарезервирован, всегда 0. + Бит 3 -> Разрешение прерывания по состоянию модема (EDSSI). Установка этого бита в "1" позволяет UART генерировать прерывание при изменении состояния одной или нескольких линий статуса. + Бит 2 -> Разрешение прерывания по состоянию линии приёмника (ELSI). Установка этого бита в "1" приводит к генерации прерывания UART при обнаружении ошибки (или сигнала BREAK) во входящих данных. + Бит 1 -> Разрешение прерывания по опустошению регистра передатчика (ETBEI). Установка этого бита в "1" приводит к генерации прерывания UART, когда в UART появляется место для одного или более дополнительных символов, предназначенных для передачи. + Бит 0 -> Разрешение прерывания по наличию принятых данных (ERBFI). Установка этого бита в "1" приводит к генерации прерывания UART, когда UART принял достаточное количество символов для превышения порога FIFO, или истекло время ожидания FIFO (устаревшие данные), или принят одиночный символ при отключённом FIFO. |+0x02 |запись |Регистр управления FIFO (FCR — FIFO Control Register) (Этот порт отсутствует в UART 8250 и 16450.) + Бит 7 -> Бит триггера приемника #1 + Бит 6 -> Бит триггера приемника #0 + Эти два бита определяют, при каком количестве данных приемник должен генерировать прерывание, когда FIFO активен. + 7 6 Количество слов перед генерацией прерывания + 0 0 1 + 0 1 4 + 1 0 8 + 1 1 14 + Бит 5 -> Зарезервирован, всегда 0. + Бит 4 -> Зарезервирован, всегда 0. + Бит 3 -> Выбор режима DMA. Если бит 0 установлен в "1" (FIFO включены), установка этого бита изменяет работу сигналов -RXRDY и -TXRDY с режима 0 на режим 1. + Бит 2 -> Сброс передающего FIFO. При записи "1" в этот бит содержимое FIFO очищается. Любое слово, которое передаётся в данный момент, будет отправлено полностью. Эта функция полезна для прерывания передачи. + Бит 1 -> Сброс приемного FIFO. При записи "1" в этот бит содержимое FIFO очищается. Любое слово, которое в данный момент собирается в сдвиговом регистре, будет принято полностью. + Бит 0 -> Включение FIFO 16550. При установке этого бита активируются как передающий, так и приемный FIFO. Любое содержимое в регистре хранения, сдвиговых регистрах или FIFO теряется при включении или отключении FIFO. + |+0x02 |чтение |Регистр идентификации прерываний + Бит 7 -> FIFO включены. На UART 8250/16450 этот бит равен нулю. + Бит 6 -> FIFO включены. На UART 8250/16450 этот бит равен нулю. + Бит 5 -> Зарезервирован, всегда 0. + Бит 4 -> Зарезервирован, всегда 0. + Бит 3 -> Бит идентификатора прерывания №2. На UART 8250/16450 этот бит равен нулю. + Бит 2 -> Бит идентификатора прерывания №1 + Бит 1 -> Бит идентификатора прерывания №0.Эти три бита объединяются для указания категории события, вызвавшего текущее прерывание. Эти категории имеют приоритеты, поэтому, если несколько категорий событий происходят одновременно, UART сообщит о более важных событиях первыми, и хост должен обрабатывать события в порядке их поступления. Все события, вызвавшие текущее прерывание, должны быть обработаны до генерации новых прерываний. (Это ограничение архитектуры ПК.) + 2 1 0 Приоритет Описание + 0 1 1 Первый Принятая ошибка (OE, PE, BI или FE) + 0 1 0 Второй Доступны принятые данные + 1 1 0 Второй Идентификация уровня триггера (Устаревшие данные в буфере приема) + 0 0 1 Третий Передатчик готов принять больше данных (THRE) + 0 0 0 Четвертый Изменение состояния модема (-CTS, -DSR, -RI или -DCD) + Бит 0 -> Бит ожидания прерывания. Если этот бит установлен в "0", то как минимум одно прерывание ожидает обработки. |+0x03 |запись/чтение |Регистр управления линией (LCR — Line Control Register) + -Бит 7 -> Бит доступа к защелке делителя (DLAB). При установке доступ к регистру передачи/приема данных (THR/RBR) и регистру разрешения прерываний (IER) отключается. Любой доступ к этим портам перенаправляется к регистрам защелки делителя. Установка этого бита, загрузка регистров делителя и сброс DLAB должны выполняться при отключенных прерываниях. + +Бит 7 -> Бит доступа к защелке делителя (DLAB). При установке доступ к регистру передачи/приема данных (THR/RBR) и регистру разрешения прерываний (IER) отключается. Любой доступ к этим портам перенаправляется к регистрам защелки делителя. Установка этого бита, загрузка регистров делителя и сброс DLAB должны выполняться при отключённых прерываниях. + Бит 6 -> Установка прерывания. При установке в "1" передатчик начинает передавать непрерывный интервал (Spacing), пока этот бит не будет сброшен в "0". Это переопределяет любые передаваемые биты символов. + -Бит 5 -> Фиксированный бит чётности. При включенной проверке чётности установка этого бита приводит к тому, что бит чётности всегда будет "1" или "0" в зависимости от значения бита 4. -Бит 4 -> Выбор чётности (EPS). При включенной проверке чётности и если бит 5 равен "0", установка этого бита приводит к использованию и ожиданию четной чётности. В противном случае используется нечетная чётность. + +Бит 5 -> Фиксированный бит чётности. При включённой проверке чётности установка этого бита приводит к тому, что бит чётности всегда будет "1" или "0" в зависимости от значения бита 4. +Бит 4 -> Выбор чётности (EPS). При включённой проверке чётности и если бит 5 равен "0", установка этого бита приводит к использованию и ожиданию четной чётности. В противном случае используется нечетная чётность. + Бит 3 -> Разрешение проверки чётности (PEN). При установке в "1" бит чётности вставляется между последним битом данных и стоповым битом. UART также ожидает наличие бита чётности в принимаемых данных. + Бит 2 -> Количество стоповых битов (STB). Если установлен в "1" и используются 5-битные слова данных, передаётся и ожидается 1.5 стоповых бита в каждом слове данных. Для 6, 7 и 8-битных слов данных передаётся и ожидается 2 стоповых бита. Если этот бит сброшен в "0", используется один стоповый бит в каждом слове данных. + Бит 1 -> Бит выбора длины слова #1 (WLSB1) + Бит 0 -> Бит выбора длины слова #0 (WLSB0) + Вместе эти биты определяют количество битов в каждом слове данных. + 1 0 Длина слова + 0 0 5 бит данных + 0 1 6 бит данных + 1 0 7 бит данных + 1 1 8 бит данных + |+0x04 |запись/чтение |Регистр управления модемом (MCR — Modem Control Register) + Бит 7 -> Зарезервирован, всегда 0. + Бит 6 -> Зарезервирован, всегда 0. + Бит 5 -> Зарезервирован, всегда 0. + Бит 4 -> Режим петли (Loop-Back). При установке в "1" передатчик и приёмник UART соединяются внутри для диагностики. Также выходы управления модемом UART подключаются к его входам: CTS к RTS, DTR к DSR, OUT1 к RI, а OUT2 к DCD. + Бит 3 -> OUT2. Вспомогательный выход, который процессор может установить в высокий или низкий уровень. В адаптере IBM PC (и большинстве клонов) OUT2 используется для отключения сигнала прерывания от UART 8250/16450/16550. + Бит 2 -> OUT1. Вспомогательный выход, который процессор может установить в высокий или низкий уровень. На адаптере IBM PC не используется. + Бит 1 -> Запрос на передачу (RTS). При установке в "1" выход линии -RTS UART переходит в низкий уровень (активное состояние). + Бит 0 -> Готовность терминала данных (DTR). При установке в "1" выход линии -DTR UART переходит в низкий уровень (активное состояние). + |+0x05 |запись/чтение |Регистр состояния линии (LSR — Line Status Register) + Бит 7 -> Ошибка в FIFO приемника. На UART 8250/16450 этот бит равен нулю. Этот бит устанавливается в «1», когда любой из байтов в FIFO имеет одно или несколько из следующих условий ошибки: PE, FE или BI. + Бит 6 -> Передатчик пуст (TEMT). Когда установлен в «1», в FIFO передатчика или сдвиговом регистре передатчика не осталось слов. Передатчик полностью бездействует. + Бит 5 -> Регистр хранения передатчика пуст (THRE). Когда установлен в «1», в FIFO (или регистре хранения) теперь есть место для передачи как минимум одного дополнительного слова. Передатчик может все ещё передавать данные, когда этот бит установлен в «1». + Бит 4 -> Прерывание по Break (BI). Приемник обнаружил сигнал Break. + Бит 3 -> Ошибка кадрирования (FE). Обнаружен стартовый бит, но стоповый бит не появился в ожидаемое время. Принятое слово, вероятно, искажено. + Бит 2 -> Ошибка чётности (PE). Бит чётности для принятого слова был некорректен. + Бит 1 -> Ошибка переполнения (OE). Было получено новое слово, но в буфере приема не было места. Вновь поступившее слово в сдвиговом регистре отбрасывается. На UART 8250/16450 слово в регистре хранения отбрасывается, а вновь поступившее слово помещается в регистр хранения. + Бит 0 -> Данные готовы (DR). Одно или несколько слов находятся в FIFO приемника, которые хост может прочитать. Слово должно быть полностью принято и перемещено из сдвигового регистра в FIFO (или регистр хранения для 8250/16450) до того, как этот бит будет установлен. |+0x06 |запись/чтение |Регистр состояния модема (MSR — Modem Status Register) + Бит 7 -> Обнаружение несущей данных (DCD). Отражает состояние линии DCD на UART. + Бит 6 -> Индикатор вызова (RI). Отражает состояние линии RI на UART. + Бит 5 -> Готовность передатчика данных (DSR). Отражает состояние линии DSR на UART. + Бит 4 -> Готовность к приёму (CTS). Отражает состояние линии CTS на UART. + Бит 3 -> Изменение состояния обнаружения несущей данных (DDCD). Устанавливается в "1", если линия -DCD изменила состояние ещё раз с момента последнего чтения MSR хостом. + Бит 2 -> Фронт сигнала вызова (TERI). Устанавливается в "1", если линия -RI перешла из низкого уровня в высокий с момента последнего чтения MSR хостом. + Бит 1 -> Изменение состояния готовности передатчика данных (DDSR). Устанавливается в "1", если линия -DSR изменила состояние ещё раз с момента последнего чтения MSR хостом. + Бит 0 -> Изменение состояния готовности к приёму (DCTS). Устанавливается в "1", если линия -CTS изменила состояние ещё раз с момента последнего чтения MSR хостом. + |+0x07 |запись/чтение |Регистр Scratch (SCR — Scratch Register). Этот регистр не выполняет никакой функции в UART. Хост может записать любое значение в это место и позднее считать его. |=== === За пределами UART 16550A Хотя National Semiconductor не предлагала никаких компонентов, совместимых с 16550 и предоставляющих дополнительные функции, другие производители сделали это. Некоторые из этих компонентов описаны ниже. Следует понимать, что для эффективного использования этих улучшений могут потребоваться драйверы от производителя чипа, поскольку большинство популярных операционных систем не поддерживают функции, выходящие за рамки возможностей 16550. ST16650:: По умолчанию эта часть аналогична NS16550A, но дополнительно можно включить расширенный 32-байтовый буфер отправки и приёма. Производитель — StarTech. TIL16660:: По умолчанию эта часть ведёт себя аналогично NS16550A, но дополнительно может быть включён расширенный 64-байтный буфер передачи и приёма. Производится Texas Instruments. Hayes ESP:: Эта проприетарная внешняя карта содержит буфер передачи и приема размером 2048 байт и поддерживает скорость передачи данных до 230,4 Кбит/с. Произведено компанией Hayes. В дополнение к этим "простым" UART многие производители выпускают интеллектуальные платы для последовательной связи. Такой тип конструкции обычно включает микропроцессор, который взаимодействует с несколькими UART, обрабатывает и буферизует данные, а затем при необходимости уведомляет основной процессор ПК. Поскольку в такой системе связи UART не доступны напрямую процессору ПК, производителю не обязательно использовать UART, совместимые с 8250, 16450 или 16550. Это даёт разработчику свободу выбора компонентов с лучшими характеристиками производительности. [[sio]] == Настройка драйвера [.filename]#sio# Драйвер [.filename]#sio# обеспечивает поддержку интерфейсов связи EIA RS-232C (CCITT V.24) на основе NS8250, NS16450, NS16550 и NS16550A. Также поддерживаются несколько многопортовых карт. Подробную техническую документацию смотрите на man:sio[4]. === Digi International (DigiBoard) PC/8 _Предоставлено `{awebster}`. 26 августа 1995._ Вот фрагмент конфигурации с машины, на которой установлена плата Digi International PC/8 с чипом 16550. К ней подключено 8 модемов, работающих на этих 8 линиях, и они отлично функционируют. Не забудьте добавить `options COM_MULTIPORT`, иначе работа будет нестабильной! [.programlisting] .... device sio4 at isa? port 0x100 flags 0xb05 device sio5 at isa? port 0x108 flags 0xb05 device sio6 at isa? port 0x110 flags 0xb05 device sio7 at isa? port 0x118 flags 0xb05 device sio8 at isa? port 0x120 flags 0xb05 device sio9 at isa? port 0x128 flags 0xb05 device sio10 at isa? port 0x130 flags 0xb05 device sio11 at isa? port 0x138 flags 0xb05 irq 9 .... Хитрость настройки заключается в том, что старший бит флагов представляет последний порт SIO, в данном случае 11, поэтому флаги равны 0xb05. === Boca 16 _Предоставлено `{whiteside}`. 26 августа 1995._ Процедуры по настройке платы Boca с 16 портами в FreeBSD довольно просты, но вам понадобится несколько вещей для успешной работы: . Вам необходимо либо установить исходные коды ядра, чтобы перекомпилировать нужные опции, либо найти кого-то, кто сделает это за вас. Стандартное ядро версии 2.0.5 _не_ включает поддержку нескольких портов, и в любом случае вам потребуется добавить запись устройства для каждого порта. . Два, вам нужно знать прерывание и настройку ввода-вывода для вашей платы Boca, чтобы правильно установить эти параметры в ядре. Важное замечание — реальные микросхемы UART для Boca 16 находятся в соединительной коробке, а не на внутренней плате. Поэтому, если она отключена, попытки проверить эти порты завершатся неудачей. Я никогда не проверял загрузку с отключённой коробкой и последующим её подключением, и не рекомендую вам этого делать. Если у вас ещё нет настроенного файла конфигурации пользовательского ядра, обратитесь к разделу extref:{handbook}kernelconfig[Конфигурация ядра, kernelconfig] в руководстве FreeBSD для получения общих инструкций. Ниже приведены конкретные настройки для платы Boca 16, предполагается, что вы используете ядро с именем MYKERNEL и редактируете его с помощью vi. [.procedure] ==== . Добавьте строку + [.programlisting] .... options COM_MULTIPORT .... в конфигурационный файл. . Где находятся текущие строки `device sio__n__`, вам нужно добавить ещё 16 устройств. В следующем примере показана плата Boca Board с прерыванием 3 и базовым адресом ввода-вывода 100h. Адрес ввода-вывода для каждого порта увеличивается на 8 в шестнадцатеричной системе относительно предыдущего порта, поэтому адреса будут 100h, 108h, 110h... + [.programlisting] .... device sio1 at isa? port 0x100 flags 0x1005 device sio2 at isa? port 0x108 flags 0x1005 device sio3 at isa? port 0x110 flags 0x1005 device sio4 at isa? port 0x118 flags 0x1005 ... device sio15 at isa? port 0x170 flags 0x1005 device sio16 at isa? port 0x178 flags 0x1005 irq 3 .... + Запись flags _обязательно_ должна быть изменена по сравнению с этим примером, если вы не используете точно такие же назначения sio. Флаги устанавливаются в соответствии с 0x``__MYY__``, где _M_ обозначает младший номер главного порта (последний порт на Boca 16), а _YY_ указывает, включен или выключен FIFO (включен), используется ли разделение IRQ (да) и есть ли регистр управления IRQ, совместимый с AST/4 (нет). В этом примере, + [.programlisting] .... flags 0x1005 .... указывает, что основной порт - sio16. Если добавить другую плату и назначить порты с sio17 по sio28, флаги для всех 16 портов на _этой_ плате будут 0x1C05, где 1C обозначает минорный номер основного порта. Не изменяйте значение 05. . Сохраните и завершите конфигурацию ядра, перекомпилируйте, установите и перезагрузитесь. Предполагая, что вы успешно установили перекомпилированное ядро и настроили правильный адрес и IRQ, сообщение при загрузке должно указывать на успешное обнаружение портов Boca следующим образом: (очевидно, номера sio, IO и IRQ могут отличаться) + [source, shell] .... sio1 at 0x100-0x107 flags 0x1005 on isa sio1: type 16550A (multiport) sio2 at 0x108-0x10f flags 0x1005 on isa sio2: type 16550A (multiport) sio3 at 0x110-0x117 flags 0x1005 on isa sio3: type 16550A (multiport) sio4 at 0x118-0x11f flags 0x1005 on isa sio4: type 16550A (multiport) sio5 at 0x120-0x127 flags 0x1005 on isa sio5: type 16550A (multiport) sio6 at 0x128-0x12f flags 0x1005 on isa sio6: type 16550A (multiport) sio7 at 0x130-0x137 flags 0x1005 on isa sio7: type 16550A (multiport) sio8 at 0x138-0x13f flags 0x1005 on isa sio8: type 16550A (multiport) sio9 at 0x140-0x147 flags 0x1005 on isa sio9: type 16550A (multiport) sio10 at 0x148-0x14f flags 0x1005 on isa sio10: type 16550A (multiport) sio11 at 0x150-0x157 flags 0x1005 on isa sio11: type 16550A (multiport) sio12 at 0x158-0x15f flags 0x1005 on isa sio12: type 16550A (multiport) sio13 at 0x160-0x167 flags 0x1005 on isa sio13: type 16550A (multiport) sio14 at 0x168-0x16f flags 0x1005 on isa sio14: type 16550A (multiport) sio15 at 0x170-0x177 flags 0x1005 on isa sio15: type 16550A (multiport) sio16 at 0x178-0x17f irq 3 flags 0x1005 on isa sio16: type 16550A (multiport master) .... + Если сообщения проходят слишком быстро, чтобы их увидеть, + [source, shell] .... # dmesg | more .... покажет вам сообщения загрузки. . Далее необходимо создать соответствующие записи в [.filename]#/dev# для устройств с помощью скрипта [.filename]#/dev/MAKEDEV#. Этот шаг можно пропустить, если вы используете FreeBSD 5.X с ядром, в котором включена поддержка man:devfs[5]. + Если вам необходимо создать записи в [.filename]#/dev#, выполните следующую команду от имени `root`: + [source, shell] .... # cd /dev # ./MAKEDEV tty1 # ./MAKEDEV cua1 (everything in between) # ./MAKEDEV ttyg # ./MAKEDEV cuag .... + Если по какой-то причине вам не нужны или не требуются устройства исходящих соединений, вы можете обойтись без создания устройств [.filename]#cua*#. . Если вам нужен быстрый и небрежный способ убедиться, что устройства работают, вы можете просто подключить модем к каждому порту и (как root) + [source, shell] .... # echo at > ttyd* .... для каждого устройства, которое вы создали. Вы _должны_ увидеть, как мигают индикаторы RX для каждого рабочего порта. ==== === Поддержка дешёвых многоканальных UART-карт _Предоставлено Хельге Ольдахом_ mailto:hmo@sep.hamburg.com[hmo@sep.hamburg.com], сентябрь 1999 года Вы когда-нибудь задумывались о поддержке FreeBSD вашей 20-долларовой многофункциональной карты с двумя (или более) COM-портами, разделяющими IRQ? Вот как это сделать: Обычно единственный способ поддержки таких плат — использование отдельного IRQ для каждого порта. Например, если ваша материнская плата имеет встроенный порт [.filename]#COM1# (он же [.filename]#sio0# — адрес ввода-вывода 0x3F8 и IRQ 4), а у вас есть расширительная плата с двумя UART, то обычно их нужно настроить как [.filename]#COM2# (он же [.filename]#sio1# — адрес ввода-вывода 0x2F8 и IRQ 3), а третий порт (он же [.filename]#sio2#) — с адресом 0x3E8 и IRQ 5. Очевидно, это расточительное использование ресурсов IRQ, так как в принципе возможно запустить оба порта расширительной платы с одним IRQ, используя конфигурацию `COM_MULTIPORT`, описанную в предыдущих разделах. Такие недорогие платы ввода-вывода обычно имеют перемычечную матрицу 4x3 для COM-портов, подобную следующей: [.programlisting] .... o o o * Port A | o * o * Port B | o * o o IRQ 2 3 4 5 .... Показано, что порт A подключен для IRQ 5, а порт B — для IRQ 3. Столбцы IRQ на вашей конкретной плате могут отличаться — другие платы могут предоставлять перемычки для IRQ 3, 4, 5 и 7. Можно было бы сделать вывод, что подключение обоих портов к IRQ 3 с помощью самодельной перемычки, замыкающей все три точки соединения в колонке IRQ 3, решит проблему, но это не так. Невозможно дублировать IRQ 3, потому что выходные драйверы каждого UART соединены по схеме "монтажное И", и если один из UART управляет IRQ 3, выходной сигнал будет не таким как ожидается. В зависимости от реализации платы расширения или материнской платы, линия IRQ 3 будет постоянно находиться в высоком уровне или всегда оставаться низкой. Вам необходимо разделить драйверы прерываний для двух UART, чтобы линия прерывания платы поднималась только тогда (и только тогда), когда один из UART вызывает прерывание, и оставалась низкой в противном случае. Решение было предложено Йоргом Вуншем mailto:j@ida.interface-business.de[j@ida.interface-business.de]: припаять монтажную схему "монтажное ИЛИ", состоящую из двух диодов (предпочтительно германиевых или типа Шоттки) и резистора на 1 кОм. Вот схема, начиная с контактного поля 4x3 выше: [.programlisting] .... Diode +---------->|-------+ / | o * o o | 1 kOhm Port A +----|######|-------+ o * o o | | Port B `-------------------+ ==+== o * o o | Ground \ | +--------->|-------+ IRQ 2 3 4 5 Diode .... Катоды диодов соединены в общей точке вместе с подтягивающим резистором 1 кОм. Важно подключить резистор к земле, чтобы избежать плавания линии IRQ на шине. Теперь мы готовы настроить ядро. Продолжая этот пример, мы настроим: [.programlisting] .... # standard on-board COM1 port device sio0 at isa? port "IO_COM1" flags 0x10 # patched-up multi-I/O extension board options COM_MULTIPORT device sio1 at isa? port "IO_COM2" flags 0x205 device sio2 at isa? port "IO_COM3" flags 0x205 irq 3 .... Обратите внимание, что настройка `flags` для [.filename]#sio1# и [.filename]#sio2# действительно важна; подробности смотрите в man:sio[4]. (Обычно `2` в атрибуте "flags" относится к [.filename]#sio#`2`, который содержит IRQ, и вам наверняка потребуется нижний ниббл `5`.) При включённом режиме подробного вывода ядра это должно дать что-то похожее на следующее: [source, shell] .... sio0: irq maps: 0x1 0x11 0x1 0x1 sio0 at 0x3f8-0x3ff irq 4 flags 0x10 on isa sio0: type 16550A sio1: irq maps: 0x1 0x9 0x1 0x1 sio1 at 0x2f8-0x2ff flags 0x205 on isa sio1: type 16550A (multiport) sio2: irq maps: 0x1 0x9 0x1 0x1 sio2 at 0x3e8-0x3ef irq 3 flags 0x205 on isa sio2: type 16550A (multiport master) .... Хотя [.filename]#/sys/i386/isa/sio.c# выглядит несколько загадочно из-за использования массива "irq maps" выше, основная идея заключается в том, что вы наблюдаете `0x1` на первой, третьей и четвертой позициях. Это означает, что соответствующий IRQ был установлен при выводе и сброшен после, что полностью соответствует ожиданиям. Если ваше ядро не демонстрирует такое поведение, скорее всего, проблема в вашей разводке. [[cy]] == Настройка драйвера [.filename]#cy# _Предоставлено Алексом Нэшем. 6 июня 1996._ Многопортовые карты Cyclades основаны на драйвере [.filename]#cy#, а не на обычном драйвере [.filename]#sio#, используемом другими многопортовыми картами. Настройка сводится к простым действиям: [.procedure] ==== . Добавьте устройство [.filename]#cy# в конфигурацию ядра (обратите внимание, что параметры irq и iomem могут отличаться). + [.programlisting] .... device cy0 at isa? irq 10 iomem 0xd4000 iosiz 0x2000 .... . Перестройте и установите новый образ ядра. . Создайте файлы устройств, введя (следующий пример предполагает 8-портовую плату): + [source, shell] .... # cd /dev # for i in 0 1 2 3 4 5 6 7;do ./MAKEDEV cuac$i ttyc$i;done .... . Если необходимо, добавьте записи для коммутируемого доступа в [.filename]#/etc/ttys#, дублируя записи для последовательных устройств (`ttyd`) и используя `ttyc` вместо `ttyd`. Например: + [.programlisting] .... ttyc0 "/usr/libexec/getty std.38400" unknown on insecure ttyc1 "/usr/libexec/getty std.38400" unknown on insecure ttyc2 "/usr/libexec/getty std.38400" unknown on insecure ... ttyc7 "/usr/libexec/getty std.38400" unknown on insecure .... . Перезагрузитесь с новым ядром. ==== == Настройка драйвера [.filename]#si# _Предоставлено `{nsayer}`. 25 марта 1998._ Специальные мультипортные карты Specialix SI/XIO и SX используют драйвер [.filename]#si#. На одной машине может быть установлено до 4 хост-карт. Поддерживаются следующие хост-карты: * ISA SI/XIO host card (2 versions) * EISA SI/XIO host card * PCI SI/XIO host card * ISA SX host card * PCI SX host card Хотя хост-карты SX и SI/XIO выглядят заметно по-разному, их функциональность практически одинакова. Хост-карты не используют порты ввода-вывода, а вместо этого требуют 32К сегмента памяти. Заводская конфигурация для карт ISA размещает этот сегмент по адресу `0xd0000-0xd7fff`. Также им требуется IRQ. Карты PCI, разумеется, настраиваются автоматически. Вы можете подключить до 4 внешних модулей к каждой карте хоста. Внешние модули содержат либо 4, либо 8 последовательных портов. Они бывают следующих видов: * Модули SI на 4 или 8 портов. Поддерживается скорость до 57600 бит/с на каждом порту. * XIO 8-портовые модули. Поддерживается скорость до 115200 бит/с на каждом порту. Один из типов модулей XIO имеет 7 последовательных и 1 параллельный порт. * Модули SXDC с 8 портами. Поддерживается скорость до 921600 бит/с на каждом порту. Как и в случае с XIO, доступен модуль с одним параллельным портом. Для настройки карты хоста ISA добавьте следующую строку в файл конфигурации ядра, изменив числа по мере необходимости: [.programlisting] .... device si0 at isa? iomem 0xd0000 irq 11 .... Допустимые номера IRQ: 9, 10, 11, 12 и 15 для SX ISA host cards и 11, 12 и 15 для SI/XIO ISA host cards. Для настройки карты EISA или PCI используйте следующую строку: [.programlisting] .... device si0 .... После добавления записи конфигурации пересоберите и установите свое новое ядро. [NOTE] ==== Следующий шаг не обязателен, если вы используете man:devfs[5] в FreeBSD 5._X_. ==== После перезагрузки с новым ядром необходимо создать файлы устройств в [.filename]#/dev#. Скрипт [.filename]#MAKEDEV# выполнит эту задачу за вас. Подсчитайте общее количество портов и введите: [source, shell] .... # cd /dev # ./MAKEDEV ttyAnn cuaAnn .... (где _nn_ — количество портов) Если вы хотите, чтобы приглашения к входу отображались на этих портах, вам нужно добавить такие строки в [.filename]#/etc/ttys#: [.programlisting] .... ttyA01 "/usr/libexec/getty std.9600" vt100 on insecure .... Измените тип терминала по необходимости. Для модемов подойдут `dialup` или `unknown`. diff --git a/documentation/content/ru/articles/serial-uart/_index.po b/documentation/content/ru/articles/serial-uart/_index.po index 54dd8dd935..8652e3faf0 100644 --- a/documentation/content/ru/articles/serial-uart/_index.po +++ b/documentation/content/ru/articles/serial-uart/_index.po @@ -1,3904 +1,3862 @@ # SOME DESCRIPTIVE TITLE # Copyright (C) YEAR The FreeBSD Project # This file is distributed under the same license as the FreeBSD Documentation package. # Vladlen Popolitov , 2025, 2026. msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-11-08 16:17+0000\n" -"PO-Revision-Date: 2026-04-05 04:45+0000\n" +"POT-Creation-Date: 2026-08-06 22:55+0100\n" +"PO-Revision-Date: 2026-05-18 04:45+0000\n" "Last-Translator: Vladlen Popolitov \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 4.17\n" #. type: YAML Front Matter: description #: documentation/content/en/articles/serial-uart/_index.adoc:1 #, no-wrap msgid "Detailed information about the use of serial ports and UART with FreeBSD" msgstr "Подробная информация об использовании последовательных портов и UART в FreeBSD" #. type: Title = #: documentation/content/en/articles/serial-uart/_index.adoc:1 #: documentation/content/en/articles/serial-uart/_index.adoc:11 #, no-wrap msgid "Serial and UART Tutorial" msgstr "Учебное руководство по последовательному интерфейсу и UART" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:44 +#: documentation/content/en/articles/serial-uart/_index.adoc:43 msgid "Abstract" msgstr "Аннотация" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:46 +#: documentation/content/en/articles/serial-uart/_index.adoc:45 msgid "This article talks about using serial hardware with FreeBSD." msgstr "" "Эта статья рассказывает об использовании последовательного оборудования с " "FreeBSD." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:48 +#: documentation/content/en/articles/serial-uart/_index.adoc:47 msgid "'''" msgstr "'''" #. type: Title == -#: documentation/content/en/articles/serial-uart/_index.adoc:52 +#: documentation/content/en/articles/serial-uart/_index.adoc:51 #, no-wrap msgid "The UART: What it is and how it works" msgstr "UART: Что это и как работает" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:55 +#: documentation/content/en/articles/serial-uart/_index.adoc:54 msgid "_Copyright (R) 1996 `{uhclem}`, All Rights Reserved. 13 January 1996._" msgstr "" "_Copyright (R) 1996 `{uhclem}`, All Rights Reserved. 13 января 1996 год_" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:59 +#: documentation/content/en/articles/serial-uart/_index.adoc:58 msgid "" "The Universal Asynchronous Receiver/Transmitter (UART) controller is the key " "component of the serial communications subsystem of a computer. The UART " "takes bytes of data and transmits the individual bits in a sequential " "fashion. At the destination, a second UART re-assembles the bits into " "complete bytes." msgstr "" "Универсальный асинхронный приёмопередатчик (UART) — это ключевой компонент " "подсистемы последовательной передачи данных компьютера. UART принимает байты " "данных и передаёт отдельные биты последовательно. На стороне приёмника " "второй UART собирает биты обратно в полные байты." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:61 +#: documentation/content/en/articles/serial-uart/_index.adoc:60 msgid "" "Serial transmission is commonly used with modems and for non-networked " "communication between computers, terminals and other devices." msgstr "" "Последовательная передача данных обычно используется с модемами и для не " "сетевого взаимодействия между компьютерами, терминалами и другими " "устройствами." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:65 +#: documentation/content/en/articles/serial-uart/_index.adoc:64 msgid "" "There are two primary forms of serial transmission: Synchronous and " "Asynchronous. Depending on the modes that are supported by the hardware, " "the name of the communication sub-system will usually include a `A` if it " "supports Asynchronous communications, and a `S` if it supports Synchronous " "communications. Both forms are described below." msgstr "" "Существует две основные формы последовательной передачи данных: синхронная и " "асинхронная. В зависимости от режимов, поддерживаемых оборудованием, " "название подсистемы связи обычно включает букву `A`, если она поддерживает " "асинхронную передачу, и букву `S`, если поддерживается синхронная передача. " "Обе формы описаны ниже." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:67 +#: documentation/content/en/articles/serial-uart/_index.adoc:66 msgid "Some common acronyms are:" msgstr "Некоторые распространённые сокращения:" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:70 +#: documentation/content/en/articles/serial-uart/_index.adoc:69 msgid "UART Universal Asynchronous Receiver/Transmitter" msgstr "" "UART Universal Asynchronous Receiver/Transmitter — Универсальный асинхронный " "приёмопередатчик" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:73 +#: documentation/content/en/articles/serial-uart/_index.adoc:72 msgid "USART Universal Synchronous-Asynchronous Receiver/Transmitter" msgstr "" "USART Universal Synchronous-Asynchronous Receiver/Transmitter — " "Универсальный синхронно-асинхронный приёмопередатчик" #. type: Title === -#: documentation/content/en/articles/serial-uart/_index.adoc:74 +#: documentation/content/en/articles/serial-uart/_index.adoc:73 #, no-wrap msgid "Synchronous Serial Transmission" msgstr "Синхронная последовательная передача" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:79 +#: documentation/content/en/articles/serial-uart/_index.adoc:78 msgid "" "Synchronous serial transmission requires that the sender and receiver share " "a clock with one another, or that the sender provide a strobe or other " "timing signal so that the receiver knows when to \"read\" the next bit of " "the data. In most forms of serial Synchronous communication, if there is no " "data available at a given instant to transmit, a fill character must be sent " "instead so that data is always being transmitted. Synchronous communication " "is usually more efficient because only data bits are transmitted between " "sender and receiver, and synchronous communication can be more costly if " "extra wiring and circuits are required to share a clock signal between the " "sender and receiver." msgstr "" "Синхронная последовательная передача данных требует, чтобы отправитель и " "получатель имели общий тактовый сигнал, либо чтобы отправитель предоставлял " "строб-сигнал или другой сигнал синхронизации, чтобы получатель знал, когда " "\"считывать\" следующий бит данных. В большинстве форм синхронной " "последовательной связи, если в данный момент нет доступных данных для " "передачи, вместо них должен быть отправлен заполняющий символ, чтобы " "передача данных не прерывалась. Синхронная связь обычно более эффективна, " "так как между отправителем и получателем передаются только биты данных, " "однако она может быть более затратной, если требуются дополнительные провода " "и схемы для обмена тактовым сигналом между отправителем и получателем." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:83 +#: documentation/content/en/articles/serial-uart/_index.adoc:82 msgid "" "A form of Synchronous transmission is used with printers and fixed disk " "devices in that the data is sent on one set of wires while a clock or strobe " "is sent on a different wire. Printers and fixed disk devices are not " "normally serial devices because most fixed disk interface standards send an " "entire word of data for each clock or strobe signal by using a separate wire " "for each bit of the word. In the PC industry, these are known as Parallel " "devices." msgstr "" "Форма синхронной передачи используется с принтерами и устройствами с " "жёсткими дисками, где данные передаются по одному набору проводов, а " "тактовый сигнал или строб — по другому проводу. Принтеры и устройства с " "жёсткими дисками обычно не являются последовательными устройствами, так как " "большинство стандартов интерфейсов жёстких дисков передают целое слово " "данных для каждого тактового сигнала или строба, используя отдельный провод " "для каждого бита слова. В индустрии ПК такие устройства известны как " "параллельные." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:86 +#: documentation/content/en/articles/serial-uart/_index.adoc:85 msgid "" "The standard serial communications hardware in the PC does not support " "Synchronous operations. This mode is described here for comparison purposes " "only." msgstr "" "Стандартное оборудование для последовательной связи в ПК не поддерживает " "синхронные операции. Этот режим описан здесь только для сравнения." #. type: Title === -#: documentation/content/en/articles/serial-uart/_index.adoc:87 +#: documentation/content/en/articles/serial-uart/_index.adoc:86 #, no-wrap msgid "Asynchronous Serial Transmission" msgstr "Асинхронная последовательная передача" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:91 +#: documentation/content/en/articles/serial-uart/_index.adoc:90 msgid "" "Asynchronous transmission allows data to be transmitted without the sender " "having to send a clock signal to the receiver. Instead, the sender and " "receiver must agree on timing parameters in advance and special bits are " "added to each word which are used to synchronize the sending and receiving " "units." msgstr "" "Асинхронная передача позволяет передавать данные без необходимости отправки " "тактового сигнала от отправителя к получателю. Вместо этого отправитель и " "получатель заранее согласовывают параметры синхронизации, а к каждому слову " "добавляются специальные биты, которые используются для синхронизации " "передающего и принимающего устройств." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:96 +#: documentation/content/en/articles/serial-uart/_index.adoc:95 msgid "" "When a word is given to the UART for Asynchronous transmissions, a bit " "called the \"Start Bit\" is added to the beginning of each word that is to " "be transmitted. The Start Bit is used to alert the receiver that a word of " "data is about to be sent, and to force the clock in the receiver into " "synchronization with the clock in the transmitter. These two clocks must be " "accurate enough to not have the frequency drift by more than 10% during the " "transmission of the remaining bits in the word. (This requirement was set " "in the days of mechanical teleprinters and is easily met by modern " "electronic equipment.)" msgstr "" "При передаче слова через UART в асинхронном режиме к началу каждого " "передаваемого слова добавляется бит, называемый \"стартовым битом\". " "Стартовый бит используется для оповещения приёмника о начале передачи слова " "данных, а также для синхронизации тактового сигнала приёмника с тактовым " "сигналом передатчика. Эти два тактовых сигнала должны быть достаточно " "точными, чтобы их расхождение по частоте не превышало 10% во время передачи " "оставшихся битов слова. (Данное требование было установлено во времена " "механических телетайпов и легко выполняется современным электронным " "оборудованием.)" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:100 +#: documentation/content/en/articles/serial-uart/_index.adoc:99 msgid "" "After the Start Bit, the individual bits of the word of data are sent, with " "the Least Significant Bit (LSB) being sent first. Each bit in the " "transmission is transmitted for exactly the same amount of time as all of " "the other bits, and the receiver \"looks\" at the wire at approximately " "halfway through the period assigned to each bit to determine if the bit is a " "`1` or a `0`. For example, if it takes two seconds to send each bit, the " "receiver will examine the signal to determine if it is a `1` or a `0` after " "one second has passed, then it will wait two seconds and then examine the " "value of the next bit, and so on." msgstr "" "После стартового бита передаются отдельные биты слова данных, начиная с " "младшего значащего бита (LSB). Каждый бит передаётся в течение точно такого " "же времени, как и все остальные биты, и приемник \"проверяет\" состояние " "линии примерно на середине интервала, отведенного для каждого бита, чтобы " "определить, является ли бит `1` или `0`. Например, если передача каждого " "бита занимает две секунды, приемник проверит сигнал, чтобы определить, " "является ли он `1` или `0`, через одну секунду, затем подождет две секунды и " "проверит значение следующего бита, и так далее." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:103 +#: documentation/content/en/articles/serial-uart/_index.adoc:102 msgid "" "The sender does not know when the receiver has \"looked\" at the value of " "the bit. The sender only knows when the clock says to begin transmitting " "the next bit of the word." msgstr "" "Отправитель не знает, когда получатель «посмотрел» значение бита. " "Отправитель знает только, когда по тактовому сигналу нужно начать передачу " "следующего бита слова." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:107 +#: documentation/content/en/articles/serial-uart/_index.adoc:106 msgid "" "When the entire data word has been sent, the transmitter may add a Parity " "Bit that the transmitter generates. The Parity Bit may be used by the " "receiver to perform simple error checking. Then at least one Stop Bit is " "sent by the transmitter." msgstr "" "Когда все слово данных отправлено, передатчик может добавить бит чётности, " "который он генерирует. Бит чётности может быть использован приемником для " "выполнения простой проверки на ошибки. Затем передатчик отправляет как " "минимум один стоповый бит." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:111 +#: documentation/content/en/articles/serial-uart/_index.adoc:110 msgid "" "When the receiver has received all of the bits in the data word, it may " "check for the Parity Bits (both sender and receiver must agree on whether a " "Parity Bit is to be used), and then the receiver looks for a Stop Bit. If " "the Stop Bit does not appear when it is supposed to, the UART considers the " "entire word to be garbled and will report a Framing Error to the host " "processor when the data word is read. The usual cause of a Framing Error is " "that the sender and receiver clocks were not running at the same speed, or " "that the signal was interrupted." msgstr "" "Когда приемник получил все биты в слове данных, он может проверить биты " "чётности (как отправитель, так и приемник должны договориться о том, будет " "ли использоваться бит чётности), а затем приемник ищет стоповый бит. Если " "стоповый бит не появляется, когда должен, UART считает все слово искаженным " "и сообщит об ошибке кадрирования главному процессору при чтении слова " "данных. Обычная причина ошибки кадрирования — несовпадение скорости тактовых " "сигналов отправителя и приемника или прерывание сигнала." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:114 +#: documentation/content/en/articles/serial-uart/_index.adoc:113 msgid "" "Regardless of whether the data was received correctly or not, the UART " "automatically discards the Start, Parity and Stop bits. If the sender and " "receiver are configured identically, these bits are not passed to the host." msgstr "" "Независимо от того, были ли данные получены правильно или нет, UART " "автоматически отбрасывает бит чётности, стартовый и стоповый биты. Если " "отправитель и получатель настроены одинаково, эти биты не передаются хосту." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:116 +#: documentation/content/en/articles/serial-uart/_index.adoc:115 msgid "" "If another word is ready for transmission, the Start Bit for the new word " "can be sent as soon as the Stop Bit for the previous word has been sent." msgstr "" "Если готово следующее слово для передачи, стартовый бит нового слова может " "быть отправлен сразу после того, как будет отправлен стоповый бит " "предыдущего слова." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:118 +#: documentation/content/en/articles/serial-uart/_index.adoc:117 msgid "" "As asynchronous data is \"self synchronizing\", if there is no data to " "transmit, the transmission line can be idle." msgstr "" "Поскольку асинхронные данные являются \"самосинхронизирующимися\", если нет " "данных для передачи, линия передачи может быть неактивна." #. type: Title === -#: documentation/content/en/articles/serial-uart/_index.adoc:119 +#: documentation/content/en/articles/serial-uart/_index.adoc:118 #, no-wrap msgid "Other UART Functions" msgstr "Другие функции UART" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:124 +#: documentation/content/en/articles/serial-uart/_index.adoc:123 msgid "" "In addition to the basic job of converting data from parallel to serial for " "transmission and from serial to parallel on reception, a UART will usually " "provide additional circuits for signals that can be used to indicate the " "state of the transmission media, and to regulate the flow of data in the " "event that the remote device is not prepared to accept more data. For " "example, when the device connected to the UART is a modem, the modem may " "report the presence of a carrier on the phone line while the computer may be " "able to instruct the modem to reset itself or to not take calls by raising " "or lowering one more of these extra signals. The function of each of these " "additional signals is defined in the EIA RS232-C standard." msgstr "" "Помимо основной задачи преобразования данных из параллельного формата в " "последовательный для передачи и из последовательного в параллельный при " "приеме, UART обычно предоставляет дополнительные схемы для сигналов, которые " "могут использоваться для указания состояния среды передачи и регулирования " "потока данных в случае, если удалённое устройство не готово принимать больше " -"данных. Например, когда устройство, подключенное к UART, является модемом, " +"данных. Например, когда устройство, подключённое к UART, является модемом, " "модем может сообщать о наличии несущей на телефонной линии, в то время как " "компьютер может дать команду модему сбросить себя или не принимать вызовы, " "поднимая или опуская один или несколько из этих дополнительных сигналов. " "Функция каждого из этих дополнительных сигналов определена в стандарте EIA " "RS232-C." #. type: Title === -#: documentation/content/en/articles/serial-uart/_index.adoc:125 +#: documentation/content/en/articles/serial-uart/_index.adoc:124 #, no-wrap msgid "The RS232-C and V.24 Standards" msgstr "Стандарты RS232-C и V.24" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:129 +#: documentation/content/en/articles/serial-uart/_index.adoc:128 msgid "" "In most computer systems, the UART is connected to circuitry that generates " "signals that comply with the EIA RS232-C specification. There is also a " "CCITT standard named V.24 that mirrors the specifications included in RS232-" "C." msgstr "" "В большинстве компьютерных систем UART подключен к схеме, которая генерирует " "сигналы, соответствующие спецификации EIA RS232-C. Также существует стандарт " -"CCITT под названием V.24, который отражает спецификации, включенные в RS232-" +"CCITT под названием V.24, который отражает спецификации, включённые в RS232-" "C." #. type: Title ==== -#: documentation/content/en/articles/serial-uart/_index.adoc:130 +#: documentation/content/en/articles/serial-uart/_index.adoc:129 #, no-wrap msgid "RS232-C Bit Assignments (Marks and Spaces)" msgstr "Назначения битов RS232-C (метки и пробелы)" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:134 +#: documentation/content/en/articles/serial-uart/_index.adoc:133 msgid "" "In RS232-C, a value of `1` is called a `Mark` and a value of `0` is called a " "`Space`. When a communication line is idle, the line is said to be \"Marking" "\", or transmitting continuous `1` values." msgstr "" "В стандарте RS232-C значение `1` называется `Маркер` (Mark), а значение `0` " "— `Пробел` (Space). Когда линия связи находится в состоянии покоя, говорят, " "что она \"маркирует\" (Marking), то есть передаёт непрерывные значения `1`." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:139 +#: documentation/content/en/articles/serial-uart/_index.adoc:138 msgid "" "The Start bit always has a value of `0` (a Space). The Stop Bit always has " "a value of `1` (a Mark). This means that there will always be a Mark (1) to " "Space (0) transition on the line at the start of every word, even when " "multiple word are transmitted back to back. This guarantees that sender and " "receiver can resynchronize their clocks regardless of the content of the " "data bits that are being transmitted." msgstr "" "Стартовый бит всегда имеет значение `0` (пробел). Стоповый бит всегда имеет " "значение `1` (метка). Это означает, что на линии всегда будет переход от " "метки (1) к пробелу (0) в начале каждого слова, даже при передаче нескольких " "слов подряд. Это гарантирует, что отправитель и получатель могут " "синхронизировать свои тактовые сигналы независимо от содержимого " "передаваемых битов данных." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:141 +#: documentation/content/en/articles/serial-uart/_index.adoc:140 msgid "" "The idle time between Stop and Start bits does not have to be an exact " "multiple (including zero) of the bit rate of the communication link, but " "most UARTs are designed this way for simplicity." msgstr "" "Время простоя между стоповым и стартовым битами не обязательно должно быть " "точным кратным (включая ноль) скорости передачи данных коммуникационного " "канала, однако большинство UART спроектированы таким образом для простоты." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:145 +#: documentation/content/en/articles/serial-uart/_index.adoc:144 msgid "" "In RS232-C, the \"Marking\" signal (a `1`) is represented by a voltage " "between -2 VDC and -12 VDC, and a \"Spacing\" signal (a `0`) is represented " "by a voltage between 0 and +12 VDC. The transmitter is supposed to send +12 " "VDC or -12 VDC, and the receiver is supposed to allow for some voltage loss " "in long cables. Some transmitters in low power devices (like portable " "computers) sometimes use only +5 VDC and -5 VDC, but these values are still " "acceptable to a RS232-C receiver, provided that the cable lengths are short." msgstr "" "В стандарте RS232-C сигнал «Marking» (логическая `1`) представлен " "напряжением от -2 В до -12 В, а сигнал «Spacing» (логический `0`) — " "напряжением от 0 В до +12 В. Передатчик должен выдавать +12 В или -12 В, а " "приёмник должен учитывать возможные потери напряжения в длинных кабелях. " "Некоторые маломощные передатчики (например, в портативных компьютерах) " "иногда используют только +5 В и -5 В, но эти значения всё ещё допустимы для " "приёмника RS232-C при условии использования коротких кабелей." #. type: Title ==== -#: documentation/content/en/articles/serial-uart/_index.adoc:146 +#: documentation/content/en/articles/serial-uart/_index.adoc:145 #, no-wrap msgid "RS232-C Break Signal" msgstr "Сигнал Break в RS232-C" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:150 +#: documentation/content/en/articles/serial-uart/_index.adoc:149 msgid "" "RS232-C also specifies a signal called a `Break`, which is caused by sending " "continuous Spacing values (no Start or Stop bits). When there is no " "electricity present on the data circuit, the line is considered to be " "sending `Break`." msgstr "" "RS232-C также определяет сигнал под названием `Break`, который вызывается " "передачей непрерывных значений Spacing (без стартовых или стоповых битов). " "Когда на линии данных отсутствует напряжение, считается, что линия передаёт " "`Break`." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:153 +#: documentation/content/en/articles/serial-uart/_index.adoc:152 msgid "" "The `Break` signal must be of a duration longer than the time it takes to " "send a complete byte plus Start, Stop and Parity bits. Most UARTs can " "distinguish between a Framing Error and a Break, but if the UART cannot do " "this, the Framing Error detection can be used to identify Breaks." msgstr "" "Сигнал `Break` должен иметь длительность больше, чем время, необходимое для " "передачи полного байта, включая стартовый, стоповый и биты чётности. " "Большинство UART способны различить ошибку кадрирования и сигнал Break, но " "если UART не поддерживает эту функцию, для определения Break можно " "использовать обнаружение ошибки кадрирования." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:156 +#: documentation/content/en/articles/serial-uart/_index.adoc:155 msgid "" "In the days of teleprinters, when numerous printers around the country were " "wired in series (such as news services), any unit could cause a `Break` by " "temporarily opening the entire circuit so that no current flowed. This was " "used to allow a location with urgent news to interrupt some other location " "that was currently sending information." msgstr "" "Во времена телетайпов, когда множество принтеров по всей стране были " "соединены последовательно (например, в службах новостей), любое устройство " "могло вызвать `Break`, временно размыкая всю цепь, чтобы ток не протекал. " "Это использовалось для того, чтобы место с срочными новостями могло прервать " "устройство в другом месте, которое в данный момент передавало информацию." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:161 +#: documentation/content/en/articles/serial-uart/_index.adoc:160 msgid "" "In modern systems there are two types of Break signals. If the Break is " "longer than 1.6 seconds, it is considered a \"Modem Break\", and some modems " "can be programmed to terminate the conversation and go on-hook or enter the " "modems' command mode when the modem detects this signal. If the Break is " "smaller than 1.6 seconds, it signifies a Data Break and it is up to the " "remote computer to respond to this signal. Sometimes this form of Break is " "used as an Attention or Interrupt signal and sometimes is accepted as a " "substitute for the ASCII CONTROL-C character." msgstr "" "В современных системах существует два типа сигналов Break. Если Break длится " "дольше 1,6 секунд, он считается \"Модемным Break\", и некоторые модемы можно " "запрограммировать на завершение соединения и переход в режим ожидания или " "вход в командный режим модема при обнаружении этого сигнала. Если Break " "короче 1,6 секунд, это означает \"Break данных\", и удалённый компьютер " "должен решить, как реагировать на этот сигнал. Иногда такая форма Break " "используется как сигнал \"Внимание\" или \"Прерывание\", а иногда " "принимается как замена символу ASCII CONTROL-C." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:163 +#: documentation/content/en/articles/serial-uart/_index.adoc:162 msgid "" "Marks and Spaces are also equivalent to \"Holes\" and \"No Holes\" in paper " "tape systems." msgstr "" "Метки и пробелы также эквивалентны \"дыркам\" и \"отсутствию дырок\" в " "системах с бумажной лентой." #. type: delimited block = 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:168 +#: documentation/content/en/articles/serial-uart/_index.adoc:167 msgid "" "Breaks cannot be generated from paper tape or from any other byte value, " "since bytes are always sent with Start and Stop bit. The UART is usually " "capable of generating the continuous Spacing signal in response to a special " "command from the host processor." msgstr "" "Разрывы не могут быть сгенерированы с перфоленты или из любого другого " "байтового значения, поскольку байты всегда отправляются со стартовым и " "стоповым битами. UART обычно способен генерировать непрерывный сигнал " "Spacing в ответ на специальную команду от главного управляющего устройства " "(процессора передачи)." #. type: Title ==== -#: documentation/content/en/articles/serial-uart/_index.adoc:170 +#: documentation/content/en/articles/serial-uart/_index.adoc:169 #, no-wrap msgid "RS232-C DTE and DCE Devices" msgstr "RS232-C устройства DTE и DCE" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:176 +#: documentation/content/en/articles/serial-uart/_index.adoc:175 msgid "" "The RS232-C specification defines two types of equipment: the Data Terminal " "Equipment (DTE) and the Data Carrier Equipment (DCE). Usually, the DTE " "device is the terminal (or computer), and the DCE is a modem. Across the " "phone line at the other end of a conversation, the receiving modem is also a " "DCE device and the computer that is connected to that modem is a DTE " "device. The DCE device receives signals on the pins that the DTE device " "transmits on, and vice versa." msgstr "" "Спецификация RS232-C определяет два типа оборудования: оконечное " "оборудование данных (DTE — Data Terminal Equipment) и оборудование передачи " "данных (DCE — Data Carrier Equipment). Обычно устройство DTE — это терминал " "(или компьютер), а DCE — модем. На другом конце телефонной линии в разговоре " "принимающий модем также является устройством DCE, а компьютер, подключённый " "к этому модему, — устройством DTE. Устройство DCE принимает сигналы на тех " "контактах, на которых устройство DTE передаёт, и наоборот." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:180 +#: documentation/content/en/articles/serial-uart/_index.adoc:179 msgid "" "When two devices that are both DTE or both DCE must be connected together " "without a modem or a similar media translator between them, a NULL modem " "must be used. The NULL modem electrically re-arranges the cabling so that " "the transmitter output is connected to the receiver input on the other " "device, and vice versa. Similar translations are performed on all of the " "control signals so that each device will see what it thinks are DCE (or DTE) " "signals from the other device." msgstr "" "Когда два устройства, оба являющиеся DTE или DCE, должны быть соединены " "вместе без модема или аналогичного преобразователя среды между ними, " "необходимо использовать NULL модем. NULL модем электрически перестраивает " "кабель так, что выход передатчика подключается ко входу приемника на другом " "устройстве, и наоборот. Аналогичные преобразования выполняются для всех " "управляющих сигналов, чтобы каждое устройство видело то, что оно считает " "сигналами DCE (или DTE) от другого устройства." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:183 +#: documentation/content/en/articles/serial-uart/_index.adoc:182 msgid "" "The number of signals generated by the DTE and DCE devices are not " "symmetrical. The DTE device generates fewer signals for the DCE device than " "the DTE device receives from the DCE." msgstr "" "Количество сигналов, генерируемых устройствами DTE и DCE, не симметрично. " "Устройство DTE генерирует меньше сигналов для устройства DCE, чем получает " "от него." #. type: Title ==== -#: documentation/content/en/articles/serial-uart/_index.adoc:184 +#: documentation/content/en/articles/serial-uart/_index.adoc:183 #, no-wrap msgid "RS232-C Pin Assignments" msgstr "Назначение контактов RS232-C" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:187 +#: documentation/content/en/articles/serial-uart/_index.adoc:186 msgid "" "The EIA RS232-C specification (and the ITU equivalent, V.24) calls for a " "twenty-five pin connector (usually a DB25) and defines the purpose of most " "of the pins in that connector." msgstr "" "Спецификация EIA RS232-C (и её эквивалент ITU, V.24) предусматривает " "использование двадцатипятиконтактного разъёма (обычно DB25) и определяет " "назначение большинства контактов в этом разъёме." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:190 +#: documentation/content/en/articles/serial-uart/_index.adoc:189 msgid "" "In the IBM Personal Computer and similar systems, a subset of RS232-C " "signals are provided via nine pin connectors (DB9). The signals that are " "not included on the PC connector deal mainly with synchronous operation, and " "this transmission mode is not supported by the UART that IBM selected for " "use in the IBM PC." msgstr "" "В IBM Personal Computer и подобных системах подмножество сигналов RS232-C " "предоставляется через девятиконтактные разъемы (DB9). Сигналы, которые не " "включены в разъем ПК, в основном связаны с синхронной работой, и этот режим " "передачи не поддерживается UART, выбранным IBM для использования в IBM PC." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:193 +#: documentation/content/en/articles/serial-uart/_index.adoc:192 msgid "" "Depending on the computer manufacturer, a DB25, a DB9, or both types of " "connector may be used for RS232-C communications. (The IBM PC also uses a " "DB25 connector for the parallel printer interface which causes some " "confusion.)" msgstr "" "В зависимости от производителя компьютера, для связи по RS232-C могут " "использоваться разъемы DB25, DB9 или оба типа. (В IBM PC также используется " "разъем DB25 для параллельного интерфейса принтера, что иногда вызывает " "путаницу.)" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:195 +#: documentation/content/en/articles/serial-uart/_index.adoc:194 msgid "" "Below is a table of the RS232-C signal assignments in the DB25 and DB9 " "connectors." msgstr "" "Ниже представлена таблица назначений сигналов RS232-C в разъемах DB25 и DB9." #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:200 +#: documentation/content/en/articles/serial-uart/_index.adoc:199 #, no-wrap msgid "DB25 RS232-C Pin" msgstr "Контакт в DB25 RS232-C" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:201 +#: documentation/content/en/articles/serial-uart/_index.adoc:200 #, no-wrap msgid "DB9 IBM PC Pin" msgstr "Контакт в DB9 IBM PC" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:202 +#: documentation/content/en/articles/serial-uart/_index.adoc:201 #, no-wrap msgid "EIA Circuit Symbol" msgstr "Символ цепи по EIA" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:203 +#: documentation/content/en/articles/serial-uart/_index.adoc:202 #, no-wrap msgid "CCITT Circuit Symbol" msgstr "Символ цепи по CCITT" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:204 +#: documentation/content/en/articles/serial-uart/_index.adoc:203 #, no-wrap msgid "Common Name" msgstr "Общее имя" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:205 +#: documentation/content/en/articles/serial-uart/_index.adoc:204 #, no-wrap msgid "Signal Source" msgstr "Источник сигнала" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:207 -#: documentation/content/en/articles/serial-uart/_index.adoc:675 +#: documentation/content/en/articles/serial-uart/_index.adoc:206 +#: documentation/content/en/articles/serial-uart/_index.adoc:674 #, no-wrap msgid "Description" msgstr "Описание" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:208 -#: documentation/content/en/articles/serial-uart/_index.adoc:265 +#: documentation/content/en/articles/serial-uart/_index.adoc:207 +#: documentation/content/en/articles/serial-uart/_index.adoc:264 #, no-wrap msgid "1" msgstr "1" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:209 -#: documentation/content/en/articles/serial-uart/_index.adoc:213 -#: documentation/content/en/articles/serial-uart/_index.adoc:261 +#: documentation/content/en/articles/serial-uart/_index.adoc:208 +#: documentation/content/en/articles/serial-uart/_index.adoc:212 +#: documentation/content/en/articles/serial-uart/_index.adoc:260 +#: documentation/content/en/articles/serial-uart/_index.adoc:272 #: documentation/content/en/articles/serial-uart/_index.adoc:273 #: documentation/content/en/articles/serial-uart/_index.adoc:274 #: documentation/content/en/articles/serial-uart/_index.adoc:275 #: documentation/content/en/articles/serial-uart/_index.adoc:276 -#: documentation/content/en/articles/serial-uart/_index.adoc:277 +#: documentation/content/en/articles/serial-uart/_index.adoc:280 #: documentation/content/en/articles/serial-uart/_index.adoc:281 #: documentation/content/en/articles/serial-uart/_index.adoc:282 #: documentation/content/en/articles/serial-uart/_index.adoc:283 #: documentation/content/en/articles/serial-uart/_index.adoc:284 -#: documentation/content/en/articles/serial-uart/_index.adoc:285 +#: documentation/content/en/articles/serial-uart/_index.adoc:288 #: documentation/content/en/articles/serial-uart/_index.adoc:289 #: documentation/content/en/articles/serial-uart/_index.adoc:290 #: documentation/content/en/articles/serial-uart/_index.adoc:291 #: documentation/content/en/articles/serial-uart/_index.adoc:292 -#: documentation/content/en/articles/serial-uart/_index.adoc:293 -#: documentation/content/en/articles/serial-uart/_index.adoc:297 -#: documentation/content/en/articles/serial-uart/_index.adoc:305 -#: documentation/content/en/articles/serial-uart/_index.adoc:313 -#: documentation/content/en/articles/serial-uart/_index.adoc:321 -#: documentation/content/en/articles/serial-uart/_index.adoc:329 -#: documentation/content/en/articles/serial-uart/_index.adoc:337 +#: documentation/content/en/articles/serial-uart/_index.adoc:296 +#: documentation/content/en/articles/serial-uart/_index.adoc:304 +#: documentation/content/en/articles/serial-uart/_index.adoc:312 +#: documentation/content/en/articles/serial-uart/_index.adoc:320 +#: documentation/content/en/articles/serial-uart/_index.adoc:328 +#: documentation/content/en/articles/serial-uart/_index.adoc:336 +#: documentation/content/en/articles/serial-uart/_index.adoc:344 #: documentation/content/en/articles/serial-uart/_index.adoc:345 -#: documentation/content/en/articles/serial-uart/_index.adoc:346 -#: documentation/content/en/articles/serial-uart/_index.adoc:353 +#: documentation/content/en/articles/serial-uart/_index.adoc:352 +#: documentation/content/en/articles/serial-uart/_index.adoc:368 #: documentation/content/en/articles/serial-uart/_index.adoc:369 #: documentation/content/en/articles/serial-uart/_index.adoc:370 -#: documentation/content/en/articles/serial-uart/_index.adoc:371 -#: documentation/content/en/articles/serial-uart/_index.adoc:385 -#: documentation/content/en/articles/serial-uart/_index.adoc:393 +#: documentation/content/en/articles/serial-uart/_index.adoc:384 +#: documentation/content/en/articles/serial-uart/_index.adoc:392 +#: documentation/content/en/articles/serial-uart/_index.adoc:400 #: documentation/content/en/articles/serial-uart/_index.adoc:401 -#: documentation/content/en/articles/serial-uart/_index.adoc:402 -#: documentation/content/en/articles/serial-uart/_index.adoc:404 +#: documentation/content/en/articles/serial-uart/_index.adoc:403 #, no-wrap msgid "-" msgstr "-" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:210 +#: documentation/content/en/articles/serial-uart/_index.adoc:209 #, no-wrap msgid "AA" msgstr "AA" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:211 +#: documentation/content/en/articles/serial-uart/_index.adoc:210 #, no-wrap msgid "101" msgstr "101" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:212 +#: documentation/content/en/articles/serial-uart/_index.adoc:211 #, no-wrap msgid "PG/FG" msgstr "PG/FG" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:215 +#: documentation/content/en/articles/serial-uart/_index.adoc:214 #, no-wrap msgid "Frame/Protective Ground" msgstr "Защитное заземление (Frame/Protective Ground)" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:216 -#: documentation/content/en/articles/serial-uart/_index.adoc:225 +#: documentation/content/en/articles/serial-uart/_index.adoc:215 +#: documentation/content/en/articles/serial-uart/_index.adoc:224 #, no-wrap msgid "2" msgstr "2" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:217 -#: documentation/content/en/articles/serial-uart/_index.adoc:224 -#: documentation/content/en/articles/serial-uart/_index.adoc:610 +#: documentation/content/en/articles/serial-uart/_index.adoc:216 +#: documentation/content/en/articles/serial-uart/_index.adoc:223 +#: documentation/content/en/articles/serial-uart/_index.adoc:609 #, no-wrap msgid "3" msgstr "3" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:218 +#: documentation/content/en/articles/serial-uart/_index.adoc:217 #, no-wrap msgid "BA" msgstr "BA" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:219 +#: documentation/content/en/articles/serial-uart/_index.adoc:218 #, no-wrap msgid "103" msgstr "103" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:220 +#: documentation/content/en/articles/serial-uart/_index.adoc:219 #, no-wrap msgid "TD" msgstr "TD" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:221 -#: documentation/content/en/articles/serial-uart/_index.adoc:237 -#: documentation/content/en/articles/serial-uart/_index.adoc:317 -#: documentation/content/en/articles/serial-uart/_index.adoc:349 -#: documentation/content/en/articles/serial-uart/_index.adoc:357 -#: documentation/content/en/articles/serial-uart/_index.adoc:365 -#: documentation/content/en/articles/serial-uart/_index.adoc:373 -#: documentation/content/en/articles/serial-uart/_index.adoc:389 -#: documentation/content/en/articles/serial-uart/_index.adoc:397 +#: documentation/content/en/articles/serial-uart/_index.adoc:220 +#: documentation/content/en/articles/serial-uart/_index.adoc:236 +#: documentation/content/en/articles/serial-uart/_index.adoc:316 +#: documentation/content/en/articles/serial-uart/_index.adoc:348 +#: documentation/content/en/articles/serial-uart/_index.adoc:356 +#: documentation/content/en/articles/serial-uart/_index.adoc:364 +#: documentation/content/en/articles/serial-uart/_index.adoc:372 +#: documentation/content/en/articles/serial-uart/_index.adoc:388 +#: documentation/content/en/articles/serial-uart/_index.adoc:396 #, no-wrap msgid "DTE" msgstr "DTE" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:223 +#: documentation/content/en/articles/serial-uart/_index.adoc:222 #, no-wrap msgid "Transmit Data" msgstr "Передача Данных (Transmit Data)" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:226 +#: documentation/content/en/articles/serial-uart/_index.adoc:225 #, no-wrap msgid "BB" msgstr "BB" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:227 +#: documentation/content/en/articles/serial-uart/_index.adoc:226 #, no-wrap msgid "104" msgstr "104" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:228 +#: documentation/content/en/articles/serial-uart/_index.adoc:227 #, no-wrap msgid "RD" msgstr "RD" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:229 -#: documentation/content/en/articles/serial-uart/_index.adoc:245 -#: documentation/content/en/articles/serial-uart/_index.adoc:253 -#: documentation/content/en/articles/serial-uart/_index.adoc:269 -#: documentation/content/en/articles/serial-uart/_index.adoc:301 -#: documentation/content/en/articles/serial-uart/_index.adoc:309 -#: documentation/content/en/articles/serial-uart/_index.adoc:325 -#: documentation/content/en/articles/serial-uart/_index.adoc:333 -#: documentation/content/en/articles/serial-uart/_index.adoc:341 -#: documentation/content/en/articles/serial-uart/_index.adoc:381 -#: documentation/content/en/articles/serial-uart/_index.adoc:405 +#: documentation/content/en/articles/serial-uart/_index.adoc:228 +#: documentation/content/en/articles/serial-uart/_index.adoc:244 +#: documentation/content/en/articles/serial-uart/_index.adoc:252 +#: documentation/content/en/articles/serial-uart/_index.adoc:268 +#: documentation/content/en/articles/serial-uart/_index.adoc:300 +#: documentation/content/en/articles/serial-uart/_index.adoc:308 +#: documentation/content/en/articles/serial-uart/_index.adoc:324 +#: documentation/content/en/articles/serial-uart/_index.adoc:332 +#: documentation/content/en/articles/serial-uart/_index.adoc:340 +#: documentation/content/en/articles/serial-uart/_index.adoc:380 +#: documentation/content/en/articles/serial-uart/_index.adoc:404 #, no-wrap msgid "DCE" msgstr "DCE" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:231 +#: documentation/content/en/articles/serial-uart/_index.adoc:230 #, no-wrap msgid "Receive Data" msgstr "Прием данных (Receive Data)" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:232 -#: documentation/content/en/articles/serial-uart/_index.adoc:361 +#: documentation/content/en/articles/serial-uart/_index.adoc:231 +#: documentation/content/en/articles/serial-uart/_index.adoc:360 #, no-wrap msgid "4" msgstr "4" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:233 -#: documentation/content/en/articles/serial-uart/_index.adoc:256 +#: documentation/content/en/articles/serial-uart/_index.adoc:232 +#: documentation/content/en/articles/serial-uart/_index.adoc:255 #, no-wrap msgid "7" msgstr "7" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:234 +#: documentation/content/en/articles/serial-uart/_index.adoc:233 #, no-wrap msgid "CA" msgstr "CA" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:235 +#: documentation/content/en/articles/serial-uart/_index.adoc:234 #, no-wrap msgid "105" msgstr "105" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:236 +#: documentation/content/en/articles/serial-uart/_index.adoc:235 #, no-wrap msgid "RTS" msgstr "RTS" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:239 +#: documentation/content/en/articles/serial-uart/_index.adoc:238 #, no-wrap msgid "Request to Send" msgstr "Запрос на передачу (Request to Send)" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:240 -#: documentation/content/en/articles/serial-uart/_index.adoc:257 +#: documentation/content/en/articles/serial-uart/_index.adoc:239 +#: documentation/content/en/articles/serial-uart/_index.adoc:256 #, no-wrap msgid "5" msgstr "5" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:241 -#: documentation/content/en/articles/serial-uart/_index.adoc:264 +#: documentation/content/en/articles/serial-uart/_index.adoc:240 +#: documentation/content/en/articles/serial-uart/_index.adoc:263 #, no-wrap msgid "8" msgstr "8" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:242 +#: documentation/content/en/articles/serial-uart/_index.adoc:241 #, no-wrap msgid "CB" msgstr "CB" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:243 +#: documentation/content/en/articles/serial-uart/_index.adoc:242 #, no-wrap msgid "106" msgstr "106" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:244 +#: documentation/content/en/articles/serial-uart/_index.adoc:243 #, no-wrap msgid "CTS" msgstr "CTS" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:247 +#: documentation/content/en/articles/serial-uart/_index.adoc:246 #, no-wrap msgid "Clear to Send" msgstr "Готовность к приёму (Clear to Send)" #. type: Table +#: documentation/content/en/articles/serial-uart/_index.adoc:247 #: documentation/content/en/articles/serial-uart/_index.adoc:248 -#: documentation/content/en/articles/serial-uart/_index.adoc:249 #, no-wrap msgid "6" msgstr "6" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:250 +#: documentation/content/en/articles/serial-uart/_index.adoc:249 #, no-wrap msgid "CC" msgstr "CC" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:251 +#: documentation/content/en/articles/serial-uart/_index.adoc:250 #, no-wrap msgid "107" msgstr "107" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:252 +#: documentation/content/en/articles/serial-uart/_index.adoc:251 #, no-wrap msgid "DSR" msgstr "DSR" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:255 +#: documentation/content/en/articles/serial-uart/_index.adoc:254 #, no-wrap msgid "Data Set Ready" msgstr "Готовность терминального оборудования (Data Set Ready)" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:258 +#: documentation/content/en/articles/serial-uart/_index.adoc:257 #, no-wrap msgid "AV" msgstr "AV" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:259 +#: documentation/content/en/articles/serial-uart/_index.adoc:258 #, no-wrap msgid "102" msgstr "102" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:260 +#: documentation/content/en/articles/serial-uart/_index.adoc:259 #, no-wrap msgid "SG/GND" msgstr "SG/GND" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:263 +#: documentation/content/en/articles/serial-uart/_index.adoc:262 #, no-wrap msgid "Signal Ground" msgstr "Сигнальная земля (Signal Ground)" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:266 +#: documentation/content/en/articles/serial-uart/_index.adoc:265 #, no-wrap msgid "CF" msgstr "CF" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:267 +#: documentation/content/en/articles/serial-uart/_index.adoc:266 #, no-wrap msgid "109" msgstr "109" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:268 +#: documentation/content/en/articles/serial-uart/_index.adoc:267 #, no-wrap msgid "DCD/CD" msgstr "DCD/CD" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:271 +#: documentation/content/en/articles/serial-uart/_index.adoc:270 #, no-wrap msgid "Data Carrier Detect" msgstr "Обнаружение несущей (Data Carrier Detect)" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:272 -#: documentation/content/en/articles/serial-uart/_index.adoc:377 +#: documentation/content/en/articles/serial-uart/_index.adoc:271 +#: documentation/content/en/articles/serial-uart/_index.adoc:376 #, no-wrap msgid "9" msgstr "9" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:279 -#: documentation/content/en/articles/serial-uart/_index.adoc:287 -#: documentation/content/en/articles/serial-uart/_index.adoc:295 +#: documentation/content/en/articles/serial-uart/_index.adoc:278 +#: documentation/content/en/articles/serial-uart/_index.adoc:286 +#: documentation/content/en/articles/serial-uart/_index.adoc:294 #, no-wrap msgid "Reserved for Test" msgstr "Зарезервировано для Теста" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:280 +#: documentation/content/en/articles/serial-uart/_index.adoc:279 #, no-wrap msgid "10" msgstr "10" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:288 +#: documentation/content/en/articles/serial-uart/_index.adoc:287 #, no-wrap msgid "11" msgstr "11" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:296 +#: documentation/content/en/articles/serial-uart/_index.adoc:295 #, no-wrap msgid "12" msgstr "12" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:298 +#: documentation/content/en/articles/serial-uart/_index.adoc:297 #, no-wrap msgid "CI" msgstr "CI" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:299 +#: documentation/content/en/articles/serial-uart/_index.adoc:298 #, no-wrap msgid "122" msgstr "122" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:300 +#: documentation/content/en/articles/serial-uart/_index.adoc:299 #, no-wrap msgid "SRLSD" msgstr "SRLSD" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:303 +#: documentation/content/en/articles/serial-uart/_index.adoc:302 #, no-wrap msgid "Sec. Recv. Line Signal Detector" msgstr "Детектор сигнала вторичной линии приёма" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:304 +#: documentation/content/en/articles/serial-uart/_index.adoc:303 #, no-wrap msgid "13" msgstr "13" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:306 +#: documentation/content/en/articles/serial-uart/_index.adoc:305 #, no-wrap msgid "SCB" msgstr "SCB" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:307 +#: documentation/content/en/articles/serial-uart/_index.adoc:306 #, no-wrap msgid "121" msgstr "121" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:308 +#: documentation/content/en/articles/serial-uart/_index.adoc:307 #, no-wrap msgid "SCTS" msgstr "SCTS" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:311 +#: documentation/content/en/articles/serial-uart/_index.adoc:310 #, no-wrap msgid "Secondary Clear to Send" msgstr "Вторичный сигнал готовности к приёму" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:312 +#: documentation/content/en/articles/serial-uart/_index.adoc:311 #, no-wrap msgid "14" msgstr "14" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:314 +#: documentation/content/en/articles/serial-uart/_index.adoc:313 #, no-wrap msgid "SBA" msgstr "SBA" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:315 +#: documentation/content/en/articles/serial-uart/_index.adoc:314 #, no-wrap msgid "118" msgstr "118" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:316 +#: documentation/content/en/articles/serial-uart/_index.adoc:315 #, no-wrap msgid "STD" msgstr "STD" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:319 +#: documentation/content/en/articles/serial-uart/_index.adoc:318 #, no-wrap msgid "Secondary Transmit Data" msgstr "Вторичная линия передачи данных" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:320 +#: documentation/content/en/articles/serial-uart/_index.adoc:319 #, no-wrap msgid "15" msgstr "15" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:322 +#: documentation/content/en/articles/serial-uart/_index.adoc:321 #, no-wrap msgid "DB" msgstr "DB" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:323 +#: documentation/content/en/articles/serial-uart/_index.adoc:322 #, no-wrap msgid "114" msgstr "114" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:324 -#: documentation/content/en/articles/serial-uart/_index.adoc:396 +#: documentation/content/en/articles/serial-uart/_index.adoc:323 +#: documentation/content/en/articles/serial-uart/_index.adoc:395 #, no-wrap msgid "TSET" msgstr "TSET" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:327 -#: documentation/content/en/articles/serial-uart/_index.adoc:399 +#: documentation/content/en/articles/serial-uart/_index.adoc:326 +#: documentation/content/en/articles/serial-uart/_index.adoc:398 #, no-wrap msgid "Trans. Sig. Element Timing" msgstr "Тактирование элементов сигнала передатчика (Trans. Sig. Element Timing)" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:328 +#: documentation/content/en/articles/serial-uart/_index.adoc:327 #, no-wrap msgid "16" msgstr "16" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:330 +#: documentation/content/en/articles/serial-uart/_index.adoc:329 #, no-wrap msgid "SBB" msgstr "SBB" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:331 +#: documentation/content/en/articles/serial-uart/_index.adoc:330 #, no-wrap msgid "119" msgstr "119" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:332 +#: documentation/content/en/articles/serial-uart/_index.adoc:331 #, no-wrap msgid "SRD" msgstr "SRD" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:335 +#: documentation/content/en/articles/serial-uart/_index.adoc:334 #, no-wrap msgid "Secondary Received Data" msgstr "Вторичная линия приема данных" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:336 +#: documentation/content/en/articles/serial-uart/_index.adoc:335 #, no-wrap msgid "17" msgstr "17" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:338 +#: documentation/content/en/articles/serial-uart/_index.adoc:337 #, no-wrap msgid "DD" msgstr "DD" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:339 +#: documentation/content/en/articles/serial-uart/_index.adoc:338 #, no-wrap msgid "115" msgstr "115" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:340 +#: documentation/content/en/articles/serial-uart/_index.adoc:339 #, no-wrap msgid "RSET" msgstr "RSET" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:343 +#: documentation/content/en/articles/serial-uart/_index.adoc:342 #, no-wrap msgid "Receiver Signal Element Timing" msgstr "Тактирование элементов сигнала приёмника (Receiver Signal Element Timing)" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:344 +#: documentation/content/en/articles/serial-uart/_index.adoc:343 #, no-wrap msgid "18" msgstr "18" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:347 +#: documentation/content/en/articles/serial-uart/_index.adoc:346 #, no-wrap msgid "141" msgstr "141" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:348 +#: documentation/content/en/articles/serial-uart/_index.adoc:347 #, no-wrap msgid "LOOP" msgstr "LOOP" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:351 +#: documentation/content/en/articles/serial-uart/_index.adoc:350 #, no-wrap msgid "Local Loopback" msgstr "Локальная петля" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:352 -#: documentation/content/en/articles/serial-uart/_index.adoc:614 +#: documentation/content/en/articles/serial-uart/_index.adoc:351 +#: documentation/content/en/articles/serial-uart/_index.adoc:613 #, no-wrap msgid "19" msgstr "19" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:354 +#: documentation/content/en/articles/serial-uart/_index.adoc:353 #, no-wrap msgid "SCA" msgstr "SCA" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:355 +#: documentation/content/en/articles/serial-uart/_index.adoc:354 #, no-wrap msgid "120" msgstr "120" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:356 +#: documentation/content/en/articles/serial-uart/_index.adoc:355 #, no-wrap msgid "SRS" msgstr "SRS" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:359 +#: documentation/content/en/articles/serial-uart/_index.adoc:358 #, no-wrap msgid "Secondary Request to Send" msgstr "Вторичный запрос на передачу" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:360 +#: documentation/content/en/articles/serial-uart/_index.adoc:359 #, no-wrap msgid "20" msgstr "20" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:362 +#: documentation/content/en/articles/serial-uart/_index.adoc:361 #, no-wrap msgid "CD" msgstr "CD" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:363 +#: documentation/content/en/articles/serial-uart/_index.adoc:362 #, no-wrap msgid "108.2" msgstr "108.2" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:364 +#: documentation/content/en/articles/serial-uart/_index.adoc:363 #, no-wrap msgid "DTR" msgstr "DTR" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:367 +#: documentation/content/en/articles/serial-uart/_index.adoc:366 #, no-wrap msgid "Data Terminal Ready" msgstr "Готовность терминального оборудования (Data Terminal Ready)" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:368 +#: documentation/content/en/articles/serial-uart/_index.adoc:367 #, no-wrap msgid "21" msgstr "21" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:372 +#: documentation/content/en/articles/serial-uart/_index.adoc:371 #, no-wrap msgid "RDL" msgstr "RDL" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:375 +#: documentation/content/en/articles/serial-uart/_index.adoc:374 #, no-wrap msgid "Remote Digital Loopback" msgstr "Режим удалённой цифровой петли (Remote Digital Loopback)" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:376 +#: documentation/content/en/articles/serial-uart/_index.adoc:375 #, no-wrap msgid "22" msgstr "22" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:378 +#: documentation/content/en/articles/serial-uart/_index.adoc:377 #, no-wrap msgid "CE" msgstr "CE" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:379 +#: documentation/content/en/articles/serial-uart/_index.adoc:378 #, no-wrap msgid "125" msgstr "125" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:380 +#: documentation/content/en/articles/serial-uart/_index.adoc:379 #, no-wrap msgid "RI" msgstr "RI" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:383 +#: documentation/content/en/articles/serial-uart/_index.adoc:382 #, no-wrap msgid "Ring Indicator" msgstr "Индикатор передачи данных (Ring Indicator)" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:384 -#: documentation/content/en/articles/serial-uart/_index.adoc:618 +#: documentation/content/en/articles/serial-uart/_index.adoc:383 +#: documentation/content/en/articles/serial-uart/_index.adoc:617 #, no-wrap msgid "23" msgstr "23" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:386 +#: documentation/content/en/articles/serial-uart/_index.adoc:385 #, no-wrap msgid "CH" msgstr "CH" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:387 +#: documentation/content/en/articles/serial-uart/_index.adoc:386 #, no-wrap msgid "111" msgstr "111" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:388 +#: documentation/content/en/articles/serial-uart/_index.adoc:387 #, no-wrap msgid "DSRS" msgstr "DSRS" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:391 +#: documentation/content/en/articles/serial-uart/_index.adoc:390 #, no-wrap msgid "Data Signal Rate Selector" msgstr "Селектор скорости передачи данных" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:392 +#: documentation/content/en/articles/serial-uart/_index.adoc:391 #, no-wrap msgid "24" msgstr "24" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:394 +#: documentation/content/en/articles/serial-uart/_index.adoc:393 #, no-wrap msgid "DA" msgstr "DA" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:395 +#: documentation/content/en/articles/serial-uart/_index.adoc:394 #, no-wrap msgid "113" msgstr "113" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:400 +#: documentation/content/en/articles/serial-uart/_index.adoc:399 #, no-wrap msgid "25" msgstr "25" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:403 +#: documentation/content/en/articles/serial-uart/_index.adoc:402 #, no-wrap msgid "142" msgstr "142" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:406 +#: documentation/content/en/articles/serial-uart/_index.adoc:405 #, no-wrap msgid "Test Mode" msgstr "Режим тестирования" #. type: Title === -#: documentation/content/en/articles/serial-uart/_index.adoc:408 +#: documentation/content/en/articles/serial-uart/_index.adoc:407 #, no-wrap msgid "Bits, Baud and Symbols" msgstr "Биты, боды и символы" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:412 +#: documentation/content/en/articles/serial-uart/_index.adoc:411 msgid "" "Baud is a measurement of transmission speed in asynchronous communication. " "Due to advances in modem communication technology, this term is frequently " "misused when describing the data rates in newer devices." msgstr "" "Скорость передачи данных (Baud) — это единица измерения скорости передачи в " "асинхронной связи. Из-за развития технологий модемной связи этот термин " "часто ошибочно используют для описания скорости передачи данных в " "современных устройствах." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:417 +#: documentation/content/en/articles/serial-uart/_index.adoc:416 msgid "" "Traditionally, a Baud Rate represents the number of bits that are actually " "being sent over the media, not the amount of data that is actually moved " "from one DTE device to the other. The Baud count includes the overhead bits " "Start, Stop and Parity that are generated by the sending UART and removed by " "the receiving UART. This means that seven-bit words of data actually take " "10 bits to be completely transmitted. Therefore, a modem capable of moving " "300 bits per second from one place to another can normally only move 30 7-" "bit words if Parity is used and one Start and Stop bit are present." msgstr "" "Традиционно, скорость передачи (Baud Rate) представляет количество битов, " "фактически передаваемых по среде, а не объём данных, которые действительно " "перемещаются от одного устройства DTE к другому. Подсчет Baud включает " "служебные биты — Start, Stop и Parity, которые генерируются передающим UART " "и удаляются принимающим UART. Это означает, что 7-битные слова данных на " "самом деле занимают 10 бит для полной передачи. Следовательно, модем, " "способный передавать 300 бит в секунду, обычно может передавать только 30 7-" "битных слов, если используется Parity и присутствуют один бит Start и один " "бит Stop." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:419 +#: documentation/content/en/articles/serial-uart/_index.adoc:418 msgid "" "If 8-bit data words are used and Parity bits are also used, the data rate " "falls to 27.27 words per second, because it now takes 11 bits to send the " "eight-bit words, and the modem still only sends 300 bits per second." msgstr "" "Если используются 8-битные слова данных и биты чётности, скорость передачи " "данных снижается до 27,27 слов в секунду, так как теперь для передачи " "восьмибитных слов требуется 11 бит, а модем по-прежнему передаёт только 300 " "бит в секунду." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:425 +#: documentation/content/en/articles/serial-uart/_index.adoc:424 msgid "" "The formula for converting bytes per second into a baud rate and vice versa " "was simple until error-correcting modems came along. These modems receive " "the serial stream of bits from the UART in the host computer (even when " "internal modems are used the data is still frequently serialized) and " "converts the bits back into bytes. These bytes are then combined into " "packets and sent over the phone line using a Synchronous transmission " "method. This means that the Stop, Start, and Parity bits added by the UART " "in the DTE (the computer) were removed by the modem before transmission by " "the sending modem. When these bytes are received by the remote modem, the " "remote modem adds Start, Stop and Parity bits to the words, converts them to " "a serial format and then sends them to the receiving UART in the remote " "computer, who then strips the Start, Stop and Parity bits." msgstr "" "Формула преобразования байтов в секунду в бодовую скорость и наоборот была " "простой до появления модемов с коррекцией ошибок. Эти модемы принимают " "последовательный поток битов от UART в компьютере (даже внутренние модемы " "часто работают с последовательными данными) и преобразуют биты обратно в " "байты. Затем эти байты объединяются в пакеты и передаются по телефонной " "линии с использованием синхронного метода передачи. Это означает, что " "стоповые, стартовые и биты чётности, добавленные UART в DTE (компьютере), " "удаляются модемом перед передачей отправляющим модемом. Когда эти байты " "принимаются удалённым модемом, он добавляет стартовые, стоповые и биты " "чётности к словам, преобразует их в последовательный формат и отправляет на " "принимающий UART в удалённом компьютере, который затем удаляет стартовые, " "стоповые и биты чётности." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:428 +#: documentation/content/en/articles/serial-uart/_index.adoc:427 msgid "" "The reason all these extra conversions are done is so that the two modems " "can perform error correction, which means that the receiving modem is able " "to ask the sending modem to resend a block of data that was not received " "with the correct checksum. This checking is handled by the modems, and the " "DTE devices are usually unaware that the process is occurring." msgstr "" "Причина, по которой выполняются все эти дополнительные преобразования, " "заключается в том, чтобы два модема могли осуществлять коррекцию ошибок. Это " "означает, что принимающий модем может запросить у передающего модема " "повторную отправку блока данных, который был получен с некорректной " "контрольной суммой. Эта проверка обрабатывается модемами, и устройства DTE " "обычно не осознают, что этот процесс происходит." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:431 +#: documentation/content/en/articles/serial-uart/_index.adoc:430 msgid "" "By striping the Start, Stop and Parity bits, the additional bits of data " "that the two modems must share between themselves to perform error-" "correction are mostly concealed from the effective transmission rate seen by " "the sending and receiving DTE equipment. For example, if a modem sends ten " "7-bit words to another modem without including the Start, Stop and Parity " "bits, the sending modem will be able to add 30 bits of its own information " "that the receiving modem can use to do error-correction without impacting " "the transmission speed of the real data." msgstr "" "Удаляя стартовые, стоповые и биты чётности, дополнительные биты данных, " "которые два модема должны обмениваться между собой для выполнения коррекции " "ошибок, в основном скрываются от эффективной скорости передачи, наблюдаемой " "отправляющим и принимающим оборудованием DTE. Например, если модем " "отправляет десять 7-битных слов другому модему без включения стартовых, " "стоповых и битов чётности, отправляющий модем сможет добавить 30 бит своей " "собственной информации, которую принимающий модем может использовать для " "коррекции ошибок, не влияя на скорость передачи реальных данных." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:435 +#: documentation/content/en/articles/serial-uart/_index.adoc:434 msgid "" "The use of the term Baud is further confused by modems that perform " "compression. A single 8-bit word passed over the telephone line might " "represent a dozen words that were transmitted to the sending modem. The " "receiving modem will expand the data back to its original content and pass " "that data to the receiving DTE." msgstr "" "Использование термина \"Бод\" дополнительно осложняется модемами, " "выполняющими сжатие. Одно 8-битное слово, переданное по телефонной линии, " "может представлять собой дюжину слов, переданных на отправляющий модем. " "Принимающий модем развернёт данные обратно в их исходное содержимое и " "передаст эти данные принимающему DTE." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:438 +#: documentation/content/en/articles/serial-uart/_index.adoc:437 msgid "" "Modern modems also include buffers that allow the rate that bits move across " "the phone line (DCE to DCE) to be a different speed than the speed that the " "bits move between the DTE and DCE on both ends of the conversation. " "Normally the speed between the DTE and DCE is higher than the DCE to DCE " "speed because of the use of compression by the modems." msgstr "" "Современные модемы также включают буферы, которые позволяют скорости " "передачи битов по телефонной линии (DCE к DCE) отличаться от скорости " "передачи битов между DTE и DCE на обоих концах соединения. Обычно скорость " "между DTE и DCE выше, чем скорость между DCE и DCE, из-за использования " "сжатия модемами." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:441 +#: documentation/content/en/articles/serial-uart/_index.adoc:440 msgid "" "As the number of bits needed to describe a byte varied during the trip " "between the two machines plus the differing bits-per-seconds speeds that are " "used present on the DTE-DCE and DCE-DCE links, the usage of the term Baud to " "describe the overall communication speed causes problems and can " "misrepresent the true transmission speed. So Bits Per Second (bps) is the " "correct term to use to describe the transmission rate seen at the DCE to DCE " "interface and Baud or Bits Per Second are acceptable terms to use when a " "connection is made between two systems with a wired connection, or if a " "modem is in use that is not performing error-correction or compression." msgstr "" "Поскольку количество битов, необходимых для описания байта, менялось во " "время передачи между двумя машинами, а также из-за различающихся скоростей " "передачи в битах в секунду на линиях DTE-DCE и DCE-DCE, использование " "термина «Бод» для описания общей скорости связи вызывает проблемы и может " "искажать реальную скорость передачи. Таким образом, термин «Биты в " "секунду» (bps) является корректным для описания скорости передачи на " "интерфейсе DCE-DCE, а термины «Бод» или «Биты в секунду» допустимы, когда " "соединение устанавливается между двумя системами с проводным подключением " "или используется модем, не выполняющий коррекцию ошибок или сжатие." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:445 +#: documentation/content/en/articles/serial-uart/_index.adoc:444 msgid "" "Modern high speed modems (2400, 9600, 14,400, and 19,200bps) in reality " "still operate at or below 2400 baud, or more accurately, 2400 Symbols per " "second. High speed modem are able to encode more bits of data into each " "Symbol using a technique called Constellation Stuffing, which is why the " "effective bits per second rate of the modem is higher, but the modem " "continues to operate within the limited audio bandwidth that the telephone " "system provides. Modems operating at 28,800 and higher speeds have variable " "Symbol rates, but the technique is the same." msgstr "" "Современные высокоскоростные модемы (2400, 9600, 14,400 и 19,200 бит/с) на " "самом деле всё ещё работают на скорости 2400 бод или ниже, или, точнее, 2400 " "символов в секунду. Высокоскоростные модемы способны кодировать больше бит " "данных в каждый символ с использованием техники, называемой \"Заполнение " "созвездия (Constellation Stuffing)\", поэтому эффективная скорость передачи " "данных в битах в секунду у модема выше, но модем продолжает работать в " "ограниченной полосе пропускания звуковых частот, предоставляемой телефонной " "системой. Модемы, работающие на скоростях 28,800 и выше, имеют переменную " "скорость передачи символов, но техника остаётся той же." #. type: Title === -#: documentation/content/en/articles/serial-uart/_index.adoc:446 +#: documentation/content/en/articles/serial-uart/_index.adoc:445 #, no-wrap msgid "The IBM Personal Computer UART" msgstr "UART в IBM PC" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:450 +#: documentation/content/en/articles/serial-uart/_index.adoc:449 msgid "" "Starting with the original IBM Personal Computer, IBM selected the National " "Semiconductor INS8250 UART for use in the IBM PC Parallel/Serial Adapter. " "Subsequent generations of compatible computers from IBM and other vendors " "continued to use the INS8250 or improved versions of the National " "Semiconductor UART family." msgstr "" "Начиная с оригинального IBM Personal Computer, IBM выбрала UART INS8250 от " "National Semiconductor для использования в адаптере Parallel/Serial IBM PC. " "Последующие поколения совместимых компьютеров от IBM и других производителей " "продолжали использовать INS8250 или улучшенные версии UART из семейства " "National Semiconductor." #. type: Title ==== -#: documentation/content/en/articles/serial-uart/_index.adoc:451 +#: documentation/content/en/articles/serial-uart/_index.adoc:450 #, no-wrap msgid "National Semiconductor UART Family Tree" msgstr "Генеалогическое дерево National Semiconductor UART" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:454 +#: documentation/content/en/articles/serial-uart/_index.adoc:453 msgid "" "There have been several versions and subsequent generations of the INS8250 " "UART. Each major version is described below." msgstr "" "Существует несколько версий и последующих поколений UART INS8250. Основные " "версии описаны ниже." #. type: delimited block . 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:467 +#: documentation/content/en/articles/serial-uart/_index.adoc:466 #, no-wrap msgid "" "INS8250 -> INS8250B\n" " \\\n" " \\\n" " \\-> INS8250A -> INS82C50A\n" " \\\n" " \\\n" " \\-> NS16450 -> NS16C450\n" " \\\n" " \\\n" " \\-> NS16550 -> NS16550A -> PC16550D\n" msgstr "" "INS8250 -> INS8250B\n" " \\\n" " \\\n" " \\-> INS8250A -> INS82C50A\n" " \\\n" " \\\n" " \\-> NS16450 -> NS16C450\n" " \\\n" " \\\n" " \\-> NS16550 -> NS16550A -> PC16550D\n" #. type: Labeled list -#: documentation/content/en/articles/serial-uart/_index.adoc:469 +#: documentation/content/en/articles/serial-uart/_index.adoc:468 #, no-wrap msgid "INS8250" msgstr "INS8250" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:472 +#: documentation/content/en/articles/serial-uart/_index.adoc:471 msgid "" "This part was used in the original IBM PC and IBM PC/XT. The original name " "for this part was the INS8250 ACE (Asynchronous Communications Element) and " "it is made from NMOS technology." msgstr "" "Эта часть использовалась в оригинальном IBM PC и IBM PC/XT. Первоначальное " "название этой части — INS8250 ACE (Asynchronous Communications Element), и " "она изготовлена по NMOS-технологии." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:476 +#: documentation/content/en/articles/serial-uart/_index.adoc:475 msgid "" "The 8250 uses eight I/O ports and has a one-byte send and a one-byte receive " "buffer. This original UART has several race conditions and other flaws. " "The original IBM BIOS includes code to work around these flaws, but this " "made the BIOS dependent on the flaws being present, so subsequent parts like " "the 8250A, 16450 or 16550 could not be used in the original IBM PC or IBM PC/" "XT." msgstr "" "8250 использует восемь портов ввода-вывода и имеет однобайтовый буфер " "передачи и однобайтовый буфер приема. Этот оригинальный UART имеет несколько " "состояний гонки и другие недостатки. Оригинальный BIOS IBM включает код для " "обхода этих недостатков, но это сделало BIOS зависимым от их наличия, " "поэтому последующие модели, такие как 8250A, 16450 или 16550, не могли быть " "использованы в оригинальном IBM PC или IBM PC/XT." #. type: Labeled list -#: documentation/content/en/articles/serial-uart/_index.adoc:476 +#: documentation/content/en/articles/serial-uart/_index.adoc:475 #, no-wrap msgid "INS8250-B" msgstr "INS8250-B" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:479 +#: documentation/content/en/articles/serial-uart/_index.adoc:478 msgid "" "This is the slower speed of the INS8250 made from NMOS technology. It " "contains the same problems as the original INS8250." msgstr "" "Это более медленная скорость INS8250, созданная по NMOS-технологии. Она " "имеет те же проблемы, что и оригинальный INS8250." #. type: Labeled list -#: documentation/content/en/articles/serial-uart/_index.adoc:480 +#: documentation/content/en/articles/serial-uart/_index.adoc:479 #, no-wrap msgid "INS8250A" msgstr "INS8250A" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:484 +#: documentation/content/en/articles/serial-uart/_index.adoc:483 msgid "" "An improved version of the INS8250 using XMOS technology with various " "functional flaws corrected. The INS8250A was used initially in PC clone " "computers by vendors who used \"clean\" BIOS designs. Due to the " "corrections in the chip, this part could not be used with a BIOS compatible " "with the INS8250 or INS8250B." msgstr "" "Улучшенная версия INS8250 с использованием технологии XMOS, в которой " "исправлены различные функциональные недостатки. INS8250A изначально " "использовалась в клонах ПК от производителей, применявших \"чистые\" проекты " "BIOS. Из-за исправлений в микросхеме этот чип не мог использоваться с BIOS, " "совместимой с INS8250 или INS8250B." #. type: Labeled list -#: documentation/content/en/articles/serial-uart/_index.adoc:485 +#: documentation/content/en/articles/serial-uart/_index.adoc:484 #, no-wrap msgid "INS82C50A" msgstr "INS82C50A" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:487 +#: documentation/content/en/articles/serial-uart/_index.adoc:486 msgid "" "This is a CMOS version (low power consumption) of the INS8250A and has " "similar functional characteristics." msgstr "" "Это CMOS-версия (с низким энергопотреблением) INS8250A и имеет схожие " "функциональные характеристики." #. type: Labeled list -#: documentation/content/en/articles/serial-uart/_index.adoc:488 +#: documentation/content/en/articles/serial-uart/_index.adoc:487 #, no-wrap msgid "NS16450" msgstr "NS16450" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:491 +#: documentation/content/en/articles/serial-uart/_index.adoc:490 msgid "" "Same as NS8250A with improvements so it can be used with faster CPU bus " "designs. IBM used this part in the IBM AT and updated the IBM BIOS to no " "longer rely on the bugs in the INS8250." msgstr "" "Так же, как NS8250A, но с улучшениями для работы с более быстрыми шинами " "CPU. IBM использовала этот компонент в IBM AT и обновила IBM BIOS, чтобы она " "больше не зависела от ошибок в INS8250." #. type: Labeled list -#: documentation/content/en/articles/serial-uart/_index.adoc:492 +#: documentation/content/en/articles/serial-uart/_index.adoc:491 #, no-wrap msgid "NS16C450" msgstr "NS16C450" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:494 +#: documentation/content/en/articles/serial-uart/_index.adoc:493 msgid "This is a CMOS version (low power consumption) of the NS16450." msgstr "Это версия NS16450 с технологией CMOS (низкое энергопотребление)." #. type: Labeled list -#: documentation/content/en/articles/serial-uart/_index.adoc:495 +#: documentation/content/en/articles/serial-uart/_index.adoc:494 #, no-wrap msgid "NS16550" msgstr "NS16550" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:497 +#: documentation/content/en/articles/serial-uart/_index.adoc:496 msgid "" "Same as NS16450 with a 16-byte send and receive buffer but the buffer design " "was flawed and could not be reliably be used." msgstr "" "То же, что и NS16450, с 16-байтовым буфером передачи и приема, но " "конструкция буфера была неудачной и не могла быть надёжно использована." #. type: Labeled list -#: documentation/content/en/articles/serial-uart/_index.adoc:498 +#: documentation/content/en/articles/serial-uart/_index.adoc:497 #, no-wrap msgid "NS16550A" msgstr "NS16550A" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:501 +#: documentation/content/en/articles/serial-uart/_index.adoc:500 msgid "" "Same as NS16550 with the buffer flaws corrected. The 16550A and its " "successors have become the most popular UART design in the PC industry, " "mainly due to its ability to reliably handle higher data rates on operating " "systems with sluggish interrupt response times." msgstr "" "То же, что и NS16550, но с исправленными недостатками буфера. 16550A и его " "преемники стали наиболее популярными UART-устройствами в индустрии ПК, в " "основном благодаря их способности надёжно работать на высоких скоростях " "передачи данных в операционных системах с медленным временем отклика " "прерываний." #. type: Labeled list -#: documentation/content/en/articles/serial-uart/_index.adoc:502 +#: documentation/content/en/articles/serial-uart/_index.adoc:501 #, no-wrap msgid "NS16C552" msgstr "NS16C552" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:504 +#: documentation/content/en/articles/serial-uart/_index.adoc:503 msgid "" "This component consists of two NS16C550A CMOS UARTs in a single package." msgstr "Этот компонент состоит из двух CMOS UART NS16C550A в одном корпусе." #. type: Labeled list -#: documentation/content/en/articles/serial-uart/_index.adoc:505 +#: documentation/content/en/articles/serial-uart/_index.adoc:504 #, no-wrap msgid "PC16550D" msgstr "PC16550D" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:508 +#: documentation/content/en/articles/serial-uart/_index.adoc:507 msgid "" "Same as NS16550A with subtle flaws corrected. This is revision D of the " "16550 family and is the latest design available from National Semiconductor." msgstr "" "Так же, как NS16550A, с исправленными незначительными недостатками. Это " "ревизия D семейства 16550 и последняя доступная версия от National " "Semiconductor." #. type: Title ==== -#: documentation/content/en/articles/serial-uart/_index.adoc:509 +#: documentation/content/en/articles/serial-uart/_index.adoc:508 #, no-wrap msgid "The NS16550AF and the PC16550D are the same thing" msgstr "NS16550AF и PC16550D — это одно и то же" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:515 +#: documentation/content/en/articles/serial-uart/_index.adoc:514 msgid "" "National reorganized their part numbering system a few years ago, and the " "NS16550AFN no longer exists by that name. (If you have a NS16550AFN, look " "at the date code on the part, which is a four digit number that usually " "starts with a nine. The first two digits of the number are the year, and " "the last two digits are the week in that year when the part was packaged. " "If you have a NS16550AFN, it is probably a few years old.)" msgstr "" "Компания National реорганизовала свою систему нумерации деталей несколько " "лет назад, и чип NS16550AFN больше не существует под этим названием. (Если у " "вас есть NS16550AFN, посмотрите на дату изготовления на корпусе — это " "четырёхзначное число, обычно начинающееся с девятки. Первые две цифры " "обозначают год, а последние две — неделю года, когда чип был упакован. Если " "у вас есть NS16550AFN, скорее всего, он уже довольно старый.)" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:518 +#: documentation/content/en/articles/serial-uart/_index.adoc:517 msgid "" "The new numbers are like PC16550DV, with minor differences in the suffix " "letters depending on the package material and its shape. (A description of " "the numbering system can be found below.)" msgstr "" "Новые номера выглядят как PC16550DV, с незначительными отличиями в " "суффиксных буквах в зависимости от материала корпуса и его формы. (Описание " "системы нумерации можно найти ниже.)" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:520 +#: documentation/content/en/articles/serial-uart/_index.adoc:519 msgid "" "It is important to understand that in some stores, you may pay $15(US) for a " "NS16550AFN made in 1990 and in the next bin are the new PC16550DN parts with " "minor fixes that National has made since the AFN part was in production, the " "PC16550DN was probably made in the past six months and it costs half (as low " "as $5(US) in volume) as much as the NS16550AFN because they are readily " "available." msgstr "" "Важно понимать, что в некоторых магазинах можно заплатить $15 (США) за " "микросхему NS16550AFN, выпущенную в 1990 году, а в соседнем ящике могут " "лежать новые PC16550DN с небольшими исправлениями, которые National внесла с " "момента выпуска AFN. PC16550DN, вероятно, произведены в последние полгода и " "стоят вдвое дешевле (от $5 (США) при оптовой покупке), чем NS16550AFN, " "поскольку они легко доступны." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:522 +#: documentation/content/en/articles/serial-uart/_index.adoc:521 msgid "" "As the supply of NS16550AFN chips continues to shrink, the price will " "probably continue to increase until more people discover and accept that the " "PC16550DN really has the same function as the old part number." msgstr "" "Поскольку поставки чипов NS16550AFN продолжают сокращаться, цена, вероятно, " "будет расти до тех пор, пока больше людей не узнают и не примут тот факт, " "что PC16550DN действительно выполняет ту же функцию, что и старый номер " "детали." #. type: Title ==== -#: documentation/content/en/articles/serial-uart/_index.adoc:523 +#: documentation/content/en/articles/serial-uart/_index.adoc:522 #, no-wrap msgid "National Semiconductor Part Numbering System" msgstr "Система нумерации компонентов National Semiconductor" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:526 +#: documentation/content/en/articles/serial-uart/_index.adoc:525 msgid "" "The older NS``__nnnnnrqp__`` part numbers are now of the format " "PC``__nnnnnrgp__``." msgstr "" "Старые номера деталей NS``__nnnnnrqp__`` теперь имеют формат " "PC``__nnnnnrgp__``." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:528 +#: documentation/content/en/articles/serial-uart/_index.adoc:527 msgid "" "The `_r_` is the revision field. The current revision of the 16550 from " "National Semiconductor is `D`." msgstr "" "`_r_` — это поле ревизии. Текущая ревизия 16550 от National Semiconductor — " "`D`." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:530 +#: documentation/content/en/articles/serial-uart/_index.adoc:529 msgid "The `_p_` is the package-type field. The types are:" msgstr "`_p_` — это поле типа пакета. Типы:" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:536 +#: documentation/content/en/articles/serial-uart/_index.adoc:535 #, no-wrap msgid "\"F\"" msgstr "\"F\"" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:537 +#: documentation/content/en/articles/serial-uart/_index.adoc:536 #, no-wrap msgid "QFP" msgstr "QFP" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:539 +#: documentation/content/en/articles/serial-uart/_index.adoc:538 #, no-wrap msgid "(quad flat pack) L lead type" msgstr "(quad flat pack - квадратный плоский корпус) с L-образными выводами" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:540 +#: documentation/content/en/articles/serial-uart/_index.adoc:539 #, no-wrap msgid "\"N\"" msgstr "\"N\"" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:541 +#: documentation/content/en/articles/serial-uart/_index.adoc:540 #, no-wrap msgid "DIP" msgstr "DIP" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:543 +#: documentation/content/en/articles/serial-uart/_index.adoc:542 #, no-wrap msgid "(dual inline package) through hole straight lead type" msgstr "(dual inline package — корпус с двусторонним расположением выводов) для сквозного монтажа с прямыми выводами" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:544 +#: documentation/content/en/articles/serial-uart/_index.adoc:543 #, no-wrap msgid "\"V\"" msgstr "\"V\"" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:545 +#: documentation/content/en/articles/serial-uart/_index.adoc:544 #, no-wrap msgid "LPCC" msgstr "LPCC" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:546 +#: documentation/content/en/articles/serial-uart/_index.adoc:545 #, no-wrap msgid "(lead plastic chip carrier) J lead type" msgstr "(lead plastic chip carrier — пластиковый корпус) с J-образными выводами" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:551 +#: documentation/content/en/articles/serial-uart/_index.adoc:550 msgid "" "The _g_ is the product grade field. If an `I` precedes the package-type " "letter, it indicates an \"industrial\" grade part, which has higher specs " "than a standard part but not as high as Military Specification (Milspec) " "component. This is an optional field." msgstr "" "Поле _g_ обозначает класс изделия. Если перед буквой типа пакета стоит `I`, " "это указывает на «промышленный» класс детали, который имеет более высокие " "характеристики, чем стандартная деталь, но не такие высокие, как компонент " "военного назначения (Milspec). Это необязательное поле." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:553 +#: documentation/content/en/articles/serial-uart/_index.adoc:552 msgid "" "So what we used to call a NS16550AFN (DIP Package) is now called a PC16550DN " "or PC16550DIN." msgstr "" "То, что мы раньше называли NS16550AFN (DIP-корпус), теперь называется " "PC16550DN или PC16550DIN." #. type: Title === -#: documentation/content/en/articles/serial-uart/_index.adoc:554 +#: documentation/content/en/articles/serial-uart/_index.adoc:553 #, no-wrap msgid "Other Vendors and Similar UARTs" msgstr "Другие производители и аналогичные UART" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:559 +#: documentation/content/en/articles/serial-uart/_index.adoc:558 msgid "" "Over the years, the 8250, 8250A, 16450 and 16550 have been licensed or " "copied by other chip vendors. In the case of the 8250, 8250A and 16450, the " "exact circuit (the \"megacell\") was licensed to many vendors, including " "Western Digital and Intel. Other vendors reverse-engineered the part or " "produced emulations that had similar behavior." msgstr "" "На протяжении многих лет чипы 8250, 8250A, 16450 и 16550 лицензировались или " "копировались другими производителями. В случае с 8250, 8250A и 16450 точная " "схема (\"мегаячейка\") была лицензирована многими производителями, включая " "Western Digital и Intel. Другие производители проводили обратную разработку " "чипа или создавали эмуляции с аналогичным поведением." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:563 +#: documentation/content/en/articles/serial-uart/_index.adoc:562 msgid "" "In internal modems, the modem designer will frequently emulate the " "8250A/16450 with the modem microprocessor, and the emulated UART will " "frequently have a hidden buffer consisting of several hundred bytes. Due to " "the size of the buffer, these emulations can be as reliable as a 16550A in " "their ability to handle high speed data. However, most operating systems " "will still report that the UART is only a 8250A or 16450, and may not make " "effective use of the extra buffering present in the emulated UART unless " "special drivers are used." msgstr "" "Во внутренних модемах разработчик модема часто эмулирует 8250A/16450 с " "помощью микропроцессора модема, и эмулированный UART часто имеет скрытый " "буфер размером в несколько сотен байт. Благодаря размеру буфера, эти " "эмуляции могут быть такими же надёжными, как 16550A, в способности " "обрабатывать высокоскоростные данные. Однако большинство операционных систем " "по-прежнему сообщают, что UART является только 8250A или 16450, и могут не " "эффективно использовать дополнительную буферизацию, присутствующую в " "эмулированном UART, если не используются специальные драйверы." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:565 +#: documentation/content/en/articles/serial-uart/_index.adoc:564 msgid "" "Some modem makers are driven by market forces to abandon a design that has " "hundreds of bytes of buffer and instead use a 16550A UART so that the " "product will compare favorably in market comparisons even though the " "effective performance may be lowered by this action." msgstr "" "Некоторые производители модемов под давлением рыночных сил отказываются от " "конструкции с буфером в сотни байт и вместо этого используют UART 16550A, " "чтобы их продукция выглядела выигрышно в рыночных сравнениях, даже если это " "может снизить фактическую производительность." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:568 +#: documentation/content/en/articles/serial-uart/_index.adoc:567 msgid "" "A common misconception is that all parts with \"16550A\" written on them are " "identical in performance. There are differences, and in some cases, " "outright flaws in most of these 16550A clones." msgstr "" "Распространённое заблуждение заключается в том, что все микросхемы с " "маркировкой \"16550A\" одинаковы по производительности. Однако между ними " "существуют различия, а в некоторых клонах 16550A даже встречаются серьёзные " "недостатки." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:572 +#: documentation/content/en/articles/serial-uart/_index.adoc:571 msgid "" "When the NS16550 was developed, the National Semiconductor obtained several " "patents on the design and they also limited licensing, making it harder for " "other vendors to provide a chip with similar features. As a result of the " "patents, reverse-engineered designs and emulations had to avoid infringing " "the claims covered by the patents. Subsequently, these copies almost never " "perform exactly the same as the NS16550A or PC16550D, which are the parts " "most computer and modem makers want to buy but are sometimes unwilling to " "pay the price required to get the genuine part." msgstr "" "Когда компания National Semiconductor разработала NS16550, она получила " "несколько патентов на эту конструкцию и также ограничила лицензирование, что " "затруднило для других производителей выпуск чипов с аналогичными " "характеристиками. В результате патентов обратно спроектированные конструкции " "и эмуляции должны были избегать нарушения пунктов, охватываемых патентами. " "Впоследствии эти копии почти никогда не работают точно так же, как NS16550A " "или PC16550D, которые являются компонентами, наиболее востребованными " "производителями компьютеров и модемов, но иногда они не готовы платить цену, " "необходимую для получения оригинальных деталей." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:577 +#: documentation/content/en/articles/serial-uart/_index.adoc:576 msgid "" "Some of the differences in the clone 16550A parts are unimportant, while " "others can prevent the device from being used at all with a given operating " "system or driver. These differences may show up when using other drivers, " "or when particular combinations of events occur that were not well tested or " "considered in the Windows(R) driver. This is because most modem vendors and " "16550-clone makers use the Microsoft drivers from Windows(R) for Workgroups " "3.11 and the Microsoft(R) MS-DOS(R) utility as the primary tests for " "compatibility with the NS16550A. This over-simplistic criteria means that " "if a different operating system is used, problems could appear due to subtle " "differences between the clones and genuine components." msgstr "" "Некоторые различия в клонах микросхем 16550A несущественны, в то время как " "другие могут полностью препятствовать использованию устройства с " "определённой операционной системой или драйвером. Эти различия могут " "проявиться при использовании других драйверов или при возникновении " "определённых комбинаций событий, которые не были хорошо протестированы или " "учтены в драйвере Windows(R). Это происходит потому, что большинство " "производителей модемов и клонов 16550 используют драйверы Microsoft из " "Windows(R) for Workgroups 3.11 и утилиту Microsoft(R) MS-DOS(R) в качестве " "основных тестов на совместимость с NS16550A. Этот чрезмерно упрощенный " "критерий означает, что при использовании другой операционной системы могут " "возникнуть проблемы из-за тонких различий между клонами и оригинальными " "компонентами." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:580 +#: documentation/content/en/articles/serial-uart/_index.adoc:579 msgid "" "National Semiconductor has made available a program named COMTEST that " "performs compatibility tests independent of any OS drivers. It should be " "remembered that the purpose of this type of program is to demonstrate the " "flaws in the products of the competition, so the program will report major " "as well as extremely subtle differences in behavior in the part being tested." msgstr "" "National Semiconductor предоставила программу под названием COMTEST, которая " "выполняет тесты совместимости независимо от каких-либо драйверов ОС. Следует " "помнить, что цель такого типа программ — демонстрация недостатков в " "продуктах конкурентов, поэтому программа будет сообщать как о значительных, " "так и о крайне незначительных различиях в поведении тестируемого компонента." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:583 +#: documentation/content/en/articles/serial-uart/_index.adoc:582 msgid "" "In a series of tests performed by the author of this document in 1994, " "components made by National Semiconductor, TI, StarTech, and CMD as well as " "megacells and emulations embedded in internal modems were tested with " "COMTEST. A difference count for some of these components is listed below. " "Since these tests were performed in 1994, they may not reflect the current " "performance of the given product from a vendor." msgstr "" "В серии тестов, проведенных автором этого документа в 1994 году, компоненты " "производства National Semiconductor, TI, StarTech и CMD, а также мегаячейки " "и эмуляции, встроенные во внутренние модемы, были протестированы с помощью " -"COMTEST. Ниже приведен счетчик различий для некоторых из этих компонентов. " +"COMTEST. Ниже приведён счетчик различий для некоторых из этих компонентов. " "Поскольку эти тесты проводились в 1994 году, они могут не отражать текущую " "производительность данного продукта от поставщика." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:586 +#: documentation/content/en/articles/serial-uart/_index.adoc:585 msgid "" "It should be noted that COMTEST normally aborts when an excessive number or " "certain types of problems have been detected. As part of this testing, " "COMTEST was modified so that it would not abort no matter how many " "differences were encountered." msgstr "" "Следует отметить, что COMTEST обычно завершает работу при обнаружении " "чрезмерного количества или определённых типов проблем. В рамках этого " "тестирования COMTEST был изменён так, чтобы он не завершал работу независимо " "от количества обнаруженных различий." #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:591 +#: documentation/content/en/articles/serial-uart/_index.adoc:590 #, no-wrap msgid "Vendor" msgstr "Поставщик" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:592 +#: documentation/content/en/articles/serial-uart/_index.adoc:591 #, no-wrap msgid "Part Number" msgstr "Номер детали" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:594 +#: documentation/content/en/articles/serial-uart/_index.adoc:593 #, no-wrap msgid "Errors (aka \"differences\" reported)" msgstr "Ошибки (также известные как \"различия\" в отчётах)" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:595 -#: documentation/content/en/articles/serial-uart/_index.adoc:599 -#: documentation/content/en/articles/serial-uart/_index.adoc:603 +#: documentation/content/en/articles/serial-uart/_index.adoc:594 +#: documentation/content/en/articles/serial-uart/_index.adoc:598 +#: documentation/content/en/articles/serial-uart/_index.adoc:602 #, no-wrap msgid "National" msgstr "National" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:596 +#: documentation/content/en/articles/serial-uart/_index.adoc:595 #, no-wrap msgid "(PC16550DV)" msgstr "(PC16550DV)" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:598 -#: documentation/content/en/articles/serial-uart/_index.adoc:602 -#: documentation/content/en/articles/serial-uart/_index.adoc:606 +#: documentation/content/en/articles/serial-uart/_index.adoc:597 +#: documentation/content/en/articles/serial-uart/_index.adoc:601 +#: documentation/content/en/articles/serial-uart/_index.adoc:605 #, no-wrap msgid "0" msgstr "0" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:600 +#: documentation/content/en/articles/serial-uart/_index.adoc:599 #, no-wrap msgid "(NS16550AFN)" msgstr "(NS16550AFN)" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:604 +#: documentation/content/en/articles/serial-uart/_index.adoc:603 #, no-wrap msgid "(NS16C552V)" msgstr "(NS16C552V)" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:607 +#: documentation/content/en/articles/serial-uart/_index.adoc:606 #, no-wrap msgid "TI" msgstr "TI" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:608 +#: documentation/content/en/articles/serial-uart/_index.adoc:607 #, no-wrap msgid "(TL16550AFN)" msgstr "(TL16550AFN)" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:611 +#: documentation/content/en/articles/serial-uart/_index.adoc:610 #, no-wrap msgid "CMD" msgstr "CMD" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:612 +#: documentation/content/en/articles/serial-uart/_index.adoc:611 #, no-wrap msgid "(16C550PE)" msgstr "(16C550PE)" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:615 +#: documentation/content/en/articles/serial-uart/_index.adoc:614 #, no-wrap msgid "StarTech" msgstr "StarTech" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:616 +#: documentation/content/en/articles/serial-uart/_index.adoc:615 #, no-wrap msgid "(ST16C550J)" msgstr "(ST16C550J)" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:619 +#: documentation/content/en/articles/serial-uart/_index.adoc:618 #, no-wrap msgid "Rockwell" msgstr "Rockwell" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:620 +#: documentation/content/en/articles/serial-uart/_index.adoc:619 #, no-wrap msgid "Reference modem with internal 16550 or an emulation (RC144DPi/C3000-25)" msgstr "Стандартный модем с внутренним 16550 или его эмуляцией (RC144DPi/C3000-25)" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:622 +#: documentation/content/en/articles/serial-uart/_index.adoc:621 #, no-wrap msgid "117" msgstr "117" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:623 +#: documentation/content/en/articles/serial-uart/_index.adoc:622 #, no-wrap msgid "Sierra" msgstr "Sierra" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:624 +#: documentation/content/en/articles/serial-uart/_index.adoc:623 #, no-wrap msgid "Modem with an internal 16550 (SC11951/SC11351)" msgstr "Модем с внутренним 16550 (SC11951/SC11351)" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:625 +#: documentation/content/en/articles/serial-uart/_index.adoc:624 #, no-wrap msgid "91" msgstr "91" #. type: delimited block = 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:632 +#: documentation/content/en/articles/serial-uart/_index.adoc:631 msgid "" "To date, the author of this document has not found any non-National parts " "that report zero differences using the COMTEST program. It should also be " "noted that National has had five versions of the 16550 over the years and " "the newest parts behave a bit differently than the classic NS16550AFN that " "is considered the benchmark for functionality. COMTEST appears to turn a " "blind eye to the differences within the National product line and reports no " "errors on the National parts (except for the original 16550) even when there " "are official erratas that describe bugs in the A, B and C revisions of the " "parts, so this bias in COMTEST must be taken into account." msgstr "" "На сегодняшний день автор данного документа не обнаружил ни одного не-" "National компонента, который бы показывал нулевые различия при использовании " "программы COMTEST. Также следует отметить, что у National было пять версий " "16550 за эти годы, и новейшие компоненты ведут себя несколько иначе, чем " "классический NS16550AFN, который считается эталоном функциональности. " "COMTEST, по-видимому, закрывает глаза на различия внутри линейки продуктов " "National и не сообщает об ошибках в компонентах National (за исключением " "оригинальной 16550), даже когда существуют официальные errata, описывающие " "ошибки в ревизиях A, B и C этих компонентов, поэтому эту предвзятость " "COMTEST необходимо учитывать." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:639 +#: documentation/content/en/articles/serial-uart/_index.adoc:638 msgid "" "It is important to understand that a simple count of differences from " "COMTEST does not reveal a lot about what differences are important and which " "are not. For example, about half of the differences reported in the two " "modems listed above that have internal UARTs were caused by the clone UARTs " "not supporting five- and six-bit character modes. The real 16550, 16450, " "and 8250 UARTs all support these modes and COMTEST checks the functionality " "of these modes so over fifty differences are reported. However, almost no " "modern modem supports five- or six-bit characters, particularly those with " "error-correction and compression capabilities. This means that the " "differences related to five- and six-bit character modes can be discounted." msgstr "" "Важно понимать, что простое подсчитывание различий с COMTEST не даёт полного " "представления о том, какие различия существенны, а какие нет. Например, " "около половины различий, обнаруженных в двух вышеупомянутых модемах с " "внутренними UART, были вызваны тем, что клоновые UART не поддерживают режимы " "пяти- и шестибитных символов. Настоящие UART 16550, 16450 и 8250 " "поддерживают эти режимы, и COMTEST проверяет их функциональность, поэтому " "фиксируется более пятидесяти различий. Однако почти ни один современный " "модем не поддерживает пяти- или шестибитные символы, особенно те, что " "обладают функциями коррекции ошибок и сжатия. Это означает, что различия, " "связанные с режимами пяти- и шестибитных символов, можно не учитывать." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:643 +#: documentation/content/en/articles/serial-uart/_index.adoc:642 msgid "" "Many of the differences COMTEST reports have to do with timing. In many of " "the clone designs, when the host reads from one port, the status bits in " "some other port may not update in the same amount of time (some faster, some " "slower) as a _real_ NS16550AFN and COMTEST looks for these differences. " "This means that the number of differences can be misleading in that one " "device may only have one or two differences but they are extremely serious, " "and some other device that updates the status registers faster or slower " "than the reference part (that would probably never affect the operation of a " "properly written driver) could have dozens of differences reported." msgstr "" "Многие различия, о которых сообщает COMTEST, связаны с временными " "характеристиками. Во многих клонированных конструкциях, когда хост читает из " "одного порта, статусные биты в другом порте могут обновляться с иной " "скоростью (быстрее или медленнее), чем у _настоящего_ NS16550AFN, и COMTEST " "выявляет эти различия. Это означает, что количество различий может вводить в " "заблуждение: одно устройство может иметь всего одно или два различия, но они " "крайне критичны, тогда как другое устройство, обновляющее статусные регистры " "быстрее или медленнее эталонной части (что, вероятно, никогда не повлияет на " "работу правильно написанного драйвера), может иметь десятки " "зарегистрированных различий." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:645 +#: documentation/content/en/articles/serial-uart/_index.adoc:644 msgid "" "COMTEST can be used as a screening tool to alert the administrator to the " "presence of potentially incompatible components that might cause problems or " "have to be handled as a special case." msgstr "" "COMTEST можно использовать в качестве инструмента проверки, чтобы " "предупредить администратора о наличии потенциально несовместимых " "компонентов, которые могут вызвать проблемы или потребуют особого подхода." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:648 +#: documentation/content/en/articles/serial-uart/_index.adoc:647 msgid "" "If you run COMTEST on a 16550 that is in a modem or a modem is attached to " "the serial port, you need to first issue a ATE0&W command to the modem so " "that the modem will not echo any of the test characters. If you forget to " "do this, COMTEST will report at least this one difference:" msgstr "" "Если вы запускаете COMTEST на 16550, который находится в модеме или к модему " "подключён последовательный порт, необходимо сначала отправить модему команду " "ATE0&W, чтобы модем не эхо-повторял ни один из тестовых символов. Если вы " "забудете это сделать, COMTEST сообщит как минимум об одном различии:" #. type: delimited block . 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:652 +#: documentation/content/en/articles/serial-uart/_index.adoc:651 #, no-wrap msgid "Error (6)...Timeout interrupt failed: IIR = c1 LSR = 61\n" msgstr "Error (6)...Timeout interrupt failed: IIR = c1 LSR = 61\n" #. type: Title === -#: documentation/content/en/articles/serial-uart/_index.adoc:654 +#: documentation/content/en/articles/serial-uart/_index.adoc:653 #, no-wrap msgid "8250/16450/16550 Registers" msgstr "Регистры 8250/16450/16550" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:660 +#: documentation/content/en/articles/serial-uart/_index.adoc:659 msgid "" "The 8250/16450/16550 UART occupies eight contiguous I/O port addresses. In " "the IBM PC, there are two defined locations for these eight ports and they " "are known collectively as [.filename]#COM1# and [.filename]#COM2#. The " "makers of PC-clones and add-on cards have created two additional areas known " "as [.filename]#COM3# and [.filename]#COM4#, but these extra COM ports " "conflict with other hardware on some systems. The most common conflict is " "with video adapters that provide IBM 8514 emulation." msgstr "" "UART 8250/16450/16550 занимает восемь последовательных адресов портов ввода-" "вывода. В IBM PC определены два расположения для этих восьми портов, которые " "вместе известны как [.filename]#COM1# и [.filename]#COM2#. Производители PC-" "клонов и дополнительных карт создали два дополнительных области, известных " "как [.filename]#COM3# и [.filename]#COM4#, но эти дополнительные COM-порты " "конфликтуют с другим оборудованием на некоторых системах. Наиболее " "распространённый конфликт возникает с видеоадаптерами, обеспечивающими " "эмуляцию IBM 8514." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:665 +#: documentation/content/en/articles/serial-uart/_index.adoc:664 msgid "" "[.filename]#COM1# is located from 0x3f8 to 0x3ff and normally uses IRQ 4. [." "filename]#COM2# is located from 0x2f8 to 0x2ff and normally uses IRQ 3. [." "filename]#COM3# is located from 0x3e8 to 0x3ef and has no standardized IRQ. " "[.filename]#COM4# is located from 0x2e8 to 0x2ef and has no standardized IRQ." msgstr "" "[.filename]#COM1# находится в диапазоне от 0x3f8 до 0x3ff и обычно " "использует IRQ 4. [.filename]#COM2# находится в диапазоне от 0x2f8 до 0x2ff " "и обычно использует IRQ 3. [.filename]#COM3# находится в диапазоне от 0x3e8 " "до 0x3ef и не имеет стандартного IRQ. [.filename]#COM4# находится в " "диапазоне от 0x2e8 до 0x2ef и не имеет стандартного IRQ." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:667 +#: documentation/content/en/articles/serial-uart/_index.adoc:666 msgid "" "A description of the I/O ports of the 8250/16450/16550 UART is provided " "below." msgstr "Описание портов ввода-вывода UART 8250/16450/16550 представлено ниже." #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:672 +#: documentation/content/en/articles/serial-uart/_index.adoc:671 #, no-wrap msgid "I/O Port" msgstr "Порт ввода/вывода" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:673 +#: documentation/content/en/articles/serial-uart/_index.adoc:672 #, no-wrap msgid "Access Allowed" msgstr "Доступ Разрешен" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:676 -#: documentation/content/en/articles/serial-uart/_index.adoc:684 -#: documentation/content/en/articles/serial-uart/_index.adoc:692 +#: documentation/content/en/articles/serial-uart/_index.adoc:675 +#: documentation/content/en/articles/serial-uart/_index.adoc:683 +#: documentation/content/en/articles/serial-uart/_index.adoc:691 #, no-wrap msgid "+0x00" msgstr "+0x00" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:677 +#: documentation/content/en/articles/serial-uart/_index.adoc:676 #, no-wrap msgid "write (DLAB==0)" msgstr "запись (DLAB==0)" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:683 +#: documentation/content/en/articles/serial-uart/_index.adoc:682 #, no-wrap msgid "" "Transmit Holding Register (THR).\n" "\n" "Information written to this port are treated as data words and will be transmitted by the UART." msgstr "" "Регистр передачи данных (THR).\n" "\n" -"Информация, записанная в этот порт, обрабатывается как слова данных и " -"передаётся через UART." +"Информация, записанная в этот порт, обрабатывается как слова данных и передаётся через UART." #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:685 +#: documentation/content/en/articles/serial-uart/_index.adoc:684 #, no-wrap msgid "read (DLAB==0)" msgstr "чтение (DLAB==0)" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:691 +#: documentation/content/en/articles/serial-uart/_index.adoc:690 #, no-wrap msgid "" "Receive Buffer Register (RBR).\n" "\n" "Any data words received by the UART form the serial link are accessed by the host by reading this port." msgstr "" "Регистр буфера приема (RBR).\n" "\n" "Любые слова данных, полученные UART из последовательного соединения, доступны для чтения хостом через этот порт." #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:693 -#: documentation/content/en/articles/serial-uart/_index.adoc:701 +#: documentation/content/en/articles/serial-uart/_index.adoc:692 +#: documentation/content/en/articles/serial-uart/_index.adoc:700 #, no-wrap msgid "write/read (DLAB==1)" msgstr "запись/чтение (DLAB==1)" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:699 +#: documentation/content/en/articles/serial-uart/_index.adoc:698 #, no-wrap msgid "" "Divisor Latch LSB (DLL)\n" "\n" "This value will be divided from the master input clock (in the IBM PC, the master clock is 1.8432MHz) and the resulting clock will determine the baud rate of the UART. This register holds bits 0 thru 7 of the divisor." msgstr "" "Младший байт защелки делителя (DLL — Divisor Latch LSB)\n" "\n" "Это значение будет поделено от основного входного тактового сигнала (в IBM PC основной тактовый сигнал равен 1,8432 МГц), и полученный тактовый сигнал будет определять скорость передачи UART. Этот регистр содержит биты с 0 по 7 делителя." #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:700 -#: documentation/content/en/articles/serial-uart/_index.adoc:708 +#: documentation/content/en/articles/serial-uart/_index.adoc:699 +#: documentation/content/en/articles/serial-uart/_index.adoc:707 #, no-wrap msgid "+0x01" msgstr "+0x01" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:707 +#: documentation/content/en/articles/serial-uart/_index.adoc:706 #, no-wrap msgid "" "Divisor Latch MSB (DLH)\n" "\n" "This value will be divided from the master input clock (in the IBM PC, the master clock is 1.8432MHz) and the resulting clock will determine the baud rate of the UART. This register holds bits 8 thru 15 of the divisor." msgstr "" "Старший байт защелки делителя (DLH — Divisor Latch MSB)\n" "\n" "Это значение будет разделено от основного входного тактового сигнала (в IBM PC основной тактовый сигнал равен 1,8432 МГц), и полученный тактовый сигнал будет определять скорость передачи данных UART. Этот регистр содержит биты с 8 по 15 делителя." #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:709 +#: documentation/content/en/articles/serial-uart/_index.adoc:708 #, no-wrap msgid "write/read (DLAB==0)" msgstr "запись/чтение (DLAB==0)" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:721 +#: documentation/content/en/articles/serial-uart/_index.adoc:720 #, no-wrap msgid "" "Interrupt Enable Register (IER) +\n" "\n" "The 8250/16450/16550 UART classifies events into one of four categories. Each category can be configured to generate an interrupt when any of the events occurs. The 8250/16450/16550 UART generates a single external interrupt signal regardless of how many events in the enabled categories have occurred. It is up to the host processor to respond to the interrupt and then poll the enabled interrupt categories (usually all categories have interrupts enabled) to determine the true cause(s) of the interrupt. +\n" "Bit 7 -> Reserved, always 0. +\n" "Bit 6 -> Reserved, always 0. +\n" "Bit 5 -> Reserved, always 0. +\n" "Bit 4 -> Reserved, always 0. +\n" "Bit 3 -> Enable Modem Status Interrupt (EDSSI). Setting this bit to \"1\" allows the UART to generate an interrupt when a change occurs on one or more of the status lines. +\n" "Bit 2 -> Enable Receiver Line Status Interrupt (ELSI) Setting this bit to \"1\" causes the UART to generate an interrupt when the an error (or a BREAK signal) has been detected in the incoming data. +\n" "Bit 1 -> Enable Transmitter Holding Register Empty Interrupt (ETBEI) Setting this bit to \"1\" causes the UART to generate an interrupt when the UART has room for one or more additional characters that are to be transmitted. +\n" "Bit 0 -> Enable Received Data Available Interrupt (ERBFI) Setting this bit to \"1\" causes the UART to generate an interrupt when the UART has received enough characters to exceed the trigger level of the FIFO, or the FIFO timer has expired (stale data), or a single character has been received when the FIFO is disabled." msgstr "" "Регистр разрешения прерываний (IER) +\n" "\n" "UART 8250/16450/1655 классифицирует события на четыре категории. Каждая категория может быть настроена на генерацию прерывания при возникновении любого из событий. UART 8250/16450/16550 генерирует единый внешний сигнал прерывания независимо от того, сколько событий в разрешённых категориях произошло. Задача главного процессора — обработать прерывание и затем опросить разрешённые категории прерываний (обычно прерывания разрешены для всех категорий), чтобы определить истинную причину(ы) прерывания. +\n" "Бит 7 -> Зарезервирован, всегда 0. +\n" "Бит 6 -> Зарезервирован, всегда 0. +\n" "Бит 5 -> Зарезервирован, всегда 0. +\n" "Бит 4 -> Зарезервирован, всегда 0. +\n" "Бит 3 -> Разрешение прерывания по состоянию модема (EDSSI). Установка этого бита в \"1\" позволяет UART генерировать прерывание при изменении состояния одной или нескольких линий статуса. +\n" "Бит 2 -> Разрешение прерывания по состоянию линии приёмника (ELSI). Установка этого бита в \"1\" приводит к генерации прерывания UART при обнаружении ошибки (или сигнала BREAK) во входящих данных. +\n" "Бит 1 -> Разрешение прерывания по опустошению регистра передатчика (ETBEI). Установка этого бита в \"1\" приводит к генерации прерывания UART, когда в UART появляется место для одного или более дополнительных символов, предназначенных для передачи. +\n" "Бит 0 -> Разрешение прерывания по наличию принятых данных (ERBFI). Установка этого бита в \"1\" приводит к генерации прерывания UART, когда UART принял достаточное количество символов для превышения порога FIFO, или истекло время ожидания FIFO (устаревшие данные), или принят одиночный символ при отключённом FIFO." #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:722 -#: documentation/content/en/articles/serial-uart/_index.adoc:741 +#: documentation/content/en/articles/serial-uart/_index.adoc:721 +#: documentation/content/en/articles/serial-uart/_index.adoc:740 #, no-wrap msgid "+0x02" msgstr "+0x02" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:723 +#: documentation/content/en/articles/serial-uart/_index.adoc:722 #, no-wrap msgid "write" msgstr "запись" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:740 +#: documentation/content/en/articles/serial-uart/_index.adoc:739 #, no-wrap msgid "" "FIFO Control Register (FCR) (This port does not exist on the 8250 and 16450 UART.) +\n" "Bit 7 -> Receiver Trigger Bit #1 +\n" "Bit 6 -> Receiver Trigger Bit #0 +\n" "\n" "These two bits control at what point the receiver is to generate an interrupt when the FIFO is active. +\n" "7 6 How many words are received before an interrupt is generated +\n" "0 0 1 +\n" "0 1 4 +\n" "1 0 8 +\n" "1 1 14 +\n" "Bit 5 -> Reserved, always 0. +\n" "Bit 4 -> Reserved, always 0. +\n" "Bit 3 -> DMA Mode Select. If Bit 0 is set to \"1\" (FIFOs enabled), setting this bit changes the operation of the -RXRDY and -TXRDY signals from Mode 0 to Mode 1. +\n" "Bit 2 -> Transmit FIFO Reset. When a \"1\" is written to this bit, the contents of the FIFO are discarded. Any word currently being transmitted will be sent intact. This function is useful in aborting transfers. +\n" "Bit 1 -> Receiver FIFO Reset. When a \"1\" is written to this bit, the contents of the FIFO are discarded. Any word currently being assembled in the shift register will be received intact. +\n" "Bit 0 -> 16550 FIFO Enable. When set, both the transmit and receive FIFOs are enabled. Any contents in the holding register, shift registers or FIFOs are lost when FIFOs are enabled or disabled. +" msgstr "" -"Регистр управления FIFO (FCR — FIFO Control Register) (Этот порт отсутствует " -"в UART 8250 и 16450.) +\n" +"Регистр управления FIFO (FCR — FIFO Control Register) (Этот порт отсутствует в UART 8250 и 16450.) +\n" "Бит 7 -> Бит триггера приемника #1 +\n" "Бит 6 -> Бит триггера приемника #0 +\n" "\n" -"Эти два бита определяют, при каком количестве данных приемник должен " -"генерировать прерывание, когда FIFO активен. +\n" +"Эти два бита определяют, при каком количестве данных приемник должен генерировать прерывание, когда FIFO активен. +\n" "7 6 Количество слов перед генерацией прерывания +\n" "0 0 1 +\n" "0 1 4 +\n" "1 0 8 +\n" "1 1 14 +\n" "Бит 5 -> Зарезервирован, всегда 0. +\n" "Бит 4 -> Зарезервирован, всегда 0. +\n" -"Бит 3 -> Выбор режима DMA. Если бит 0 установлен в \"1\" (FIFO включены), " -"установка этого бита изменяет работу сигналов -RXRDY и -TXRDY с режима 0 на " -"режим 1. +\n" -"Бит 2 -> Сброс передающего FIFO. При записи \"1\" в этот бит содержимое FIFO " -"очищается. Любое слово, которое передаётся в данный момент, будет отправлено " -"полностью. Эта функция полезна для прерывания передачи. +\n" -"Бит 1 -> Сброс приемного FIFO. При записи \"1\" в этот бит содержимое FIFO " -"очищается. Любое слово, которое в данный момент собирается в сдвиговом " -"регистре, будет принято полностью. +\n" -"Бит 0 -> Включение FIFO 16550. При установке этого бита активируются как " -"передающий, так и приемный FIFO. Любое содержимое в регистре хранения, " -"сдвиговых регистрах или FIFO теряется при включении или отключении FIFO. +" - -#. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:742 +"Бит 3 -> Выбор режима DMA. Если бит 0 установлен в \"1\" (FIFO включены), установка этого бита изменяет работу сигналов -RXRDY и -TXRDY с режима 0 на режим 1. +\n" +"Бит 2 -> Сброс передающего FIFO. При записи \"1\" в этот бит содержимое FIFO очищается. Любое слово, которое передаётся в данный момент, будет отправлено полностью. Эта функция полезна для прерывания передачи. +\n" +"Бит 1 -> Сброс приемного FIFO. При записи \"1\" в этот бит содержимое FIFO очищается. Любое слово, которое в данный момент собирается в сдвиговом регистре, будет принято полностью. +\n" +"Бит 0 -> Включение FIFO 16550. При установке этого бита активируются как передающий, так и приемный FIFO. Любое содержимое в регистре хранения, сдвиговых регистрах или FIFO теряется при включении или отключении FIFO. +" + +#. type: Table +#: documentation/content/en/articles/serial-uart/_index.adoc:741 #, no-wrap msgid "read" msgstr "чтение" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:758 +#: documentation/content/en/articles/serial-uart/_index.adoc:757 #, no-wrap msgid "" "Interrupt Identification Register +\n" "Bit 7 -> FIFOs enabled. On the 8250/16450 UART, this bit is zero. +\n" "Bit 6 -> FIFOs enabled. On the 8250/16450 UART, this bit is zero. +\n" "Bit 5 -> Reserved, always 0. +\n" "Bit 4 -> Reserved, always 0. +\n" "Bit 3 -> Interrupt ID Bit #2. On the 8250/16450 UART, this bit is zero. +\n" "Bit 2 -> Interrupt ID Bit #1 +\n" "Bit 1 -> Interrupt ID Bit #0.These three bits combine to report the category of event that caused the interrupt that is in progress. These categories have priorities, so if multiple categories of events occur at the same time, the UART will report the more important events first and the host must resolve the events in the order they are reported. All events that caused the current interrupt must be resolved before any new interrupts will be generated. (This is a limitation of the PC architecture.) +\n" "2 1 0 Priority Description +\n" "0 1 1 First Received Error (OE, PE, BI, or FE) +\n" "0 1 0 Second Received Data Available +\n" "1 1 0 Second Trigger level identification (Stale data in receive buffer) +\n" "0 0 1 Third Transmitter has room for more words (THRE) +\n" "0 0 0 Fourth Modem Status Change (-CTS, -DSR, -RI, or -DCD) +\n" "Bit 0 -> Interrupt Pending Bit. If this bit is set to \"0\", then at least one interrupt is pending." msgstr "" "Регистр идентификации прерываний +\n" "Бит 7 -> FIFO включены. На UART 8250/16450 этот бит равен нулю. +\n" "Бит 6 -> FIFO включены. На UART 8250/16450 этот бит равен нулю. +\n" "Бит 5 -> Зарезервирован, всегда 0. +\n" "Бит 4 -> Зарезервирован, всегда 0. +\n" "Бит 3 -> Бит идентификатора прерывания №2. На UART 8250/16450 этот бит равен нулю. +\n" "Бит 2 -> Бит идентификатора прерывания №1 +\n" "Бит 1 -> Бит идентификатора прерывания №0.Эти три бита объединяются для указания категории события, вызвавшего текущее прерывание. Эти категории имеют приоритеты, поэтому, если несколько категорий событий происходят одновременно, UART сообщит о более важных событиях первыми, и хост должен обрабатывать события в порядке их поступления. Все события, вызвавшие текущее прерывание, должны быть обработаны до генерации новых прерываний. (Это ограничение архитектуры ПК.) +\n" "2 1 0 Приоритет Описание +\n" "0 1 1 Первый Принятая ошибка (OE, PE, BI или FE) +\n" "0 1 0 Второй Доступны принятые данные +\n" "1 1 0 Второй Идентификация уровня триггера (Устаревшие данные в буфере приема) +\n" "0 0 1 Третий Передатчик готов принять больше данных (THRE) +\n" "0 0 0 Четвертый Изменение состояния модема (-CTS, -DSR, -RI или -DCD) +\n" "Бит 0 -> Бит ожидания прерывания. Если этот бит установлен в \"0\", то как минимум одно прерывание ожидает обработки." #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:759 +#: documentation/content/en/articles/serial-uart/_index.adoc:758 #, no-wrap msgid "+0x03" msgstr "+0x03" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:760 -#: documentation/content/en/articles/serial-uart/_index.adoc:778 -#: documentation/content/en/articles/serial-uart/_index.adoc:790 -#: documentation/content/en/articles/serial-uart/_index.adoc:802 -#: documentation/content/en/articles/serial-uart/_index.adoc:813 +#: documentation/content/en/articles/serial-uart/_index.adoc:759 +#: documentation/content/en/articles/serial-uart/_index.adoc:777 +#: documentation/content/en/articles/serial-uart/_index.adoc:789 +#: documentation/content/en/articles/serial-uart/_index.adoc:801 +#: documentation/content/en/articles/serial-uart/_index.adoc:812 #, no-wrap msgid "write/read" msgstr "запись/чтение" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:776 +#: documentation/content/en/articles/serial-uart/_index.adoc:775 #, no-wrap msgid "" "Line Control Register (LCR) +\n" "Bit 7 -> Divisor Latch Access Bit (DLAB). When set, access to the data transmit/receive register (THR/RBR) and the Interrupt Enable Register (IER) is disabled. Any access to these ports is now redirected to the Divisor Latch Registers. Setting this bit, loading the Divisor Registers, and clearing DLAB should be done with interrupts disabled. +\n" "Bit 6 -> Set Break. When set to \"1\", the transmitter begins to transmit continuous Spacing until this bit is set to \"0\". This overrides any bits of characters that are being transmitted. +\n" "Bit 5 -> Stick Parity. When parity is enabled, setting this bit causes parity to always be \"1\" or \"0\", based on the value of Bit 4.\n" "Bit 4 -> Even Parity Select (EPS). When parity is enabled and Bit 5 is \"0\", setting this bit causes even parity to be transmitted and expected. Otherwise, odd parity is used. +\n" "Bit 3 -> Parity Enable (PEN). When set to \"1\", a parity bit is inserted between the last bit of the data and the Stop Bit. The UART will also expect parity to be present in the received data. +\n" "Bit 2 -> Number of Stop Bits (STB). If set to \"1\" and using 5-bit data words, 1.5 Stop Bits are transmitted and expected in each data word. For 6, 7 and 8-bit data words, 2 Stop Bits are transmitted and expected. When this bit is set to \"0\", one Stop Bit is used on each data word. +\n" "Bit 1 -> Word Length Select Bit #1 (WLSB1) +\n" "Bit 0 -> Word Length Select Bit #0 (WLSB0) +\n" "Together these bits specify the number of bits in each data word. +\n" "1 0 Word Length +\n" "0 0 5 Data Bits +\n" "0 1 6 Data Bits +\n" "1 0 7 Data Bits +\n" "1 1 8 Data Bits +" msgstr "" "Регистр управления линией (LCR — Line Control Register) +\n" -"Бит 7 -> Бит доступа к защелке делителя (DLAB). При установке доступ к " -"регистру передачи/приема данных (THR/RBR) и регистру разрешения прерываний " -"(IER) отключается. Любой доступ к этим портам перенаправляется к регистрам " -"защелки делителя. Установка этого бита, загрузка регистров делителя и сброс " -"DLAB должны выполняться при отключенных прерываниях. +\n" -"Бит 6 -> Установка прерывания. При установке в \"1\" передатчик начинает " -"передавать непрерывный интервал (Spacing), пока этот бит не будет сброшен в " -"\"0\". Это переопределяет любые передаваемые биты символов. +\n" -"Бит 5 -> Фиксированный бит чётности. При включенной проверке чётности " -"установка этого бита приводит к тому, что бит чётности всегда будет \"1\" " -"или \"0\" в зависимости от значения бита 4.\n" -"Бит 4 -> Выбор чётности (EPS). При включенной проверке чётности и если бит 5 " -"равен \"0\", установка этого бита приводит к использованию и ожиданию четной " -"чётности. В противном случае используется нечетная чётность. +\n" -"Бит 3 -> Разрешение проверки чётности (PEN). При установке в \"1\" бит " -"чётности вставляется между последним битом данных и стоповым битом. UART " -"также ожидает наличие бита чётности в принимаемых данных. +\n" -"Бит 2 -> Количество стоповых битов (STB). Если установлен в \"1\" и " -"используются 5-битные слова данных, передаётся и ожидается 1.5 стоповых бита " -"в каждом слове данных. Для 6, 7 и 8-битных слов данных передаётся и " -"ожидается 2 стоповых бита. Если этот бит сброшен в \"0\", используется один " -"стоповый бит в каждом слове данных. +\n" +"Бит 7 -> Бит доступа к защелке делителя (DLAB). При установке доступ к регистру передачи/приема данных (THR/RBR) и регистру разрешения прерываний (IER) отключается. Любой доступ к этим портам перенаправляется к регистрам защелки делителя. Установка этого бита, загрузка регистров делителя и сброс DLAB должны выполняться при отключённых прерываниях. +\n" +"Бит 6 -> Установка прерывания. При установке в \"1\" передатчик начинает передавать непрерывный интервал (Spacing), пока этот бит не будет сброшен в \"0\". Это переопределяет любые передаваемые биты символов. +\n" +"Бит 5 -> Фиксированный бит чётности. При включённой проверке чётности установка этого бита приводит к тому, что бит чётности всегда будет \"1\" или \"0\" в зависимости от значения бита 4.\n" +"Бит 4 -> Выбор чётности (EPS). При включённой проверке чётности и если бит 5 равен \"0\", установка этого бита приводит к использованию и ожиданию четной чётности. В противном случае используется нечетная чётность. +\n" +"Бит 3 -> Разрешение проверки чётности (PEN). При установке в \"1\" бит чётности вставляется между последним битом данных и стоповым битом. UART также ожидает наличие бита чётности в принимаемых данных. +\n" +"Бит 2 -> Количество стоповых битов (STB). Если установлен в \"1\" и используются 5-битные слова данных, передаётся и ожидается 1.5 стоповых бита в каждом слове данных. Для 6, 7 и 8-битных слов данных передаётся и ожидается 2 стоповых бита. Если этот бит сброшен в \"0\", используется один стоповый бит в каждом слове данных. +\n" "Бит 1 -> Бит выбора длины слова #1 (WLSB1) +\n" "Бит 0 -> Бит выбора длины слова #0 (WLSB0) +\n" "Вместе эти биты определяют количество битов в каждом слове данных. +\n" "1 0 Длина слова +\n" "0 0 5 бит данных +\n" "0 1 6 бит данных +\n" "1 0 7 бит данных +\n" "1 1 8 бит данных +" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:777 +#: documentation/content/en/articles/serial-uart/_index.adoc:776 #, no-wrap msgid "+0x04" msgstr "+0x04" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:788 +#: documentation/content/en/articles/serial-uart/_index.adoc:787 #, no-wrap msgid "" "Modem Control Register (MCR) +\n" "Bit 7 -> Reserved, always 0. +\n" "Bit 6 -> Reserved, always 0. +\n" "Bit 5 -> Reserved, always 0. +\n" "Bit 4 -> Loop-Back Enable. When set to \"1\", the UART transmitter and receiver are internally connected together to allow diagnostic operations. In addition, the UART modem control outputs are connected to the UART modem control inputs. CTS is connected to RTS, DTR is connected to DSR, OUT1 is connected to RI, and OUT 2 is connected to DCD. +\n" "Bit 3 -> OUT 2. An auxiliary output that the host processor may set high or low. In the IBM PC serial adapter (and most clones), OUT 2 is used to tri-state (disable) the interrupt signal from the 8250/16450/16550 UART. +\n" "Bit 2 -> OUT 1. An auxiliary output that the host processor may set high or low. This output is not used on the IBM PC serial adapter. +\n" "Bit 1 -> Request to Send (RTS). When set to \"1\", the output of the UART -RTS line is Low (Active). +\n" "Bit 0 -> Data Terminal Ready (DTR). When set to \"1\", the output of the UART -DTR line is Low (Active). +" msgstr "" "Регистр управления модемом (MCR — Modem Control Register) +\n" "Бит 7 -> Зарезервирован, всегда 0. +\n" "Бит 6 -> Зарезервирован, всегда 0. +\n" "Бит 5 -> Зарезервирован, всегда 0. +\n" "Бит 4 -> Режим петли (Loop-Back). При установке в \"1\" передатчик и приёмник UART соединяются внутри для диагностики. Также выходы управления модемом UART подключаются к его входам: CTS к RTS, DTR к DSR, OUT1 к RI, а OUT2 к DCD. +\n" "Бит 3 -> OUT2. Вспомогательный выход, который процессор может установить в высокий или низкий уровень. В адаптере IBM PC (и большинстве клонов) OUT2 используется для отключения сигнала прерывания от UART 8250/16450/16550. +\n" "Бит 2 -> OUT1. Вспомогательный выход, который процессор может установить в высокий или низкий уровень. На адаптере IBM PC не используется. +\n" "Бит 1 -> Запрос на передачу (RTS). При установке в \"1\" выход линии -RTS UART переходит в низкий уровень (активное состояние). +\n" "Бит 0 -> Готовность терминала данных (DTR). При установке в \"1\" выход линии -DTR UART переходит в низкий уровень (активное состояние). +" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:789 +#: documentation/content/en/articles/serial-uart/_index.adoc:788 #, no-wrap msgid "+0x05" msgstr "+0x05" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:800 +#: documentation/content/en/articles/serial-uart/_index.adoc:799 #, no-wrap msgid "" "Line Status Register (LSR) +\n" "Bit 7 -> Error in Receiver FIFO. On the 8250/16450 UART, this bit is zero. This bit is set to \"1\" when any of the bytes in the FIFO have one or more of the following error conditions: PE, FE, or BI. +\n" "Bit 6 -> Transmitter Empty (TEMT). When set to \"1\", there are no words remaining in the transmit FIFO or the transmit shift register. The transmitter is completely idle. +\n" "Bit 5 -> Transmitter Holding Register Empty (THRE). When set to \"1\", the FIFO (or holding register) now has room for at least one additional word to transmit. The transmitter may still be transmitting when this bit is set to \"1\". +\n" "Bit 4 -> Break Interrupt (BI). The receiver has detected a Break signal. +\n" "Bit 3 -> Framing Error (FE). A Start Bit was detected but the Stop Bit did not appear at the expected time. The received word is probably garbled. +\n" "Bit 2 -> Parity Error (PE). The parity bit was incorrect for the word received. +\n" "Bit 1 -> Overrun Error (OE). A new word was received and there was no room in the receive buffer. The newly-arrived word in the shift register is discarded. On 8250/16450 UARTs, the word in the holding register is discarded and the newly- arrived word is put in the holding register. +\n" "Bit 0 -> Data Ready (DR) One or more words are in the receive FIFO that the host may read. A word must be completely received and moved from the shift register into the FIFO (or holding register for 8250/16450 designs) before this bit is set." msgstr "" "Регистр состояния линии (LSR — Line Status Register) +\n" -"Бит 7 -> Ошибка в FIFO приемника. На UART 8250/16450 этот бит равен нулю. " -"Этот бит устанавливается в «1», когда любой из байтов в FIFO имеет одно или " -"несколько из следующих условий ошибки: PE, FE или BI. +\n" -"Бит 6 -> Передатчик пуст (TEMT). Когда установлен в «1», в FIFO передатчика " -"или сдвиговом регистре передатчика не осталось слов. Передатчик полностью " -"бездействует. +\n" -"Бит 5 -> Регистр хранения передатчика пуст (THRE). Когда установлен в «1», в " -"FIFO (или регистре хранения) теперь есть место для передачи как минимум " -"одного дополнительного слова. Передатчик может все ещё передавать данные, " -"когда этот бит установлен в «1». +\n" +"Бит 7 -> Ошибка в FIFO приемника. На UART 8250/16450 этот бит равен нулю. Этот бит устанавливается в «1», когда любой из байтов в FIFO имеет одно или несколько из следующих условий ошибки: PE, FE или BI. +\n" +"Бит 6 -> Передатчик пуст (TEMT). Когда установлен в «1», в FIFO передатчика или сдвиговом регистре передатчика не осталось слов. Передатчик полностью бездействует. +\n" +"Бит 5 -> Регистр хранения передатчика пуст (THRE). Когда установлен в «1», в FIFO (или регистре хранения) теперь есть место для передачи как минимум одного дополнительного слова. Передатчик может все ещё передавать данные, когда этот бит установлен в «1». +\n" "Бит 4 -> Прерывание по Break (BI). Приемник обнаружил сигнал Break. +\n" -"Бит 3 -> Ошибка кадрирования (FE). Обнаружен стартовый бит, но стоповый бит " -"не появился в ожидаемое время. Принятое слово, вероятно, искажено. +\n" -"Бит 2 -> Ошибка чётности (PE). Бит чётности для принятого слова был " -"некорректен. +\n" -"Бит 1 -> Ошибка переполнения (OE). Было получено новое слово, но в буфере " -"приема не было места. Вновь поступившее слово в сдвиговом регистре " -"отбрасывается. На UART 8250/16450 слово в регистре хранения отбрасывается, а " -"вновь поступившее слово помещается в регистр хранения. +\n" -"Бит 0 -> Данные готовы (DR). Одно или несколько слов находятся в FIFO " -"приемника, которые хост может прочитать. Слово должно быть полностью принято " -"и перемещено из сдвигового регистра в FIFO (или регистр хранения для 8250/" -"16450) до того, как этот бит будет установлен." +"Бит 3 -> Ошибка кадрирования (FE). Обнаружен стартовый бит, но стоповый бит не появился в ожидаемое время. Принятое слово, вероятно, искажено. +\n" +"Бит 2 -> Ошибка чётности (PE). Бит чётности для принятого слова был некорректен. +\n" +"Бит 1 -> Ошибка переполнения (OE). Было получено новое слово, но в буфере приема не было места. Вновь поступившее слово в сдвиговом регистре отбрасывается. На UART 8250/16450 слово в регистре хранения отбрасывается, а вновь поступившее слово помещается в регистр хранения. +\n" +"Бит 0 -> Данные готовы (DR). Одно или несколько слов находятся в FIFO приемника, которые хост может прочитать. Слово должно быть полностью принято и перемещено из сдвигового регистра в FIFO (или регистр хранения для 8250/16450) до того, как этот бит будет установлен." #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:801 +#: documentation/content/en/articles/serial-uart/_index.adoc:800 #, no-wrap msgid "+0x06" msgstr "+0x06" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:811 +#: documentation/content/en/articles/serial-uart/_index.adoc:810 #, no-wrap msgid "" "Modem Status Register (MSR) +\n" "Bit 7 -> Data Carrier Detect (DCD). Reflects the state of the DCD line on the UART. +\n" "Bit 6 -> Ring Indicator (RI). Reflects the state of the RI line on the UART. +\n" "Bit 5 -> Data Set Ready (DSR). Reflects the state of the DSR line on the UART. +\n" "Bit 4 -> Clear To Send (CTS). Reflects the state of the CTS line on the UART. +\n" "Bit 3 -> Delta Data Carrier Detect (DDCD). Set to \"1\" if the -DCD line has changed state one more time since the last time the MSR was read by the host. +\n" "Bit 2 -> Trailing Edge Ring Indicator (TERI). Set to \"1\" if the -RI line has had a low to high transition since the last time the MSR was read by the host. +\n" "Bit 1 -> Delta Data Set Ready (DDSR). Set to \"1\" if the -DSR line has changed state one more time since the last time the MSR was read by the host. +\n" "Bit 0 -> Delta Clear To Send (DCTS). Set to \"1\" if the -CTS line has changed state one more time since the last time the MSR was read by the host. +" msgstr "" "Регистр состояния модема (MSR — Modem Status Register) +\n" "Бит 7 -> Обнаружение несущей данных (DCD). Отражает состояние линии DCD на UART. +\n" "Бит 6 -> Индикатор вызова (RI). Отражает состояние линии RI на UART. +\n" "Бит 5 -> Готовность передатчика данных (DSR). Отражает состояние линии DSR на UART. +\n" "Бит 4 -> Готовность к приёму (CTS). Отражает состояние линии CTS на UART. +\n" "Бит 3 -> Изменение состояния обнаружения несущей данных (DDCD). Устанавливается в \"1\", если линия -DCD изменила состояние ещё раз с момента последнего чтения MSR хостом. +\n" "Бит 2 -> Фронт сигнала вызова (TERI). Устанавливается в \"1\", если линия -RI перешла из низкого уровня в высокий с момента последнего чтения MSR хостом. +\n" "Бит 1 -> Изменение состояния готовности передатчика данных (DDSR). Устанавливается в \"1\", если линия -DSR изменила состояние ещё раз с момента последнего чтения MSR хостом. +\n" "Бит 0 -> Изменение состояния готовности к приёму (DCTS). Устанавливается в \"1\", если линия -CTS изменила состояние ещё раз с момента последнего чтения MSR хостом. +" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:812 +#: documentation/content/en/articles/serial-uart/_index.adoc:811 #, no-wrap msgid "+0x07" msgstr "+0x07" #. type: Table -#: documentation/content/en/articles/serial-uart/_index.adoc:814 +#: documentation/content/en/articles/serial-uart/_index.adoc:813 #, no-wrap msgid "Scratch Register (SCR). This register performs no function in the UART. Any value can be written by the host to this location and read by the host later on." msgstr "Регистр Scratch (SCR — Scratch Register). Этот регистр не выполняет никакой функции в UART. Хост может записать любое значение в это место и позднее считать его." #. type: Title === -#: documentation/content/en/articles/serial-uart/_index.adoc:816 +#: documentation/content/en/articles/serial-uart/_index.adoc:815 #, no-wrap msgid "Beyond the 16550A UART" msgstr "За пределами UART 16550A" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:821 +#: documentation/content/en/articles/serial-uart/_index.adoc:820 msgid "" "Although National Semiconductor has not offered any components compatible " "with the 16550 that provide additional features, various other vendors " "have. Some of these components are described below. It should be " "understood that to effectively utilize these improvements, drivers may have " "to be provided by the chip vendor since most of the popular operating " "systems do not support features beyond those provided by the 16550." msgstr "" "Хотя National Semiconductor не предлагала никаких компонентов, совместимых с " "16550 и предоставляющих дополнительные функции, другие производители сделали " "это. Некоторые из этих компонентов описаны ниже. Следует понимать, что для " "эффективного использования этих улучшений могут потребоваться драйверы от " "производителя чипа, поскольку большинство популярных операционных систем не " "поддерживают функции, выходящие за рамки возможностей 16550." #. type: Labeled list -#: documentation/content/en/articles/serial-uart/_index.adoc:822 +#: documentation/content/en/articles/serial-uart/_index.adoc:821 #, no-wrap msgid "ST16650" msgstr "ST16650" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:825 +#: documentation/content/en/articles/serial-uart/_index.adoc:824 msgid "" "By default this part is similar to the NS16550A, but an extended 32-byte " "send and receive buffer can be optionally enabled. Made by StarTech." msgstr "" "По умолчанию эта часть аналогична NS16550A, но дополнительно можно включить " "расширенный 32-байтовый буфер отправки и приёма. Производитель — StarTech." #. type: Labeled list -#: documentation/content/en/articles/serial-uart/_index.adoc:826 +#: documentation/content/en/articles/serial-uart/_index.adoc:825 #, no-wrap msgid "TIL16660" msgstr "TIL16660" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:829 +#: documentation/content/en/articles/serial-uart/_index.adoc:828 msgid "" "By default this part behaves similar to the NS16550A, but an extended 64-" "byte send and receive buffer can be optionally enabled. Made by Texas " "Instruments." msgstr "" "По умолчанию эта часть ведёт себя аналогично NS16550A, но дополнительно " "может быть включён расширенный 64-байтный буфер передачи и приёма. " "Производится Texas Instruments." #. type: Labeled list -#: documentation/content/en/articles/serial-uart/_index.adoc:830 +#: documentation/content/en/articles/serial-uart/_index.adoc:829 #, no-wrap msgid "Hayes ESP" msgstr "Hayes ESP" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:833 +#: documentation/content/en/articles/serial-uart/_index.adoc:832 msgid "" "This proprietary plug-in card contains a 2048-byte send and receive buffer, " "and supports data rates to 230.4Kbit/sec. Made by Hayes." msgstr "" "Эта проприетарная внешняя карта содержит буфер передачи и приема размером " "2048 байт и поддерживает скорость передачи данных до 230,4 Кбит/с. " "Произведено компанией Hayes." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:838 +#: documentation/content/en/articles/serial-uart/_index.adoc:837 msgid "" "In addition to these \"dumb\" UARTs, many vendors produce intelligent serial " "communication boards. This type of design usually provides a microprocessor " "that interfaces with several UARTs, processes and buffers the data, and then " "alerts the main PC processor when necessary. As the UARTs are not directly " "accessed by the PC processor in this type of communication system, it is not " "necessary for the vendor to use UARTs that are compatible with the 8250, " "16450, or the 16550 UART. This leaves the designer free to components that " "may have better performance characteristics." msgstr "" "В дополнение к этим \"простым\" UART многие производители выпускают " "интеллектуальные платы для последовательной связи. Такой тип конструкции " "обычно включает микропроцессор, который взаимодействует с несколькими UART, " "обрабатывает и буферизует данные, а затем при необходимости уведомляет " "основной процессор ПК. Поскольку в такой системе связи UART не доступны " "напрямую процессору ПК, производителю не обязательно использовать UART, " "совместимые с 8250, 16450 или 16550. Это даёт разработчику свободу выбора " "компонентов с лучшими характеристиками производительности." #. type: Title == -#: documentation/content/en/articles/serial-uart/_index.adoc:840 +#: documentation/content/en/articles/serial-uart/_index.adoc:839 #, no-wrap msgid "Configuring the [.filename]#sio# driver" msgstr "Настройка драйвера [.filename]#sio#" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:845 +#: documentation/content/en/articles/serial-uart/_index.adoc:844 msgid "" "The [.filename]#sio# driver provides support for NS8250-, NS16450-, NS16550 " "and NS16550A-based EIA RS-232C (CCITT V.24) communications interfaces. " "Several multiport cards are supported as well. See the man:sio[4] manual " "page for detailed technical documentation." msgstr "" "Драйвер [.filename]#sio# обеспечивает поддержку интерфейсов связи EIA " "RS-232C (CCITT V.24) на основе NS8250, NS16450, NS16550 и NS16550A. Также " "поддерживаются несколько многопортовых карт. Подробную техническую " "документацию смотрите на man:sio[4]." #. type: Title === -#: documentation/content/en/articles/serial-uart/_index.adoc:846 +#: documentation/content/en/articles/serial-uart/_index.adoc:845 #, no-wrap msgid "Digi International (DigiBoard) PC/8" msgstr "Digi International (DigiBoard) PC/8" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:849 +#: documentation/content/en/articles/serial-uart/_index.adoc:848 msgid "_Contributed by `{awebster}`. 26 August 1995._" msgstr "_Предоставлено `{awebster}`. 26 августа 1995._" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:853 +#: documentation/content/en/articles/serial-uart/_index.adoc:852 msgid "" "Here is a config snippet from a machine with a Digi International PC/8 with " "16550. It has 8 modems connected to these 8 lines, and they work just " "great. Do not forget to add `options COM_MULTIPORT` or it will not work " "very well!" msgstr "" "Вот фрагмент конфигурации с машины, на которой установлена плата Digi " "International PC/8 с чипом 16550. К ней подключено 8 модемов, работающих на " "этих 8 линиях, и они отлично функционируют. Не забудьте добавить `options " "COM_MULTIPORT`, иначе работа будет нестабильной!" #. type: delimited block . 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:864 +#: documentation/content/en/articles/serial-uart/_index.adoc:863 #, no-wrap msgid "" "device sio4 at isa? port 0x100 flags 0xb05\n" "device sio5 at isa? port 0x108 flags 0xb05\n" "device sio6 at isa? port 0x110 flags 0xb05\n" "device sio7 at isa? port 0x118 flags 0xb05\n" "device sio8 at isa? port 0x120 flags 0xb05\n" "device sio9 at isa? port 0x128 flags 0xb05\n" "device sio10 at isa? port 0x130 flags 0xb05\n" "device sio11 at isa? port 0x138 flags 0xb05 irq 9\n" msgstr "" "device sio4 at isa? port 0x100 flags 0xb05\n" "device sio5 at isa? port 0x108 flags 0xb05\n" "device sio6 at isa? port 0x110 flags 0xb05\n" "device sio7 at isa? port 0x118 flags 0xb05\n" "device sio8 at isa? port 0x120 flags 0xb05\n" "device sio9 at isa? port 0x128 flags 0xb05\n" "device sio10 at isa? port 0x130 flags 0xb05\n" "device sio11 at isa? port 0x138 flags 0xb05 irq 9\n" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:867 +#: documentation/content/en/articles/serial-uart/_index.adoc:866 msgid "" "The trick in setting this up is that the MSB of the flags represent the last " "SIO port, in this case 11 so flags are 0xb05." msgstr "" "Хитрость настройки заключается в том, что старший бит флагов представляет " "последний порт SIO, в данном случае 11, поэтому флаги равны 0xb05." #. type: Title === -#: documentation/content/en/articles/serial-uart/_index.adoc:868 +#: documentation/content/en/articles/serial-uart/_index.adoc:867 #, no-wrap msgid "Boca 16" msgstr "Boca 16" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:871 +#: documentation/content/en/articles/serial-uart/_index.adoc:870 msgid "_Contributed by `{whiteside}`. 26 August 1995._" msgstr "_Предоставлено `{whiteside}`. 26 августа 1995._" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:873 +#: documentation/content/en/articles/serial-uart/_index.adoc:872 msgid "" "The procedures to make a Boca 16 port board with FreeBSD are pretty " "straightforward, but you will need a couple things to make it work:" msgstr "" "Процедуры по настройке платы Boca с 16 портами в FreeBSD довольно просты, но " "вам понадобится несколько вещей для успешной работы:" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:875 +#: documentation/content/en/articles/serial-uart/_index.adoc:874 msgid "" "You either need the kernel sources installed so you can recompile the " "necessary options or you will need someone else to compile it for you. The " "2.0.5 default kernel does _not_ come with multiport support enabled and you " "will need to add a device entry for each port anyways." msgstr "" "Вам необходимо либо установить исходные коды ядра, чтобы перекомпилировать " "нужные опции, либо найти кого-то, кто сделает это за вас. Стандартное ядро " "версии 2.0.5 _не_ включает поддержку нескольких портов, и в любом случае вам " "потребуется добавить запись устройства для каждого порта." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:876 +#: documentation/content/en/articles/serial-uart/_index.adoc:875 msgid "" "Two, you will need to know the interrupt and IO setting for your Boca Board " "so you can set these options properly in the kernel." msgstr "" "Два, вам нужно знать прерывание и настройку ввода-вывода для вашей платы " "Boca, чтобы правильно установить эти параметры в ядре." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:880 +#: documentation/content/en/articles/serial-uart/_index.adoc:879 msgid "" "One important note - the actual UART chips for the Boca 16 are in the " "connector box, not on the internal board itself. So if you have it " "unplugged, probes of those ports will fail. I have never tested booting " "with the box unplugged and plugging it back in, and I suggest you do not " "either." msgstr "" "Важное замечание — реальные микросхемы UART для Boca 16 находятся в " "соединительной коробке, а не на внутренней плате. Поэтому, если она " "отключена, попытки проверить эти порты завершатся неудачей. Я никогда не " "проверял загрузку с отключённой коробкой и последующим её подключением, и не " "рекомендую вам этого делать." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:883 +#: documentation/content/en/articles/serial-uart/_index.adoc:882 msgid "" "If you do not already have a custom kernel configuration file set up, refer " "to extref:{handbook}kernelconfig[Kernel Configuration, kernelconfig] chapter " "of the FreeBSD Handbook for general procedures. The following are the " "specifics for the Boca 16 board and assume you are using the kernel name " "MYKERNEL and editing with vi." msgstr "" "Если у вас ещё нет настроенного файла конфигурации пользовательского ядра, " "обратитесь к разделу extref:{handbook}kernelconfig[Конфигурация ядра, " "kernelconfig] в руководстве FreeBSD для получения общих инструкций. Ниже " "приведены конкретные настройки для платы Boca 16, предполагается, что вы " "используете ядро с именем MYKERNEL и редактируете его с помощью vi." #. type: delimited block = 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:887 +#: documentation/content/en/articles/serial-uart/_index.adoc:886 msgid "Add the line" msgstr "Добавьте строку" #. type: delimited block . 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:891 +#: documentation/content/en/articles/serial-uart/_index.adoc:890 #, no-wrap msgid "options COM_MULTIPORT\n" msgstr "options COM_MULTIPORT\n" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:893 +#: documentation/content/en/articles/serial-uart/_index.adoc:892 msgid "to the config file." msgstr "в конфигурационный файл." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:894 +#: documentation/content/en/articles/serial-uart/_index.adoc:893 msgid "" "Where the current `device sio__n__` lines are, you will need to add 16 more " "devices. The following example is for a Boca Board with an interrupt of 3, " "and a base IO address 100h. The IO address for Each port is +8 hexadecimal " "from the previous port, thus the 100h, 108h, 110h... addresses." msgstr "" "Где находятся текущие строки `device sio__n__`, вам нужно добавить ещё 16 " "устройств. В следующем примере показана плата Boca Board с прерыванием 3 и " "базовым адресом ввода-вывода 100h. Адрес ввода-вывода для каждого порта " "увеличивается на 8 в шестнадцатеричной системе относительно предыдущего " "порта, поэтому адреса будут 100h, 108h, 110h..." #. type: delimited block . 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:904 +#: documentation/content/en/articles/serial-uart/_index.adoc:903 #, no-wrap msgid "" "device sio1 at isa? port 0x100 flags 0x1005\n" "device sio2 at isa? port 0x108 flags 0x1005\n" "device sio3 at isa? port 0x110 flags 0x1005\n" "device sio4 at isa? port 0x118 flags 0x1005\n" "...\n" "device sio15 at isa? port 0x170 flags 0x1005\n" "device sio16 at isa? port 0x178 flags 0x1005 irq 3\n" msgstr "" "device sio1 at isa? port 0x100 flags 0x1005\n" "device sio2 at isa? port 0x108 flags 0x1005\n" "device sio3 at isa? port 0x110 flags 0x1005\n" "device sio4 at isa? port 0x118 flags 0x1005\n" "...\n" "device sio15 at isa? port 0x170 flags 0x1005\n" "device sio16 at isa? port 0x178 flags 0x1005 irq 3\n" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:909 +#: documentation/content/en/articles/serial-uart/_index.adoc:908 msgid "" "The flags entry _must_ be changed from this example unless you are using the " "exact same sio assignments. Flags are set according to 0x``__MYY__`` where " "_M_ indicates the minor number of the master port (the last port on a Boca " "16) and _YY_ indicates if FIFO is enabled or disabled(enabled), IRQ sharing " "is used(yes) and if there is an AST/4 compatible IRQ control register(no). " "In this example," msgstr "" "Запись flags _обязательно_ должна быть изменена по сравнению с этим " "примером, если вы не используете точно такие же назначения sio. Флаги " "устанавливаются в соответствии с 0x``__MYY__``, где _M_ обозначает младший " "номер главного порта (последний порт на Boca 16), а _YY_ указывает, включен " "или выключен FIFO (включен), используется ли разделение IRQ (да) и есть ли " "регистр управления IRQ, совместимый с AST/4 (нет). В этом примере," #. type: delimited block . 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:914 +#: documentation/content/en/articles/serial-uart/_index.adoc:913 #, no-wrap msgid "" " flags\n" "\t 0x1005\n" msgstr "" " flags\n" "\t 0x1005\n" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:918 +#: documentation/content/en/articles/serial-uart/_index.adoc:917 msgid "" "indicates that the master port is sio16. If I added another board and " "assigned sio17 through sio28, the flags for all 16 ports on _that_ board " "would be 0x1C05, where 1C indicates the minor number of the master port. Do " "not change the 05 setting." msgstr "" "указывает, что основной порт - sio16. Если добавить другую плату и назначить " "порты с sio17 по sio28, флаги для всех 16 портов на _этой_ плате будут " "0x1C05, где 1C обозначает минорный номер основного порта. Не изменяйте " "значение 05." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:919 +#: documentation/content/en/articles/serial-uart/_index.adoc:918 msgid "" "Save and complete the kernel configuration, recompile, install and reboot. " "Presuming you have successfully installed the recompiled kernel and have it " "set to the correct address and IRQ, your boot message should indicate the " "successful probe of the Boca ports as follows: (obviously the sio numbers, " "IO and IRQ could be different)" msgstr "" "Сохраните и завершите конфигурацию ядра, перекомпилируйте, установите и " "перезагрузитесь. Предполагая, что вы успешно установили перекомпилированное " "ядро и настроили правильный адрес и IRQ, сообщение при загрузке должно " "указывать на успешное обнаружение портов Boca следующим образом: (очевидно, " "номера sio, IO и IRQ могут отличаться)" #. type: delimited block . 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:954 +#: documentation/content/en/articles/serial-uart/_index.adoc:953 #, no-wrap msgid "" "sio1 at 0x100-0x107 flags 0x1005 on isa\n" "sio1: type 16550A (multiport)\n" "sio2 at 0x108-0x10f flags 0x1005 on isa\n" "sio2: type 16550A (multiport)\n" "sio3 at 0x110-0x117 flags 0x1005 on isa\n" "sio3: type 16550A (multiport)\n" "sio4 at 0x118-0x11f flags 0x1005 on isa\n" "sio4: type 16550A (multiport)\n" "sio5 at 0x120-0x127 flags 0x1005 on isa\n" "sio5: type 16550A (multiport)\n" "sio6 at 0x128-0x12f flags 0x1005 on isa\n" "sio6: type 16550A (multiport)\n" "sio7 at 0x130-0x137 flags 0x1005 on isa\n" "sio7: type 16550A (multiport)\n" "sio8 at 0x138-0x13f flags 0x1005 on isa\n" "sio8: type 16550A (multiport)\n" "sio9 at 0x140-0x147 flags 0x1005 on isa\n" "sio9: type 16550A (multiport)\n" "sio10 at 0x148-0x14f flags 0x1005 on isa\n" "sio10: type 16550A (multiport)\n" "sio11 at 0x150-0x157 flags 0x1005 on isa\n" "sio11: type 16550A (multiport)\n" "sio12 at 0x158-0x15f flags 0x1005 on isa\n" "sio12: type 16550A (multiport)\n" "sio13 at 0x160-0x167 flags 0x1005 on isa\n" "sio13: type 16550A (multiport)\n" "sio14 at 0x168-0x16f flags 0x1005 on isa\n" "sio14: type 16550A (multiport)\n" "sio15 at 0x170-0x177 flags 0x1005 on isa\n" "sio15: type 16550A (multiport)\n" "sio16 at 0x178-0x17f irq 3 flags 0x1005 on isa\n" "sio16: type 16550A (multiport master)\n" msgstr "" "sio1 at 0x100-0x107 flags 0x1005 on isa\n" "sio1: type 16550A (multiport)\n" "sio2 at 0x108-0x10f flags 0x1005 on isa\n" "sio2: type 16550A (multiport)\n" "sio3 at 0x110-0x117 flags 0x1005 on isa\n" "sio3: type 16550A (multiport)\n" "sio4 at 0x118-0x11f flags 0x1005 on isa\n" "sio4: type 16550A (multiport)\n" "sio5 at 0x120-0x127 flags 0x1005 on isa\n" "sio5: type 16550A (multiport)\n" "sio6 at 0x128-0x12f flags 0x1005 on isa\n" "sio6: type 16550A (multiport)\n" "sio7 at 0x130-0x137 flags 0x1005 on isa\n" "sio7: type 16550A (multiport)\n" "sio8 at 0x138-0x13f flags 0x1005 on isa\n" "sio8: type 16550A (multiport)\n" "sio9 at 0x140-0x147 flags 0x1005 on isa\n" "sio9: type 16550A (multiport)\n" "sio10 at 0x148-0x14f flags 0x1005 on isa\n" "sio10: type 16550A (multiport)\n" "sio11 at 0x150-0x157 flags 0x1005 on isa\n" "sio11: type 16550A (multiport)\n" "sio12 at 0x158-0x15f flags 0x1005 on isa\n" "sio12: type 16550A (multiport)\n" "sio13 at 0x160-0x167 flags 0x1005 on isa\n" "sio13: type 16550A (multiport)\n" "sio14 at 0x168-0x16f flags 0x1005 on isa\n" "sio14: type 16550A (multiport)\n" "sio15 at 0x170-0x177 flags 0x1005 on isa\n" "sio15: type 16550A (multiport)\n" "sio16 at 0x178-0x17f irq 3 flags 0x1005 on isa\n" "sio16: type 16550A (multiport master)\n" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:957 +#: documentation/content/en/articles/serial-uart/_index.adoc:956 msgid "If the messages go by too fast to see," msgstr "Если сообщения проходят слишком быстро, чтобы их увидеть," #. type: delimited block . 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:961 +#: documentation/content/en/articles/serial-uart/_index.adoc:960 #, no-wrap msgid "# dmesg | more\n" msgstr "# dmesg | more\n" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:963 +#: documentation/content/en/articles/serial-uart/_index.adoc:962 msgid "will show you the boot messages." msgstr "покажет вам сообщения загрузки." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:964 +#: documentation/content/en/articles/serial-uart/_index.adoc:963 msgid "" "Next, appropriate entries in [.filename]#/dev# for the devices must be made " "using the [.filename]#/dev/MAKEDEV# script. This step can be omitted if you " "are running FreeBSD 5.X with a kernel that has man:devfs[5] support compiled " "in." msgstr "" "Далее необходимо создать соответствующие записи в [.filename]#/dev# для " "устройств с помощью скрипта [.filename]#/dev/MAKEDEV#. Этот шаг можно " "пропустить, если вы используете FreeBSD 5.X с ядром, в котором включена " "поддержка man:devfs[5]." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:966 +#: documentation/content/en/articles/serial-uart/_index.adoc:965 msgid "" "If you do need to create the [.filename]#/dev# entries, run the following as " "`root`:" msgstr "" "Если вам необходимо создать записи в [.filename]#/dev#, выполните следующую " "команду от имени `root`:" #. type: delimited block . 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:972 +#: documentation/content/en/articles/serial-uart/_index.adoc:971 #, no-wrap msgid "" "# cd /dev\n" "# ./MAKEDEV tty1\n" "# ./MAKEDEV cua1\n" msgstr "" "# cd /dev\n" "# ./MAKEDEV tty1\n" "# ./MAKEDEV cua1\n" #. type: delimited block . 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:976 +#: documentation/content/en/articles/serial-uart/_index.adoc:975 #, no-wrap msgid "" "(everything in between)\n" "# ./MAKEDEV ttyg\n" "# ./MAKEDEV cuag\n" msgstr "" "(everything in between)\n" "# ./MAKEDEV ttyg\n" "# ./MAKEDEV cuag\n" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:979 +#: documentation/content/en/articles/serial-uart/_index.adoc:978 msgid "" "If you do not want or need call-out devices for some reason, you can " "dispense with making the [.filename]#cua*# devices." msgstr "" "Если по какой-то причине вам не нужны или не требуются устройства исходящих " "соединений, вы можете обойтись без создания устройств [.filename]#cua*#." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:980 +#: documentation/content/en/articles/serial-uart/_index.adoc:979 msgid "" "If you want a quick and sloppy way to make sure the devices are working, you " "can simply plug a modem into each port and (as root)" msgstr "" "Если вам нужен быстрый и небрежный способ убедиться, что устройства " "работают, вы можете просто подключить модем к каждому порту и (как root)" #. type: delimited block . 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:984 +#: documentation/content/en/articles/serial-uart/_index.adoc:983 #, no-wrap msgid "# echo at > ttyd*\n" msgstr "# echo at > ttyd*\n" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:986 +#: documentation/content/en/articles/serial-uart/_index.adoc:985 msgid "" "for each device you have made. You _should_ see the RX lights flash for each " "working port." msgstr "" "для каждого устройства, которое вы создали. Вы _должны_ увидеть, как мигают " "индикаторы RX для каждого рабочего порта." #. type: Title === -#: documentation/content/en/articles/serial-uart/_index.adoc:988 +#: documentation/content/en/articles/serial-uart/_index.adoc:987 #, no-wrap msgid "Support for Cheap Multi-UART Cards" msgstr "Поддержка дешёвых многоканальных UART-карт" #. type: delimited block = 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:991 +#: documentation/content/en/articles/serial-uart/_index.adoc:990 msgid "" "_Contributed by Helge Oldach_ mailto:hmo@sep.hamburg.com[hmo@sep.hamburg." "com], September 1999" msgstr "" "_Предоставлено Хельге Ольдахом_ mailto:hmo@sep.hamburg.com[hmo@sep.hamburg." "com], сентябрь 1999 года" #. type: delimited block = 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:993 +#: documentation/content/en/articles/serial-uart/_index.adoc:992 msgid "" "Ever wondered about FreeBSD support for your 20$ multi-I/O card with two (or " "more) COM ports, sharing IRQs? Here is how:" msgstr "" "Вы когда-нибудь задумывались о поддержке FreeBSD вашей 20-долларовой " "многофункциональной карты с двумя (или более) COM-портами, разделяющими IRQ? " "Вот как это сделать:" #. type: delimited block = 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:997 +#: documentation/content/en/articles/serial-uart/_index.adoc:996 msgid "" "Usually the only option to support these kind of boards is to use a distinct " "IRQ for each port. For example, if your CPU board has an on-board [." "filename]#COM1# port (aka [.filename]#sio0#-I/O address 0x3F8 and IRQ 4) and " "you have an extension board with two UARTs, you will commonly need to " "configure them as [.filename]#COM2# (aka [.filename]#sio1#-I/O address 0x2F8 " "and IRQ 3), and the third port (aka [.filename]#sio2#) as I/O 0x3E8 and IRQ " "5. Obviously this is a waste of IRQ resources, as it should be basically " "possible to run both extension board ports using a single IRQ with the " "`COM_MULTIPORT` configuration described in the previous sections." msgstr "" "Обычно единственный способ поддержки таких плат — использование отдельного " "IRQ для каждого порта. Например, если ваша материнская плата имеет " "встроенный порт [.filename]#COM1# (он же [.filename]#sio0# — адрес ввода-" "вывода 0x3F8 и IRQ 4), а у вас есть расширительная плата с двумя UART, то " "обычно их нужно настроить как [.filename]#COM2# (он же [.filename]#sio1# — " "адрес ввода-вывода 0x2F8 и IRQ 3), а третий порт (он же [.filename]#sio2#) — " "с адресом 0x3E8 и IRQ 5. Очевидно, это расточительное использование ресурсов " "IRQ, так как в принципе возможно запустить оба порта расширительной платы с " "одним IRQ, используя конфигурацию `COM_MULTIPORT`, описанную в предыдущих " "разделах." #. type: delimited block = 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:999 +#: documentation/content/en/articles/serial-uart/_index.adoc:998 msgid "" "Such cheap I/O boards commonly have a 4 by 3 jumper matrix for the COM " "ports, similar to the following:" msgstr "" "Такие недорогие платы ввода-вывода обычно имеют перемычечную матрицу 4x3 для " "COM-портов, подобную следующей:" #. type: delimited block . 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:1008 +#: documentation/content/en/articles/serial-uart/_index.adoc:1007 #, no-wrap msgid "" " o o o *\n" "Port A |\n" " o * o *\n" "Port B |\n" " o * o o\n" "IRQ 2 3 4 5\n" msgstr "" " o o o *\n" "Port A |\n" " o * o *\n" "Port B |\n" " o * o o\n" "IRQ 2 3 4 5\n" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:1012 +#: documentation/content/en/articles/serial-uart/_index.adoc:1011 msgid "" "Shown here is port A wired for IRQ 5 and port B wired for IRQ 3. The IRQ " "columns on your specific board may vary-other boards may supply jumpers for " "IRQs 3, 4, 5, and 7 instead." msgstr "" "Показано, что порт A подключен для IRQ 5, а порт B — для IRQ 3. Столбцы IRQ " "на вашей конкретной плате могут отличаться — другие платы могут " "предоставлять перемычки для IRQ 3, 4, 5 и 7." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:1016 +#: documentation/content/en/articles/serial-uart/_index.adoc:1015 msgid "" "One could conclude that wiring both ports for IRQ 3 using a handcrafted wire-" "made jumper covering all three connection points in the IRQ 3 column would " "solve the issue, but no. You cannot duplicate IRQ 3 because the output " "drivers of each UART are wired in a \"totem pole\" fashion, so if one of the " "UARTs drives IRQ 3, the output signal will not be what you would expect. " "Depending on the implementation of the extension board or your motherboard, " "the IRQ 3 line will continuously stay up, or always stay low." msgstr "" "Можно было бы сделать вывод, что подключение обоих портов к IRQ 3 с помощью " "самодельной перемычки, замыкающей все три точки соединения в колонке IRQ 3, " "решит проблему, но это не так. Невозможно дублировать IRQ 3, потому что " "выходные драйверы каждого UART соединены по схеме \"монтажное И\", и если " "один из UART управляет IRQ 3, выходной сигнал будет не таким как ожидается. " "В зависимости от реализации платы расширения или материнской платы, линия " "IRQ 3 будет постоянно находиться в высоком уровне или всегда оставаться " "низкой." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:1020 +#: documentation/content/en/articles/serial-uart/_index.adoc:1019 msgid "" "You need to decouple the IRQ drivers for the two UARTs, so that the IRQ line " "of the board only goes up if (and only if) one of the UARTs asserts a IRQ, " "and stays low otherwise. The solution was proposed by Joerg Wunsch mailto:" "j@ida.interface-business.de[j@ida.interface-business.de]: To solder up a " "wired-or consisting of two diodes (Germanium or Schottky-types strongly " "preferred) and a 1 kOhm resistor. Here is the schematic, starting from the " "4 by 3 jumper field above:" msgstr "" "Вам необходимо разделить драйверы прерываний для двух UART, чтобы линия " "прерывания платы поднималась только тогда (и только тогда), когда один из " "UART вызывает прерывание, и оставалась низкой в противном случае. Решение " "было предложено Йоргом Вуншем mailto:j@ida.interface-business.de[j@ida." "interface-business.de]: припаять монтажную схему \"монтажное ИЛИ\", " "состоящую из двух диодов (предпочтительно германиевых или типа Шоттки) и " "резистора на 1 кОм. Вот схема, начиная с контактного поля 4x3 выше:" #. type: delimited block . 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:1034 +#: documentation/content/en/articles/serial-uart/_index.adoc:1033 #, no-wrap msgid "" " Diode\n" " +---------->|-------+\n" " / |\n" " o * o o | 1 kOhm\n" "Port A +----|######|-------+\n" " o * o o | |\n" "Port B `-------------------+ ==+==\n" " o * o o | Ground\n" " \\ |\n" " +--------->|-------+\n" "IRQ 2 3 4 5 Diode\n" msgstr "" " Diode\n" " +---------->|-------+\n" " / |\n" " o * o o | 1 kOhm\n" "Port A +----|######|-------+\n" " o * o o | |\n" "Port B `-------------------+ ==+==\n" " o * o o | Ground\n" " \\ |\n" " +--------->|-------+\n" "IRQ 2 3 4 5 Diode\n" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:1038 +#: documentation/content/en/articles/serial-uart/_index.adoc:1037 msgid "" "The cathodes of the diodes are connected to a common point, together with a " "1 kOhm pull-down resistor. It is essential to connect the resistor to " "ground to avoid floating of the IRQ line on the bus." msgstr "" "Катоды диодов соединены в общей точке вместе с подтягивающим резистором 1 " "кОм. Важно подключить резистор к земле, чтобы избежать плавания линии IRQ на " "шине." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:1041 +#: documentation/content/en/articles/serial-uart/_index.adoc:1040 msgid "" "Now we are ready to configure a kernel. Staying with this example, we would " "configure:" msgstr "Теперь мы готовы настроить ядро. Продолжая этот пример, мы настроим:" #. type: delimited block . 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:1050 +#: documentation/content/en/articles/serial-uart/_index.adoc:1049 #, no-wrap msgid "" "# standard on-board COM1 port\n" "device sio0 at isa? port \"IO_COM1\" flags 0x10\n" "# patched-up multi-I/O extension board\n" "options COM_MULTIPORT\n" "device sio1 at isa? port \"IO_COM2\" flags 0x205\n" "device sio2 at isa? port \"IO_COM3\" flags 0x205 irq 3\n" msgstr "" "# standard on-board COM1 port\n" "device sio0 at isa? port \"IO_COM1\" flags 0x10\n" "# patched-up multi-I/O extension board\n" "options COM_MULTIPORT\n" "device sio1 at isa? port \"IO_COM2\" flags 0x205\n" "device sio2 at isa? port \"IO_COM3\" flags 0x205 irq 3\n" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:1055 +#: documentation/content/en/articles/serial-uart/_index.adoc:1054 msgid "" "Note that the `flags` setting for [.filename]#sio1# and [.filename]#sio2# is " "truly essential; refer to man:sio[4] for details. (Generally, the `2` in " "the \"flags\" attribute refers to [.filename]#sio#`2` which holds the IRQ, " "and you surely want a `5` low nibble.) With kernel verbose mode turned on " "this should yield something similar to this:" msgstr "" "Обратите внимание, что настройка `flags` для [.filename]#sio1# и [." "filename]#sio2# действительно важна; подробности смотрите в man:sio[4]. " "(Обычно `2` в атрибуте \"flags\" относится к [.filename]#sio#`2`, который " "содержит IRQ, и вам наверняка потребуется нижний ниббл `5`.) При включённом " "режиме подробного вывода ядра это должно дать что-то похожее на следующее:" #. type: delimited block . 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:1067 +#: documentation/content/en/articles/serial-uart/_index.adoc:1066 #, no-wrap msgid "" "sio0: irq maps: 0x1 0x11 0x1 0x1\n" "sio0 at 0x3f8-0x3ff irq 4 flags 0x10 on isa\n" "sio0: type 16550A\n" "sio1: irq maps: 0x1 0x9 0x1 0x1\n" "sio1 at 0x2f8-0x2ff flags 0x205 on isa\n" "sio1: type 16550A (multiport)\n" "sio2: irq maps: 0x1 0x9 0x1 0x1\n" "sio2 at 0x3e8-0x3ef irq 3 flags 0x205 on isa\n" "sio2: type 16550A (multiport master)\n" msgstr "" "sio0: irq maps: 0x1 0x11 0x1 0x1\n" "sio0 at 0x3f8-0x3ff irq 4 flags 0x10 on isa\n" "sio0: type 16550A\n" "sio1: irq maps: 0x1 0x9 0x1 0x1\n" "sio1 at 0x2f8-0x2ff flags 0x205 on isa\n" "sio1: type 16550A (multiport)\n" "sio2: irq maps: 0x1 0x9 0x1 0x1\n" "sio2 at 0x3e8-0x3ef irq 3 flags 0x205 on isa\n" "sio2: type 16550A (multiport master)\n" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:1072 +#: documentation/content/en/articles/serial-uart/_index.adoc:1071 msgid "" "Though [.filename]#/sys/i386/isa/sio.c# is somewhat cryptic with its use of " "the \"irq maps\" array above, the basic idea is that you observe `0x1` in " "the first, third, and fourth place. This means that the corresponding IRQ " "was set upon output and cleared after, which is just what we would expect. " "If your kernel does not display this behavior, most likely there is " "something wrong with your wiring." msgstr "" "Хотя [.filename]#/sys/i386/isa/sio.c# выглядит несколько загадочно из-за " "использования массива \"irq maps\" выше, основная идея заключается в том, " "что вы наблюдаете `0x1` на первой, третьей и четвертой позициях. Это " "означает, что соответствующий IRQ был установлен при выводе и сброшен после, " "что полностью соответствует ожиданиям. Если ваше ядро не демонстрирует такое " "поведение, скорее всего, проблема в вашей разводке." #. type: Title == -#: documentation/content/en/articles/serial-uart/_index.adoc:1074 +#: documentation/content/en/articles/serial-uart/_index.adoc:1073 #, no-wrap msgid "Configuring the [.filename]#cy# driver" msgstr "Настройка драйвера [.filename]#cy#" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:1077 +#: documentation/content/en/articles/serial-uart/_index.adoc:1076 msgid "_Contributed by Alex Nash. 6 June 1996._" msgstr "_Предоставлено Алексом Нэшем. 6 июня 1996._" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:1080 +#: documentation/content/en/articles/serial-uart/_index.adoc:1079 msgid "" "The Cyclades multiport cards are based on the [.filename]#cy# driver instead " "of the usual [.filename]#sio# driver used by other multiport cards. " "Configuration is a simple matter of:" msgstr "" "Многопортовые карты Cyclades основаны на драйвере [.filename]#cy#, а не на " "обычном драйвере [.filename]#sio#, используемом другими многопортовыми " "картами. Настройка сводится к простым действиям:" #. type: delimited block = 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:1084 +#: documentation/content/en/articles/serial-uart/_index.adoc:1083 msgid "" "Add the [.filename]#cy# device to your kernel configuration (note that your " "irq and iomem settings may differ)." msgstr "" "Добавьте устройство [.filename]#cy# в конфигурацию ядра (обратите внимание, " "что параметры irq и iomem могут отличаться)." #. type: delimited block . 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:1088 +#: documentation/content/en/articles/serial-uart/_index.adoc:1087 #, no-wrap msgid "device cy0 at isa? irq 10 iomem 0xd4000 iosiz 0x2000\n" msgstr "device cy0 at isa? irq 10 iomem 0xd4000 iosiz 0x2000\n" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:1090 +#: documentation/content/en/articles/serial-uart/_index.adoc:1089 msgid "Rebuild and install the new kernel." msgstr "Перестройте и установите новый образ ядра." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:1091 +#: documentation/content/en/articles/serial-uart/_index.adoc:1090 msgid "" "Make the device nodes by typing (the following example assumes an 8-port " "board):" msgstr "" "Создайте файлы устройств, введя (следующий пример предполагает 8-портовую " "плату):" #. type: delimited block . 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:1096 +#: documentation/content/en/articles/serial-uart/_index.adoc:1095 #, no-wrap msgid "" "# cd /dev\n" "# for i in 0 1 2 3 4 5 6 7;do ./MAKEDEV cuac$i ttyc$i;done\n" msgstr "" "# cd /dev\n" "# for i in 0 1 2 3 4 5 6 7;do ./MAKEDEV cuac$i ttyc$i;done\n" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:1099 +#: documentation/content/en/articles/serial-uart/_index.adoc:1098 msgid "" "If appropriate, add dialup entries to [.filename]#/etc/ttys# by duplicating " "serial device (`ttyd`) entries and using `ttyc` in place of `ttyd`. For " "example:" msgstr "" "Если необходимо, добавьте записи для коммутируемого доступа в [.filename]#/" "etc/ttys#, дублируя записи для последовательных устройств (`ttyd`) и " "используя `ttyc` вместо `ttyd`. Например:" #. type: delimited block . 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:1107 +#: documentation/content/en/articles/serial-uart/_index.adoc:1106 #, no-wrap msgid "" "ttyc0 \"/usr/libexec/getty std.38400\" unknown on insecure\n" "ttyc1 \"/usr/libexec/getty std.38400\" unknown on insecure\n" "ttyc2 \"/usr/libexec/getty std.38400\" unknown on insecure\n" "...\n" "ttyc7 \"/usr/libexec/getty std.38400\" unknown on insecure\n" msgstr "" "ttyc0 \"/usr/libexec/getty std.38400\" unknown on insecure\n" "ttyc1 \"/usr/libexec/getty std.38400\" unknown on insecure\n" "ttyc2 \"/usr/libexec/getty std.38400\" unknown on insecure\n" "...\n" "ttyc7 \"/usr/libexec/getty std.38400\" unknown on insecure\n" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:1109 +#: documentation/content/en/articles/serial-uart/_index.adoc:1108 msgid "Reboot with the new kernel." msgstr "Перезагрузитесь с новым ядром." #. type: Title == -#: documentation/content/en/articles/serial-uart/_index.adoc:1111 +#: documentation/content/en/articles/serial-uart/_index.adoc:1110 #, no-wrap msgid "Configuring the [.filename]#si# driver" msgstr "Настройка драйвера [.filename]#si#" #. type: delimited block = 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:1114 +#: documentation/content/en/articles/serial-uart/_index.adoc:1113 msgid "_Contributed by `{nsayer}`. 25 March 1998._" msgstr "_Предоставлено `{nsayer}`. 25 марта 1998._" #. type: delimited block = 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:1118 +#: documentation/content/en/articles/serial-uart/_index.adoc:1117 msgid "" "The Specialix SI/XIO and SX multiport cards use the [.filename]#si# driver. " "A single machine can have up to 4 host cards. The following host cards are " "supported:" msgstr "" "Специальные мультипортные карты Specialix SI/XIO и SX используют драйвер [." "filename]#si#. На одной машине может быть установлено до 4 хост-карт. " "Поддерживаются следующие хост-карты:" #. type: delimited block = 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:1120 +#: documentation/content/en/articles/serial-uart/_index.adoc:1119 msgid "ISA SI/XIO host card (2 versions)" msgstr "ISA SI/XIO host card (2 versions)" #. type: delimited block = 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:1121 +#: documentation/content/en/articles/serial-uart/_index.adoc:1120 msgid "EISA SI/XIO host card" msgstr "EISA SI/XIO host card" #. type: delimited block = 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:1122 +#: documentation/content/en/articles/serial-uart/_index.adoc:1121 msgid "PCI SI/XIO host card" msgstr "PCI SI/XIO host card" #. type: delimited block = 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:1123 +#: documentation/content/en/articles/serial-uart/_index.adoc:1122 msgid "ISA SX host card" msgstr "ISA SX host card" #. type: delimited block = 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:1124 +#: documentation/content/en/articles/serial-uart/_index.adoc:1123 msgid "PCI SX host card" msgstr "PCI SX host card" #. type: delimited block = 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:1130 +#: documentation/content/en/articles/serial-uart/_index.adoc:1129 msgid "" "Although the SX and SI/XIO host cards look markedly different, their " "functionality are basically the same. The host cards do not use I/O " "locations, but instead require a 32K chunk of memory. The factory " "configuration for ISA cards places this at `0xd0000-0xd7fff`. They also " "require an IRQ. PCI cards will, of course, auto-configure themselves." msgstr "" "Хотя хост-карты SX и SI/XIO выглядят заметно по-разному, их функциональность " "практически одинакова. Хост-карты не используют порты ввода-вывода, а вместо " "этого требуют 32К сегмента памяти. Заводская конфигурация для карт ISA " "размещает этот сегмент по адресу `0xd0000-0xd7fff`. Также им требуется IRQ. " "Карты PCI, разумеется, настраиваются автоматически." #. type: delimited block = 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:1134 +#: documentation/content/en/articles/serial-uart/_index.adoc:1133 msgid "" "You can attach up to 4 external modules to each host card. The external " "modules contain either 4 or 8 serial ports. They come in the following " "varieties:" msgstr "" "Вы можете подключить до 4 внешних модулей к каждой карте хоста. Внешние " "модули содержат либо 4, либо 8 последовательных портов. Они бывают следующих " "видов:" #. type: delimited block = 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:1136 +#: documentation/content/en/articles/serial-uart/_index.adoc:1135 msgid "SI 4 or 8 port modules. Up to 57600 bps on each port supported." msgstr "" "Модули SI на 4 или 8 портов. Поддерживается скорость до 57600 бит/с на " "каждом порту." #. type: delimited block = 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:1137 +#: documentation/content/en/articles/serial-uart/_index.adoc:1136 msgid "" "XIO 8 port modules. Up to 115200 bps on each port supported. One type of XIO " "module has 7 serial and 1 parallel port." msgstr "" "XIO 8-портовые модули. Поддерживается скорость до 115200 бит/с на каждом " "порту. Один из типов модулей XIO имеет 7 последовательных и 1 параллельный " "порт." #. type: delimited block = 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:1138 +#: documentation/content/en/articles/serial-uart/_index.adoc:1137 msgid "" "SXDC 8 port modules. Up to 921600 bps on each port supported. Like XIO, a " "module is available with one parallel port as well." msgstr "" "Модули SXDC с 8 портами. Поддерживается скорость до 921600 бит/с на каждом " "порту. Как и в случае с XIO, доступен модуль с одним параллельным портом." #. type: delimited block = 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:1140 +#: documentation/content/en/articles/serial-uart/_index.adoc:1139 msgid "" "To configure an ISA host card, add the following line to your kernel " "configuration file, changing the numbers as appropriate:" msgstr "" "Для настройки карты хоста ISA добавьте следующую строку в файл конфигурации " "ядра, изменив числа по мере необходимости:" #. type: delimited block . 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:1144 +#: documentation/content/en/articles/serial-uart/_index.adoc:1143 #, no-wrap msgid "device si0 at isa? iomem 0xd0000 irq 11\n" msgstr "device si0 at isa? iomem 0xd0000 irq 11\n" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:1147 +#: documentation/content/en/articles/serial-uart/_index.adoc:1146 msgid "" "Valid IRQ numbers are 9, 10, 11, 12 and 15 for SX ISA host cards and 11, 12 " "and 15 for SI/XIO ISA host cards." msgstr "" "Допустимые номера IRQ: 9, 10, 11, 12 и 15 для SX ISA host cards и 11, 12 и " "15 для SI/XIO ISA host cards." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:1149 +#: documentation/content/en/articles/serial-uart/_index.adoc:1148 msgid "To configure an EISA or PCI host card, use this line:" msgstr "Для настройки карты EISA или PCI используйте следующую строку:" #. type: delimited block . 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:1153 +#: documentation/content/en/articles/serial-uart/_index.adoc:1152 #, no-wrap msgid "device si0\n" msgstr "device si0\n" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:1156 +#: documentation/content/en/articles/serial-uart/_index.adoc:1155 msgid "" "After adding the configuration entry, rebuild and install your new kernel." msgstr "" "После добавления записи конфигурации пересоберите и установите свое новое " "ядро." #. type: delimited block = 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:1160 +#: documentation/content/en/articles/serial-uart/_index.adoc:1159 msgid "" "The following step, is not necessary if you are using man:devfs[5] in " "FreeBSD 5._X_." msgstr "" "Следующий шаг не обязателен, если вы используете man:devfs[5] в FreeBSD 5." "_X_." #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:1165 +#: documentation/content/en/articles/serial-uart/_index.adoc:1164 msgid "" "After rebooting with the new kernel, you need to make the device nodes in [." "filename]#/dev#. The [.filename]#MAKEDEV# script will take care of this for " "you. Count how many total ports you have and type:" msgstr "" "После перезагрузки с новым ядром необходимо создать файлы устройств в [." "filename]#/dev#. Скрипт [.filename]#MAKEDEV# выполнит эту задачу за вас. " "Подсчитайте общее количество портов и введите:" #. type: delimited block . 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:1170 +#: documentation/content/en/articles/serial-uart/_index.adoc:1169 #, no-wrap msgid "" "# cd /dev\n" "# ./MAKEDEV ttyAnn cuaAnn\n" msgstr "" "# cd /dev\n" "# ./MAKEDEV ttyAnn cuaAnn\n" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:1173 +#: documentation/content/en/articles/serial-uart/_index.adoc:1172 msgid "(where _nn_ is the number of ports)" msgstr "(где _nn_ — количество портов)" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:1175 +#: documentation/content/en/articles/serial-uart/_index.adoc:1174 msgid "" "If you want login prompts to appear on these ports, you will need to add " "lines like this to [.filename]#/etc/ttys#:" msgstr "" "Если вы хотите, чтобы приглашения к входу отображались на этих портах, вам " "нужно добавить такие строки в [.filename]#/etc/ttys#:" #. type: delimited block . 4 -#: documentation/content/en/articles/serial-uart/_index.adoc:1179 +#: documentation/content/en/articles/serial-uart/_index.adoc:1178 #, no-wrap msgid "ttyA01 \"/usr/libexec/getty std.9600\" vt100 on insecure\n" msgstr "ttyA01 \"/usr/libexec/getty std.9600\" vt100 on insecure\n" #. type: Plain text -#: documentation/content/en/articles/serial-uart/_index.adoc:1182 +#: documentation/content/en/articles/serial-uart/_index.adoc:1181 msgid "" "Change the terminal type as appropriate. For modems, `dialup` or `unknown` " "is fine." msgstr "" "Измените тип терминала по необходимости. Для модемов подойдут `dialup` или " "`unknown`." diff --git a/documentation/content/ru/articles/vinum/_index.adoc b/documentation/content/ru/articles/vinum/_index.adoc index 6365a02e6a..ed81ec8e33 100644 --- a/documentation/content/ru/articles/vinum/_index.adoc +++ b/documentation/content/ru/articles/vinum/_index.adoc @@ -1,600 +1,600 @@ --- authors: - author: 'Greg Lehey' description: 'Менеджер томов vinum в FreeBSD' tags: ["vinum", "Volume Manager", "FreeBSD"] title: 'Менеджер томов vinum' --- //// The Vinum Volume Manager By Greg Lehey (grog at lemis dot com) Added to the Handbook by Hiten Pandya and Tom Rhodes For the FreeBSD Documentation Project //// = Менеджер томов vinum :doctype: article :toc: macro :toclevels: 1 :icons: font :sectnums: :source-highlighter: rouge :experimental: :images-path: articles/vinum/ ifdef::env-beastie[] ifdef::backend-html5[] include::shared/authors.adoc[] include::shared/mirrors.adoc[] include::shared/releases.adoc[] include::shared/attributes/attributes-{{% lang %}}.adoc[] include::shared/{{% lang %}}/teams.adoc[] include::shared/{{% lang %}}/mailing-lists.adoc[] include::shared/{{% lang %}}/urls.adoc[] :imagesdir: ../../../images/{images-path} endif::[] ifdef::backend-pdf,backend-epub3[] include::../../../../shared/asciidoctor.adoc[] endif::[] endif::[] ifndef::env-beastie[] include::../../../../../shared/asciidoctor.adoc[] endif::[] ''' toc::[] [[vinum-synopsis]] == Обзор Независимо от типа дисков, всегда существуют потенциальные проблемы. Диски могут быть слишком малы, слишком медленны или недостаточно надёжны для соответствия требованиям системы. Хотя диски становятся больше, требования к хранению данных также растут. Часто требуется файловая система, размер которой превышает емкость одного диска. Были предложены и реализованы различные решения этих проблем. Один из методов заключается в использовании нескольких, а иногда и избыточных дисков. Помимо поддержки различных карт и контроллеров для аппаратных систем RAID (Redundant Array of Independent Disks), базовая система FreeBSD включает менеджер томов [.filename]#vinum#, драйвер блочных устройств, который реализует виртуальные диски и решает эти три проблемы. [.filename]#vinum# обеспечивает большую гибкость, производительность и надёжность по сравнению с традиционными системами хранения данных, а также реализует модели `RAID`-0, `RAID`-1 и `RAID`-5 как по отдельности, так и в комбинации. Эта глава предоставляет обзор потенциальных проблем с традиционным дисковым хранилищем и введение в менеджер томов [.filename]#vinum#. [WARNING] ==== vinum устарел и отсутствует в FreeBSD 15.0 и более поздних версиях. Пользователям рекомендуется перейти на man:gconcat[8], man:gmirror[8], man:gstripe[8], man:graid[8] или man:zfs[8]. ==== [NOTE] ==== Начиная с FreeBSD 5, [.filename]#vinum# был переписан для интеграции в extref:{handbook}geom[архитектуру GEOM, geom-synopsis], сохраняя при этом оригинальные идеи, терминологию и метаданные на диске. Эта переработанная версия называется _gvinum_ (от _GEOM vinum_). Хотя в этой главе используется термин [.filename]#vinum#, все команды должны выполняться с помощью `gvinum`. Имя модуля ядра изменилось с оригинального [.filename]#vinum.ko# на [.filename]#geom_vinum.ko#, а все узлы устройств находятся в [.filename]#/dev/gvinum# вместо [.filename]#/dev/vinum#. Начиная с FreeBSD 6, оригинальная реализация [.filename]#vinum# больше не доступна в кодовой базе. ==== [[vinum-access-bottlenecks]] == Узкие места доступа Современные системы часто нуждаются в доступе к данным в условиях высокой параллельности. Например, крупные FTP- или HTTP-серверы могут поддерживать тысячи одновременных сеансов и иметь несколько 100 Мбит/с соединений с внешним миром, что значительно превышает устойчивую скорость передачи большинства дисков. Современные дисковые накопители могут передавать данные последовательно со скоростью до 70 МБ/с, но это значение имеет мало значения в среде, где множество независимых процессов обращаются к накопителю и могут достичь лишь доли этих значений. В таких случаях более интересно рассмотреть проблему с точки зрения дисковой подсистемы. Важным параметром является нагрузка, которую передача данных создаёт на подсистему, или время, в течение которого передача занимает задействованные накопители. При любом переносе данных на диск сначала необходимо позиционировать головки, дождаться, пока первый сектор окажется под считывающей головкой, а затем выполнить перенос. Эти действия можно считать атомарными, так как их прерывание не имеет смысла. [[vinum-latency]] Рассмотрим типичную передачу около 10 КБ: современные высокопроизводительные диски могут позиционировать головки в среднем за 3,5 мс. Самые быстрые диски вращаются со скоростью 15 000 об/мин, поэтому средняя задержка вращения (половина оборота) составляет 2 мс. При скорости 70 МБ/с сама передача занимает около 150 мкс, что почти ничто по сравнению с временем позиционирования. В таком случае эффективная скорость передачи падает до чуть более 1 МБ/с и явно сильно зависит от размера передачи. Традиционное и очевидное решение этой проблемы — «больше дисков»: вместо одного большого диска использовать несколько дисков меньшего размера с тем же общим объёмом хранилища. Каждый диск способен позиционироваться и передавать данные независимо, поэтому эффективная пропускная способность увеличивается почти пропорционально количеству используемых дисков. Фактическое увеличение пропускной способности меньше, чем количество задействованных дисков. Хотя каждый диск способен передавать данные параллельно, нет возможности гарантировать равномерное распределение запросов между дисками. Неизбежно нагрузка на один диск будет выше, чем на другой. Равномерность нагрузки на диски сильно зависит от способа распределения данных по накопителям. В дальнейшем обсуждении удобно представлять дисковое хранилище как большое количество секторов данных, адресуемых по номерам, подобно страницам в книге. Наиболее очевидный метод — разделить виртуальный диск на группы последовательных секторов размером с отдельные физические диски и хранить их таким образом, как если бы большую книгу разорвали на меньшие разделы. Этот метод называется _объединением_ (конкатенацией) и имеет преимущество в том, что диски не требуют каких-либо определённых соотношений размеров. Он хорошо работает, когда доступ к виртуальному диску равномерно распределён по его адресному пространству. Если доступ сосредоточен на меньшей области, улучшение менее заметно. crossref:vinum[vinum-concat, Организация методом объединения] иллюстрирует последовательность выделения блоков хранения в организации методом объединения. [[vinum-concat]] .Организация методом объединения image::vinum-concat.png[] Альтернативный метод распределения заключается в разделении адресного пространства на меньшие равные по размеру компоненты и их последовательном хранении на разных устройствах. Например, первые 256 секторов могут храниться на первом диске, следующие 256 секторов — на следующем диске и так далее. После заполнения последнего диска процесс повторяется, пока все диски не будут заполнены. Такой метод называется _чередованием (striping)_ или RAID-0. `RAID` предлагает различные формы отказоустойчивости, хотя RAID-0 несколько вводит в заблуждение, так как не обеспечивает избыточности. Разделение данных требует несколько больше усилий для их поиска и может создавать дополнительную нагрузку ввода-вывода, когда передача распределяется по нескольким дискам, но также может обеспечить более равномерную нагрузку на диски. crossref:vinum[vinum-striped,Организация методом чередования] иллюстрирует последовательность, в которой организуется распределение блоков хранения с чередованием. [[vinum-striped]] .Организация методом чередования image::vinum-striped.png[] [[vinum-data-integrity]] == Целостность данных Последняя проблема с дисками заключается в их ненадёжности. Хотя надёжность значительно повысилась за последние годы, дисковые накопители остаются наиболее вероятным компонентом сервера, который может выйти из строя. Когда это происходит, последствия могут быть катастрофическими, а замена вышедшего из строя диска и восстановление данных могут привести к простою сервера. Один из подходов к этой проблеме — _зеркалирование_, или `RAID-1`, при котором данные хранятся в двух экземплярах на разных физических носителях. Любая запись на том записывается на оба диска; чтение может выполняться с любого из них, поэтому при отказе одного диска данные остаются доступны на другом. Зеркалирование имеет две проблемы: * Требуется в два раза больше дискового пространства, чем для решения без избыточности. * Запись должна выполняться на оба диска, поэтому она занимает в два раза больше пропускной способности, чем в незеркалированном томе. Чтение не страдает от потери производительности и может быть даже быстрее. Альтернативным решением является _чётность_, реализованная в уровнях `RAID` 2, 3, 4 и 5. Из них `RAID-5` представляет наибольший интерес. В реализации [.filename]#vinum# это вариант организации с чередованием, где один блок каждой полосы выделяется под чётность одного из других блоков. В реализации [.filename]#vinum# плекс `RAID-5` аналогичен плексу с чередованием, за исключением того, что он реализует `RAID-5`, включая блок чётности в каждую полосу. Как требуется в `RAID-5`, расположение этого блока чётности меняется от одной полосы к другой. Числа в блоках данных обозначают относительные номера блоков. [[vinum-raid5-org]] .Организация `RAID`-5 image::vinum-raid5-org.png[] По сравнению с зеркалированием, `RAID-5` имеет преимущество в виде значительно меньшего требуемого объёма хранилища. Скорость чтения аналогична таковой при чередующейся организации, но скорость записи значительно ниже — примерно 25% от скорости чтения. Если один диск выходит из строя, массив может продолжать работу в деградировавшем режиме, при котором чтение с оставшихся доступных дисков продолжается в обычном режиме, а чтение с отказавшего диска пересчитывается из соответствующих блоков всех оставшихся дисков. [[vinum-objects]] == Объекты [.filename]#vinum# Для решения этих проблем [.filename]#vinum# реализует четырёхуровневую иерархию объектов: * Наиболее заметным объектом является виртуальный диск, называемый _томом_. Том обладает практически теми же свойствами, что и UNIX(R) дисковый накопитель, хотя есть некоторые незначительные отличия. Например, у тома нет ограничений по размеру. * Тома состоят из _плексов_, каждый из которых представляет полное адресное пространство тома. Этот уровень в иерархии обеспечивает избыточность. Можно представить плексы как отдельные диски в зеркальном массиве, каждый из которых содержит одинаковые данные. * Поскольку [.filename]#vinum# существует в рамках системы хранения данных UNIX(R), можно было бы использовать разделы UNIX(R) в качестве строительных блоков для многодисковых plexes. Однако на практике это оказывается слишком негибким, так как диски UNIX(R) могут иметь только ограниченное количество разделов. Вместо этого [.filename]#vinum# разбивает единственный раздел UNIX(R), называемый _дисковый раздел (drive)_, на непрерывные области, называемые _поддисками (subdisk)_, которые используются как строительные блоки для плексов. * Поддиски располагаются на _дисковых разделах_ [.filename]#vinum#, в настоящее время это разделы UNIX(R). Разделы [.filename]#vinum# могут содержать любое количество поддисков. За исключением небольшой области в начале раздела, которая используется для хранения конфигурации и состояния, весь раздел доступен для хранения данных. Следующие разделы статьи описывают, каким образом эти объекты обеспечивают функциональность, требуемую для [.filename]#vinum#. === Учёт размера томов -Плексы могут включать несколько поддисков, распределенных по всем дискам в конфигурации [.filename]#vinum#. В результате, размер отдельного диска не ограничивает размер плекса или тома. +Плексы могут включать несколько поддисков, распределённых по всем дискам в конфигурации [.filename]#vinum#. В результате, размер отдельного диска не ограничивает размер плекса или тома. === Избыточное хранение данных [.filename]#vinum# реализует зеркалирование путем присоединения нескольких плекс к тому. Каждый плекс представляет данные в томе. Том может содержать от одного до восьми плексов. Хотя плекс представляет полные данные тома, возможно, что некоторые части представления физически отсутствуют — либо по замыслу (если поддиск для частей плекса не определён), либо случайно (в результате выхода диска из строя). До тех пор, пока хотя бы один плекс может предоставить данные для полного адресного пространства тома, том остаётся полностью работоспособным. === Какую организацию плексов выбрать? [.filename]#vinum# реализует как объединение, так и чередование на уровне плекс: * _Плекс с объединением_ использует адресное пространство каждого поддиска по очереди. Объединённые плексы являются наиболее гибкими, так как могут содержать любое количество поддисков, а поддиски могут быть разной длины. Плекс может быть расширен путём добавления дополнительных поддисков. Они требуют меньше процессорного времени, чем чередующиеся плексы, хотя разница в нагрузке на процессор незначительна. С другой стороны, они наиболее подвержены "горячим точкам", когда один диск очень активен, а другие простаивают. * _Плекс с чередованием_ распределяет данные по каждому поддиску. Поддиски должны быть одного размера, и их должно быть как минимум два, чтобы отличить такой плекс от объединенного. Главное преимущество чередующихся плексов в том, что они уменьшают вероятность появления "горячих точек". Выбрав оптимальный размер полосы (около 256 КБ), можно равномерно распределить нагрузку на диски – компоненты системы. Расширение плекса путем добавления новых поддисков настолько сложно, что [.filename]#vinum# не реализует эту возможность. crossref:vinum[vinum-comparison, Организации плексов в [.filename]#vinum#] обобщает преимущества и недостатки каждой организации плексов. [[vinum-comparison]] .Организации плексов в [.filename]#vinum# [cols="1,1,1,1,1", frame="none", options="header"] |=== | Тип плекса | Минимальное количество поддисков | Может добавлять поддиски | Должен быть равного размера | Приложение |объединённый |1 |да |no |Крупное хранилище данных с максимальной гибкостью размещения и умеренной производительностью |чередуемый |2 |no |да |Высокая производительность в сочетании с высокопараллельным доступом |=== [[vinum-examples]] == Некоторые примеры [.filename]#vinum# поддерживает _базу данных конфигурации_, которая описывает объекты, известные конкретной системе. Первоначально пользователь создаёт базу данных конфигурации из одного или нескольких конфигурационных файлов с помощью man:gvinum[8]. [.filename]#vinum# хранит копию своей базы данных конфигурации на каждом _устройстве_ диска, находящемся под его управлением. Эта база данных обновляется при каждом изменении состояния, так что перезапуск точно восстанавливает состояние каждого объекта [.filename]#vinum#. === Файл конфигурации Файл конфигурации описывает отдельные объекты [.filename]#vinum#. Определение простого тома может выглядеть следующим образом: [.programlisting] .... drive a device /dev/da3h volume myvol plex org concat sd length 512m drive a .... Этот файл описывает четыре объекта [.filename]#vinum#: * Строка _drive_ описывает раздел диска (_drive_) и его расположение относительно оборудования, на котором он расположен. Ему присваивается символическое имя _a_. Такое разделение символических имён от имён устройств позволяет перемещать диски из одного места в другое без путаницы. * Строка _volume_ описывает том. Единственный обязательный атрибут — это имя, в данном случае _myvol_. * Строка _plex_ определяет плекс. Единственный обязательный параметр — это организация, в данном случае _concat_. Имя не требуется, так как система автоматически генерирует его из имени тома, добавляя суффикс _.px_, где _x_ — номер плекса в томе. Таким образом, этот плекс будет называться _myvol.p0_. * Строка _sd_ описывает поддиск. Минимальные требования — это имя диска для его хранения и длина поддиска. Имя не обязательно, так как система автоматически назначает имена, производные от имени плекса, добавляя суффикс _.sx_, где _x_ — номер поддиска в плексе. Таким образом, [.filename]#vinum# присваивает этому поддиску имя _myvol.p0.s0_. После обработки этого файла команда man:gvinum[8] выводит следующий результат: [.programlisting] .... # gvinum -> create config1 Configuration summary Drives: 1 (4 configured) Volumes: 1 (4 configured) Plexes: 1 (8 configured) Subdisks: 1 (16 configured) D a State: up Device /dev/da3h Avail: 2061/2573 MB (80%) V myvol State: up Plexes: 1 Size: 512 MB P myvol.p0 C State: up Subdisks: 1 Size: 512 MB S myvol.p0.s0 State: up PO: 0 B Size: 512 MB .... Этот вывод показывает краткий формат списка man:gvinum[8]. Он представлен графически в crossref:vinum[vinum-simple-vol, Простой том [.filename]#vinum#]. [[vinum-simple-vol]] .Простой том [.filename]#vinum# image::vinum-simple-vol.png[] Этот рисунок и следующие представляют том, который содержит плексы, которые, в свою очередь, содержат поддиски. В этом примере том содержит один плекс, а плекс содержит один поддиск. Этот конкретный том не имеет особых преимуществ по сравнению с обычным разделом диска. Он содержит один плекс, поэтому не является избыточным. Плекс содержит один поддиск, поэтому нет различий в распределении хранилища по сравнению с обычным разделом диска. В следующих разделах показаны различные более интересные методы конфигурации. === Увеличенная отказоустойчивость: зеркалирование Устойчивость тома может быть повышена за счёт зеркалирования. При создании зеркального тома важно убедиться, что поддиски каждого плекса находятся на разных дисках, чтобы выход из строя одного диска не затронул оба плекса. Следующая конфигурация создаёт зеркальный том: [.programlisting] .... drive b device /dev/da4h volume mirror plex org concat sd length 512m drive a plex org concat sd length 512m drive b .... В этом примере не потребовалось снова указывать определение диска _a_, поскольку [.filename]#vinum# отслеживает все объекты в своей базе данных конфигурации. После обработки этого определения конфигурация выглядит следующим образом: [.programlisting] .... Drives: 2 (4 configured) Volumes: 2 (4 configured) Plexes: 3 (8 configured) Subdisks: 3 (16 configured) D a State: up Device /dev/da3h Avail: 1549/2573 MB (60%) D b State: up Device /dev/da4h Avail: 2061/2573 MB (80%) V myvol State: up Plexes: 1 Size: 512 MB V mirror State: up Plexes: 2 Size: 512 MB P myvol.p0 C State: up Subdisks: 1 Size: 512 MB P mirror.p0 C State: up Subdisks: 1 Size: 512 MB P mirror.p1 C State: initializing Subdisks: 1 Size: 512 MB S myvol.p0.s0 State: up PO: 0 B Size: 512 MB S mirror.p0.s0 State: up PO: 0 B Size: 512 MB S mirror.p1.s0 State: empty PO: 0 B Size: 512 MB .... crossref:vinum[vinum-mirrored-vol, Зеркальный том [.filename]#vinum#] графически отображает структуру. [[vinum-mirrored-vol]] .Зеркальный том [.filename]#vinum# image::vinum-mirrored-vol.png[] В этом примере каждый плекс содержит полные 512 МБ адресного пространства. Как и в предыдущем примере, каждый плекс содержит только один поддиск. === Оптимизация производительности Зеркальный том в предыдущем примере более устойчив к сбоям, чем незеркальный том, но его производительность ниже, так как каждая запись в том требует записи на оба диска, используя большую часть общей пропускной способности дисков. Соображения производительности требуют другого подхода: вместо зеркалирования данные распределяются по полосам на максимально возможное количество дисков. Следующая конфигурация показывает том с плексом, распределённым по полосам на четырёх дисках: [.programlisting] .... drive c device /dev/da5h drive d device /dev/da6h volume stripe plex org striped 512k sd length 128m drive a sd length 128m drive b sd length 128m drive c sd length 128m drive d .... Как и ранее, не нужно определять диски, которые уже известны [.filename]#vinum#. После обработки этого определения конфигурация выглядит следующим образом: [.programlisting] .... Drives: 4 (4 configured) Volumes: 3 (4 configured) Plexes: 4 (8 configured) Subdisks: 7 (16 configured) D a State: up Device /dev/da3h Avail: 1421/2573 MB (55%) D b State: up Device /dev/da4h Avail: 1933/2573 MB (75%) D c State: up Device /dev/da5h Avail: 2445/2573 MB (95%) D d State: up Device /dev/da6h Avail: 2445/2573 MB (95%) V myvol State: up Plexes: 1 Size: 512 MB V mirror State: up Plexes: 2 Size: 512 MB V striped State: up Plexes: 1 Size: 512 MB P myvol.p0 C State: up Subdisks: 1 Size: 512 MB P mirror.p0 C State: up Subdisks: 1 Size: 512 MB P mirror.p1 C State: initializing Subdisks: 1 Size: 512 MB P striped.p1 State: up Subdisks: 1 Size: 512 MB S myvol.p0.s0 State: up PO: 0 B Size: 512 MB S mirror.p0.s0 State: up PO: 0 B Size: 512 MB S mirror.p1.s0 State: empty PO: 0 B Size: 512 MB S striped.p0.s0 State: up PO: 0 B Size: 128 MB S striped.p0.s1 State: up PO: 512 kB Size: 128 MB S striped.p0.s2 State: up PO: 1024 kB Size: 128 MB S striped.p0.s3 State: up PO: 1536 kB Size: 128 MB .... [[vinum-striped-vol]] .Том [.filename]#vinum# с чередованием image::vinum-striped-vol.png[] Этот том представлен на схеме crossref:vinum[vinum-striped-vol, Том [.filename]#vinum# с чередованием]. Темнота полос указывает на позицию в адресном пространстве плекса, где самые светлые полосы идут первыми, а самые темные — последними. === Устойчивость и производительность [[vinum-resilience]]При достаточном аппаратном обеспечении можно создать тома, которые демонстрируют как повышенную отказоустойчивость, так и увеличенную производительность по сравнению со стандартными разделами UNIX(R). Типичный конфигурационный файл может выглядеть так: [.programlisting] .... volume raid10 plex org striped 512k sd length 102480k drive a sd length 102480k drive b sd length 102480k drive c sd length 102480k drive d sd length 102480k drive e plex org striped 512k sd length 102480k drive c sd length 102480k drive d sd length 102480k drive e sd length 102480k drive a sd length 102480k drive b .... Поддиски второго плекса смещены на два диска относительно поддисков первого плекса. Это помогает гарантировать, что записи не будут направляться на одни и те же поддиски, даже если передача затронет два диска. -crossref:vinum[vinum-raid10-vol, Том [.filename]#vinum# c зеркалированием и чередованием] представляет структуру этого тома. +crossref:vinum[vinum-raid10-vol, "Том [.filename]#vinum# c зеркалированием и чередованием"] представляет структуру этого тома. [[vinum-raid10-vol]] .Том [.filename]#vinum# c зеркалированием и чередованием image::vinum-raid10-vol.png[] [[vinum-object-naming]] == Именование объектов [.filename]#vinum# назначает стандартные имена для плексов и поддисков, хотя их можно изменить. Не рекомендуется изменять стандартные имена, так как это не даёт значительных преимуществ и может вызвать путаницу. Имена могут содержать любые непустые символы, но рекомендуется ограничиваться буквами, цифрами и символами подчёркивания. Имена томов, плексов и поддисков могут быть длиной до 64 символов, а имена дисков — до 32 символов. Объектам [.filename]#vinum# назначаются узлы устройств в иерархии [.filename]#/dev/gvinum#. Приведённая выше конфигурация приведёт к тому, что [.filename]#vinum# создаст следующие узлы устройств: * Записи устройств для каждого тома. Это основные устройства, используемые [.filename]#vinum#. Приведённая конфигурация включает устройства [.filename]#/dev/gvinum/myvol#, [.filename]#/dev/gvinum/mirror#, [.filename]#/dev/gvinum/striped#, [.filename]#/dev/gvinum/raid5# и [.filename]#/dev/gvinum/raid10#. * Все тома получают собственные записи в [.filename]#/dev/gvinum/#. * Каталоги [.filename]#/dev/gvinum/plex# и [.filename]#/dev/gvinum/sd#, которые содержат узлы устройств для каждого плекса и каждого субдиска соответственно. Например, рассмотрим следующий конфигурационный файл: [.programlisting] .... drive drive1 device /dev/sd1h drive drive2 device /dev/sd2h drive drive3 device /dev/sd3h drive drive4 device /dev/sd4h volume s64 setupstate plex org striped 64k sd length 100m drive drive1 sd length 100m drive drive2 sd length 100m drive drive3 sd length 100m drive drive4 .... После обработки этого файла man:gvinum[8] создаёт следующую структуру в [.filename]#/dev/gvinum#: [.programlisting] .... drwxr-xr-x 2 root wheel 512 Apr 13 16:46 plex crwxr-xr-- 1 root wheel 91, 2 Apr 13 16:46 s64 drwxr-xr-x 2 root wheel 512 Apr 13 16:46 sd /dev/vinum/plex: total 0 crwxr-xr-- 1 root wheel 25, 0x10000002 Apr 13 16:46 s64.p0 /dev/vinum/sd: total 0 crwxr-xr-- 1 root wheel 91, 0x20000002 Apr 13 16:46 s64.p0.s0 crwxr-xr-- 1 root wheel 91, 0x20100002 Apr 13 16:46 s64.p0.s1 crwxr-xr-- 1 root wheel 91, 0x20200002 Apr 13 16:46 s64.p0.s2 crwxr-xr-- 1 root wheel 91, 0x20300002 Apr 13 16:46 s64.p0.s3 .... Хотя рекомендуется не назначать конкретные имена плексам и поддискам, диски [.filename]#vinum# должны быть именованными. Это позволяет переместить диск в другое место и по-прежнему автоматически его распознавать. Имена дисков могут быть длиной до 32 символов. === Создание файловых систем Тома для системы выглядят идентично дискам, за одним исключением. В отличие от дисков UNIX(R), [.filename]#vinum# не разбивает тома на разделы, поэтому они не содержат таблицы разделов. Это потребовало внесения изменений в некоторые утилиты для работы с дисками, в частности, в man:newfs[8], чтобы они не пытались интерпретировать последнюю букву имени тома [.filename]#vinum# как идентификатор раздела. Например, имя диска может выглядеть как [.filename]#/dev/ad0a# или [.filename]#/dev/da2h#. Эти имена обозначают первый раздел ([.filename]#a#) на первом (0) IDE-диске ([.filename]#ad#) и восьмой раздел ([.filename]#h#) на третьем (2) SCSI-диске ([.filename]#da#), соответственно. В отличие от этого, том [.filename]#vinum# может называться [.filename]#/dev/gvinum/concat#, что не имеет отношения к имени раздела. Чтобы создать файловую систему на этом томе, используйте man:newfs[8]: [source, shell] .... # newfs /dev/gvinum/concat .... [[vinum-config]] == Настройка [.filename]#vinum# Ядро [.filename]#GENERIC# не содержит [.filename]#vinum#. Можно собрать пользовательское ядро с включённым [.filename]#vinum#, но это не рекомендуется. Стандартный способ запуска [.filename]#vinum# — в качестве модуля ядра. Команда man:kldload[8] не требуется, так как при запуске man:gvinum[8] проверяет, загружен ли модуль, и если нет, загружает его автоматически. === Запуск [.filename]#vinum# хранит конфигурационную информацию на дисковых слайсах практически в той же форме, что и в конфигурационных файлах. При чтении из базы данных конфигурации [.filename]#vinum# распознаёт ряд ключевых слов, которые не допускаются в конфигурационных файлах. Например, конфигурация диска может содержать следующий текст: [.programlisting] .... volume myvol state up volume bigraid state down plex name myvol.p0 state up org concat vol myvol plex name myvol.p1 state up org concat vol myvol plex name myvol.p2 state init org striped 512b vol myvol plex name bigraid.p0 state initializing org raid5 512b vol bigraid sd name myvol.p0.s0 drive a plex myvol.p0 state up len 1048576b driveoffset 265b plexoffset 0b sd name myvol.p0.s1 drive b plex myvol.p0 state up len 1048576b driveoffset 265b plexoffset 1048576b sd name myvol.p1.s0 drive c plex myvol.p1 state up len 1048576b driveoffset 265b plexoffset 0b sd name myvol.p1.s1 drive d plex myvol.p1 state up len 1048576b driveoffset 265b plexoffset 1048576b sd name myvol.p2.s0 drive a plex myvol.p2 state init len 524288b driveoffset 1048841b plexoffset 0b sd name myvol.p2.s1 drive b plex myvol.p2 state init len 524288b driveoffset 1048841b plexoffset 524288b sd name myvol.p2.s2 drive c plex myvol.p2 state init len 524288b driveoffset 1048841b plexoffset 1048576b sd name myvol.p2.s3 drive d plex myvol.p2 state init len 524288b driveoffset 1048841b plexoffset 1572864b sd name bigraid.p0.s0 drive a plex bigraid.p0 state initializing len 4194304b driveoff set 1573129b plexoffset 0b sd name bigraid.p0.s1 drive b plex bigraid.p0 state initializing len 4194304b driveoff set 1573129b plexoffset 4194304b sd name bigraid.p0.s2 drive c plex bigraid.p0 state initializing len 4194304b driveoff set 1573129b plexoffset 8388608b sd name bigraid.p0.s3 drive d plex bigraid.p0 state initializing len 4194304b driveoff set 1573129b plexoffset 12582912b sd name bigraid.p0.s4 drive e plex bigraid.p0 state initializing len 4194304b driveoff set 1573129b plexoffset 16777216b .... Очевидные различия здесь — наличие явной информации о местоположении и именования, что разрешено, но не рекомендуется, а также информация о состояниях. [.filename]#vinum# не хранит сведения о дисках в конфигурационной информации. Он находит диски, сканируя настроенные дисковые накопители на наличие разделов с меткой [.filename]#vinum#. Это позволяет [.filename]#vinum# корректно идентифицировать диски, даже если им были присвоены разные идентификаторы дисков UNIX(R). [[vinum-rc-startup]] ==== Автоматический запуск _Gvinum_ всегда запускается автоматически после загрузки модуля ядра через man:loader.conf[5]. Чтобы загрузить модуль _Gvinum_ при загрузке системы, добавьте `geom_vinum_load="YES"` в [.filename]#/boot/loader.conf#. Когда [.filename]#vinum# запускается командой `gvinum start`, [.filename]#vinum# читает конфигурационную базу данных с одного из дисков [.filename]#vinum#. В нормальных условиях каждый диск содержит идентичную копию конфигурационной базы данных, поэтому не имеет значения, с какого диска читать. Однако после сбоя [.filename]#vinum# должен определить, какой диск был обновлён последним, и прочитать конфигурацию с этого диска. Затем, если необходимо, он обновляет конфигурацию последовательно с более старых дисков. [[vinum-root]] == Использование [.filename]#vinum# для корневой файловой системы Для машины с полностью зеркалированными файловыми системами с использованием [.filename]#vinum#, желательно также зеркалировать корневую файловую систему. Настройка такой конфигурации менее тривиальна, чем зеркалирование произвольной файловой системы, потому что: * Корневая файловая система должна быть доступна очень рано в процессе загрузки, поэтому инфраструктура [.filename]#vinum# должна быть уже доступна на этом этапе. * Том, содержащий корневую файловую систему, также включает системный загрузчик и ядро. Они должны быть прочитаны с использованием родных утилит хостовой системы, таких как BIOS, который зачастую нельзя обучить работе с деталями [.filename]#vinum#. В следующих разделах термин "корневой том" обычно используется для описания тома [.filename]#vinum#, который содержит корневую файловую систему. === Запуск [.filename]#vinum# на раннем этапе для обеспечения доступа к корневой файловой системе Файл `[.filename]#vinum#` должен быть доступен на раннем этапе загрузки системы, так как `man:loader[8]` должен загрузить модуль ядра `vinum` перед запуском ядра. Это можно сделать, добавив следующую строку в `[.filename]#/boot/loader.conf#`: [.programlisting] .... geom_vinum_load="YES" .... === Создание корневого тома на основе [.filename]#vinum#, доступного для загрузчика Текущая загрузочная запись FreeBSD занимает всего 7,5 КБ кода и не понимает внутренние структуры [.filename]#vinum#. Это означает, что она не может разобрать конфигурационные данные [.filename]#vinum# или определить элементы загрузочного тома. Таким образом, необходимы некоторые обходные решения, чтобы предоставить загрузочному коду иллюзию стандартного раздела `a`, содержащего корневую файловую систему. Для этого должны быть выполнены следующие требования к корневому тому: * Корневой том не должен быть чередующимся или `RAID`-5. * Корневой том не должен содержать более одного объединённого поддиска на плекс. Обратите внимание, что желательно и возможно использовать несколько плексов, каждый из которых содержит одну реплику корневой файловой системы. Процесс начальной загрузки будет использовать только одну реплику для поиска загрузчика и всех загрузочных файлов, пока ядро не смонтирует корневую файловую систему. Каждый отдельный поддиск в этих плексах должен иметь свою собственную иллюзию раздела `a`, чтобы соответствующее устройство было загрузочным. Не строго необходимо, чтобы каждый из этих фальшивых разделов `a` находился на том же смещении внутри своего устройства по сравнению с другими устройствами, содержащими плекс корневого тома. Однако, вероятно, хорошей идеей будет создавать тома [.filename]#vinum# таким образом, чтобы результирующие зеркальные устройства были симметричными, чтобы избежать путаницы. Для настройки этих разделов `a` на каждом устройстве, содержащем часть корневого тома, требуется следующее: [.procedure] ==== . Местоположение, смещение от начала устройства и размер подобласти этого устройства, которая является частью корневого тома, необходимо проверить с помощью команды: + [source, shell] .... # gvinum l -rv root .... + Смещения и размеры в [.filename]#vinum# измеряются в байтах. Их необходимо разделить на 512, чтобы получить номера блоков, которые будут использоваться в `bsdlabel`. . Выполните эту команду для каждого устройства, участвующего в корневом томе: + [source, shell] .... # bsdlabel -e devname .... + `_devname_` должен быть либо именем диска, например, [.filename]#da0# для дисков без таблицы разделов, либо именем раздела, например, [.filename]#ad0s1#. + Если на устройстве уже существует раздел `a` из корневой файловой системы до [.filename]#vinum#, его следует переименовать во что-то другое, чтобы он оставался доступным (на всякий случай), но больше не использовался по умолчанию для загрузки системы. Текущий смонтированный корневой файловой системы нельзя переименовать, поэтому это должно выполняться либо при загрузке с "Fixit" носителя, либо в два этапа, когда в зеркале сначала обрабатывается диск, с которого в данный момент не загружаются. + Смещение раздела [.filename]#vinum# на этом устройстве (если есть) должно быть добавлено к смещению соответствующего поддиска корневого тома на этом устройстве. Полученное значение станет значением `offset` для нового раздела `a`. Значение `size` для этого раздела можно взять дословно из приведённых выше расчётов. Для `fstype` следует указать `4.2BSD`. Значения `fsize`, `bsize` и `cpg` должны быть выбраны в соответствии с реальной файловой системой, хотя в данном контексте они не слишком важны. + Таким образом, будет создан новый раздел `a`, который перекрывает раздел [.filename]#vinum# на этом устройстве. `bsdlabel` разрешит это перекрытие только в том случае, если раздел [.filename]#vinum# был правильно помечен с использованием типа файловой системы `vinum`. . Поддельный раздел `a` теперь существует на каждом устройстве, имеющем одну реплику корневого тома. Настоятельно рекомендуется проверить результат с помощью команды, например: + [source, shell] .... # fsck -n /dev/devnamea .... ==== Следует помнить, что все файлы, содержащие управляющую информацию, должны быть относительны к корневой файловой системе в томе [.filename]#vinum#, которая при настройке нового корневого тома [.filename]#vinum# может не совпадать с текущей активной корневой файловой системой. Поэтому, в частности, необходимо позаботиться о [.filename]#/etc/fstab# и [.filename]#/boot/loader.conf#. При следующей перезагрузке загрузчик должен определить соответствующую управляющую информацию из новой корневой файловой системы на основе [.filename]#vinum# и действовать соответствующим образом. В конце процесса инициализации ядра, после объявления всех устройств, явным признаком успешного завершения настройки будет сообщение вида: [source, shell] .... Mounting root from ufs:/dev/gvinum/root .... === Пример настройки корневой системы на основе [.filename]#vinum# После настройки корневого тома [.filename]#vinum#, вывод команды `gvinum l -rv root` может выглядеть следующим образом: [source, shell] .... ... Subdisk root.p0.s0: Size: 125829120 bytes (120 MB) State: up Plex root.p0 at offset 0 (0 B) Drive disk0 (/dev/da0h) at offset 135680 (132 kB) Subdisk root.p1.s0: Size: 125829120 bytes (120 MB) State: up Plex root.p1 at offset 0 (0 B) Drive disk1 (/dev/da1h) at offset 135680 (132 kB) .... Значения, на которые следует обратить внимание: `135680` для смещения, относительного к разделу [.filename]#/dev/da0h#. Это соответствует 265 блокам диска по 512 байт в терминах `bsdlabel`. Аналогично, размер этого корневого тома составляет 245760 блоков по 512 байт. [.filename]#/dev/da1h#, содержащий вторую реплику этого корневого тома, имеет симметричную конфигурацию. Метка bsdlabel для этих устройств может выглядеть следующим образом: [source, shell] .... ... 8 partitions: # size offset fstype [fsize bsize bps/cpg] a: 245760 281 4.2BSD 2048 16384 0 # (Cyl. 0*- 15*) c: 71771688 0 unused 0 0 # (Cyl. 0 - 4467*) h: 71771672 16 vinum # (Cyl. 0*- 4467*) .... -Можно заметить, что параметр `size` для поддельного раздела `a` совпадает с указанным выше значением, в то время как параметр `offset` представляет собой сумму смещения внутри раздела [.filename]#vinum# `h` и смещения этого раздела в устройстве или слайсе. Это стандартная настройка, необходимая для избежания проблемы, описанной в crossref:vinum[vinum-root-panic, Nothing Boots, the Bootstrap Panics]. Весь раздел `a` полностью находится внутри раздела `h`, содержащего все данные [.filename]#vinum# для этого устройства. +Можно заметить, что параметр `size` для поддельного раздела `a` совпадает с указанным выше значением, в то время как параметр `offset` представляет собой сумму смещения внутри раздела [.filename]#vinum# `h` и смещения этого раздела в устройстве или слайсе. Это стандартная настройка, необходимая для избежания проблемы, описанной в crossref:vinum[vinum-root-panic, "Ничего не загружается, паника при загрузке"]. Весь раздел `a` полностью находится внутри раздела `h`, содержащего все данные [.filename]#vinum# для этого устройства. В приведённом выше примере все устройство выделено под [.filename]#vinum#, и не осталось корневого раздела, существовавшего до [.filename]#vinum#. === Устранение неполадок Следующий список содержит несколько известных подводных камней и их решения. ==== Загрузчик системы загружается, но система не запускается Если по какой-либо причине система не продолжает загрузку, процесс можно прервать, нажав kbd:[space] при появлении 10-секундного предупреждения. Переменную загрузчика `vinum.autostart` можно проверить, введя команду `show`, и изменить с помощью `set` или `unset`. Если модуль ядра [.filename]#vinum# ещё не был в списке модулей для автоматической загрузки, введите `load geom_vinum`. Когда всё готово, процесс загрузки можно продолжить, введя `boot -as`, где `-as` указывает ядру запросить корневую файловую систему для монтирования (`-a`) и остановить процесс загрузки в однопользовательском режиме (`-s`), при этом корневая файловая система монтируется в режиме только для чтения. Таким образом, даже если смонтирован только один слой многокомпонентного тома, не возникает риска несогласованности данных между слоями. На запрос о корневой файловой системе для монтирования можно ввести любое устройство, содержащее действительную корневую файловую систему. Если [.filename]#/etc/fstab# настроен правильно, по умолчанию должно быть что-то вроде `ufs:/dev/gvinum/root`. Типичным альтернативным выбором может быть что-то вроде `ufs:da0d`, что может быть гипотетическим разделом, содержащим корневую файловую систему до [.filename]#vinum#. Следует быть осторожным, если здесь вводится один из псевдонимов `a` разделов, чтобы он действительно ссылался на поддиски устройства [.filename]#vinum# root, потому что в зеркальной настройке это приведёт к монтированию только одной части зеркального корневого устройства. Если эта файловая система будет позже смонтирована в режиме чтения-записи, необходимо удалить другие плексы тома [.filename]#vinum# root, так как в противном случае эти плексы будут содержать несогласованные данные. ==== Только первичная загрузка Bootstrap Если [.filename]#/boot/loader# не загружается, но первичная загрузка всё ещё работает (это видно по одному дефису в левой части экрана сразу после начала процесса загрузки), можно попытаться прервать первичную загрузку, нажав kbd:[space]. Это остановит загрузку на extref:{handbook}boot[втором этапе, boot-boot1]. Здесь можно попытаться загрузиться с альтернативного раздела, например, с раздела, содержащего предыдущую корневую файловую систему, которая была перемещена из `a`. [[vinum-root-panic]] ==== Ничего не загружается, паника при загрузке Такая ситуация произойдет, если загрузчик был уничтожен при установке [.filename]#vinum#. К сожалению, [.filename]#vinum# случайно оставляет свободными только первые 4 КБ в начале своего раздела перед записью заголовочной информации [.filename]#vinum#. Однако, первая и вторая стадии загрузчика вместе с bsdlabel требуют 8 КБ. Поэтому, если раздел [.filename]#vinum# начинается со смещения 0 внутри слайса или диска, который должен быть загрузочным, установка [.filename]#vinum# повредит загрузчик. Аналогично, если описанная выше ситуация была исправлена загрузкой с "Fixit"-носителя, и загрузчик был переустановлен с помощью `bsdlabel -B`, как описано в extref:{handbook}boot[этапе два, boot-boot1], загрузчик повредит заголовок [.filename]#vinum#, и [.filename]#vinum# больше не сможет найти свои диски. Хотя фактические данные конфигурации [.filename]#vinum# или данные в томах [.filename]#vinum# не будут повреждены, и можно восстановить все данные, введя точно такую же конфигурацию [.filename]#vinum# снова, исправить ситуацию сложно. Необходимо переместить весь раздел [.filename]#vinum# как минимум на 4 КБ, чтобы заголовок [.filename]#vinum# и системный загрузчик больше не конфликтовали. diff --git a/documentation/content/ru/articles/vinum/_index.po b/documentation/content/ru/articles/vinum/_index.po index 651eebad56..065f1c5625 100644 --- a/documentation/content/ru/articles/vinum/_index.po +++ b/documentation/content/ru/articles/vinum/_index.po @@ -1,2260 +1,2261 @@ # SOME DESCRIPTIVE TITLE # Copyright (C) YEAR The FreeBSD Project # This file is distributed under the same license as the FreeBSD Documentation package. # Vladlen Popolitov , 2025, 2026. msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-11-08 16:17+0000\n" -"PO-Revision-Date: 2026-04-05 04:45+0000\n" +"POT-Creation-Date: 2026-08-06 22:55+0100\n" +"PO-Revision-Date: 2026-08-08 04:45+0000\n" "Last-Translator: Vladlen Popolitov \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 4.17\n" #. type: YAML Front Matter: description #: documentation/content/en/articles/vinum/_index.adoc:1 #, no-wrap msgid "The vinum Volume Manager in FreeBSD" msgstr "Менеджер томов vinum в FreeBSD" #. The Vinum Volume Manager #. By Greg Lehey (grog at lemis dot com) #. Added to the Handbook by Hiten Pandya #. and Tom Rhodes #. For the FreeBSD Documentation Project #. type: Title = #: documentation/content/en/articles/vinum/_index.adoc:1 #: documentation/content/en/articles/vinum/_index.adoc:19 #, no-wrap msgid "The vinum Volume Manager" msgstr "Менеджер томов vinum" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:51 +#: documentation/content/en/articles/vinum/_index.adoc:50 msgid "'''" msgstr "'''" #. type: Title == -#: documentation/content/en/articles/vinum/_index.adoc:55 +#: documentation/content/en/articles/vinum/_index.adoc:54 #, no-wrap msgid "Synopsis" msgstr "Обзор" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:62 +#: documentation/content/en/articles/vinum/_index.adoc:61 msgid "" "No matter the type of disks, there are always potential problems. The disks " "can be too small, too slow, or too unreliable to meet the system's " "requirements. While disks are getting bigger, so are data storage " "requirements. Often a file system is needed that is bigger than a disk's " "capacity. Various solutions to these problems have been proposed and " "implemented." msgstr "" "Независимо от типа дисков, всегда существуют потенциальные проблемы. Диски " "могут быть слишком малы, слишком медленны или недостаточно надёжны для " "соответствия требованиям системы. Хотя диски становятся больше, требования " "к хранению данных также растут. Часто требуется файловая система, размер " "которой превышает емкость одного диска. Были предложены и реализованы " "различные решения этих проблем." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:66 +#: documentation/content/en/articles/vinum/_index.adoc:65 msgid "" "One method is through the use of multiple, and sometimes redundant, disks. " "In addition to supporting various cards and controllers for hardware " "Redundant Array of Independent Disks RAID systems, the base FreeBSD system " "includes the [.filename]#vinum# volume manager, a block device driver that " "implements virtual disk drives and addresses these three problems. [." "filename]#vinum# provides more flexibility, performance, and reliability " "than traditional disk storage and implements `RAID`-0, `RAID`-1, and " "`RAID`-5 models, both individually and in combination." msgstr "" "Один из методов заключается в использовании нескольких, а иногда и " "избыточных дисков. Помимо поддержки различных карт и контроллеров для " "аппаратных систем RAID (Redundant Array of Independent Disks), базовая " "система FreeBSD включает менеджер томов [.filename]#vinum#, драйвер блочных " "устройств, который реализует виртуальные диски и решает эти три проблемы. [." "filename]#vinum# обеспечивает большую гибкость, производительность и " "надёжность по сравнению с традиционными системами хранения данных, а также " "реализует модели `RAID`-0, `RAID`-1 и `RAID`-5 как по отдельности, так и в " "комбинации." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:68 +#: documentation/content/en/articles/vinum/_index.adoc:67 msgid "" "This chapter provides an overview of potential problems with traditional " "disk storage, and an introduction to the [.filename]#vinum# volume manager." msgstr "" "Эта глава предоставляет обзор потенциальных проблем с традиционным дисковым " "хранилищем и введение в менеджер томов [.filename]#vinum#." #. type: delimited block = 4 -#: documentation/content/en/articles/vinum/_index.adoc:73 +#: documentation/content/en/articles/vinum/_index.adoc:72 msgid "" "vinum is deprecated and is not present in FreeBSD 15.0 and later. Users are " "advised to migrate to man:gconcat[8], man:gmirror[8], man:gstripe[8], man:" "graid[8], or man:zfs[8]." msgstr "" "vinum устарел и отсутствует в FreeBSD 15.0 и более поздних версиях. " "Пользователям рекомендуется перейти на man:gconcat[8], man:gmirror[8], man:" "gstripe[8], man:graid[8] или man:zfs[8]." #. type: delimited block = 4 -#: documentation/content/en/articles/vinum/_index.adoc:82 +#: documentation/content/en/articles/vinum/_index.adoc:81 msgid "" "Starting with FreeBSD 5, [.filename]#vinum# has been rewritten to fit into " "the extref:{handbook}geom[GEOM architecture, geom], while retaining the " "original ideas, terminology, and on-disk metadata. This rewrite is called " "_gvinum_ (for _GEOM vinum_). While this chapter uses the term [." "filename]#vinum#, any command invocations should be performed with " "`gvinum`. The name of the kernel module has changed from the original [." "filename]#vinum.ko# to [.filename]#geom_vinum.ko#, and all device nodes " "reside under [.filename]#/dev/gvinum# instead of [.filename]#/dev/vinum#. " "As of FreeBSD 6, the original [.filename]#vinum# implementation is no longer " "available in the code base." msgstr "" "Начиная с FreeBSD 5, [.filename]#vinum# был переписан для интеграции в " "extref:{handbook}geom[архитектуру GEOM, geom-synopsis], сохраняя при этом " "оригинальные идеи, терминологию и метаданные на диске. Эта переработанная " "версия называется _gvinum_ (от _GEOM vinum_). Хотя в этой главе используется " -"термин [.filename]#vinum#, все команды должны выполняться с помощью `gvinum`" -". Имя модуля ядра изменилось с оригинального [.filename]#vinum.ko# на [." -"filename]#geom_vinum.ko#, а все узлы устройств находятся в [.filename]#/dev/" -"gvinum# вместо [.filename]#/dev/vinum#. Начиная с FreeBSD 6, оригинальная " -"реализация [.filename]#vinum# больше не доступна в кодовой базе." +"термин [.filename]#vinum#, все команды должны выполняться с помощью " +"`gvinum`. Имя модуля ядра изменилось с оригинального [.filename]#vinum.ko# " +"на [.filename]#geom_vinum.ko#, а все узлы устройств находятся в [.filename]#/" +"dev/gvinum# вместо [.filename]#/dev/vinum#. Начиная с FreeBSD 6, " +"оригинальная реализация [.filename]#vinum# больше не доступна в кодовой базе." #. type: Title == -#: documentation/content/en/articles/vinum/_index.adoc:85 +#: documentation/content/en/articles/vinum/_index.adoc:84 #, no-wrap msgid "Access Bottlenecks" msgstr "Узкие места доступа" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:89 +#: documentation/content/en/articles/vinum/_index.adoc:88 msgid "" "Modern systems frequently need to access data in a highly concurrent " "manner. For example, large FTP or HTTP servers can maintain thousands of " "concurrent sessions and have multiple 100 Mbit/s connections to the outside " "world, well beyond the sustained transfer rate of most disks." msgstr "" "Современные системы часто нуждаются в доступе к данным в условиях высокой " "параллельности. Например, крупные FTP- или HTTP-серверы могут поддерживать " "тысячи одновременных сеансов и иметь несколько 100 Мбит/с соединений с " "внешним миром, что значительно превышает устойчивую скорость передачи " "большинства дисков." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:93 +#: documentation/content/en/articles/vinum/_index.adoc:92 msgid "" "Current disk drives can transfer data sequentially at up to 70 MB/s, but " "this value is of little importance in an environment where many independent " "processes access a drive, and where they may achieve only a fraction of " "these values. In such cases, it is more interesting to view the problem " "from the viewpoint of the disk subsystem. The important parameter is the " "load that a transfer places on the subsystem, or the time for which a " "transfer occupies the drives involved in the transfer." msgstr "" "Современные дисковые накопители могут передавать данные последовательно со " "скоростью до 70 МБ/с, но это значение имеет мало значения в среде, где " "множество независимых процессов обращаются к накопителю и могут достичь лишь " "доли этих значений. В таких случаях более интересно рассмотреть проблему с " "точки зрения дисковой подсистемы. Важным параметром является нагрузка, " "которую передача данных создаёт на подсистему, или время, в течение которого " "передача занимает задействованные накопители." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:96 +#: documentation/content/en/articles/vinum/_index.adoc:95 msgid "" "In any disk transfer, the drive must first position the heads, wait for the " "first sector to pass under the read head, and then perform the transfer. " "These actions can be considered to be atomic as it does not make any sense " "to interrupt them." msgstr "" "При любом переносе данных на диск сначала необходимо позиционировать " "головки, дождаться, пока первый сектор окажется под считывающей головкой, а " "затем выполнить перенос. Эти действия можно считать атомарными, так как их " "прерывание не имеет смысла." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:101 +#: documentation/content/en/articles/vinum/_index.adoc:100 msgid "" "[[vinum-latency]] Consider a typical transfer of about 10 kB: the current " "generation of high-performance disks can position the heads in an average of " "3.5 ms. The fastest drives spin at 15,000 rpm, so the average rotational " "latency (half a revolution) is 2 ms. At 70 MB/s, the transfer itself takes " "about 150 μs, almost nothing compared to the positioning time. In such a " "case, the effective transfer rate drops to a little over 1 MB/s and is " "clearly highly dependent on the transfer size." msgstr "" "[[vinum-latency]] Рассмотрим типичную передачу около 10 КБ: современные " "высокопроизводительные диски могут позиционировать головки в среднем за 3,5 " "мс. Самые быстрые диски вращаются со скоростью 15 000 об/мин, поэтому " "средняя задержка вращения (половина оборота) составляет 2 мс. При скорости " "70 МБ/с сама передача занимает около 150 мкс, что почти ничто по сравнению с " "временем позиционирования. В таком случае эффективная скорость передачи " "падает до чуть более 1 МБ/с и явно сильно зависит от размера передачи." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:104 +#: documentation/content/en/articles/vinum/_index.adoc:103 msgid "" "The traditional and obvious solution to this bottleneck is \"more spindles" "\": rather than using one large disk, use several smaller disks with the " "same aggregate storage space. Each disk is capable of positioning and " "transferring independently, so the effective throughput increases by a " "factor close to the number of disks used." msgstr "" "Традиционное и очевидное решение этой проблемы — «больше дисков»: вместо " "одного большого диска использовать несколько дисков меньшего размера с тем " "же общим объёмом хранилища. Каждый диск способен позиционироваться и " "передавать данные независимо, поэтому эффективная пропускная способность " "увеличивается почти пропорционально количеству используемых дисков." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:108 +#: documentation/content/en/articles/vinum/_index.adoc:107 msgid "" "The actual throughput improvement is smaller than the number of disks " "involved. Although each drive is capable of transferring in parallel, there " "is no way to ensure that the requests are evenly distributed across the " "drives. Inevitably the load on one drive will be higher than on another." msgstr "" "Фактическое увеличение пропускной способности меньше, чем количество " "задействованных дисков. Хотя каждый диск способен передавать данные " "параллельно, нет возможности гарантировать равномерное распределение " "запросов между дисками. Неизбежно нагрузка на один диск будет выше, чем на " "другой." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:116 +#: documentation/content/en/articles/vinum/_index.adoc:115 msgid "" "The evenness of the load on the disks is strongly dependent on the way the " "data is shared across the drives. In the following discussion, it is " "convenient to think of the disk storage as a large number of data sectors " "which are addressable by number, rather like the pages in a book. The most " "obvious method is to divide the virtual disk into groups of consecutive " "sectors the size of the individual physical disks and store them in this " "manner, rather like taking a large book and tearing it into smaller " "sections. This method is called _concatenation_ and has the advantage that " "the disks are not required to have any specific size relationships. It " "works well when the access to the virtual disk is spread evenly about its " "address space. When access is concentrated on a smaller area, the " "improvement is less marked. crossref:vinum[vinum-concat, Concatenated " "Organization] illustrates the sequence in which storage units are allocated " "in a concatenated organization." msgstr "" "Равномерность нагрузки на диски сильно зависит от способа распределения " "данных по накопителям. В дальнейшем обсуждении удобно представлять дисковое " "хранилище как большое количество секторов данных, адресуемых по номерам, " "подобно страницам в книге. Наиболее очевидный метод — разделить виртуальный " "диск на группы последовательных секторов размером с отдельные физические " "диски и хранить их таким образом, как если бы большую книгу разорвали на " "меньшие разделы. Этот метод называется _объединением_ (конкатенацией) и " "имеет преимущество в том, что диски не требуют каких-либо определённых " "соотношений размеров. Он хорошо работает, когда доступ к виртуальному диску " "равномерно распределён по его адресному пространству. Если доступ " "сосредоточен на меньшей области, улучшение менее заметно. crossref:" "vinum[vinum-concat, Организация методом объединения] иллюстрирует " "последовательность выделения блоков хранения в организации методом " "объединения." #. type: Block title -#: documentation/content/en/articles/vinum/_index.adoc:118 +#: documentation/content/en/articles/vinum/_index.adoc:117 #, no-wrap msgid "Concatenated Organization" msgstr "Организация методом объединения" #. type: Target for macro image -#: documentation/content/en/articles/vinum/_index.adoc:119 +#: documentation/content/en/articles/vinum/_index.adoc:118 #, no-wrap msgid "vinum-concat.png" msgstr "vinum-concat.png" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:125 +#: documentation/content/en/articles/vinum/_index.adoc:124 msgid "" "An alternative mapping is to divide the address space into smaller, equal-" "sized components and store them sequentially on different devices. For " "example, the first 256 sectors may be stored on the first disk, the next 256 " "sectors on the next disk and so on. After filling the last disk, the " "process repeats until the disks are full. This mapping is called _striping_ " "or RAID-0." msgstr "" "Альтернативный метод распределения заключается в разделении адресного " "пространства на меньшие равные по размеру компоненты и их последовательном " "хранении на разных устройствах. Например, первые 256 секторов могут " "храниться на первом диске, следующие 256 секторов — на следующем диске и так " "далее. После заполнения последнего диска процесс повторяется, пока все диски " "не будут заполнены. Такой метод называется _чередованием (striping)_ или " "RAID-0." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:129 +#: documentation/content/en/articles/vinum/_index.adoc:128 msgid "" "`RAID` offers various forms of fault tolerance, though RAID-0 is somewhat " "misleading as it provides no redundancy. Striping requires somewhat more " "effort to locate the data, and it can cause additional I/O load where a " "transfer is spread over multiple disks, but it can also provide a more " "constant load across the disks. crossref:vinum[vinum-striped, Striped " "Organization] illustrates the sequence in which storage units are allocated " "in a striped organization." msgstr "" "`RAID` предлагает различные формы отказоустойчивости, хотя RAID-0 несколько " "вводит в заблуждение, так как не обеспечивает избыточности. Разделение " "данных требует несколько больше усилий для их поиска и может создавать " "дополнительную нагрузку ввода-вывода, когда передача распределяется по " "нескольким дискам, но также может обеспечить более равномерную нагрузку на " "диски. crossref:vinum[vinum-striped,Организация методом чередования] " "иллюстрирует последовательность, в которой организуется распределение блоков " "хранения с чередованием." #. type: Block title -#: documentation/content/en/articles/vinum/_index.adoc:131 +#: documentation/content/en/articles/vinum/_index.adoc:130 #, no-wrap msgid "Striped Organization" msgstr "Организация методом чередования" #. type: Target for macro image -#: documentation/content/en/articles/vinum/_index.adoc:132 +#: documentation/content/en/articles/vinum/_index.adoc:131 #, no-wrap msgid "vinum-striped.png" msgstr "vinum-striped.png" #. type: Title == -#: documentation/content/en/articles/vinum/_index.adoc:135 +#: documentation/content/en/articles/vinum/_index.adoc:134 #, no-wrap msgid "Data Integrity" msgstr "Целостность данных" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:140 +#: documentation/content/en/articles/vinum/_index.adoc:139 msgid "" "The final problem with disks is that they are unreliable. Although " "reliability has increased tremendously over the last few years, disk drives " "are still the most likely core component of a server to fail. When they do, " "the results can be catastrophic and replacing a failed disk drive and " "restoring data can result in server downtime." msgstr "" "Последняя проблема с дисками заключается в их ненадёжности. Хотя надёжность " "значительно повысилась за последние годы, дисковые накопители остаются " "наиболее вероятным компонентом сервера, который может выйти из строя. Когда " "это происходит, последствия могут быть катастрофическими, а замена вышедшего " "из строя диска и восстановление данных могут привести к простою сервера." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:143 +#: documentation/content/en/articles/vinum/_index.adoc:142 msgid "" "One approach to this problem is _mirroring_, or `RAID-1`, which keeps two " "copies of the data on different physical hardware. Any write to the volume " "writes to both disks; a read can be satisfied from either, so if one drive " "fails, the data is still available on the other drive." msgstr "" "Один из подходов к этой проблеме — _зеркалирование_, или `RAID-1`, при " "котором данные хранятся в двух экземплярах на разных физических носителях. " "Любая запись на том записывается на оба диска; чтение может выполняться с " "любого из них, поэтому при отказе одного диска данные остаются доступны на " "другом." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:145 +#: documentation/content/en/articles/vinum/_index.adoc:144 msgid "Mirroring has two problems:" msgstr "Зеркалирование имеет две проблемы:" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:147 +#: documentation/content/en/articles/vinum/_index.adoc:146 msgid "It requires twice as much disk storage as a non-redundant solution." msgstr "" "Требуется в два раза больше дискового пространства, чем для решения без " "избыточности." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:148 +#: documentation/content/en/articles/vinum/_index.adoc:147 msgid "" "Writes must be performed to both drives, so they take up twice the bandwidth " "of a non-mirrored volume. Reads do not suffer from a performance penalty and " "can even be faster." msgstr "" "Запись должна выполняться на оба диска, поэтому она занимает в два раза " "больше пропускной способности, чем в незеркалированном томе. Чтение не " "страдает от потери производительности и может быть даже быстрее." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:155 +#: documentation/content/en/articles/vinum/_index.adoc:154 msgid "" "An alternative solution is _parity_, implemented in `RAID` levels 2, 3, 4 " "and 5. Of these, `RAID-5` is the most interesting. As implemented in [." "filename]#vinum#, it is a variant on a striped organization which dedicates " "one block of each stripe to parity one of the other blocks. As implemented " "by [.filename]#vinum#, a `RAID-5` plex is similar to a striped plex, except " "that it implements `RAID-5` by including a parity block in each stripe. As " "required by `RAID-5`, the location of this parity block changes from one " "stripe to the next. The numbers in the data blocks indicate the relative " "block numbers." msgstr "" "Альтернативным решением является _чётность_, реализованная в уровнях `RAID` " "2, 3, 4 и 5. Из них `RAID-5` представляет наибольший интерес. В реализации [." "filename]#vinum# это вариант организации с чередованием, где один блок " -"каждой полосы выделяется под чётность одного из других блоков. В реализации [" -".filename]#vinum# плекс `RAID-5` аналогичен плексу с чередованием, за " +"каждой полосы выделяется под чётность одного из других блоков. В реализации " +"[.filename]#vinum# плекс `RAID-5` аналогичен плексу с чередованием, за " "исключением того, что он реализует `RAID-5`, включая блок чётности в каждую " "полосу. Как требуется в `RAID-5`, расположение этого блока чётности меняется " "от одной полосы к другой. Числа в блоках данных обозначают относительные " "номера блоков." #. type: Block title -#: documentation/content/en/articles/vinum/_index.adoc:157 +#: documentation/content/en/articles/vinum/_index.adoc:156 #, no-wrap msgid "`RAID`-5 Organization" msgstr "Организация `RAID`-5" #. type: Target for macro image -#: documentation/content/en/articles/vinum/_index.adoc:158 +#: documentation/content/en/articles/vinum/_index.adoc:157 #, no-wrap msgid "vinum-raid5-org.png" msgstr "vinum-raid5-org.png" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:163 +#: documentation/content/en/articles/vinum/_index.adoc:162 msgid "" "Compared to mirroring, `RAID-5` has the advantage of requiring significantly " "less storage space. Read access is similar to that of striped " "organizations, but write access is significantly slower, approximately 25% " "of the read performance. If one drive fails, the array can continue to " "operate in degraded mode where a read from one of the remaining accessible " "drives continues normally, but a read from the failed drive is recalculated " "from the corresponding block from all the remaining drives." msgstr "" "По сравнению с зеркалированием, `RAID-5` имеет преимущество в виде " "значительно меньшего требуемого объёма хранилища. Скорость чтения аналогична " "таковой при чередующейся организации, но скорость записи значительно ниже — " "примерно 25% от скорости чтения. Если один диск выходит из строя, массив " "может продолжать работу в деградировавшем режиме, при котором чтение с " "оставшихся доступных дисков продолжается в обычном режиме, а чтение с " "отказавшего диска пересчитывается из соответствующих блоков всех оставшихся " "дисков." #. type: Title == -#: documentation/content/en/articles/vinum/_index.adoc:165 +#: documentation/content/en/articles/vinum/_index.adoc:164 #, no-wrap msgid "[.filename]#vinum# Objects" msgstr "Объекты [.filename]#vinum#" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:168 +#: documentation/content/en/articles/vinum/_index.adoc:167 msgid "" "To address these problems, [.filename]#vinum# implements a four-level " "hierarchy of objects:" msgstr "" "Для решения этих проблем [.filename]#vinum# реализует четырёхуровневую " "иерархию объектов:" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:170 +#: documentation/content/en/articles/vinum/_index.adoc:169 msgid "" "The most visible object is the virtual disk, called a _volume_. Volumes have " "essentially the same properties as a UNIX(R) disk drive, though there are " "some minor differences. For one, they have no size limitations." msgstr "" "Наиболее заметным объектом является виртуальный диск, называемый _томом_. " "Том обладает практически теми же свойствами, что и UNIX(R) дисковый " "накопитель, хотя есть некоторые незначительные отличия. Например, у тома нет " "ограничений по размеру." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:171 +#: documentation/content/en/articles/vinum/_index.adoc:170 msgid "" "Volumes are composed of _plexes_, each of which represent the total address " "space of a volume. This level in the hierarchy provides redundancy. Think of " "plexes as individual disks in a mirrored array, each containing the same " "data." msgstr "" "Тома состоят из _плексов_, каждый из которых представляет полное адресное " "пространство тома. Этот уровень в иерархии обеспечивает избыточность. Можно " "представить плексы как отдельные диски в зеркальном массиве, каждый из " "которых содержит одинаковые данные." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:172 +#: documentation/content/en/articles/vinum/_index.adoc:171 msgid "" "Since [.filename]#vinum# exists within the UNIX(R) disk storage framework, " "it would be possible to use UNIX(R) partitions as the building block for " "multi-disk plexes. In fact, this turns out to be too inflexible as UNIX(R) " "disks can have only a limited number of partitions. Instead, [." "filename]#vinum# subdivides a single UNIX(R) partition, the _drive_, into " "contiguous areas called _subdisks_, which are used as building blocks for " "plexes." msgstr "" "Поскольку [.filename]#vinum# существует в рамках системы хранения данных " "UNIX(R), можно было бы использовать разделы UNIX(R) в качестве строительных " "блоков для многодисковых plexes. Однако на практике это оказывается слишком " "негибким, так как диски UNIX(R) могут иметь только ограниченное количество " "разделов. Вместо этого [.filename]#vinum# разбивает единственный раздел " "UNIX(R), называемый _дисковый раздел (drive)_, на непрерывные области, " "называемые _поддисками (subdisk)_, которые используются как строительные " "блоки для плексов." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:173 +#: documentation/content/en/articles/vinum/_index.adoc:172 msgid "" "Subdisks reside on [.filename]#vinum#_drives_, currently UNIX(R) partitions. " "[.filename]#vinum# drives can contain any number of subdisks. With the " "exception of a small area at the beginning of the drive, which is used for " "storing configuration and state information, the entire drive is available " "for data storage." msgstr "" "Поддиски располагаются на _дисковых разделах_ [.filename]#vinum#, в " "настоящее время это разделы UNIX(R). Разделы [.filename]#vinum# могут " "содержать любое количество поддисков. За исключением небольшой области в " "начале раздела, которая используется для хранения конфигурации и состояния, " "весь раздел доступен для хранения данных." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:175 +#: documentation/content/en/articles/vinum/_index.adoc:174 msgid "" "The following sections describe the way these objects provide the " "functionality required of [.filename]#vinum#." msgstr "" "Следующие разделы статьи описывают, каким образом эти объекты обеспечивают " "функциональность, требуемую для [.filename]#vinum#." #. type: Title === -#: documentation/content/en/articles/vinum/_index.adoc:176 +#: documentation/content/en/articles/vinum/_index.adoc:175 #, no-wrap msgid "Volume Size Considerations" msgstr "Учёт размера томов" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:180 +#: documentation/content/en/articles/vinum/_index.adoc:179 msgid "" "Plexes can include multiple subdisks spread over all drives in the [." "filename]#vinum# configuration. As a result, the size of an individual " "drive does not limit the size of a plex or a volume." msgstr "" -"Плексы могут включать несколько поддисков, распределенных по всем дискам в " +"Плексы могут включать несколько поддисков, распределённых по всем дискам в " "конфигурации [.filename]#vinum#. В результате, размер отдельного диска не " "ограничивает размер плекса или тома." #. type: Title === -#: documentation/content/en/articles/vinum/_index.adoc:181 +#: documentation/content/en/articles/vinum/_index.adoc:180 #, no-wrap msgid "Redundant Data Storage" msgstr "Избыточное хранение данных" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:186 +#: documentation/content/en/articles/vinum/_index.adoc:185 msgid "" "[.filename]#vinum# implements mirroring by attaching multiple plexes to a " "volume. Each plex is a representation of the data in a volume. A volume " "may contain between one and eight plexes." msgstr "" "[.filename]#vinum# реализует зеркалирование путем присоединения нескольких " "плекс к тому. Каждый плекс представляет данные в томе. Том может содержать " "от одного до восьми плексов." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:189 +#: documentation/content/en/articles/vinum/_index.adoc:188 msgid "" "Although a plex represents the complete data of a volume, it is possible for " "parts of the representation to be physically missing, either by design (by " "not defining a subdisk for parts of the plex) or by accident (as a result of " "the failure of a drive). As long as at least one plex can provide the data " "for the complete address range of the volume, the volume is fully functional." msgstr "" "Хотя плекс представляет полные данные тома, возможно, что некоторые части " "представления физически отсутствуют — либо по замыслу (если поддиск для " "частей плекса не определён), либо случайно (в результате выхода диска из " "строя). До тех пор, пока хотя бы один плекс может предоставить данные для " "полного адресного пространства тома, том остаётся полностью работоспособным." #. type: Title === -#: documentation/content/en/articles/vinum/_index.adoc:190 +#: documentation/content/en/articles/vinum/_index.adoc:189 #, no-wrap msgid "Which Plex Organization?" msgstr "Какую организацию плексов выбрать?" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:193 +#: documentation/content/en/articles/vinum/_index.adoc:192 msgid "" "[.filename]#vinum# implements both concatenation and striping at the plex " "level:" msgstr "" "[.filename]#vinum# реализует как объединение, так и чередование на уровне " "плекс:" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:195 +#: documentation/content/en/articles/vinum/_index.adoc:194 msgid "" "A _concatenated plex_ uses the address space of each subdisk in turn. " "Concatenated plexes are the most flexible as they can contain any number of " "subdisks, and the subdisks may be of different length. The plex may be " "extended by adding additional subdisks. They require less CPU time than " "striped plexes, though the difference in CPU overhead is not measurable. On " "the other hand, they are most susceptible to hot spots, where one disk is " "very active and others are idle." msgstr "" "_Плекс с объединением_ использует адресное пространство каждого поддиска по " "очереди. Объединённые плексы являются наиболее гибкими, так как могут " "содержать любое количество поддисков, а поддиски могут быть разной длины. " "Плекс может быть расширен путём добавления дополнительных поддисков. Они " "требуют меньше процессорного времени, чем чередующиеся плексы, хотя разница " "в нагрузке на процессор незначительна. С другой стороны, они наиболее " "подвержены \"горячим точкам\", когда один диск очень активен, а другие " "простаивают." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:196 +#: documentation/content/en/articles/vinum/_index.adoc:195 msgid "" "A _striped plex_ stripes the data across each subdisk. The subdisks must all " "be the same size and there must be at least two subdisks to distinguish it " "from a concatenated plex. The greatest advantage of striped plexes is that " "they reduce hot spots. By choosing an optimum sized stripe, about 256 kB, " "the load can be evened out on the component drives. Extending a plex by " "adding new subdisks is so complicated that [.filename]#vinum# does not " "implement it." msgstr "" "_Плекс с чередованием_ распределяет данные по каждому поддиску. Поддиски " "должны быть одного размера, и их должно быть как минимум два, чтобы отличить " "такой плекс от объединенного. Главное преимущество чередующихся плексов в " "том, что они уменьшают вероятность появления \"горячих точек\". Выбрав " "оптимальный размер полосы (около 256 КБ), можно равномерно распределить " "нагрузку на диски – компоненты системы. Расширение плекса путем добавления " "новых поддисков настолько сложно, что [.filename]#vinum# не реализует эту " "возможность." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:198 +#: documentation/content/en/articles/vinum/_index.adoc:197 msgid "" "crossref:vinum[vinum-comparison, [.filename]#vinum# Plex Organizations] " "summarizes the advantages and disadvantages of each plex organization." msgstr "" "crossref:vinum[vinum-comparison, Организации плексов в [.filename]#vinum#] " "обобщает преимущества и недостатки каждой организации плексов." #. type: Block title -#: documentation/content/en/articles/vinum/_index.adoc:200 +#: documentation/content/en/articles/vinum/_index.adoc:199 #, no-wrap msgid "[.filename]#vinum# Plex Organizations" msgstr "Организации плексов в [.filename]#vinum#" #. type: Table -#: documentation/content/en/articles/vinum/_index.adoc:204 +#: documentation/content/en/articles/vinum/_index.adoc:203 #, no-wrap msgid "Plex type" msgstr "Тип плекса" #. type: Table -#: documentation/content/en/articles/vinum/_index.adoc:205 +#: documentation/content/en/articles/vinum/_index.adoc:204 #, no-wrap msgid "Minimum subdisks" msgstr "Минимальное количество поддисков" #. type: Table -#: documentation/content/en/articles/vinum/_index.adoc:206 +#: documentation/content/en/articles/vinum/_index.adoc:205 #, no-wrap msgid "Can add subdisks" msgstr "Может добавлять поддиски" #. type: Table -#: documentation/content/en/articles/vinum/_index.adoc:207 +#: documentation/content/en/articles/vinum/_index.adoc:206 #, no-wrap msgid "Must be equal size" msgstr "Должен быть равного размера" #. type: Table -#: documentation/content/en/articles/vinum/_index.adoc:209 +#: documentation/content/en/articles/vinum/_index.adoc:208 #, no-wrap msgid "Application" msgstr "Приложение" #. type: Table -#: documentation/content/en/articles/vinum/_index.adoc:210 +#: documentation/content/en/articles/vinum/_index.adoc:209 #, no-wrap msgid "concatenated" msgstr "объединённый" #. type: Table -#: documentation/content/en/articles/vinum/_index.adoc:211 +#: documentation/content/en/articles/vinum/_index.adoc:210 #, no-wrap msgid "1" msgstr "1" #. type: Table -#: documentation/content/en/articles/vinum/_index.adoc:212 -#: documentation/content/en/articles/vinum/_index.adoc:219 +#: documentation/content/en/articles/vinum/_index.adoc:211 +#: documentation/content/en/articles/vinum/_index.adoc:218 #, no-wrap msgid "yes" msgstr "да" #. type: Table -#: documentation/content/en/articles/vinum/_index.adoc:213 -#: documentation/content/en/articles/vinum/_index.adoc:218 +#: documentation/content/en/articles/vinum/_index.adoc:212 +#: documentation/content/en/articles/vinum/_index.adoc:217 #, no-wrap msgid "no" msgstr "no" #. type: Table -#: documentation/content/en/articles/vinum/_index.adoc:215 +#: documentation/content/en/articles/vinum/_index.adoc:214 #, no-wrap msgid "Large data storage with maximum placement flexibility and moderate performance" msgstr "Крупное хранилище данных с максимальной гибкостью размещения и умеренной производительностью" #. type: Table -#: documentation/content/en/articles/vinum/_index.adoc:216 +#: documentation/content/en/articles/vinum/_index.adoc:215 #, no-wrap msgid "striped" msgstr "чередуемый" #. type: Table -#: documentation/content/en/articles/vinum/_index.adoc:217 +#: documentation/content/en/articles/vinum/_index.adoc:216 #, no-wrap msgid "2" msgstr "2" #. type: Table -#: documentation/content/en/articles/vinum/_index.adoc:220 +#: documentation/content/en/articles/vinum/_index.adoc:219 #, no-wrap msgid "High performance in combination with highly concurrent access" msgstr "Высокая производительность в сочетании с высокопараллельным доступом" #. type: Title == -#: documentation/content/en/articles/vinum/_index.adoc:223 +#: documentation/content/en/articles/vinum/_index.adoc:222 #, no-wrap msgid "Some Examples" msgstr "Некоторые примеры" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:229 +#: documentation/content/en/articles/vinum/_index.adoc:228 msgid "" "[.filename]#vinum# maintains a _configuration database_ which describes the " "objects known to an individual system. Initially, the user creates the " "configuration database from one or more configuration files using man:" "gvinum[8]. [.filename]#vinum# stores a copy of its configuration database " "on each disk _device_ under its control. This database is updated on each " "state change, so that a restart accurately restores the state of each [." "filename]#vinum# object." msgstr "" "[.filename]#vinum# поддерживает _базу данных конфигурации_, которая " "описывает объекты, известные конкретной системе. Первоначально пользователь " "создаёт базу данных конфигурации из одного или нескольких конфигурационных " "файлов с помощью man:gvinum[8]. [.filename]#vinum# хранит копию своей базы " "данных конфигурации на каждом _устройстве_ диска, находящемся под его " "управлением. Эта база данных обновляется при каждом изменении состояния, так " "что перезапуск точно восстанавливает состояние каждого объекта [." "filename]#vinum#." #. type: Title === -#: documentation/content/en/articles/vinum/_index.adoc:230 +#: documentation/content/en/articles/vinum/_index.adoc:229 #, no-wrap msgid "The Configuration File" msgstr "Файл конфигурации" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:234 +#: documentation/content/en/articles/vinum/_index.adoc:233 msgid "" "The configuration file describes individual [.filename]#vinum# objects. The " "definition of a simple volume might be:" msgstr "" "Файл конфигурации описывает отдельные объекты [.filename]#vinum#. " "Определение простого тома может выглядеть следующим образом:" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:241 +#: documentation/content/en/articles/vinum/_index.adoc:240 #, no-wrap msgid "" " drive a device /dev/da3h\n" " volume myvol\n" " plex org concat\n" " sd length 512m drive a\n" msgstr "" " drive a device /dev/da3h\n" " volume myvol\n" " plex org concat\n" " sd length 512m drive a\n" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:244 +#: documentation/content/en/articles/vinum/_index.adoc:243 msgid "This file describes four [.filename]#vinum# objects:" msgstr "Этот файл описывает четыре объекта [.filename]#vinum#:" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:246 +#: documentation/content/en/articles/vinum/_index.adoc:245 msgid "" "The _drive_ line describes a disk partition (_drive_) and its location " "relative to the underlying hardware. It is given the symbolic name _a_. This " "separation of symbolic names from device names allows disks to be moved from " "one location to another without confusion." msgstr "" "Строка _drive_ описывает раздел диска (_drive_) и его расположение " "относительно оборудования, на котором он расположен. Ему присваивается " "символическое имя _a_. Такое разделение символических имён от имён устройств " "позволяет перемещать диски из одного места в другое без путаницы." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:247 +#: documentation/content/en/articles/vinum/_index.adoc:246 msgid "" "The _volume_ line describes a volume. The only required attribute is the " "name, in this case _myvol_." msgstr "" "Строка _volume_ описывает том. Единственный обязательный атрибут — это имя, " "в данном случае _myvol_." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:248 +#: documentation/content/en/articles/vinum/_index.adoc:247 msgid "" "The _plex_ line defines a plex. The only required parameter is the " "organization, in this case _concat_. No name is necessary as the system " "automatically generates a name from the volume name by adding the suffix _." "px_, where _x_ is the number of the plex in the volume. Thus this plex will " "be called _myvol.p0_." msgstr "" "Строка _plex_ определяет плекс. Единственный обязательный параметр — это " "организация, в данном случае _concat_. Имя не требуется, так как система " "автоматически генерирует его из имени тома, добавляя суффикс _.px_, где _x_ " "— номер плекса в томе. Таким образом, этот плекс будет называться _myvol.p0_." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:249 +#: documentation/content/en/articles/vinum/_index.adoc:248 msgid "" "The _sd_ line describes a subdisk. The minimum specifications are the name " "of a drive on which to store it, and the length of the subdisk. No name is " "necessary as the system automatically assigns names derived from the plex " "name by adding the suffix _.sx_, where _x_ is the number of the subdisk in " "the plex. Thus [.filename]#vinum# gives this subdisk the name _myvol.p0.s0_." msgstr "" "Строка _sd_ описывает поддиск. Минимальные требования — это имя диска для " "его хранения и длина поддиска. Имя не обязательно, так как система " "автоматически назначает имена, производные от имени плекса, добавляя суффикс " "_.sx_, где _x_ — номер поддиска в плексе. Таким образом, [.filename]#vinum# " "присваивает этому поддиску имя _myvol.p0.s0_." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:251 +#: documentation/content/en/articles/vinum/_index.adoc:250 msgid "" "After processing this file, man:gvinum[8] produces the following output:" msgstr "" "После обработки этого файла команда man:gvinum[8] выводит следующий " "результат:" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:261 +#: documentation/content/en/articles/vinum/_index.adoc:260 #, no-wrap msgid "" "# gvinum -> create config1\n" "Configuration summary\n" "Drives: 1 (4 configured)\n" "Volumes: 1 (4 configured)\n" "Plexes: 1 (8 configured)\n" "Subdisks: 1 (16 configured)\n" msgstr "" "# gvinum -> create config1\n" "Configuration summary\n" "Drives: 1 (4 configured)\n" "Volumes: 1 (4 configured)\n" "Plexes: 1 (8 configured)\n" "Subdisks: 1 (16 configured)\n" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:263 +#: documentation/content/en/articles/vinum/_index.adoc:262 #, no-wrap msgid " D a State: up Device /dev/da3h Avail: 2061/2573 MB (80%)\n" msgstr " D a State: up Device /dev/da3h Avail: 2061/2573 MB (80%)\n" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:265 +#: documentation/content/en/articles/vinum/_index.adoc:264 #, no-wrap msgid " V myvol State: up Plexes: 1 Size: 512 MB\n" msgstr " V myvol State: up Plexes: 1 Size: 512 MB\n" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:267 +#: documentation/content/en/articles/vinum/_index.adoc:266 #, no-wrap msgid " P myvol.p0 C State: up Subdisks: 1 Size: 512 MB\n" msgstr " P myvol.p0 C State: up Subdisks: 1 Size: 512 MB\n" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:269 +#: documentation/content/en/articles/vinum/_index.adoc:268 #, no-wrap msgid " S myvol.p0.s0 State: up PO: 0 B Size: 512 MB\n" msgstr " S myvol.p0.s0 State: up PO: 0 B Size: 512 MB\n" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:273 +#: documentation/content/en/articles/vinum/_index.adoc:272 msgid "" "This output shows the brief listing format of man:gvinum[8]. It is " "represented graphically in crossref:vinum[vinum-simple-vol, A Simple [." "filename]#vinum# Volume]." msgstr "" "Этот вывод показывает краткий формат списка man:gvinum[8]. Он представлен " "графически в crossref:vinum[vinum-simple-vol, Простой том [." "filename]#vinum#]." #. type: Block title -#: documentation/content/en/articles/vinum/_index.adoc:275 +#: documentation/content/en/articles/vinum/_index.adoc:274 #, no-wrap msgid "A Simple [.filename]#vinum# Volume" msgstr "Простой том [.filename]#vinum#" #. type: Target for macro image -#: documentation/content/en/articles/vinum/_index.adoc:276 +#: documentation/content/en/articles/vinum/_index.adoc:275 #, no-wrap msgid "vinum-simple-vol.png" msgstr "vinum-simple-vol.png" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:280 +#: documentation/content/en/articles/vinum/_index.adoc:279 msgid "" "This figure, and the ones which follow, represent a volume, which contains " "the plexes, which in turn contains the subdisks. In this example, the " "volume contains one plex, and the plex contains one subdisk." msgstr "" "Этот рисунок и следующие представляют том, который содержит плексы, которые, " "в свою очередь, содержат поддиски. В этом примере том содержит один плекс, а " "плекс содержит один поддиск." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:285 +#: documentation/content/en/articles/vinum/_index.adoc:284 msgid "" "This particular volume has no specific advantage over a conventional disk " "partition. It contains a single plex, so it is not redundant. The plex " "contains a single subdisk, so there is no difference in storage allocation " "from a conventional disk partition. The following sections illustrate " "various more interesting configuration methods." msgstr "" "Этот конкретный том не имеет особых преимуществ по сравнению с обычным " "разделом диска. Он содержит один плекс, поэтому не является избыточным. " "Плекс содержит один поддиск, поэтому нет различий в распределении хранилища " "по сравнению с обычным разделом диска. В следующих разделах показаны " "различные более интересные методы конфигурации." #. type: Title === -#: documentation/content/en/articles/vinum/_index.adoc:286 +#: documentation/content/en/articles/vinum/_index.adoc:285 #, no-wrap msgid "Increased Resilience: Mirroring" msgstr "Увеличенная отказоустойчивость: зеркалирование" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:291 +#: documentation/content/en/articles/vinum/_index.adoc:290 msgid "" "The resilience of a volume can be increased by mirroring. When laying out a " "mirrored volume, it is important to ensure that the subdisks of each plex " "are on different drives, so that a drive failure will not take down both " "plexes. The following configuration mirrors a volume:" msgstr "" "Устойчивость тома может быть повышена за счёт зеркалирования. При создании " "зеркального тома важно убедиться, что поддиски каждого плекса находятся на " "разных дисках, чтобы выход из строя одного диска не затронул оба плекса. " "Следующая конфигурация создаёт зеркальный том:" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:300 +#: documentation/content/en/articles/vinum/_index.adoc:299 #, no-wrap msgid "" "\tdrive b device /dev/da4h\n" "\tvolume mirror\n" " plex org concat\n" " sd length 512m drive a\n" "\t plex org concat\n" "\t sd length 512m drive b\n" msgstr "" "\tdrive b device /dev/da4h\n" "\tvolume mirror\n" " plex org concat\n" " sd length 512m drive a\n" "\t plex org concat\n" "\t sd length 512m drive b\n" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:304 +#: documentation/content/en/articles/vinum/_index.adoc:303 msgid "" "In this example, it was not necessary to specify a definition of drive _a_ " "again, since [.filename]#vinum# keeps track of all objects in its " "configuration database. After processing this definition, the configuration " "looks like:" msgstr "" "В этом примере не потребовалось снова указывать определение диска _a_, " "поскольку [.filename]#vinum# отслеживает все объекты в своей базе данных " "конфигурации. После обработки этого определения конфигурация выглядит " "следующим образом:" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:312 +#: documentation/content/en/articles/vinum/_index.adoc:311 #, no-wrap msgid "" "\tDrives: 2 (4 configured)\n" "\tVolumes: 2 (4 configured)\n" "\tPlexes: 3 (8 configured)\n" "\tSubdisks: 3 (16 configured)\n" msgstr "" "\tDrives: 2 (4 configured)\n" "\tVolumes: 2 (4 configured)\n" "\tPlexes: 3 (8 configured)\n" "\tSubdisks: 3 (16 configured)\n" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:315 +#: documentation/content/en/articles/vinum/_index.adoc:314 #, no-wrap msgid "" "\tD a State: up Device /dev/da3h Avail: 1549/2573 MB (60%)\n" "\tD b State: up Device /dev/da4h Avail: 2061/2573 MB (80%)\n" msgstr "" "\tD a State: up Device /dev/da3h Avail: 1549/2573 MB (60%)\n" "\tD b State: up Device /dev/da4h Avail: 2061/2573 MB (80%)\n" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:318 +#: documentation/content/en/articles/vinum/_index.adoc:317 #, no-wrap msgid "" " V myvol State: up Plexes: 1 Size: 512 MB\n" " V mirror State: up Plexes: 2 Size: 512 MB\n" msgstr "" " V myvol State: up Plexes: 1 Size: 512 MB\n" " V mirror State: up Plexes: 2 Size: 512 MB\n" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:322 +#: documentation/content/en/articles/vinum/_index.adoc:321 #, no-wrap msgid "" " P myvol.p0 C State: up Subdisks: 1 Size: 512 MB\n" " P mirror.p0 C State: up Subdisks: 1 Size: 512 MB\n" " P mirror.p1 C State: initializing Subdisks: 1 Size: 512 MB\n" msgstr "" " P myvol.p0 C State: up Subdisks: 1 Size: 512 MB\n" " P mirror.p0 C State: up Subdisks: 1 Size: 512 MB\n" " P mirror.p1 C State: initializing Subdisks: 1 Size: 512 MB\n" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:326 +#: documentation/content/en/articles/vinum/_index.adoc:325 #, no-wrap msgid "" " S myvol.p0.s0 State: up PO: 0 B Size: 512 MB\n" "\tS mirror.p0.s0 State: up PO: 0 B Size: 512 MB\n" "\tS mirror.p1.s0 State: empty PO: 0 B Size: 512 MB\n" msgstr "" " S myvol.p0.s0 State: up PO: 0 B Size: 512 MB\n" "\tS mirror.p0.s0 State: up PO: 0 B Size: 512 MB\n" "\tS mirror.p1.s0 State: empty PO: 0 B Size: 512 MB\n" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:329 +#: documentation/content/en/articles/vinum/_index.adoc:328 msgid "" "crossref:vinum[vinum-mirrored-vol, A Mirrored [.filename]#vinum# Volume] " "shows the structure graphically." msgstr "" "crossref:vinum[vinum-mirrored-vol, Зеркальный том [.filename]#vinum#] " "графически отображает структуру." #. type: Block title -#: documentation/content/en/articles/vinum/_index.adoc:331 +#: documentation/content/en/articles/vinum/_index.adoc:330 #, no-wrap msgid "A Mirrored [.filename]#vinum# Volume" msgstr "Зеркальный том [.filename]#vinum#" #. type: Target for macro image -#: documentation/content/en/articles/vinum/_index.adoc:332 +#: documentation/content/en/articles/vinum/_index.adoc:331 #, no-wrap msgid "vinum-mirrored-vol.png" msgstr "vinum-mirrored-vol.png" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:336 +#: documentation/content/en/articles/vinum/_index.adoc:335 msgid "" "In this example, each plex contains the full 512 MB of address space. As in " "the previous example, each plex contains only a single subdisk." msgstr "" "В этом примере каждый плекс содержит полные 512 МБ адресного пространства. " "Как и в предыдущем примере, каждый плекс содержит только один поддиск." #. type: Title === -#: documentation/content/en/articles/vinum/_index.adoc:337 +#: documentation/content/en/articles/vinum/_index.adoc:336 #, no-wrap msgid "Optimizing Performance" msgstr "Оптимизация производительности" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:342 +#: documentation/content/en/articles/vinum/_index.adoc:341 msgid "" "The mirrored volume in the previous example is more resistant to failure " "than an unmirrored volume, but its performance is less as each write to the " "volume requires a write to both drives, using up a greater proportion of the " "total disk bandwidth. Performance considerations demand a different " "approach: instead of mirroring, the data is striped across as many disk " "drives as possible. The following configuration shows a volume with a plex " "striped across four disk drives:" msgstr "" "Зеркальный том в предыдущем примере более устойчив к сбоям, чем незеркальный " "том, но его производительность ниже, так как каждая запись в том требует " "записи на оба диска, используя большую часть общей пропускной способности " "дисков. Соображения производительности требуют другого подхода: вместо " "зеркалирования данные распределяются по полосам на максимально возможное " "количество дисков. Следующая конфигурация показывает том с плексом, " "распределённым по полосам на четырёх дисках:" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:353 +#: documentation/content/en/articles/vinum/_index.adoc:352 #, no-wrap msgid "" " drive c device /dev/da5h\n" "\tdrive d device /dev/da6h\n" "\tvolume stripe\n" "\tplex org striped 512k\n" "\t sd length 128m drive a\n" "\t sd length 128m drive b\n" "\t sd length 128m drive c\n" "\t sd length 128m drive d\n" msgstr "" " drive c device /dev/da5h\n" "\tdrive d device /dev/da6h\n" "\tvolume stripe\n" "\tplex org striped 512k\n" "\t sd length 128m drive a\n" "\t sd length 128m drive b\n" "\t sd length 128m drive c\n" "\t sd length 128m drive d\n" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:357 +#: documentation/content/en/articles/vinum/_index.adoc:356 msgid "" "As before, it is not necessary to define the drives which are already known " "to [.filename]#vinum#. After processing this definition, the configuration " "looks like:" msgstr "" "Как и ранее, не нужно определять диски, которые уже известны [." "filename]#vinum#. После обработки этого определения конфигурация выглядит " "следующим образом:" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:365 +#: documentation/content/en/articles/vinum/_index.adoc:364 #, no-wrap msgid "" "\tDrives: 4 (4 configured)\n" "\tVolumes: 3 (4 configured)\n" "\tPlexes: 4 (8 configured)\n" "\tSubdisks: 7 (16 configured)\n" msgstr "" "\tDrives: 4 (4 configured)\n" "\tVolumes: 3 (4 configured)\n" "\tPlexes: 4 (8 configured)\n" "\tSubdisks: 7 (16 configured)\n" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:370 +#: documentation/content/en/articles/vinum/_index.adoc:369 #, no-wrap msgid "" " D a State: up Device /dev/da3h Avail: 1421/2573 MB (55%)\n" " D b State: up Device /dev/da4h Avail: 1933/2573 MB (75%)\n" " D c State: up Device /dev/da5h Avail: 2445/2573 MB (95%)\n" " D d State: up Device /dev/da6h Avail: 2445/2573 MB (95%)\n" msgstr "" " D a State: up Device /dev/da3h Avail: 1421/2573 MB (55%)\n" " D b State: up Device /dev/da4h Avail: 1933/2573 MB (75%)\n" " D c State: up Device /dev/da5h Avail: 2445/2573 MB (95%)\n" " D d State: up Device /dev/da6h Avail: 2445/2573 MB (95%)\n" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:374 +#: documentation/content/en/articles/vinum/_index.adoc:373 #, no-wrap msgid "" " V myvol State: up Plexes: 1 Size: 512 MB\n" " V mirror State: up Plexes: 2 Size: 512 MB\n" " V striped State: up Plexes: 1 Size: 512 MB\n" msgstr "" " V myvol State: up Plexes: 1 Size: 512 MB\n" " V mirror State: up Plexes: 2 Size: 512 MB\n" " V striped State: up Plexes: 1 Size: 512 MB\n" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:379 +#: documentation/content/en/articles/vinum/_index.adoc:378 #, no-wrap msgid "" " P myvol.p0 C State: up Subdisks: 1 Size: 512 MB\n" " P mirror.p0 C State: up Subdisks: 1 Size: 512 MB\n" " P mirror.p1 C State: initializing Subdisks: 1 Size: 512 MB\n" " P striped.p1 State: up Subdisks: 1 Size: 512 MB\n" msgstr "" " P myvol.p0 C State: up Subdisks: 1 Size: 512 MB\n" " P mirror.p0 C State: up Subdisks: 1 Size: 512 MB\n" " P mirror.p1 C State: initializing Subdisks: 1 Size: 512 MB\n" " P striped.p1 State: up Subdisks: 1 Size: 512 MB\n" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:387 +#: documentation/content/en/articles/vinum/_index.adoc:386 #, no-wrap msgid "" " S myvol.p0.s0 State: up PO: 0 B Size: 512 MB\n" " S mirror.p0.s0 State: up PO: 0 B Size: 512 MB\n" " S mirror.p1.s0 State: empty PO: 0 B Size: 512 MB\n" " S striped.p0.s0 State: up PO: 0 B Size: 128 MB\n" " S striped.p0.s1 State: up PO: 512 kB Size: 128 MB\n" " S striped.p0.s2 State: up PO: 1024 kB Size: 128 MB\n" " S striped.p0.s3 State: up PO: 1536 kB Size: 128 MB\n" msgstr "" " S myvol.p0.s0 State: up PO: 0 B Size: 512 MB\n" " S mirror.p0.s0 State: up PO: 0 B Size: 512 MB\n" " S mirror.p1.s0 State: empty PO: 0 B Size: 512 MB\n" " S striped.p0.s0 State: up PO: 0 B Size: 128 MB\n" " S striped.p0.s1 State: up PO: 512 kB Size: 128 MB\n" " S striped.p0.s2 State: up PO: 1024 kB Size: 128 MB\n" " S striped.p0.s3 State: up PO: 1536 kB Size: 128 MB\n" #. type: Block title -#: documentation/content/en/articles/vinum/_index.adoc:390 +#: documentation/content/en/articles/vinum/_index.adoc:389 #, no-wrap msgid "A Striped [.filename]#vinum# Volume" msgstr "Том [.filename]#vinum# с чередованием" #. type: Target for macro image -#: documentation/content/en/articles/vinum/_index.adoc:391 +#: documentation/content/en/articles/vinum/_index.adoc:390 #, no-wrap msgid "vinum-striped-vol.png" msgstr "vinum-striped-vol.png" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:395 +#: documentation/content/en/articles/vinum/_index.adoc:394 msgid "" "This volume is represented in crossref:vinum[vinum-striped-vol, A Striped [." "filename]#vinum# Volume]. The darkness of the stripes indicates the " "position within the plex address space, where the lightest stripes come " "first and the darkest last." msgstr "" "Этот том представлен на схеме crossref:vinum[vinum-striped-vol, Том [." "filename]#vinum# с чередованием]. Темнота полос указывает на позицию в " "адресном пространстве плекса, где самые светлые полосы идут первыми, а самые " "темные — последними." #. type: Title === -#: documentation/content/en/articles/vinum/_index.adoc:396 +#: documentation/content/en/articles/vinum/_index.adoc:395 #, no-wrap msgid "Resilience and Performance" msgstr "Устойчивость и производительность" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:400 +#: documentation/content/en/articles/vinum/_index.adoc:399 msgid "" "[[vinum-resilience]]With sufficient hardware, it is possible to build " "volumes which show both increased resilience and increased performance " "compared to standard UNIX(R) partitions. A typical configuration file might " "be:" msgstr "" "[[vinum-resilience]]При достаточном аппаратном обеспечении можно создать " "тома, которые демонстрируют как повышенную отказоустойчивость, так и " "увеличенную производительность по сравнению со стандартными разделами " "UNIX(R). Типичный конфигурационный файл может выглядеть так:" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:416 +#: documentation/content/en/articles/vinum/_index.adoc:415 #, no-wrap msgid "" "\tvolume raid10\n" " plex org striped 512k\n" " sd length 102480k drive a\n" " sd length 102480k drive b\n" " sd length 102480k drive c\n" " sd length 102480k drive d\n" " sd length 102480k drive e\n" " plex org striped 512k\n" " sd length 102480k drive c\n" " sd length 102480k drive d\n" " sd length 102480k drive e\n" " sd length 102480k drive a\n" " sd length 102480k drive b\n" msgstr "" "\tvolume raid10\n" " plex org striped 512k\n" " sd length 102480k drive a\n" " sd length 102480k drive b\n" " sd length 102480k drive c\n" " sd length 102480k drive d\n" " sd length 102480k drive e\n" " plex org striped 512k\n" " sd length 102480k drive c\n" " sd length 102480k drive d\n" " sd length 102480k drive e\n" " sd length 102480k drive a\n" " sd length 102480k drive b\n" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:420 +#: documentation/content/en/articles/vinum/_index.adoc:419 msgid "" "The subdisks of the second plex are offset by two drives from those of the " "first plex. This helps to ensure that writes do not go to the same subdisks " "even if a transfer goes over two drives." msgstr "" "Поддиски второго плекса смещены на два диска относительно поддисков первого " "плекса. Это помогает гарантировать, что записи не будут направляться на одни " "и те же поддиски, даже если передача затронет два диска." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:422 +#: documentation/content/en/articles/vinum/_index.adoc:421 msgid "" -"crossref:vinum[vinum-raid10-vol, A Mirrored, Striped [.filename]#vinum# " -"Volume] represents the structure of this volume." +"crossref:vinum[vinum-raid10-vol,\"A Mirrored, Striped [.filename]#vinum# " +"Volume\"] represents the structure of this volume." msgstr "" -"crossref:vinum[vinum-raid10-vol, Том [.filename]#vinum# c зеркалированием и " -"чередованием] представляет структуру этого тома." +"crossref:vinum[vinum-raid10-vol, \"Том [.filename]#vinum# c зеркалированием " +"и чередованием\"] представляет структуру этого тома." #. type: Block title -#: documentation/content/en/articles/vinum/_index.adoc:424 +#: documentation/content/en/articles/vinum/_index.adoc:423 #, no-wrap msgid "A Mirrored, Striped [.filename]#vinum# Volume" msgstr "Том [.filename]#vinum# c зеркалированием и чередованием" #. type: Target for macro image -#: documentation/content/en/articles/vinum/_index.adoc:425 +#: documentation/content/en/articles/vinum/_index.adoc:424 #, no-wrap msgid "vinum-raid10-vol.png" msgstr "vinum-raid10-vol.png" #. type: Title == -#: documentation/content/en/articles/vinum/_index.adoc:428 +#: documentation/content/en/articles/vinum/_index.adoc:427 #, no-wrap msgid "Object Naming" msgstr "Именование объектов" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:432 +#: documentation/content/en/articles/vinum/_index.adoc:431 msgid "" "[.filename]#vinum# assigns default names to plexes and subdisks, although " "they may be overridden. Overriding the default names is not recommended as " "it does not bring a significant advantage and it can cause confusion." msgstr "" "[.filename]#vinum# назначает стандартные имена для плексов и поддисков, хотя " "их можно изменить. Не рекомендуется изменять стандартные имена, так как это " "не даёт значительных преимуществ и может вызвать путаницу." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:435 +#: documentation/content/en/articles/vinum/_index.adoc:434 msgid "" "Names may contain any non-blank character, but it is recommended to restrict " "them to letters, digits and the underscore characters. The names of " "volumes, plexes, and subdisks may be up to 64 characters long, and the names " "of drives may be up to 32 characters long." msgstr "" "Имена могут содержать любые непустые символы, но рекомендуется " "ограничиваться буквами, цифрами и символами подчёркивания. Имена томов, " "плексов и поддисков могут быть длиной до 64 символов, а имена дисков — до 32 " "символов." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:438 +#: documentation/content/en/articles/vinum/_index.adoc:437 msgid "" "[.filename]#vinum# objects are assigned device nodes in the hierarchy [." "filename]#/dev/gvinum#. The configuration shown above would cause [." "filename]#vinum# to create the following device nodes:" msgstr "" "Объектам [.filename]#vinum# назначаются узлы устройств в иерархии [." "filename]#/dev/gvinum#. Приведённая выше конфигурация приведёт к тому, что [." "filename]#vinum# создаст следующие узлы устройств:" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:440 +#: documentation/content/en/articles/vinum/_index.adoc:439 msgid "" "Device entries for each volume. These are the main devices used by [." "filename]#vinum#. The configuration above would include the devices [." "filename]#/dev/gvinum/myvol#, [.filename]#/dev/gvinum/mirror#, [.filename]#/" "dev/gvinum/striped#, [.filename]#/dev/gvinum/raid5# and [.filename]#/dev/" "gvinum/raid10#." msgstr "" "Записи устройств для каждого тома. Это основные устройства, используемые [." "filename]#vinum#. Приведённая конфигурация включает устройства [.filename]#/" "dev/gvinum/myvol#, [.filename]#/dev/gvinum/mirror#, [.filename]#/dev/gvinum/" "striped#, [.filename]#/dev/gvinum/raid5# и [.filename]#/dev/gvinum/raid10#." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:441 +#: documentation/content/en/articles/vinum/_index.adoc:440 msgid "All volumes get direct entries under [.filename]#/dev/gvinum/#." msgstr "Все тома получают собственные записи в [.filename]#/dev/gvinum/#." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:442 +#: documentation/content/en/articles/vinum/_index.adoc:441 msgid "" "The directories [.filename]#/dev/gvinum/plex#, and [.filename]#/dev/gvinum/" "sd#, which contain device nodes for each plex and for each subdisk, " "respectively." msgstr "" "Каталоги [.filename]#/dev/gvinum/plex# и [.filename]#/dev/gvinum/sd#, " "которые содержат узлы устройств для каждого плекса и каждого субдиска " "соответственно." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:444 +#: documentation/content/en/articles/vinum/_index.adoc:443 msgid "For example, consider the following configuration file:" msgstr "Например, рассмотрим следующий конфигурационный файл:" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:457 +#: documentation/content/en/articles/vinum/_index.adoc:456 #, no-wrap msgid "" "\tdrive drive1 device /dev/sd1h\n" "\tdrive drive2 device /dev/sd2h\n" "\tdrive drive3 device /dev/sd3h\n" "\tdrive drive4 device /dev/sd4h\n" " volume s64 setupstate\n" " plex org striped 64k\n" " sd length 100m drive drive1\n" " sd length 100m drive drive2\n" " sd length 100m drive drive3\n" " sd length 100m drive drive4\n" msgstr "" "\tdrive drive1 device /dev/sd1h\n" "\tdrive drive2 device /dev/sd2h\n" "\tdrive drive3 device /dev/sd3h\n" "\tdrive drive4 device /dev/sd4h\n" " volume s64 setupstate\n" " plex org striped 64k\n" " sd length 100m drive drive1\n" " sd length 100m drive drive2\n" " sd length 100m drive drive3\n" " sd length 100m drive drive4\n" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:460 +#: documentation/content/en/articles/vinum/_index.adoc:459 msgid "" "After processing this file, man:gvinum[8] creates the following structure in " "[.filename]#/dev/gvinum#:" msgstr "" "После обработки этого файла man:gvinum[8] создаёт следующую структуру в [." "filename]#/dev/gvinum#:" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:467 +#: documentation/content/en/articles/vinum/_index.adoc:466 #, no-wrap msgid "" "\tdrwxr-xr-x 2 root wheel 512 Apr 13\n" "16:46 plex\n" "\tcrwxr-xr-- 1 root wheel 91, 2 Apr 13 16:46 s64\n" "\tdrwxr-xr-x 2 root wheel 512 Apr 13 16:46 sd\n" msgstr "" "\tdrwxr-xr-x 2 root wheel 512 Apr 13\n" "16:46 plex\n" "\tcrwxr-xr-- 1 root wheel 91, 2 Apr 13 16:46 s64\n" "\tdrwxr-xr-x 2 root wheel 512 Apr 13 16:46 sd\n" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:471 +#: documentation/content/en/articles/vinum/_index.adoc:470 #, no-wrap msgid "" " /dev/vinum/plex:\n" " total 0\n" " crwxr-xr-- 1 root wheel 25, 0x10000002 Apr 13 16:46 s64.p0\n" msgstr "" " /dev/vinum/plex:\n" " total 0\n" " crwxr-xr-- 1 root wheel 25, 0x10000002 Apr 13 16:46 s64.p0\n" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:478 +#: documentation/content/en/articles/vinum/_index.adoc:477 #, no-wrap msgid "" " /dev/vinum/sd:\n" " total 0\n" " crwxr-xr-- 1 root wheel 91, 0x20000002 Apr 13 16:46 s64.p0.s0\n" " crwxr-xr-- 1 root wheel 91, 0x20100002 Apr 13 16:46 s64.p0.s1\n" " crwxr-xr-- 1 root wheel 91, 0x20200002 Apr 13 16:46 s64.p0.s2\n" " crwxr-xr-- 1 root wheel 91, 0x20300002 Apr 13 16:46 s64.p0.s3\n" msgstr "" " /dev/vinum/sd:\n" " total 0\n" " crwxr-xr-- 1 root wheel 91, 0x20000002 Apr 13 16:46 s64.p0.s0\n" " crwxr-xr-- 1 root wheel 91, 0x20100002 Apr 13 16:46 s64.p0.s1\n" " crwxr-xr-- 1 root wheel 91, 0x20200002 Apr 13 16:46 s64.p0.s2\n" " crwxr-xr-- 1 root wheel 91, 0x20300002 Apr 13 16:46 s64.p0.s3\n" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:483 +#: documentation/content/en/articles/vinum/_index.adoc:482 msgid "" "Although it is recommended that plexes and subdisks should not be allocated " "specific names, [.filename]#vinum# drives must be named. This makes it " "possible to move a drive to a different location and still recognize it " "automatically. Drive names may be up to 32 characters long." msgstr "" "Хотя рекомендуется не назначать конкретные имена плексам и поддискам, диски " "[.filename]#vinum# должны быть именованными. Это позволяет переместить диск " "в другое место и по-прежнему автоматически его распознавать. Имена дисков " "могут быть длиной до 32 символов." #. type: Title === -#: documentation/content/en/articles/vinum/_index.adoc:484 +#: documentation/content/en/articles/vinum/_index.adoc:483 #, no-wrap msgid "Creating File Systems" msgstr "Создание файловых систем" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:492 +#: documentation/content/en/articles/vinum/_index.adoc:491 msgid "" "Volumes appear to the system to be identical to disks, with one exception. " "Unlike UNIX(R) drives, [.filename]#vinum# does not partition volumes, which " "thus do not contain a partition table. This has required modification to " "some disk utilities, notably man:newfs[8], so that it does not try to " "interpret the last letter of a [.filename]#vinum# volume name as a partition " "identifier. For example, a disk drive may have a name like [.filename]#/dev/" "ad0a# or [.filename]#/dev/da2h#. These names represent the first partition " "([.filename]#a#) on the first (0) IDE disk ([.filename]#ad#) and the eighth " "partition ([.filename]#h#) on the third (2) SCSI disk ([.filename]#da#) " "respectively. By contrast, a [.filename]#vinum# volume might be called [." "filename]#/dev/gvinum/concat#, which has no relationship with a partition " "name." msgstr "" "Тома для системы выглядят идентично дискам, за одним исключением. В отличие " "от дисков UNIX(R), [.filename]#vinum# не разбивает тома на разделы, поэтому " "они не содержат таблицы разделов. Это потребовало внесения изменений в " "некоторые утилиты для работы с дисками, в частности, в man:newfs[8], чтобы " "они не пытались интерпретировать последнюю букву имени тома [." "filename]#vinum# как идентификатор раздела. Например, имя диска может " "выглядеть как [.filename]#/dev/ad0a# или [.filename]#/dev/da2h#. Эти имена " "обозначают первый раздел ([.filename]#a#) на первом (0) IDE-диске ([." -"filename]#ad#) и восьмой раздел ([.filename]#h#) на третьем (2) SCSI-диске ([" -".filename]#da#), соответственно. В отличие от этого, том [.filename]#vinum# " -"может называться [.filename]#/dev/gvinum/concat#, что не имеет отношения к " -"имени раздела." +"filename]#ad#) и восьмой раздел ([.filename]#h#) на третьем (2) SCSI-диске " +"([.filename]#da#), соответственно. В отличие от этого, том [." +"filename]#vinum# может называться [.filename]#/dev/gvinum/concat#, что не " +"имеет отношения к имени раздела." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:494 +#: documentation/content/en/articles/vinum/_index.adoc:493 msgid "To create a file system on this volume, use man:newfs[8]:" msgstr "Чтобы создать файловую систему на этом томе, используйте man:newfs[8]:" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:498 +#: documentation/content/en/articles/vinum/_index.adoc:497 #, no-wrap msgid "# newfs /dev/gvinum/concat\n" msgstr "# newfs /dev/gvinum/concat\n" #. type: Title == -#: documentation/content/en/articles/vinum/_index.adoc:501 +#: documentation/content/en/articles/vinum/_index.adoc:500 #, no-wrap msgid "Configuring [.filename]#vinum#" msgstr "Настройка [.filename]#vinum#" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:507 +#: documentation/content/en/articles/vinum/_index.adoc:506 msgid "" "The [.filename]#GENERIC# kernel does not contain [.filename]#vinum#. It is " "possible to build a custom kernel which includes [.filename]#vinum#, but " "this is not recommended. The standard way to start [.filename]#vinum# is as " "a kernel module. man:kldload[8] is not needed because when man:gvinum[8] " "starts, it checks whether the module has been loaded, and if it is not, it " "loads it automatically." msgstr "" "Ядро [.filename]#GENERIC# не содержит [.filename]#vinum#. Можно собрать " "пользовательское ядро с включённым [.filename]#vinum#, но это не " "рекомендуется. Стандартный способ запуска [.filename]#vinum# — в качестве " "модуля ядра. Команда man:kldload[8] не требуется, так как при запуске man:" "gvinum[8] проверяет, загружен ли модуль, и если нет, загружает его " "автоматически." #. type: Title === -#: documentation/content/en/articles/vinum/_index.adoc:508 +#: documentation/content/en/articles/vinum/_index.adoc:507 #, no-wrap msgid "Startup" msgstr "Запуск" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:513 +#: documentation/content/en/articles/vinum/_index.adoc:512 msgid "" "[.filename]#vinum# stores configuration information on the disk slices in " "essentially the same form as in the configuration files. When reading from " "the configuration database, [.filename]#vinum# recognizes a number of " "keywords which are not allowed in the configuration files. For example, a " "disk configuration might contain the following text:" msgstr "" "[.filename]#vinum# хранит конфигурационную информацию на дисковых слайсах " "практически в той же форме, что и в конфигурационных файлах. При чтении из " "базы данных конфигурации [.filename]#vinum# распознаёт ряд ключевых слов, " "которые не допускаются в конфигурационных файлах. Например, конфигурация " "диска может содержать следующий текст:" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:535 +#: documentation/content/en/articles/vinum/_index.adoc:534 #, no-wrap msgid "" "volume myvol state up\n" "volume bigraid state down\n" "plex name myvol.p0 state up org concat vol myvol\n" "plex name myvol.p1 state up org concat vol myvol\n" "plex name myvol.p2 state init org striped 512b vol myvol\n" "plex name bigraid.p0 state initializing org raid5 512b vol bigraid\n" "sd name myvol.p0.s0 drive a plex myvol.p0 state up len 1048576b driveoffset 265b plexoffset 0b\n" "sd name myvol.p0.s1 drive b plex myvol.p0 state up len 1048576b driveoffset 265b plexoffset 1048576b\n" "sd name myvol.p1.s0 drive c plex myvol.p1 state up len 1048576b driveoffset 265b plexoffset 0b\n" "sd name myvol.p1.s1 drive d plex myvol.p1 state up len 1048576b driveoffset 265b plexoffset 1048576b\n" "sd name myvol.p2.s0 drive a plex myvol.p2 state init len 524288b driveoffset 1048841b plexoffset 0b\n" "sd name myvol.p2.s1 drive b plex myvol.p2 state init len 524288b driveoffset 1048841b plexoffset 524288b\n" "sd name myvol.p2.s2 drive c plex myvol.p2 state init len 524288b driveoffset 1048841b plexoffset 1048576b\n" "sd name myvol.p2.s3 drive d plex myvol.p2 state init len 524288b driveoffset 1048841b plexoffset 1572864b\n" "sd name bigraid.p0.s0 drive a plex bigraid.p0 state initializing len 4194304b driveoff set 1573129b plexoffset 0b\n" "sd name bigraid.p0.s1 drive b plex bigraid.p0 state initializing len 4194304b driveoff set 1573129b plexoffset 4194304b\n" "sd name bigraid.p0.s2 drive c plex bigraid.p0 state initializing len 4194304b driveoff set 1573129b plexoffset 8388608b\n" "sd name bigraid.p0.s3 drive d plex bigraid.p0 state initializing len 4194304b driveoff set 1573129b plexoffset 12582912b\n" "sd name bigraid.p0.s4 drive e plex bigraid.p0 state initializing len 4194304b driveoff set 1573129b plexoffset 16777216b\n" msgstr "" "volume myvol state up\n" "volume bigraid state down\n" "plex name myvol.p0 state up org concat vol myvol\n" "plex name myvol.p1 state up org concat vol myvol\n" "plex name myvol.p2 state init org striped 512b vol myvol\n" "plex name bigraid.p0 state initializing org raid5 512b vol bigraid\n" "sd name myvol.p0.s0 drive a plex myvol.p0 state up len 1048576b driveoffset 265b plexoffset 0b\n" "sd name myvol.p0.s1 drive b plex myvol.p0 state up len 1048576b driveoffset 265b plexoffset 1048576b\n" "sd name myvol.p1.s0 drive c plex myvol.p1 state up len 1048576b driveoffset 265b plexoffset 0b\n" "sd name myvol.p1.s1 drive d plex myvol.p1 state up len 1048576b driveoffset 265b plexoffset 1048576b\n" "sd name myvol.p2.s0 drive a plex myvol.p2 state init len 524288b driveoffset 1048841b plexoffset 0b\n" "sd name myvol.p2.s1 drive b plex myvol.p2 state init len 524288b driveoffset 1048841b plexoffset 524288b\n" "sd name myvol.p2.s2 drive c plex myvol.p2 state init len 524288b driveoffset 1048841b plexoffset 1048576b\n" "sd name myvol.p2.s3 drive d plex myvol.p2 state init len 524288b driveoffset 1048841b plexoffset 1572864b\n" "sd name bigraid.p0.s0 drive a plex bigraid.p0 state initializing len 4194304b driveoff set 1573129b plexoffset 0b\n" "sd name bigraid.p0.s1 drive b plex bigraid.p0 state initializing len 4194304b driveoff set 1573129b plexoffset 4194304b\n" "sd name bigraid.p0.s2 drive c plex bigraid.p0 state initializing len 4194304b driveoff set 1573129b plexoffset 8388608b\n" "sd name bigraid.p0.s3 drive d plex bigraid.p0 state initializing len 4194304b driveoff set 1573129b plexoffset 12582912b\n" "sd name bigraid.p0.s4 drive e plex bigraid.p0 state initializing len 4194304b driveoff set 1573129b plexoffset 16777216b\n" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:541 +#: documentation/content/en/articles/vinum/_index.adoc:540 msgid "" "The obvious differences here are the presence of explicit location " "information and naming, both of which are allowed but discouraged, and the " "information on the states. [.filename]#vinum# does not store information " "about drives in the configuration information. It finds the drives by " "scanning the configured disk drives for partitions with a [.filename]#vinum# " "label. This enables [.filename]#vinum# to identify drives correctly even if " "they have been assigned different UNIX(R) drive IDs." msgstr "" "Очевидные различия здесь — наличие явной информации о местоположении и " "именования, что разрешено, но не рекомендуется, а также информация о " "состояниях. [.filename]#vinum# не хранит сведения о дисках в " "конфигурационной информации. Он находит диски, сканируя настроенные дисковые " "накопители на наличие разделов с меткой [.filename]#vinum#. Это позволяет [." "filename]#vinum# корректно идентифицировать диски, даже если им были " "присвоены разные идентификаторы дисков UNIX(R)." #. type: Title ==== -#: documentation/content/en/articles/vinum/_index.adoc:543 +#: documentation/content/en/articles/vinum/_index.adoc:542 #, no-wrap msgid "Automatic Startup" msgstr "Автоматический запуск" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:547 +#: documentation/content/en/articles/vinum/_index.adoc:546 msgid "" "_Gvinum_ always features an automatic startup once the kernel module is " "loaded, via man:loader.conf[5]. To load the _Gvinum_ module at boot time, " "add `geom_vinum_load=\"YES\"` to [.filename]#/boot/loader.conf#." msgstr "" "_Gvinum_ всегда запускается автоматически после загрузки модуля ядра через " "man:loader.conf[5]. Чтобы загрузить модуль _Gvinum_ при загрузке системы, " "добавьте `geom_vinum_load=\"YES\"` в [.filename]#/boot/loader.conf#." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:552 +#: documentation/content/en/articles/vinum/_index.adoc:551 msgid "" "When [.filename]#vinum# is started with `gvinum start`, [.filename]#vinum# " "reads the configuration database from one of the [.filename]#vinum# drives. " "Under normal circumstances, each drive contains an identical copy of the " "configuration database, so it does not matter which drive is read. After a " "crash, however, [.filename]#vinum# must determine which drive was updated " "most recently and read the configuration from this drive. It then updates " "the configuration, if necessary, from progressively older drives." msgstr "" "Когда [.filename]#vinum# запускается командой `gvinum start`, [." "filename]#vinum# читает конфигурационную базу данных с одного из дисков [." "filename]#vinum#. В нормальных условиях каждый диск содержит идентичную " "копию конфигурационной базы данных, поэтому не имеет значения, с какого " "диска читать. Однако после сбоя [.filename]#vinum# должен определить, какой " "диск был обновлён последним, и прочитать конфигурацию с этого диска. Затем, " "если необходимо, он обновляет конфигурацию последовательно с более старых " "дисков." #. type: Title == -#: documentation/content/en/articles/vinum/_index.adoc:554 +#: documentation/content/en/articles/vinum/_index.adoc:553 #, no-wrap msgid "Using [.filename]#vinum# for the Root File System" msgstr "Использование [.filename]#vinum# для корневой файловой системы" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:558 +#: documentation/content/en/articles/vinum/_index.adoc:557 msgid "" "For a machine that has fully-mirrored file systems using [.filename]#vinum#, " "it is desirable to also mirror the root file system. Setting up such a " "configuration is less trivial than mirroring an arbitrary file system " "because:" msgstr "" "Для машины с полностью зеркалированными файловыми системами с использованием " "[.filename]#vinum#, желательно также зеркалировать корневую файловую " "систему. Настройка такой конфигурации менее тривиальна, чем зеркалирование " "произвольной файловой системы, потому что:" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:560 +#: documentation/content/en/articles/vinum/_index.adoc:559 msgid "" "The root file system must be available very early during the boot process, " "so the [.filename]#vinum# infrastructure must already be available at this " "time." msgstr "" "Корневая файловая система должна быть доступна очень рано в процессе " "загрузки, поэтому инфраструктура [.filename]#vinum# должна быть уже доступна " "на этом этапе." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:561 +#: documentation/content/en/articles/vinum/_index.adoc:560 msgid "" "The volume containing the root file system also contains the system " "bootstrap and the kernel. These must be read using the host system's native " "utilities, such as the BIOS, which often cannot be taught about the details " "of [.filename]#vinum#." msgstr "" "Том, содержащий корневую файловую систему, также включает системный " "загрузчик и ядро. Они должны быть прочитаны с использованием родных утилит " "хостовой системы, таких как BIOS, который зачастую нельзя обучить работе с " "деталями [.filename]#vinum#." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:563 +#: documentation/content/en/articles/vinum/_index.adoc:562 msgid "" "In the following sections, the term \"root volume\" is generally used to " "describe the [.filename]#vinum# volume that contains the root file system." msgstr "" "В следующих разделах термин \"корневой том\" обычно используется для " "описания тома [.filename]#vinum#, который содержит корневую файловую систему." #. type: Title === -#: documentation/content/en/articles/vinum/_index.adoc:564 +#: documentation/content/en/articles/vinum/_index.adoc:563 #, no-wrap msgid "Starting up [.filename]#vinum# Early Enough for the Root File System" msgstr "Запуск [.filename]#vinum# на раннем этапе для обеспечения доступа к корневой файловой системе" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:568 +#: documentation/content/en/articles/vinum/_index.adoc:567 msgid "" "[.filename]#vinum# must be available early in the system boot as man:" "loader[8] must be able to load the vinum kernel module before starting the " "kernel. This can be accomplished by putting this line in [.filename]#/boot/" "loader.conf#:" msgstr "" "Файл `[.filename]#vinum#` должен быть доступен на раннем этапе загрузки " "системы, так как `man:loader[8]` должен загрузить модуль ядра `vinum` перед " "запуском ядра. Это можно сделать, добавив следующую строку в `[.filename]#/" "boot/loader.conf#`:" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:572 +#: documentation/content/en/articles/vinum/_index.adoc:571 #, no-wrap msgid "geom_vinum_load=\"YES\"\n" msgstr "geom_vinum_load=\"YES\"\n" #. type: Title === -#: documentation/content/en/articles/vinum/_index.adoc:574 +#: documentation/content/en/articles/vinum/_index.adoc:573 #, no-wrap msgid "Making a [.filename]#vinum#-based Root Volume Accessible to the Bootstrap" msgstr "Создание корневого тома на основе [.filename]#vinum#, доступного для загрузчика" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:579 +#: documentation/content/en/articles/vinum/_index.adoc:578 msgid "" "The current FreeBSD bootstrap is only 7.5 KB of code and does not understand " "the internal [.filename]#vinum# structures. This means that it cannot parse " "the [.filename]#vinum# configuration data or figure out the elements of a " "boot volume. Thus, some workarounds are necessary to provide the bootstrap " "code with the illusion of a standard `a` partition that contains the root " "file system." msgstr "" "Текущая загрузочная запись FreeBSD занимает всего 7,5 КБ кода и не понимает " "внутренние структуры [.filename]#vinum#. Это означает, что она не может " "разобрать конфигурационные данные [.filename]#vinum# или определить элементы " "загрузочного тома. Таким образом, необходимы некоторые обходные решения, " "чтобы предоставить загрузочному коду иллюзию стандартного раздела `a`, " "содержащего корневую файловую систему." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:581 +#: documentation/content/en/articles/vinum/_index.adoc:580 msgid "" "For this to be possible, the following requirements must be met for the root " "volume:" msgstr "Для этого должны быть выполнены следующие требования к корневому тому:" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:583 +#: documentation/content/en/articles/vinum/_index.adoc:582 msgid "The root volume must not be a stripe or `RAID`-5." msgstr "Корневой том не должен быть чередующимся или `RAID`-5." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:584 +#: documentation/content/en/articles/vinum/_index.adoc:583 msgid "" "The root volume must not contain more than one concatenated subdisk per plex." msgstr "" "Корневой том не должен содержать более одного объединённого поддиска на " "плекс." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:590 +#: documentation/content/en/articles/vinum/_index.adoc:589 msgid "" "Note that it is desirable and possible to use multiple plexes, each " "containing one replica of the root file system. The bootstrap process will " "only use one replica for finding the bootstrap and all boot files, until the " "kernel mounts the root file system. Each single subdisk within these plexes " "needs its own `a` partition illusion, for the respective device to be " "bootable. It is not strictly needed that each of these faked `a` partitions " "is located at the same offset within its device, compared with other devices " "containing plexes of the root volume. However, it is probably a good idea " "to create the [.filename]#vinum# volumes that way so the resulting mirrored " "devices are symmetric, to avoid confusion." msgstr "" "Обратите внимание, что желательно и возможно использовать несколько плексов, " "каждый из которых содержит одну реплику корневой файловой системы. Процесс " "начальной загрузки будет использовать только одну реплику для поиска " "загрузчика и всех загрузочных файлов, пока ядро не смонтирует корневую " "файловую систему. Каждый отдельный поддиск в этих плексах должен иметь свою " "собственную иллюзию раздела `a`, чтобы соответствующее устройство было " "загрузочным. Не строго необходимо, чтобы каждый из этих фальшивых разделов " "`a` находился на том же смещении внутри своего устройства по сравнению с " "другими устройствами, содержащими плекс корневого тома. Однако, вероятно, " "хорошей идеей будет создавать тома [.filename]#vinum# таким образом, чтобы " "результирующие зеркальные устройства были симметричными, чтобы избежать " "путаницы." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:592 +#: documentation/content/en/articles/vinum/_index.adoc:591 msgid "" "To set up these `a` partitions for each device containing part of the root " "volume, the following is required:" msgstr "" "Для настройки этих разделов `a` на каждом устройстве, содержащем часть " "корневого тома, требуется следующее:" #. type: delimited block = 4 -#: documentation/content/en/articles/vinum/_index.adoc:596 +#: documentation/content/en/articles/vinum/_index.adoc:595 msgid "" "The location, offset from the beginning of the device, and size of this " "device's subdisk that is part of the root volume needs to be examined, using " "the command:" msgstr "" "Местоположение, смещение от начала устройства и размер подобласти этого " "устройства, которая является частью корневого тома, необходимо проверить с " "помощью команды:" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:600 +#: documentation/content/en/articles/vinum/_index.adoc:599 #, no-wrap msgid "# gvinum l -rv root\n" msgstr "# gvinum l -rv root\n" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:604 +#: documentation/content/en/articles/vinum/_index.adoc:603 msgid "" "[.filename]#vinum# offsets and sizes are measured in bytes. They must be " "divided by 512 to obtain the block numbers that are to be used by `bsdlabel`." msgstr "" "Смещения и размеры в [.filename]#vinum# измеряются в байтах. Их необходимо " "разделить на 512, чтобы получить номера блоков, которые будут использоваться " "в `bsdlabel`." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:605 +#: documentation/content/en/articles/vinum/_index.adoc:604 msgid "Run this command for each device that participates in the root volume:" msgstr "" "Выполните эту команду для каждого устройства, участвующего в корневом томе:" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:609 +#: documentation/content/en/articles/vinum/_index.adoc:608 #, no-wrap msgid "# bsdlabel -e devname\n" msgstr "# bsdlabel -e devname\n" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:612 +#: documentation/content/en/articles/vinum/_index.adoc:611 msgid "" "_devname_ must be either the name of the disk, like [.filename]#da0# for " "disks without a slice table, or the name of the slice, like [." "filename]#ad0s1#." msgstr "" "`_devname_` должен быть либо именем диска, например, [.filename]#da0# для " "дисков без таблицы разделов, либо именем раздела, например, [." "filename]#ad0s1#." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:615 +#: documentation/content/en/articles/vinum/_index.adoc:614 msgid "" "If there is already an `a` partition on the device from a pre-[." "filename]#vinum# root file system, it should be renamed to something else so " "that it remains accessible (just in case), but will no longer be used by " "default to bootstrap the system. A currently mounted root file system " "cannot be renamed, so this must be executed either when being booted from a " "\"Fixit\" media, or in a two-step process where, in a mirror, the disk that " "is not been currently booted is manipulated first." msgstr "" "Если на устройстве уже существует раздел `a` из корневой файловой системы до " "[.filename]#vinum#, его следует переименовать во что-то другое, чтобы он " "оставался доступным (на всякий случай), но больше не использовался по " "умолчанию для загрузки системы. Текущий смонтированный корневой файловой " "системы нельзя переименовать, поэтому это должно выполняться либо при " "загрузке с \"Fixit\" носителя, либо в два этапа, когда в зеркале сначала " "обрабатывается диск, с которого в данный момент не загружаются." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:621 +#: documentation/content/en/articles/vinum/_index.adoc:620 msgid "" "The offset of the [.filename]#vinum# partition on this device (if any) must " "be added to the offset of the respective root volume subdisk on this " "device. The resulting value will become the `offset` value for the new `a` " "partition. The `size` value for this partition can be taken verbatim from " "the calculation above. The `fstype` should be `4.2BSD`. The `fsize`, " "`bsize`, and `cpg` values should be chosen to match the actual file system, " "though they are fairly unimportant within this context." msgstr "" "Смещение раздела [.filename]#vinum# на этом устройстве (если есть) должно " "быть добавлено к смещению соответствующего поддиска корневого тома на этом " "устройстве. Полученное значение станет значением `offset` для нового раздела " "`a`. Значение `size` для этого раздела можно взять дословно из приведённых " "выше расчётов. Для `fstype` следует указать `4.2BSD`. Значения `fsize`, " "`bsize` и `cpg` должны быть выбраны в соответствии с реальной файловой " "системой, хотя в данном контексте они не слишком важны." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:624 +#: documentation/content/en/articles/vinum/_index.adoc:623 msgid "" "That way, a new `a` partition will be established that overlaps the [." "filename]#vinum# partition on this device. `bsdlabel` will only allow for " "this overlap if the [.filename]#vinum# partition has properly been marked " "using the `vinum` fstype." msgstr "" "Таким образом, будет создан новый раздел `a`, который перекрывает раздел [." "filename]#vinum# на этом устройстве. `bsdlabel` разрешит это перекрытие " "только в том случае, если раздел [.filename]#vinum# был правильно помечен с " "использованием типа файловой системы `vinum`." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:625 +#: documentation/content/en/articles/vinum/_index.adoc:624 msgid "" "A faked `a` partition now exists on each device that has one replica of the " "root volume. It is highly recommendable to verify the result using a command " "like:" msgstr "" "Поддельный раздел `a` теперь существует на каждом устройстве, имеющем одну " "реплику корневого тома. Настоятельно рекомендуется проверить результат с " "помощью команды, например:" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:629 +#: documentation/content/en/articles/vinum/_index.adoc:628 #, no-wrap msgid "# fsck -n /dev/devnamea\n" msgstr "# fsck -n /dev/devnamea\n" #. type: delimited block = 4 -#: documentation/content/en/articles/vinum/_index.adoc:634 +#: documentation/content/en/articles/vinum/_index.adoc:633 msgid "" "It should be remembered that all files containing control information must " "be relative to the root file system in the [.filename]#vinum# volume which, " "when setting up a new [.filename]#vinum# root volume, might not match the " "root file system that is currently active. So in particular, [.filename]#/" "etc/fstab# and [.filename]#/boot/loader.conf# need to be taken care of." msgstr "" "Следует помнить, что все файлы, содержащие управляющую информацию, должны " "быть относительны к корневой файловой системе в томе [.filename]#vinum#, " "которая при настройке нового корневого тома [.filename]#vinum# может не " "совпадать с текущей активной корневой файловой системой. Поэтому, в " "частности, необходимо позаботиться о [.filename]#/etc/fstab# и [.filename]#/" "boot/loader.conf#." #. type: delimited block = 4 -#: documentation/content/en/articles/vinum/_index.adoc:637 +#: documentation/content/en/articles/vinum/_index.adoc:636 msgid "" "At next reboot, the bootstrap should figure out the appropriate control " "information from the new [.filename]#vinum#-based root file system, and act " "accordingly. At the end of the kernel initialization process, after all " "devices have been announced, the prominent notice that shows the success of " "this setup is a message like:" msgstr "" "При следующей перезагрузке загрузчик должен определить соответствующую " "управляющую информацию из новой корневой файловой системы на основе [." "filename]#vinum# и действовать соответствующим образом. В конце процесса " "инициализации ядра, после объявления всех устройств, явным признаком " "успешного завершения настройки будет сообщение вида:" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:641 +#: documentation/content/en/articles/vinum/_index.adoc:640 #, no-wrap msgid "Mounting root from ufs:/dev/gvinum/root\n" msgstr "Mounting root from ufs:/dev/gvinum/root\n" #. type: Title === -#: documentation/content/en/articles/vinum/_index.adoc:643 +#: documentation/content/en/articles/vinum/_index.adoc:642 #, no-wrap msgid "Example of a [.filename]#vinum#-based Root Setup" msgstr "Пример настройки корневой системы на основе [.filename]#vinum#" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:646 +#: documentation/content/en/articles/vinum/_index.adoc:645 msgid "" "After the [.filename]#vinum# root volume has been set up, the output of " "`gvinum l -rv root` could look like:" msgstr "" "После настройки корневого тома [.filename]#vinum#, вывод команды `gvinum l -" "rv root` может выглядеть следующим образом:" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:655 +#: documentation/content/en/articles/vinum/_index.adoc:654 #, no-wrap msgid "" "...\n" "Subdisk root.p0.s0:\n" "\t\tSize: 125829120 bytes (120 MB)\n" "\t\tState: up\n" "\t\tPlex root.p0 at offset 0 (0 B)\n" "\t\tDrive disk0 (/dev/da0h) at offset 135680 (132 kB)\n" msgstr "" "...\n" "Subdisk root.p0.s0:\n" "\t\tSize: 125829120 bytes (120 MB)\n" "\t\tState: up\n" "\t\tPlex root.p0 at offset 0 (0 B)\n" "\t\tDrive disk0 (/dev/da0h) at offset 135680 (132 kB)\n" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:661 +#: documentation/content/en/articles/vinum/_index.adoc:660 #, no-wrap msgid "" "Subdisk root.p1.s0:\n" "\t\tSize: 125829120 bytes (120 MB)\n" "\t\tState: up\n" "\t\tPlex root.p1 at offset 0 (0 B)\n" "\t\tDrive disk1 (/dev/da1h) at offset 135680 (132 kB)\n" msgstr "" "Subdisk root.p1.s0:\n" "\t\tSize: 125829120 bytes (120 MB)\n" "\t\tState: up\n" "\t\tPlex root.p1 at offset 0 (0 B)\n" "\t\tDrive disk1 (/dev/da1h) at offset 135680 (132 kB)\n" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:667 +#: documentation/content/en/articles/vinum/_index.adoc:666 msgid "" "The values to note are `135680` for the offset, relative to partition [." "filename]#/dev/da0h#. This translates to 265 512-byte disk blocks in " "`bsdlabel`'s terms. Likewise, the size of this root volume is 245760 512-" "byte blocks. [.filename]#/dev/da1h#, containing the second replica of this " "root volume, has a symmetric setup." msgstr "" "Значения, на которые следует обратить внимание: `135680` для смещения, " "относительного к разделу [.filename]#/dev/da0h#. Это соответствует 265 " "блокам диска по 512 байт в терминах `bsdlabel`. Аналогично, размер этого " "корневого тома составляет 245760 блоков по 512 байт. [.filename]#/dev/da1h#, " "содержащий вторую реплику этого корневого тома, имеет симметричную " "конфигурацию." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:669 +#: documentation/content/en/articles/vinum/_index.adoc:668 msgid "The bsdlabel for these devices might look like:" msgstr "Метка bsdlabel для этих устройств может выглядеть следующим образом:" #. type: delimited block . 4 -#: documentation/content/en/articles/vinum/_index.adoc:678 +#: documentation/content/en/articles/vinum/_index.adoc:677 #, no-wrap msgid "" "...\n" "8 partitions:\n" "# size offset fstype [fsize bsize bps/cpg]\n" " a: 245760 281 4.2BSD 2048 16384 0 # (Cyl. 0*- 15*)\n" " c: 71771688 0 unused 0 0 # (Cyl. 0 - 4467*)\n" " h: 71771672 16 vinum # (Cyl. 0*- 4467*)\n" msgstr "" "...\n" "8 partitions:\n" "# size offset fstype [fsize bsize bps/cpg]\n" " a: 245760 281 4.2BSD 2048 16384 0 # (Cyl. 0*- 15*)\n" " c: 71771688 0 unused 0 0 # (Cyl. 0 - 4467*)\n" " h: 71771672 16 vinum # (Cyl. 0*- 4467*)\n" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:684 +#: documentation/content/en/articles/vinum/_index.adoc:683 msgid "" "It can be observed that the `size` parameter for the faked `a` partition " "matches the value outlined above, while the `offset` parameter is the sum of " "the offset within the [.filename]#vinum# partition `h`, and the offset of " "this partition within the device or slice. This is a typical setup that is " -"necessary to avoid the problem described in crossref:vinum[vinum-root-panic, " -"Nothing Boots, the Bootstrap Panics]. The entire `a` partition is " +"necessary to avoid the problem described in crossref:vinum[vinum-root-panic," +"\"Nothing Boots, the Bootstrap Panics\"]. The entire `a` partition is " "completely within the `h` partition containing all the [.filename]#vinum# " "data for this device." msgstr "" "Можно заметить, что параметр `size` для поддельного раздела `a` совпадает с " "указанным выше значением, в то время как параметр `offset` представляет " "собой сумму смещения внутри раздела [.filename]#vinum# `h` и смещения этого " "раздела в устройстве или слайсе. Это стандартная настройка, необходимая для " -"избежания проблемы, описанной в crossref:vinum[vinum-root-panic, Nothing " -"Boots, the Bootstrap Panics]. Весь раздел `a` полностью находится внутри " -"раздела `h`, содержащего все данные [.filename]#vinum# для этого устройства." +"избежания проблемы, описанной в crossref:vinum[vinum-root-panic, \"Ничего не " +"загружается, паника при загрузке\"]. Весь раздел `a` полностью находится " +"внутри раздела `h`, содержащего все данные [.filename]#vinum# для этого " +"устройства." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:686 +#: documentation/content/en/articles/vinum/_index.adoc:685 msgid "" "In the above example, the entire device is dedicated to [.filename]#vinum# " "and there is no leftover pre-[.filename]#vinum# root partition." msgstr "" "В приведённом выше примере все устройство выделено под [.filename]#vinum#, и " "не осталось корневого раздела, существовавшего до [.filename]#vinum#." #. type: Title === -#: documentation/content/en/articles/vinum/_index.adoc:687 +#: documentation/content/en/articles/vinum/_index.adoc:686 #, no-wrap msgid "Troubleshooting" msgstr "Устранение неполадок" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:690 +#: documentation/content/en/articles/vinum/_index.adoc:689 msgid "The following list contains a few known pitfalls and solutions." msgstr "" "Следующий список содержит несколько известных подводных камней и их решения." #. type: Title ==== -#: documentation/content/en/articles/vinum/_index.adoc:691 +#: documentation/content/en/articles/vinum/_index.adoc:690 #, no-wrap msgid "System Bootstrap Loads, but System Does Not Boot" msgstr "Загрузчик системы загружается, но система не запускается" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:695 +#: documentation/content/en/articles/vinum/_index.adoc:694 msgid "" "If for any reason the system does not continue to boot, the bootstrap can be " "interrupted by pressing kbd:[space] at the 10-seconds warning. The loader " "variable `vinum.autostart` can be examined by typing `show` and manipulated " "using `set` or `unset`." msgstr "" "Если по какой-либо причине система не продолжает загрузку, процесс можно " "прервать, нажав kbd:[space] при появлении 10-секундного предупреждения. " "Переменную загрузчика `vinum.autostart` можно проверить, введя команду " "`show`, и изменить с помощью `set` или `unset`." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:697 +#: documentation/content/en/articles/vinum/_index.adoc:696 msgid "" "If the [.filename]#vinum# kernel module was not yet in the list of modules " "to load automatically, type `load geom_vinum`." msgstr "" "Если модуль ядра [.filename]#vinum# ещё не был в списке модулей для " "автоматической загрузки, введите `load geom_vinum`." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:700 +#: documentation/content/en/articles/vinum/_index.adoc:699 msgid "" "When ready, the boot process can be continued by typing `boot -as` which `-" "as` requests the kernel to ask for the root file system to mount (`-a`) and " "make the boot process stop in single-user mode (`-s`), where the root file " "system is mounted read-only. That way, even if only one plex of a multi-" "plex volume has been mounted, no data inconsistency between plexes is being " "risked." msgstr "" "Когда всё готово, процесс загрузки можно продолжить, введя `boot -as`, где `-" "as` указывает ядру запросить корневую файловую систему для монтирования (`-" "a`) и остановить процесс загрузки в однопользовательском режиме (`-s`), при " "этом корневая файловая система монтируется в режиме только для чтения. Таким " "образом, даже если смонтирован только один слой многокомпонентного тома, не " "возникает риска несогласованности данных между слоями." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:706 +#: documentation/content/en/articles/vinum/_index.adoc:705 msgid "" "At the prompt asking for a root file system to mount, any device that " "contains a valid root file system can be entered. If [.filename]#/etc/" "fstab# is set up correctly, the default should be something like `ufs:/dev/" "gvinum/root`. A typical alternate choice would be something like `ufs:da0d` " "which could be a hypothetical partition containing the pre-[." "filename]#vinum# root file system. Care should be taken if one of the alias " "`a` partitions is entered here, that it actually references the subdisks of " "the [.filename]#vinum# root device, because in a mirrored setup, this would " "only mount one piece of a mirrored root device. If this file system is to " "be mounted read-write later on, it is necessary to remove the other plex(es) " "of the [.filename]#vinum# root volume since these plexes would otherwise " "carry inconsistent data." msgstr "" "На запрос о корневой файловой системе для монтирования можно ввести любое " "устройство, содержащее действительную корневую файловую систему. Если [." "filename]#/etc/fstab# настроен правильно, по умолчанию должно быть что-то " "вроде `ufs:/dev/gvinum/root`. Типичным альтернативным выбором может быть что-" "то вроде `ufs:da0d`, что может быть гипотетическим разделом, содержащим " "корневую файловую систему до [.filename]#vinum#. Следует быть осторожным, " "если здесь вводится один из псевдонимов `a` разделов, чтобы он действительно " "ссылался на поддиски устройства [.filename]#vinum# root, потому что в " "зеркальной настройке это приведёт к монтированию только одной части " "зеркального корневого устройства. Если эта файловая система будет позже " "смонтирована в режиме чтения-записи, необходимо удалить другие плексы тома [." "filename]#vinum# root, так как в противном случае эти плексы будут содержать " "несогласованные данные." #. type: Title ==== -#: documentation/content/en/articles/vinum/_index.adoc:707 +#: documentation/content/en/articles/vinum/_index.adoc:706 #, no-wrap msgid "Only Primary Bootstrap Loads" msgstr "Только первичная загрузка Bootstrap" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:712 +#: documentation/content/en/articles/vinum/_index.adoc:711 msgid "" "If [.filename]#/boot/loader# fails to load, but the primary bootstrap still " "loads (visible by a single dash in the left column of the screen right after " "the boot process starts), an attempt can be made to interrupt the primary " "bootstrap by pressing kbd:[space]. This will make the bootstrap stop in " "extref:{handbook}boot[stage two, boot-boot1]. An attempt can be made here " "to boot off an alternate partition, like the partition containing the " "previous root file system that has been moved away from `a`." msgstr "" "Если [.filename]#/boot/loader# не загружается, но первичная загрузка всё ещё " "работает (это видно по одному дефису в левой части экрана сразу после начала " -"процесса загрузки), можно попытаться прервать первичную загрузку, нажав " -"kbd:[space]. Это остановит загрузку на extref:{handbook}boot[втором этапе, " -"boot-boot1]. Здесь можно попытаться загрузиться с альтернативного раздела, " +"процесса загрузки), можно попытаться прервать первичную загрузку, нажав kbd:" +"[space]. Это остановит загрузку на extref:{handbook}boot[втором этапе, boot-" +"boot1]. Здесь можно попытаться загрузиться с альтернативного раздела, " "например, с раздела, содержащего предыдущую корневую файловую систему, " "которая была перемещена из `a`." #. type: Title ==== -#: documentation/content/en/articles/vinum/_index.adoc:714 +#: documentation/content/en/articles/vinum/_index.adoc:713 #, no-wrap msgid "Nothing Boots, the Bootstrap Panics" msgstr "Ничего не загружается, паника при загрузке" #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:720 +#: documentation/content/en/articles/vinum/_index.adoc:719 msgid "" "This situation will happen if the bootstrap had been destroyed by the [." "filename]#vinum# installation. Unfortunately, [.filename]#vinum# " "accidentally leaves only 4 KB at the beginning of its partition free before " "starting to write its [.filename]#vinum# header information. However, the " "stage one and two bootstraps plus the bsdlabel require 8 KB. So if a [." "filename]#vinum# partition was started at offset 0 within a slice or disk " "that was meant to be bootable, the [.filename]#vinum# setup will trash the " "bootstrap." msgstr "" "Такая ситуация произойдет, если загрузчик был уничтожен при установке [." "filename]#vinum#. К сожалению, [.filename]#vinum# случайно оставляет " "свободными только первые 4 КБ в начале своего раздела перед записью " "заголовочной информации [.filename]#vinum#. Однако, первая и вторая стадии " "загрузчика вместе с bsdlabel требуют 8 КБ. Поэтому, если раздел [." "filename]#vinum# начинается со смещения 0 внутри слайса или диска, который " "должен быть загрузочным, установка [.filename]#vinum# повредит загрузчик." #. type: Plain text -#: documentation/content/en/articles/vinum/_index.adoc:723 +#: documentation/content/en/articles/vinum/_index.adoc:722 msgid "" "Similarly, if the above situation has been recovered, by booting from a " "\"Fixit\" media, and the bootstrap has been re-installed using `bsdlabel -B` " "as described in extref:{handbook}boot[stage two, boot-boot1], the bootstrap " "will trash the [.filename]#vinum# header, and [.filename]#vinum# will no " "longer find its disk(s). Though no actual [.filename]#vinum# configuration " "data or data in [.filename]#vinum# volumes will be trashed, and it would be " "possible to recover all the data by entering exactly the same [." "filename]#vinum# configuration data again, the situation is hard to fix. It " "is necessary to move the entire [.filename]#vinum# partition by at least 4 " "KB, to have the [.filename]#vinum# header and the system bootstrap no longer " "collide." msgstr "" "Аналогично, если описанная выше ситуация была исправлена загрузкой с \"Fixit" "\"-носителя, и загрузчик был переустановлен с помощью `bsdlabel -B`, как " "описано в extref:{handbook}boot[этапе два, boot-boot1], загрузчик повредит " "заголовок [.filename]#vinum#, и [.filename]#vinum# больше не сможет найти " "свои диски. Хотя фактические данные конфигурации [.filename]#vinum# или " "данные в томах [.filename]#vinum# не будут повреждены, и можно восстановить " "все данные, введя точно такую же конфигурацию [.filename]#vinum# снова, " "исправить ситуацию сложно. Необходимо переместить весь раздел [." "filename]#vinum# как минимум на 4 КБ, чтобы заголовок [.filename]#vinum# и " "системный загрузчик больше не конфликтовали." diff --git a/documentation/content/ru/articles/vm-design/_index.adoc b/documentation/content/ru/articles/vm-design/_index.adoc index 733cda53b8..1462ad1dde 100644 --- a/documentation/content/ru/articles/vm-design/_index.adoc +++ b/documentation/content/ru/articles/vm-design/_index.adoc @@ -1,205 +1,205 @@ --- authors: - author: 'Matthew Dillon' email: dillon@apollo.backplane.com description: 'Простое и понятное описание архитектуры системы виртуальной памяти FreeBSD' tags: ["Design", "virtual machine", "FreeBSD"] title: 'Элементы архитектуры системы виртуальной памяти во FreeBSD' trademarks: ["freebsd", "linux", "microsoft", "opengroup", "daemon-news", "general"] --- = Элементы архитектуры системы виртуальной памяти во FreeBSD :doctype: article :toc: macro :toclevels: 1 :icons: font :sectnums: :source-highlighter: rouge :experimental: :images-path: articles/vm-design/ ifdef::env-beastie[] ifdef::backend-html5[] include::shared/authors.adoc[] include::shared/mirrors.adoc[] include::shared/releases.adoc[] include::shared/attributes/attributes-{{% lang %}}.adoc[] include::shared/{{% lang %}}/teams.adoc[] include::shared/{{% lang %}}/mailing-lists.adoc[] include::shared/{{% lang %}}/urls.adoc[] :imagesdir: ../../../images/{images-path} endif::[] ifdef::backend-pdf,backend-epub3[] include::../../../../shared/asciidoctor.adoc[] endif::[] endif::[] ifndef::env-beastie[] include::../../../../../shared/asciidoctor.adoc[] endif::[] [NOTE] ==== Этот документ устарел, и некоторые разделы больше не соответствуют текущему состоянию системы виртуальной памяти. Он сохранён в исторических целях и может быть обновлён в будущем. ==== [.abstract-title] Аннотация Matthew Dillon Это название — просто замысловатый способ сказать, что я попытаюсь описать всю систему виртуальной памяти (VM) целиком, по возможности так, чтобы это было понятно каждому.В течение последнего года я сосредоточился на нескольких основных подсистемах ядра FreeBSD. Наиболее интересными из них стали подсистемы VM и подкачки (Swap), тогда как работа с NFS оказалась, скорее, «необходимой рутиной». Я переписал лишь небольшие части кода. В области VM моей единственной крупной переработкой стала подсистема подкачки. В основном моя работа заключалась в очистке и поддержке кода, с умеренными правками и без серьёзных изменений алгоритмов в подсистеме VM. Теоретическая основа VM-подсистемы осталась неизменной, и львиная доля заслуг в её модернизации за последние годы принадлежит Джону Дайсону и Дэвиду Гринману. Я не историк, в отличие от Кирка, поэтому не стану приписывать различные функции конкретным людям — всё равно где-нибудь ошибусь. ''' 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-система не может больше освобождать эту страницу, так как впоследствии её невозможно будет восстановить. Вы тут же заметите, что то, что сначала было простым отображением файла в память, становится гораздо более сложным предметом. Данные могут модифицироваться постранично, когда как отображение файла выполняется для многих страниц за раз. Сложность ещё более увеличивается, когда процесс выполняет вызов fork. При этом порождаются два процесса, и каждый с собственным адресным пространством, включающим все изменения, выполненные исходным процессом до вызова функции `fork()`. Было бы глупо для VM-системы делать полную копию данных во время вызова `fork()`, так как весьма вероятно, что один из двух процессов будет нужен только для чтения из той страницы, что позволяет использование исходной страницы. То, что было страницей, принадлежащей только процессу, снова становится страницей, копируемой при записи, поскольку каждый из процессов (родительский и дочерний) рассчитывает на то, что его собственные изменения после вызова fork() останутся приватными и не повлияют на другой процесс. FreeBSD управляет всем этим при помощи многоуровневой модели VM-объектов. Исходный файл с двоичной программой переносится на самый нижний уровень объектов VM. Уровень страниц, копируемых при записи, находится выше него, и хранит те страницы, которые были скопированы из исходного файла. Если программа изменяет страницу данных, принадлежащую исходному файлу, подсистема виртуальной памяти обрабатывает страничное нарушение (page fault) и создаёт копию этой страницы на вышележащем уровне. Когда процесс разветвляется, добавляются новые уровни 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. В нашем последнем примере, если и родитель, и потомок изменяют одну и ту же страницу, они оба получают собственные копии, а исходная страница на уровне **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`, то заметите, что она всегда выдаёт некоторое количество ошибок доступа к страницам, даже когда вы запускаете её снова и снова. Эти ошибки относятся к типу zero-fill и не связаны с доступом к коду программы (который уже был предварительно отображён). Предварительное копирование страниц при выполнении вызовов exec или fork находятся в области, требующей более тщательного изучения. Большой процент страничных нарушений относится к страничным нарушениям при заполнении нулями. Вы можете обычно видеть это, просматривая вывод команды `vmstat -s`. Это происходит, когда процесс обращается к страницам в своей области BSS. Область BSS предполагается изначально заполненной нулями, но VM-система не заботится о выделении памяти до тех пор, пока процесс реально к ней не обратится. При страничном нарушении VM-система должна не только выделить новую страницу, но и заполнить её нулями. Для оптимизации операции по заполнению нулями в системе VM имеется возможность предварительно обнулять страницы и помечать их, и запрашивать уже обнуленные страницы при возникновении страничных нарушений заполнения нулями. Предварительное заполнение нулями происходит, когда CPU простаивает, однако количество страниц, которые система заранее заполняет нулями, ограничено, для того, чтобы не переполнить кэши памяти. Это прекрасный пример добавления сложности в VM-систему ради оптимизации критического пути. [[page-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, с другой стороны, выглядит хуже в случае, когда много процессов частично используют одну и ту же динамическую библиотеку, а также работает неоптимально при попытке определить, может ли страница повторно использоваться, или нет. [[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 не будет очень сильно стараться над отделением грязных страниц (неактивная очередь) от чистых страниц (очередь кэша), когда система не находится под нагрузкой, и не будет деактивировать страницы (активная очередь -> неактивная очередь), когда система не нагружена, даже если они не используются. === В примере с man:ls(1) и `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 есть алгоритмическое преимущество, заключающееся в способности сбрасывать таблицы страниц с очень малыми накладными расходами. diff --git a/documentation/content/ru/articles/vm-design/_index.po b/documentation/content/ru/articles/vm-design/_index.po index 87686da716..774b09e739 100644 --- a/documentation/content/ru/articles/vm-design/_index.po +++ b/documentation/content/ru/articles/vm-design/_index.po @@ -1,1382 +1,1365 @@ # SOME DESCRIPTIVE TITLE # Copyright (C) YEAR The FreeBSD Project # This file is distributed under the same license as the FreeBSD Documentation package. # Vladlen Popolitov , 2025, 2026. msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-06-29 21:20+0100\n" -"PO-Revision-Date: 2026-04-05 04:45+0000\n" +"POT-Creation-Date: 2026-08-06 22:55+0100\n" +"PO-Revision-Date: 2026-05-18 04:45+0000\n" "Last-Translator: Vladlen Popolitov \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 4.17\n" #. type: YAML Front Matter: description #: documentation/content/en/articles/vm-design/_index.adoc:1 #, no-wrap msgid "An easy to follow description of the design of the FreeBSD virtual memory system" -msgstr "" -"Простое и понятное описание архитектуры системы виртуальной памяти FreeBSD" +msgstr "Простое и понятное описание архитектуры системы виртуальной памяти FreeBSD" #. type: Title = #: documentation/content/en/articles/vm-design/_index.adoc:1 #: documentation/content/en/articles/vm-design/_index.adoc:11 #, no-wrap msgid "Design elements of the FreeBSD VM system" msgstr "Элементы архитектуры системы виртуальной памяти во FreeBSD" #. type: delimited block = 4 -#: documentation/content/en/articles/vm-design/_index.adoc:46 +#: documentation/content/en/articles/vm-design/_index.adoc:45 msgid "" "This document is outdated and some sections do not accurately describe the " "current state of the VM system. It is retained for historical purposes and " "may be updated over time." msgstr "" "Этот документ устарел, и некоторые разделы больше не соответствуют текущему " "состоянию системы виртуальной памяти. Он сохранён в исторических целях и " "может быть обновлён в будущем." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:50 +#: documentation/content/en/articles/vm-design/_index.adoc:49 msgid "Abstract" msgstr "Аннотация" #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:52 +#: documentation/content/en/articles/vm-design/_index.adoc:51 msgid "Matthew Dillon " msgstr "Matthew Dillon " #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:59 +#: documentation/content/en/articles/vm-design/_index.adoc:58 msgid "" "The title is really just a fancy way of saying that I am going to attempt to " "describe the whole VM enchilada, hopefully in a way that everyone can " "follow. For the last year I have concentrated on a number of major kernel " "subsystems within FreeBSD, with the VM and Swap subsystems being the most " "interesting and NFS being \"a necessary chore\". I rewrote only small " "portions of the code. In the VM arena the only major rewrite I have done is " "to the swap subsystem. Most of my work was cleanup and maintenance, with " "only moderate code rewriting and no major algorithmic adjustments within the " "VM subsystem. The bulk of the VM subsystem's theoretical base remains " "unchanged and a lot of the credit for the modernization effort in the last " "few years belongs to John Dyson and David Greenman. Not being a historian " "like Kirk I will not attempt to tag all the various features with peoples " "names, since I will invariably get it wrong." msgstr "" "Это название — просто замысловатый способ сказать, что я попытаюсь описать " "всю систему виртуальной памяти (VM) целиком, по возможности так, чтобы это " "было понятно каждому.В течение последнего года я сосредоточился на " "нескольких основных подсистемах ядра FreeBSD. Наиболее интересными из них " "стали подсистемы VM и подкачки (Swap), тогда как работа с NFS оказалась, " "скорее, «необходимой рутиной». Я переписал лишь небольшие части кода. В " "области VM моей единственной крупной переработкой стала подсистема подкачки. " "В основном моя работа заключалась в очистке и поддержке кода, с умеренными " "правками и без серьёзных изменений алгоритмов в подсистеме VM. Теоретическая " "основа VM-подсистемы осталась неизменной, и львиная доля заслуг в её " "модернизации за последние годы принадлежит Джону Дайсону и Дэвиду Гринману. " "Я не историк, в отличие от Кирка, поэтому не стану приписывать различные " "функции конкретным людям — всё равно где-нибудь ошибусь." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:61 +#: documentation/content/en/articles/vm-design/_index.adoc:60 msgid "'''" msgstr "'''" #. type: Title == -#: documentation/content/en/articles/vm-design/_index.adoc:65 +#: documentation/content/en/articles/vm-design/_index.adoc:64 #, no-wrap msgid "Introduction" msgstr "Введение" #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:81 +#: documentation/content/en/articles/vm-design/_index.adoc:80 msgid "" "Before moving along to the actual design let's spend a little time on the " "necessity of maintaining and modernizing any long-living codebase. In the " "programming world, algorithms tend to be more important than code and it is " "precisely due to BSD's academic roots that a great deal of attention was " "paid to algorithm design from the beginning. More attention paid to the " "design generally leads to a clean and flexible codebase that can be fairly " "easily modified, extended, or replaced over time. While BSD is considered " "an \"old\" operating system by some people, those of us who work on it tend " "to view it more as a \"mature\" codebase which has various components " "modified, extended, or replaced with modern code. It has evolved, and " "FreeBSD is at the bleeding edge no matter how old some of the code might " "be. This is an important distinction to make and one that is unfortunately " "lost to many people. The biggest error a programmer can make is to not " "learn from history, and this is precisely the error that many other modern " "operating systems have made. Windows NT(R) is the best example of this, and " "the consequences have been dire. Linux also makes this mistake to some " "degree-enough that we BSD folk can make small jokes about it every once in a " "while, anyway. Linux's problem is simply one of a lack of experience and " "history to compare ideas against, a problem that is easily and rapidly being " "addressed by the Linux community in the same way it has been addressed in " "the BSD community-by continuous code development. The Windows NT(R) folk, " "on the other hand, repeatedly make the same mistakes solved by UNIX(R) " "decades ago and then spend years fixing them. Over and over again. They " "have a severe case of \"not designed here\" and \"we are always right " "because our marketing department says so\". I have little tolerance for " "anyone who cannot learn from history." msgstr "" "Перед тем, как перейти непосредственно к существующей архитектуре, потратим " "немного времени на рассмотрение вопроса о необходимости поддержки и " "модернизации любого длительно живущего кода. В мире программирования " "алгоритмы становятся более важными, чем код, и именно из-за академических " "корней BSD изначально большое внимание уделялось проработке алгоритмов. " "Более тщательное внимание к проектированию в целом приводит к созданию " "чистой и гибкой кодовой базы, которую со временем можно достаточно легко " -"модифицировать, расширять или заменять. Хотя некоторые считают BSD \"старой\"" -" операционной системой, те их нас, кто работает над ней, видят её скорее " +"модифицировать, расширять или заменять. Хотя некоторые считают BSD \"старой" +"\" операционной системой, те их нас, кто работает над ней, видят её скорее " "системой со \"зрелым\" кодом с различными компонентами, которые были " "заменены, расширены или изменены современным кодом. Он развивается, и " "FreeBSD остаётся передовой системой, вне зависимости от того, насколько " "старой может быть часть кода. Это важное отличие, которое, к сожалению, не " "всеми понимается. Самой большой ошибкой, которую может допустить " "программист, является игнорирование истории, и это именно та ошибка, которую " "сделали многие другие современные операционные системы. Самым ярким примером " "здесь является Windows NT(R), и последствия ужасны. Linux также в некоторой " "степени совершил эту ошибку — достаточно, чтобы мы, люди BSD, по крайней " "мере по разу отпустили по этому поводу шутку. Проблема Linux заключается " "просто в отсутствии опыта и истории для сравнения идей, проблема, которая " "легко и быстро решается сообществом Linux точно так же, как она решается в " "сообществе BSD — постоянной работой над кодом. Разработчики Windows NT(R), с " "другой стороны, постоянно совершают те же самые ошибки, что были решены в " "UNIX(R) десятки лет назад, а затем тратят годы на их устранение. Снова и " "снова. У них тяжёлый случай синдрома „не нами разработано“ и „мы всегда " "правы, потому что так говорит наш отдел маркетинга“. Я плохо переношу тех, " "кого не учит история." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:86 +#: documentation/content/en/articles/vm-design/_index.adoc:85 msgid "" "Much of the apparent complexity of the FreeBSD design, especially in the VM/" "Swap subsystem, is a direct result of having to solve serious performance " "issues that occur under various conditions. These issues are not due to bad " "algorithmic design but instead rise from environmental factors. In any " "direct comparison between platforms, these issues become most apparent when " "system resources begin to get stressed. As I describe FreeBSD's VM/Swap " "subsystem the reader should always keep two points in mind:" msgstr "" "Большинство очевидной сложности архитектуры FreeBSD, особенно в подсистеме " "VM/Swap, является прямым следствием того, что она решает серьезные проблемы " "с производительностью, которые проявляются при различных условиях. Эти " "проблемы вызваны не плохой проработкой алгоритмов, а возникают из окружающих " "факторов. В любом прямом сравнении между платформами эти проблемы " "проявляются, когда системные ресурсы начинают истощаться. Так как я описываю " "подсистему VM/Swap во FreeBSD, то читатель должен всегда иметь в виду два " "обстоятельства:" #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:88 +#: documentation/content/en/articles/vm-design/_index.adoc:87 msgid "" "The most important aspect of performance design is what is known as " "\"Optimizing the Critical Path\". It is often the case that performance " "optimizations add a little bloat to the code to make the critical path " "perform better." msgstr "" "Самым важным аспектом при проектировании производительности является то, что " "называется \"оптимизацией критического маршрута\". Часто случается, что " "оптимизация производительности даёт прирост объёма кода ради того, чтобы " "критический маршрут работал быстрее." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:89 +#: documentation/content/en/articles/vm-design/_index.adoc:88 msgid "" "A solid, generalized design outperforms a heavily-optimized design over the " "long run. While a generalized design may end up being slower than an heavily-" "optimized design when they are first implemented, the generalized design " "tends to be easier to adapt to changing conditions and the heavily-optimized " "design winds up having to be thrown away." msgstr "" -"Четкость общей архитектуры оказывается лучше сильно оптимизированной " +"Чёткость общей архитектуры оказывается лучше сильно оптимизированной " "архитектуры с течением времени. Когда как обобщенная архитектура может быть " "медленнее, чем оптимизированная архитектура, при первой реализации, при " "обобщенной архитектуре легче подстраиваться под изменяющиеся условия и " "чрезмерно оптимизированная архитектура оказывается непригодной." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:93 +#: documentation/content/en/articles/vm-design/_index.adoc:92 msgid "" "Any codebase that will survive and be maintainable for years must therefore " "be designed properly from the beginning even if it costs some performance. " "Twenty years ago people were still arguing that programming in assembly was " "better than programming in a high-level language because it produced code " "that was ten times as fast. Today, the fallibility of that argument is " "obvious - as are the parallels to algorithmic design and code generalization." msgstr "" "Любой код, который должен выжить и поддаваться поддержке годы, должен " "поэтому быть тщательно продуман с самого начала, даже если это стоит потери " "производительности. Двадцать лет назад были те, кто отстаивал преимущество " "программирования на языке ассемблера перед программированием на языке " "высокого уровня, потому что первый генерировал в десять раз более быстрый " "код. В наши дни ошибочность этого аргумента очевидна - можно провести " "параллели с построением алгоритмов и обобщением кода." #. type: Title == -#: documentation/content/en/articles/vm-design/_index.adoc:95 +#: documentation/content/en/articles/vm-design/_index.adoc:94 #, no-wrap msgid "VM Objects" msgstr "Объекты VM" #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:105 +#: documentation/content/en/articles/vm-design/_index.adoc:104 msgid "" "The best way to begin describing the FreeBSD VM system is to look at it from " "the perspective of a user-level process. Each user process sees a single, " "private, contiguous VM address space containing several types of memory " "objects. These objects have various characteristics. Program code and " "program data are effectively a single memory-mapped file (the binary file " "being run), but program code is read-only while program data is copy-on-" "write. Program BSS is just memory allocated and filled with zeros on " "demand, called demand zero page fill. Arbitrary files can be memory-mapped " "into the address space as well, which is how the shared library mechanism " "works. Such mappings can require modifications to remain private to the " "process making them. The fork system call adds an entirely new dimension to " "the VM management problem on top of the complexity already given." msgstr "" "Лучше всего начать описание VM-системы FreeBSD с попытки взглянуть на неё с " "точки зрения пользовательского процесса. Каждый пользовательский процесс " "имеет единое, принадлежащее только ему и неразрывное адресное пространство " "VM, содержащее несколько типов объектов памяти. Эти объекты имеют различные " "характеристики. Код программы и её данные являются единым файлом, " "отображаемым в память (это выполняющийся двоичный файл), однако код " "программы доступен только для чтения, тогда как данные программы размещаются " "в режиме копирования-при-записи. BSS программы представляет собой всего лишь " "выделенную область памяти, заполненную, если это требовалось, нулями, что " "называется обнулением страниц памяти по требованию. Отдельные файлы могут " "также отображаться в адресное пространство, именно так работают динамические " "библиотеки. Такие отображения требуют изменений, чтобы оставаться " "принадлежащими процессу, который их выполнил. Системный вызов fork переводит " "проблему управления VM полностью в новую плоскость, вдобавок к уже имеющимся " "сложностям." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:111 +#: documentation/content/en/articles/vm-design/_index.adoc:110 msgid "" "A program binary data page (which is a basic copy-on-write page) illustrates " "the complexity. A program binary contains a preinitialized data section " "which is initially mapped directly from the program file. When a program is " "loaded into a process's VM space, this area is initially memory-mapped and " "backed by the program binary itself, allowing the VM system to free/reuse " "the page and later load it back in from the binary. The moment a process " "modifies this data, however, the VM system must make a private copy of the " "page for that process. Since the private copy has been modified, the VM " "system may no longer free it, because there is no longer any way to restore " "it later on." msgstr "" "Иллюстрирует сложность страница данных двоичной программы (которая является " "страницей копируемой-при-записи). Двоичная программа содержит секцию " "предварительно инициализированных данных, которая первоначально отображается " "непосредственно из файла программы. Когда программа загружается в " "виртуальную память процесса, эта область сначала отображается в память и " "поддерживается бинарным файлом программы, позволяя VM-системе освобождать/" "повторно использовать страницу, а потом загружать её снова из бинарного " "файла. Однако в момент, когда процесс изменяет эти данные, VM-система должна " "сделать копию страницы, принадлежащую только этому процессу. Так как эта " "копия была изменена, то VM-система не может больше освобождать эту страницу, " "так как впоследствии её невозможно будет восстановить." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:118 +#: documentation/content/en/articles/vm-design/_index.adoc:117 msgid "" "You will notice immediately that what was originally a simple file mapping " "has become much more complex. Data may be modified on a page-by-page basis " "whereas the file mapping encompasses many pages at once. The complexity " "further increases when a process forks. When a process forks, the result is " "two processes-each with their own private address spaces, including any " "modifications made by the original process prior to the call to `fork()`. " "It would be silly for the VM system to make a complete copy of the data at " "the time of the `fork()` because it is quite possible that at least one of " "the two processes will only need to read from that page from then on, " "allowing the original page to continue to be used. What was a private page " "is made copy-on-write again, since each process (parent and child) expects " "their own personal post-fork modifications to remain private to themselves " "and not affect the other." msgstr "" "Вы тут же заметите, что то, что сначала было простым отображением файла в " "память, становится гораздо более сложным предметом. Данные могут " "модифицироваться постранично, когда как отображение файла выполняется для " "многих страниц за раз. Сложность ещё более увеличивается, когда процесс " "выполняет вызов fork. При этом порождаются два процесса, и каждый с " "собственным адресным пространством, включающим все изменения, выполненные " "исходным процессом до вызова функции `fork()`. Было бы глупо для VM-системы " "делать полную копию данных во время вызова `fork()`, так как весьма " "вероятно, что один из двух процессов будет нужен только для чтения из той " "страницы, что позволяет использование исходной страницы. То, что было " "страницей, принадлежащей только процессу, снова становится страницей, " "копируемой при записи, поскольку каждый из процессов (родительский и " "дочерний) рассчитывает на то, что его собственные изменения после вызова " "fork() останутся приватными и не повлияют на другой процесс." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:127 +#: documentation/content/en/articles/vm-design/_index.adoc:126 msgid "" "FreeBSD manages all of this with a layered VM Object model. The original " "binary program file winds up being the lowest VM Object layer. A copy-on-" "write layer is pushed on top of that to hold those pages which had to be " "copied from the original file. If the program modifies a data page " "belonging to the original file the VM system takes a fault and makes a copy " "of the page in the higher layer. When a process forks, additional VM Object " "layers are pushed on. This might make a little more sense with a fairly " "basic example. A `fork()` is a common operation for any *BSD system, so " "this example will consider a program that starts up, and forks. When the " "process starts, the VM system creates an object layer, let's call this A:" msgstr "" "FreeBSD управляет всем этим при помощи многоуровневой модели VM-объектов. " "Исходный файл с двоичной программой переносится на самый нижний уровень " "объектов VM. Уровень страниц, копируемых при записи, находится выше него, и " "хранит те страницы, которые были скопированы из исходного файла. Если " "программа изменяет страницу данных, принадлежащую исходному файлу, " "подсистема виртуальной памяти обрабатывает страничное нарушение (page fault) " "и создаёт копию этой страницы на вышележащем уровне. Когда процесс " "разветвляется, добавляются новые уровни VM-объектов. Понять это поможет " "достаточно простой пример. Функция `fork()` является общей операцией для " "всех систем *BSD, так что в этом примере будет рассматриваться программа, " "которая запускается, а затем разветвляется. Когда процесс запускается, VM-" "система создаёт некоторый уровень объектов, обозначим его **A**:" #. type: Positional ($1) AttributeList argument for macro 'image' -#: documentation/content/en/articles/vm-design/_index.adoc:128 +#: documentation/content/en/articles/vm-design/_index.adoc:127 #, no-wrap msgid "A picture" msgstr "Рисунок" #. type: Target for macro image -#: documentation/content/en/articles/vm-design/_index.adoc:128 +#: documentation/content/en/articles/vm-design/_index.adoc:127 #, no-wrap msgid "fig1.png" msgstr "fig1.png" #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:133 +#: documentation/content/en/articles/vm-design/_index.adoc:132 msgid "" "A represents the file-pages may be paged in and out of the file's physical " "media as necessary. Paging in from the disk is reasonable for a program, " "but we really do not want to page back out and overwrite the executable. " "The VM system therefore creates a second layer, B, that will be physically " "backed by swap space:" msgstr "" "На рисунке *A* соответствует файлу — по необходимости страницы памяти могут " "высвобождаться и подгружаться с носителя файла. Подгрузка с диска может " "потребоваться программе, однако на самом деле мы не хотим, чтобы она " -"записывалась обратно в файл. Поэтому VM-система создаёт второй уровень, **B**" -", который физически поддерживается дисковым пространством подкачки:" +"записывалась обратно в файл. Поэтому VM-система создаёт второй уровень, " +"**B**, который физически поддерживается дисковым пространством подкачки:" #. type: Target for macro image -#: documentation/content/en/articles/vm-design/_index.adoc:134 +#: documentation/content/en/articles/vm-design/_index.adoc:133 #, no-wrap msgid "fig2.png" msgstr "fig2.png" #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:139 +#: documentation/content/en/articles/vm-design/_index.adoc:138 msgid "" "On the first write to a page after this, a new page is created in B, and its " "contents are initialized from A. All pages in B can be paged in or out to a " "swap device. When the program forks, the VM system creates two new object " "layers-C1 for the parent, and C2 for the child-that rest on top of B:" msgstr "" "При первой записи в страницу после выполнения этой операции в **B** " "создаётся новая страница, содержимое которой берётся из **A**. Все страницы " "в **B** могут сбрасываться и считываться из устройства подкачки. Когда " "программа ветвится, VM-система создаёт два новых уровня объектов — **C1** " "для порождающего процесса и **C2** для порождённого — они располагаются " "поверх **B**:" #. type: Target for macro image -#: documentation/content/en/articles/vm-design/_index.adoc:140 +#: documentation/content/en/articles/vm-design/_index.adoc:139 #, no-wrap msgid "fig3.png" msgstr "fig3.png" #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:151 +#: documentation/content/en/articles/vm-design/_index.adoc:150 msgid "" "In this case, let's say a page in B is modified by the original parent " "process. The process will take a copy-on-write fault and duplicate the page " "in C1, leaving the original page in B untouched. Now, let's say the same " "page in B is modified by the child process. The process will take a copy-on-" "write fault and duplicate the page in C2. The original page in B is now " "completely hidden since both C1 and C2 have a copy and B could theoretically " "be destroyed if it does not represent a \"real\" file; however, this sort of " "optimization is not trivial to make because it is so fine-grained. FreeBSD " "does not make this optimization. Now, suppose (as is often the case) that " "the child process does an `exec()`. Its current address space is usually " "replaced by a new address space representing a new file. In this case, the " "C2 layer is destroyed:" msgstr "" "В этом случае, допустим, что страница в **B** была изменена начальным " "родительским процессом. Процесс вызовет страничное нарушение копирования-при-" "записи и продублирует страницу в **C1**, при этом исходная страница " "останется в **B** нетронутой. Теперь допустим, что та же самая страница в " "**B** изменяется дочерним процессом. В процессе возникнет ситуация " "копирования при записи и страница скопируется в **C2**. Исходная страница в " "**B** теперь полностью скрыта, так как и **C1**, и **C2** имеют копии, а " "уровень **B** теоретически может быть уничтожен, если он не представляет " "собой \"реального\" файла). Однако такую оптимизацию не так уж просто " "осуществить, потому что это надо делать на уровне слишком мелких единиц. Во " "FreeBSD такая оптимизация не выполняется. Теперь положим (а это часто " "случается), что дочерний процесс выполняет вызов `exec()`. Его текущее " "адресное пространство обычно заменяется новым адресным пространством, " "представляющим новый файл. В этом случае уровень **C2** уничтожается:" #. type: Target for macro image -#: documentation/content/en/articles/vm-design/_index.adoc:152 +#: documentation/content/en/articles/vm-design/_index.adoc:151 #, no-wrap msgid "fig4.png" msgstr "fig4.png" #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:158 +#: documentation/content/en/articles/vm-design/_index.adoc:157 msgid "" "In this case, the number of children of B drops to one, and all accesses to " "B now go through C1. This means that B and C1 can be collapsed together. " "Any pages in B that also exist in C1 are deleted from B during the " "collapse. Thus, even though the optimization in the previous step could not " "be made, we can recover the dead pages when either of the processes exit or " "`exec()`." msgstr "" "В этом случае количество потомков **B** становится равным одному и все " "обращения к **B** теперь выполняются через **C1**. Это означает, что **B** и " "**C1** могут быть объединены. Все страницы в **B**, которые также существуют " "и в **C1**, во время объединения из** B** удаляются. Таким образом, хотя " "оптимизация на предыдущем шаге может не делаться, мы можем восстановить " "мёртвые страницы при окончании работы процессов или при вызове `exec()`." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:165 +#: documentation/content/en/articles/vm-design/_index.adoc:164 msgid "" "This model creates a number of potential problems. The first is that you " "can wind up with a relatively deep stack of layered VM Objects which can " "cost scanning time and memory when you take a fault. Deep layering can " "occur when processes fork and then fork again (either parent or child). The " "second problem is that you can wind up with dead, inaccessible pages deep in " "the stack of VM Objects. In our last example if both the parent and child " "processes modify the same page, they both get their own private copies of " "the page and the original page in B is no longer accessible by anyone. That " "page in B can be freed." msgstr "" "Такая модель создаёт некоторое количество потенциальных проблем. Во-первых, " "можно получить относительно глубокий стек наслоённых объектов виртуальной " "памяти, что может увеличить время сканирования и расход памяти при обработке " "страничного исключения. Большое количество уровней может возникнуть, когда " "процессы разветвляются, а затем разветвляются ещё раз (как порождённые, так " "и порождающие). Вторая проблема заключается в том, что вы можете столкнуться " "с мёртвыми, недоступными страницами глубоко в иерархии объектов VM. В нашем " "последнем примере, если и родитель, и потомок изменяют одну и ту же " "страницу, они оба получают собственные копии, а исходная страница на уровне " "**B** становится недоступной ни для одного из них. Такая страница в **B** " "может быть высвобождена." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:176 +#: documentation/content/en/articles/vm-design/_index.adoc:175 msgid "" "FreeBSD solves the deep layering problem with a special optimization called " "the \"All Shadowed Case\". This case occurs if either C1 or C2 take " "sufficient COW faults to completely shadow all pages in B. Lets say that C1 " "achieves this. C1 can now bypass B entirely, so rather then have C1->B->A " "and C2->B->A we now have C1->A and C2->B->A. But look what also happened-" "now B has only one reference (C2), so we can collapse B and C2 together. " "The end result is that B is deleted entirely and we have C1->A and C2->A. " "It is often the case that B will contain a large number of pages and neither " "C1 nor C2 will be able to completely overshadow it. If we fork again and " "create a set of D layers, however, it is much more likely that one of the D " "layers will eventually be able to completely overshadow the much smaller " "dataset represented by C1 or C2. The same optimization will work at any " "point in the graph and the grand result of this is that even on a heavily " "forked machine VM Object stacks tend to not get much deeper then 4. This is " "true of both the parent and the children and true whether the parent is " "doing the forking or whether the children cascade forks." msgstr "" "FreeBSD решает проблему с глубиной вложенности с помощью приёма оптимизации, " "который называется \"All Shadowed Case\". Этот случай возникает, если в " "**C1** либо *C2* происходит столько случаев копирования страниц при записи, " "что они полностью перекрывают все страницы в *B*. Допустим, что такое " -"произошло в *C1*. Уровень *C1* может теперь полностью пропускать уровень *B*" -", так что вместо цепочек *C1* -> *B* -> *A* и *C2* -> *B* -> *A* мы теперь " -"имеем цепочки *C1* -> *A* и *C2* -> *B* -> *A*. Но посмотрите, что " +"произошло в *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 не часто бывают глубже четырёх уровней. Это " "верно как для порождающего, так и для порождённого процессов, и остаётся " "справедливым как в случае, когда ветвление выполняет родитель, так и в " "случае, когда ветвление выполняет его потомок." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:180 +#: documentation/content/en/articles/vm-design/_index.adoc:179 msgid "" "The dead page problem still exists in the case where C1 or C2 do not " "completely overshadow B. Due to our other optimizations this case does not " "represent much of a problem and we simply allow the pages to be dead. If " "the system runs low on memory it will swap them out, eating a little swap, " "but that is it." msgstr "" "Проблема с мёртвой страницей все ещё имеет место, когда *C1* или *C2* не " "полностью перекрывают *B*. Из-за других применяемых нами методов оптимизации " "этот случай не представляет большой проблемы, и мы просто позволяем таким " "страницам существовать. Если система испытывает нехватку оперативной памяти, " "она выполняет их выгрузку в область подкачки, что занимает некоторое " "пространство в области подкачки, но это всё." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:184 +#: documentation/content/en/articles/vm-design/_index.adoc:183 msgid "" "The advantage to the VM Object model is that `fork()` is extremely fast, " "since no real data copying need take place. The disadvantage is that you " "can build a relatively complex VM Object layering that slows page fault " "handling down a little, and you spend memory managing the VM Object " "structures. The optimizations FreeBSD makes proves to reduce the problems " "enough that they can be ignored, leaving no real disadvantage." msgstr "" "Преимущество модели VM-объектов заключается в очень быстром выполнении " "функции `fork()`, так как при этом не выполняется реального копирования " "данных. Минусом этого подхода является то, что вы можете построить " "сравнительно сложную иерархию объектов VM, которая несколько замедляет " "обработку страничных нарушений, и к тому же тратится память на управление " "структурами объектов VM. Приёмы оптимизации, применяемые во FreeBSD, " "позволяют снизить значимость этих проблем до степени, когда их можно без " "особых потерь игнорировать." #. type: Title == -#: documentation/content/en/articles/vm-design/_index.adoc:186 +#: documentation/content/en/articles/vm-design/_index.adoc:185 #, no-wrap msgid "SWAP Layers" msgstr "Уровни области подкачки" #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:194 +#: documentation/content/en/articles/vm-design/_index.adoc:193 msgid "" "Private data pages are initially either copy-on-write or zero-fill pages. " "When a change, and therefore a copy, is made, the original backing object " "(usually a file) can no longer be used to save a copy of the page when the " "VM system needs to reuse it for other purposes. This is where SWAP comes " "in. SWAP is allocated to create backing store for memory that does not " "otherwise have it. FreeBSD allocates the swap management structure for a VM " "Object only when it is actually needed. However, the swap management " "structure has had problems historically:" msgstr "" "Страницы с собственными данными первоначально являются страницами, " "копируемыми-при-записи или заполняемыми нулями. Когда выполняется изменение, " "и, соответственно, копирование, начальное хранилище объекта (обычно файл) не " "может больше использоваться для хранения копии страницы, когда VM-системе " "нужно использовать её повторно для других целей. В этот момент на помощь " "приходит область подкачки. Область подкачки выделяется для организации " "хранилища памяти, которая иначе не может быть доступна. FreeBSD создаёт " "структуру управления подкачкой для объекта VM, только когда это " "действительно нужно. Однако структура управления подкачкой исторически имела " "некоторые проблемы:" #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:196 +#: documentation/content/en/articles/vm-design/_index.adoc:195 msgid "" "Under FreeBSD 3.X the swap management structure preallocates an array that " "encompasses the entire object requiring swap backing store-even if only a " "few pages of that object are swap-backed. This creates a kernel memory " "fragmentation problem when large objects are mapped, or processes with large " "runsizes (RSS) fork." msgstr "" "В FreeBSD 3.X в структуре управления областью подкачки предварительно " "выделяется массив, который представляет собой целый объект, требующий " "хранения в области подкачки — даже если только несколько страниц этого " "объекта хранятся в области подкачки. Это создаёт проблему фрагментации " "памяти ядра в случае, когда в память отображаются большие объекты или когда " "ветвятся процессы, занимающие большой объём памяти при работе (RSS)." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:197 +#: documentation/content/en/articles/vm-design/_index.adoc:196 msgid "" "Also, to keep track of swap space, a \"list of holes\" is kept in kernel " "memory, and this tends to get severely fragmented as well. Since the \"list " "of holes\" is a linear list, the swap allocation and freeing performance is " "a non-optimal O(n)-per-page." msgstr "" "Также для отслеживания памяти подкачки в памяти ядра поддерживается \"список " "дыр\", и он также несколько фрагментирован. Так как \"список дыр\" является " "последовательным списком, то производительность при распределении и " "высвобождении памяти в области подкачки неоптимальна, и её сложность зависит " "от количества страниц как O(n)." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:198 +#: documentation/content/en/articles/vm-design/_index.adoc:197 msgid "" "It requires kernel memory allocations to take place during the swap freeing " "process, and that creates low memory deadlock problems." msgstr "" "Также в процессе высвобождения памяти из области подкачки требуется " "выделение памяти в ядре, и это приводит к проблемам блокировки при " "недостатке памяти." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:199 +#: documentation/content/en/articles/vm-design/_index.adoc:198 msgid "" "The problem is further exacerbated by holes created due to the interleaving " "algorithm." msgstr "" "Проблема ещё более обостряется из-за дыр, создаваемых по чередующемуся " "алгоритму." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:200 +#: documentation/content/en/articles/vm-design/_index.adoc:199 msgid "" "Also, the swap block map can become fragmented fairly easily resulting in " "non-contiguous allocations." msgstr "" "Кроме того, список распределения блоков в области подкачки легко оказывается " "фрагментированным, что приводит к распределению непоследовательных областей." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:201 +#: documentation/content/en/articles/vm-design/_index.adoc:200 msgid "" "Kernel memory must also be allocated on the fly for additional swap " "management structures when a swapout occurs." msgstr "" "Память ядра также должна выделяться на лету для дополнительных структур " "управления подкачкой при выгрузке страниц в область подкачки." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:204 +#: documentation/content/en/articles/vm-design/_index.adoc:203 msgid "" "It is evident from that list that there was plenty of room for improvement. " "For FreeBSD 4.X, I completely rewrote the swap subsystem:" msgstr "" "Очевидно, что мест для усовершенствований предостаточно. Во FreeBSD 4.X " "подсистема управления областью подкачки была полностью переписана мною:" #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:206 +#: documentation/content/en/articles/vm-design/_index.adoc:205 msgid "" "Swap management structures are allocated through a hash table rather than a " "linear array giving them a fixed allocation size and much finer granularity." msgstr "" "Структуры управления областью подкачки распределяются при помощи хэш-" "таблицы, а не через линейный массив, что даёт им фиксированный размер при " "распределении и работу с гораздо меньшими структурами." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:207 +#: documentation/content/en/articles/vm-design/_index.adoc:206 msgid "" "Rather then using a linearly linked list to keep track of swap space " "reservations, it now uses a bitmap of swap blocks arranged in a radix tree " "structure with free-space hinting in the radix node structures. This " "effectively makes swap allocation and freeing an O(1) operation." msgstr "" "Вместо того, чтобы использовать однонаправленный связный список для " "отслеживания выделения пространства в области подкачки, теперь используется " "побитовая карта блоков области подкачки, выполненная в основном в виде " "древовидной структуры с информацией о свободном пространстве, находящейся в " "узлах структур. Это приводит к тому, что выделение и высвобождение памяти в " "области подкачки становится операцией сложности O(1)." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:208 +#: documentation/content/en/articles/vm-design/_index.adoc:207 msgid "" "The entire radix tree bitmap is also preallocated to avoid having to " "allocate kernel memory during critical low memory swapping operations. After " "all, the system tends to swap when it is low on memory so we should avoid " "allocating kernel memory at such times to avoid potential deadlocks." msgstr "" "Всё дерево также распределяется заранее для того, чтобы избежать " "распределения памяти ядра во время операций с областью подкачки при " "критически малом объёме свободной памяти. В конце концов, система обращается " "к области подкачки при нехватке памяти, так что мы должны избежать " "распределения памяти ядра в такие моменты для избежания потенциальных " "блокировок." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:209 +#: documentation/content/en/articles/vm-design/_index.adoc:208 msgid "" "To reduce fragmentation the radix tree is capable of allocating large " "contiguous chunks at once, skipping over smaller fragmented chunks." msgstr "" "Для уменьшения фрагментации дерево может распределять большой " "последовательный кусок за раз, пропуская меньшие фрагментированные области." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:211 +#: documentation/content/en/articles/vm-design/_index.adoc:210 msgid "" "I did not take the final step of having an \"allocating hint pointer\" that " "would trundle through a portion of swap as allocations were made to further " "guarantee contiguous allocations or at least locality of reference, but I " "ensured that such an addition could be made." msgstr "" "Я не сделал последний шаг к заведению \"указателя на распределение\", " "который будет передвигаться по участку области подкачки при выделении памяти " "для обеспечения в будущем распределения последовательных участков, или по " "крайней мере местоположения ссылки, но я убежден, что это может быть сделано." #. type: Title == -#: documentation/content/en/articles/vm-design/_index.adoc:213 +#: documentation/content/en/articles/vm-design/_index.adoc:212 #, no-wrap msgid "When to free a page" msgstr "Когда освобождать страницу" #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:218 +#: documentation/content/en/articles/vm-design/_index.adoc:217 msgid "" "Since the VM system uses all available memory for disk caching, there are " "usually very few truly-free pages. The VM system depends on being able to " "properly choose pages which are not in use to reuse for new allocations. " "Selecting the optimal pages to free is possibly the single-most important " "function any VM system can perform because if it makes a poor selection, the " "VM system may be forced to unnecessarily retrieve pages from disk, seriously " "degrading system performance." msgstr "" "Так как система VM использует всю доступную память для кэширования диска, то " "обычно действительно незанятых страниц очень мало. Система VM зависит от " "того, как она точно выбирает незанятые страницы для повторного использования " "для новых распределений. Оптимальный выбор страниц для высвобождения, " "возможно, является самой важной функцией любой VM-системы, из тех, что она " "может выполнять, потому что при неправильном выборе система VM вынуждена " "будет запрашивать страницы с диска, значительно снижая производительность " "всей системы." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:221 +#: documentation/content/en/articles/vm-design/_index.adoc:220 msgid "" "How much overhead are we willing to suffer in the critical path to avoid " "freeing the wrong page? Each wrong choice we make will cost us hundreds of " "thousands of CPU cycles and a noticeable stall of the affected processes, so " "we are willing to endure a significant amount of overhead to be sure that " "the right page is chosen. This is why FreeBSD tends to outperform other " "systems when memory resources become stressed." msgstr "" "Какую дополнительную нагрузку мы может выделить в критическом пути для " "избежания высвобождения неверно выбранной страницы? Каждый неправильный " "выбор будет стоить нам сотен тысяч тактов работы центрального процессора и " "заметного замедления работы затронутых процессов, так что мы должны " "смириться со значительными издержками ради того, чтобы была выбрана " "правильная страница. Вот почему FreeBSD превосходит другие системы в " "производительности при нехватке ресурсов памяти." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:224 +#: documentation/content/en/articles/vm-design/_index.adoc:223 msgid "" "The free page determination algorithm is built upon a history of the use of " "memory pages. To acquire this history, the system takes advantage of a page-" "used bit feature that most hardware page tables have." msgstr "" "Алгоритм определения свободной страницы написан на основе истории " "использования страниц памяти. Для получения этой истории система использует " "возможности бита использования памяти, которые имеются в большинстве " "аппаратных таблицах страниц памяти." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:230 +#: documentation/content/en/articles/vm-design/_index.adoc:229 msgid "" "In any case, the page-used bit is cleared and at some later point the VM " "system comes across the page again and sees that the page-used bit has been " "set. This indicates that the page is still being actively used. If the bit " "is still clear it is an indication that the page is not being actively " "used. By testing this bit periodically, a use history (in the form of a " "counter) for the physical page is developed. When the VM system later needs " "to free up some pages, checking this history becomes the cornerstone of " "determining the best candidate page to reuse." msgstr "" "В любом случае, бит использования страницы очищается, и в некоторый более " "поздний момент VM-система обращается к странице снова и обнаруживает, что " "этот бит установлен. Это указывает на то, что страница активно используется. " "Периодически проверяя этот бит, накапливается история использования (в виде " "счетчика) физической страницы. Когда позже VM-системе требуется высвободить " "некоторые страницы, проверка истории выступает указателем при определении " "наиболее вероятной кандидатуры для повторного использования." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:235 +#: documentation/content/en/articles/vm-design/_index.adoc:234 msgid "" "For those platforms that do not have this feature, the system actually " "emulates a page-used bit. It unmaps or protects a page, forcing a page " "fault if the page is accessed again. When the page fault is taken, the " "system simply marks the page as having been used and unprotects the page so " "that it may be used. While taking such page faults just to determine if a " "page is being used appears to be an expensive proposition, it is much less " "expensive than reusing the page for some other purpose only to find that a " "process needs it back and then have to go to disk." msgstr "" "Для тех платформ, что не имеют этой возможности, система эмулирует этот бит. " "Она снимает отображение или защищает страницу, что приводит к страничному " "нарушению, если к странице выполняется повторное обращение. При " "возникновении этого страничного нарушения система просто помечает страницу " "как используемую и снимает защиту со страницы, так что она может " "использоваться. Хотя использование такого приема только для определения " "использования страницы весьма накладно, это выгоднее, чем повторно " "использовать страницу для других целей и обнаружить, что она снова нужна " "процессу и подгружать её с диска." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:245 +#: documentation/content/en/articles/vm-design/_index.adoc:244 msgid "" "FreeBSD makes use of several page queues to further refine the selection of " "pages to reuse as well as to determine when dirty pages must be flushed to " "their backing store. Since page tables are dynamic entities under FreeBSD, " "it costs virtually nothing to unmap a page from the address space of any " "processes using it. When a page candidate has been chosen based on the page-" "use counter, this is precisely what is done. The system must make a " "distinction between clean pages which can theoretically be freed up at any " "time, and dirty pages which must first be written to their backing store " "before being reusable. When a page candidate has been found it is moved to " "the inactive queue if it is dirty, or the cache queue if it is clean. A " "separate algorithm based on the dirty-to-clean page ratio determines when " "dirty pages in the inactive queue must be flushed to disk. Once this is " "accomplished, the flushed pages are moved from the inactive queue to the " "cache queue. At this point, pages in the cache queue can still be " "reactivated by a VM fault at relatively low cost. However, pages in the " "cache queue are considered to be \"immediately freeable\" and will be reused " "in an LRU (least-recently used) fashion when the system needs to allocate " "new memory." msgstr "" "FreeBSD использует несколько очередей страниц для обновления выбора страниц " "для повторного использования, а также для определения того, когда же грязные " "страницы должны быть сброшены в хранилище. Так как таблицы страниц во " "FreeBSD являются динамическими объектами, практически ничего не стоит " "вырезать страницу из адресного пространства любого использующего её " "процесса. После того как подходящая страница на основе счётчика " "использования выбрана, именно это и выполняется. Система должна различать " "чистые страницы, которые теоретически могут быть высвобождены в любое время, " "и грязные страницы, которые сначала должны быть переписаны в хранилище перед " "тем, как их можно будет использовать повторно. После нахождения подходящей " "страницы она перемещается в неактивную очередь, если она является грязной, " "или в очередь кэша, если она чистая. Отдельный алгоритм, основывающийся на " "отношении количества грязных страниц к чистым, определяет, когда грязные " "страницы в неактивной очереди должны быть сброшены на диск. Когда это " "выполнится, сброшенные страницы перемещаются из неактивной очереди в очередь " "кэша. В этот момент страницы в очереди кэша могут быть повторно " "активизированы страничными нарушениями VM со сравнительно малыми накладными " "расходами. Однако страницы в очереди кэша предполагается \"высвобождать " "немедленно\" и повторно использовать в LRU-порядке (наименее давно " "используемый), когда системе потребуется выделение дополнительной памяти." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:249 +#: documentation/content/en/articles/vm-design/_index.adoc:248 msgid "" "It is important to note that the FreeBSD VM system attempts to separate " "clean and dirty pages for the express reason of avoiding unnecessary flushes " "of dirty pages (which eats I/O bandwidth), nor does it move pages between " "the various page queues gratuitously when the memory subsystem is not being " "stressed. This is why you will see some systems with very low cache queue " "counts and high active queue counts when doing a `systat -vm` command. As " "the VM system becomes more stressed, it makes a greater effort to maintain " "the various page queues at the levels determined to be the most effective." msgstr "" "Стоит отметить, что во FreeBSD VM-система пытается разделить чистые и " "грязные страницы во избежание срочной необходимости в ненужных сбросах " "грязных страниц (что отражается на пропускной способности ввода/вывода) и не " "перемещает беспричинно страницы между разными очередями, когда подсистема " "управления памятью не испытывает нехватку ресурсов. Вот почему вы можете " "видеть, что при выполнении команды `systat -vm` в некоторых системах " "значение счетчика очереди кэша мало, а счетчик активной очереди большой. При " "повышении нагрузки на VM-систему она прилагает большие усилия на поддержку " "различных очередей страниц в соотношениях, которые являются наиболее " "эффективными." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:253 +#: documentation/content/en/articles/vm-design/_index.adoc:252 msgid "" "An urban myth has circulated for years that Linux did a better job avoiding " "swapouts than FreeBSD, but this in fact is not true. What was actually " "occurring was that FreeBSD was proactively paging out unused pages to make " "room for more disk cache while Linux was keeping unused pages in core and " "leaving less memory available for cache and process pages. I do not know " "whether this is still true today." msgstr "" "Годами ходили современные легенды, что Linux выполняет работу по " "предотвращению выгрузки на диск лучше, чем FreeBSD, но это не так. На самом " "деле FreeBSD старается сбросить на диск неиспользуемые страницы для " "освобождения места под дисковый кэш, когда как Linux хранит неиспользуемые " "страницы в памяти и оставляет под кэш и страницы процессов меньше памяти. Я " "не знаю, остаётся ли это правдой на сегодняшний день." #. type: Title == -#: documentation/content/en/articles/vm-design/_index.adoc:255 +#: documentation/content/en/articles/vm-design/_index.adoc:254 #, no-wrap msgid "Pre-Faulting and Zeroing Optimizations" msgstr "Упреждающая оптимизация страничных нарушений и обнуления" #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:265 +#: documentation/content/en/articles/vm-design/_index.adoc:264 msgid "" "Taking a VM fault is not expensive if the underlying page is already in core " "and can simply be mapped into the process, but it can become expensive if " "you take a whole lot of them on a regular basis. A good example of this is " "running a program such as man:ls[1] or man:ps[1] over and over again. If " "the program binary is mapped into memory but not mapped into the page table, " "then all the pages that will be accessed by the program will have to be " "faulted in every time the program is run. This is unnecessary when the " "pages in question are already in the VM Cache, so FreeBSD will attempt to " "pre-populate a process's page tables with those pages that are already in " "the VM Cache. One thing that FreeBSD does not yet do is pre-copy-on-write " "certain pages on exec. For example, if you run the man:ls[1] program while " "running `vmstat 1` you will notice that it always takes a certain number of " "page faults, even when you run it over and over again. These are zero-fill " "faults, not program code faults (which were pre-faulted in already). Pre-" "copying pages on exec or fork is an area that could use more study." msgstr "" "Полагая, что страничное нарушение в VM не является операцией с большими " "накладными расходами, если страница уже находится в основной памяти и может " "быть просто отображена в адресное пространство процесса, может оказаться, " "что это станет весьма накладно, если их будет оказываться регулярно много. " "Хорошим примером этой ситуации является запуск таких программ, как man:ls[1] " "или man:ps[1], снова и снова. Если бинарный файл программы отображён в " "память, но не отображён в таблицу страниц, то все страницы, к которым " "обращалась программа, окажутся недоступными при каждом запуске программы. " "Это не так уж необходимо, если эти страницы уже присутствуют в кэше VM, так " "что FreeBSD будет пытаться восстанавливать таблицы страниц процесса из тех " "страниц, что уже располагаются в VM-кэше. Однако во FreeBSD пока не " "выполняется предварительное копирование при записи определённых страниц при " "выполнении вызова exec. Например, если вы запускаете программу man:ls[1] " "одновременно с работающей `vmstat 1`, то заметите, что она всегда выдаёт " "некоторое количество ошибок доступа к страницам, даже когда вы запускаете её " "снова и снова. Эти ошибки относятся к типу zero-fill и не связаны с доступом " "к коду программы (который уже был предварительно отображён). Предварительное " "копирование страниц при выполнении вызовов exec или fork находятся в " "области, требующей более тщательного изучения." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:274 +#: documentation/content/en/articles/vm-design/_index.adoc:273 msgid "" "A large percentage of page faults that occur are zero-fill faults. You can " "usually see this by observing the `vmstat -s` output. These occur when a " "process accesses pages in its BSS area. The BSS area is expected to be " "initially zero but the VM system does not bother to allocate any memory at " "all until the process actually accesses it. When a fault occurs the VM " "system must not only allocate a new page, it must zero it as well. To " "optimize the zeroing operation the VM system has the ability to pre-zero " "pages and mark them as such, and to request pre-zeroed pages when zero-fill " "faults occur. The pre-zeroing occurs whenever the CPU is idle but the " "number of pages the system pre-zeros is limited to avoid blowing away the " "memory caches. This is an excellent example of adding complexity to the VM " "system to optimize the critical path." msgstr "" "Большой процент страничных нарушений относится к страничным нарушениям при " -"заполнении нулями. Вы можете обычно видеть это, просматривая вывод команды `" -"vmstat -s`. Это происходит, когда процесс обращается к страницам в своей " +"заполнении нулями. Вы можете обычно видеть это, просматривая вывод команды " +"`vmstat -s`. Это происходит, когда процесс обращается к страницам в своей " "области BSS. Область BSS предполагается изначально заполненной нулями, но VM-" "система не заботится о выделении памяти до тех пор, пока процесс реально к " "ней не обратится. При страничном нарушении VM-система должна не только " "выделить новую страницу, но и заполнить её нулями. Для оптимизации операции " "по заполнению нулями в системе VM имеется возможность предварительно " "обнулять страницы и помечать их, и запрашивать уже обнуленные страницы при " "возникновении страничных нарушений заполнения нулями. Предварительное " "заполнение нулями происходит, когда CPU простаивает, однако количество " "страниц, которые система заранее заполняет нулями, ограничено, для того, " "чтобы не переполнить кэши памяти. Это прекрасный пример добавления сложности " "в VM-систему ради оптимизации критического пути." #. type: Title == -#: documentation/content/en/articles/vm-design/_index.adoc:276 +#: documentation/content/en/articles/vm-design/_index.adoc:275 #, no-wrap msgid "Page Table Optimizations" msgstr "Оптимизация таблицы страниц" #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:286 +#: documentation/content/en/articles/vm-design/_index.adoc:285 msgid "" "The page table optimizations make up the most contentious part of the " "FreeBSD VM design and they have shown some strain with the advent of serious " "use of `mmap()`. I think this is actually a feature of most BSDs though I " "am not sure when it was first introduced. There are two major " "optimizations. The first is that hardware page tables do not contain " "persistent state but instead can be thrown away at any time with only a " "minor amount of management overhead. The second is that every active page " "table entry in the system has a governing `pv_entry` structure which is tied " "into the `vm_page` structure. FreeBSD can simply iterate through those " "mappings that are known to exist while Linux must check all page tables that " "_might_ contain a specific mapping to see if it does, which can achieve " "O(n^2) overhead in certain situations. It is because of this that FreeBSD " "tends to make better choices on which pages to reuse or swap when memory is " "stressed, giving it better performance under load. However, FreeBSD " "requires kernel tuning to accommodate large-shared-address-space situations " "such as those that can occur in a news system because it may run out of " "`pv_entry` structures." msgstr "" "Оптимизация таблицы страниц составляет самую содержательную часть " "архитектуры VM во FreeBSD и она проявляется при появлении нагрузки при " "значительном использовании `mmap()`. Я думаю, что это на самом деле " "особенность работы большинства BSD-систем, хотя я не уверен, когда это " "проявилось впервые. Есть два основных подхода к оптимизации. Первый " "заключается в том, что аппаратные таблицы страниц не содержат постоянного " "состояния, а вместо этого могут быть сброшены в любой момент с малыми " "накладными расходами. Второй подход состоит в том, что каждая активная " "таблица страниц в системе имеет управляющую структуру `pv_entry`, которая " "связана в структуру `vm_page`. FreeBSD может просто просматривать эти " "отображения, которые существуют, когда как в Linux должны проверяться все " "таблицы страниц, которые _могут_ содержать нужное отображение, что в " "некоторых ситуация даёт увеличение сложности O(n^2). Из-за того, что FreeBSD " "стремится выбрать наиболее подходящую к повторному использованию или сбросу " "в область подкачки страницу, когда ощущается нехватка памяти, система даёт " "лучшую производительность при нагрузке. Однако во FreeBSD требуется тонкая " "настройка ядра для соответствия ситуациям с большим совместно используемым " "адресным пространством, которые могут случиться в системе, обслуживающей " "сервер телеконференций, потому что структуры `pv_entry` могут оказаться " "исчерпанными." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:291 +#: documentation/content/en/articles/vm-design/_index.adoc:290 msgid "" "Both Linux and FreeBSD need work in this area. FreeBSD is trying to " "maximize the advantage of a potentially sparse active-mapping model (not all " "processes need to map all pages of a shared library, for example), whereas " "Linux is trying to simplify its algorithms. FreeBSD generally has the " "performance advantage here at the cost of wasting a little extra memory, but " "FreeBSD breaks down in the case where a large file is massively shared " "across hundreds of processes. Linux, on the other hand, breaks down in the " "case where many processes are sparsely-mapping the same shared library and " "also runs non-optimally when trying to determine whether a page can be " "reused or not." msgstr "" "И в Linux, и во FreeBSD требуются доработки в этой области. FreeBSD пытается " "максимизировать преимущества от потенциально редко применяемой модели " "активного отображения (к примеру, не всем процессам нужно отображать все " "страницы динамической библиотеки), когда как Linux пытается упростить свои " "алгоритмы. FreeBSD имеет здесь общее преимущество в производительности за " "счет использования дополнительной памяти, но FreeBSD выглядит хуже в случае, " "когда большой файл совместно используется сотнями процессов. Linux, с другой " "стороны, выглядит хуже в случае, когда много процессов частично используют " "одну и ту же динамическую библиотеку, а также работает неоптимально при " "попытке определить, может ли страница повторно использоваться, или нет." #. type: Title == -#: documentation/content/en/articles/vm-design/_index.adoc:293 +#: documentation/content/en/articles/vm-design/_index.adoc:292 #, no-wrap msgid "Conclusion" msgstr "Заключение" #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:298 +#: documentation/content/en/articles/vm-design/_index.adoc:297 msgid "" "Virtual memory in modern operating systems must address a number of " "different issues efficiently and for many different usage patterns. The " "modular and algorithmic approach that BSD has historically taken allows us " "to study and understand the current implementation as well as relatively " "cleanly replace large sections of the code. There have been a number of " "improvements to the FreeBSD VM system in the last several years, and work is " "ongoing." msgstr "" "Виртуальная память в современных операционных системах должна решать " "несколько различных задач эффективно и при разных условиях. Модульный и " "алгоритмический подход, которому исторически следует BSD, позволяет нам " "изучить и понять существующую реализацию, а также сравнительно легко " "изменить большие блоки кода. За несколько последних лет в VM-системе FreeBSD " "было сделано некоторое количество усовершенствований, и работа над ними " "продолжается." #. type: Title == -#: documentation/content/en/articles/vm-design/_index.adoc:300 +#: documentation/content/en/articles/vm-design/_index.adoc:299 #, no-wrap msgid "Bonus QA session by Allen Briggs" -msgstr "" -"Дополнительный сеанс вопросов и ответов от Аллена Бриггса (Allen Briggs)" +msgstr "Дополнительный сеанс вопросов и ответов от Аллена Бриггса (Allen Briggs)" #. type: Title === -#: documentation/content/en/articles/vm-design/_index.adoc:302 +#: documentation/content/en/articles/vm-design/_index.adoc:301 #, no-wrap msgid "What is the interleaving algorithm that you refer to in your listing of the ills of the FreeBSD 3.X swap arrangements?" -msgstr "" -"Что это за алгоритм чередования, который вы упоминали в списке недостатков " -"подсистемы управления разделом подкачки во FreeBSD 3.X?" +msgstr "Что это за алгоритм чередования, который вы упоминали в списке недостатков подсистемы управления разделом подкачки во FreeBSD 3.X?" #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:308 +#: documentation/content/en/articles/vm-design/_index.adoc:307 msgid "" "FreeBSD uses a fixed swap interleave which defaults to 4. This means that " "FreeBSD reserves space for four swap areas even if you only have one, two, " "or three. Since swap is interleaved the linear address space representing " "the \"four swap areas\" will be fragmented if you do not actually have four " "swap areas. For example, if you have two swap areas A and B FreeBSD's " "address space representation for that swap area will be interleaved in " "blocks of 16 pages:" msgstr "" "FreeBSD использует в области подкачки механизм чередования, с индексом по " "умолчанию, равным четырем. Это означает, что FreeBSD резервирует " "пространство для четырёх областей подкачки, даже если у вас имеется всего " "лишь одна, две или три области. Так как в области подкачки имеется " "чередование, то линейное адресное пространство, представляющее \"четыре " "области подкачки\", будет фрагментироваться, если у вас нет на самом деле " "четырёх областей подкачки. Например, если у вас две области A и B, то " "представление адресного пространства для этой области подкачки во FreeBSD " "будет организовано с чередованием блоков из 16 страниц:" #. type: delimited block . 4 -#: documentation/content/en/articles/vm-design/_index.adoc:311 +#: documentation/content/en/articles/vm-design/_index.adoc:310 #, no-wrap msgid "A B C D A B C D A B C D A B C D\n" msgstr "A B C D A B C D A B C D A B C D\n" #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:318 +#: documentation/content/en/articles/vm-design/_index.adoc:317 msgid "" "FreeBSD 3.X uses a \"sequential list of free regions\" approach to " "accounting for the free swap areas. The idea is that large blocks of free " "linear space can be represented with a single list node ([.filename]#kern/" "subr_rlist.c#). But due to the fragmentation the sequential list winds up " "being insanely fragmented. In the above example, completely unused swap " "will have A and B shown as \"free\" and C and D shown as \"all allocated\". " "Each A-B sequence requires a list node to account for because C and D are " "holes, so the list node cannot be combined with the next A-B sequence." msgstr "" "FreeBSD 3.X использует \"последовательный список свободных областей\" для " "управления свободными областями в разделе подкачки. Идея состоит в том, что " "большие последовательные блоки свободного пространства могут быть " -"представлены при помощи узла односвязного списка ([.filename]#kern/subr_rlist" -".c#). Но из-за фрагментации последовательный список сам становится " +"представлены при помощи узла односвязного списка ([.filename]#kern/" +"subr_rlist.c#). Но из-за фрагментации последовательный список сам становится " "фрагментированным. В примере выше полностью неиспользуемое пространство в A " "и B будет показано как \"свободное\", а C и D как \"полностью занятое\". " "Каждой последовательности A-B требуется для учёта узел списка, потому что C " "и D являются дырами, так что узел списка не может быть связан со следующей " "последовательностью A-B." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:320 +#: documentation/content/en/articles/vm-design/_index.adoc:319 msgid "" "Why do we interleave our swap space instead of just tack swap areas onto the " "end and do something fancier? It is a whole lot easier to allocate linear " "swaths of an address space and have the result automatically be interleaved " "across multiple disks than it is to try to put that sophistication elsewhere." msgstr "" "Почему мы организуем чередование в области подкачки вместо того, чтобы " "просто объединить области подкачки в одно целое и придумать что-то более " "умное? Потому что гораздо легче выделять последовательные полосы адресного " "пространства и получать в результате автоматическое чередование между " "несколькими дисками, чем пытаться выдумывать сложности в другом месте." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:325 +#: documentation/content/en/articles/vm-design/_index.adoc:324 msgid "" "The fragmentation causes other problems. Being a linear list under 3.X, and " "having such a huge amount of inherent fragmentation, allocating and freeing " "swap winds up being an O(N) algorithm instead of an O(1) algorithm. " "Combined with other factors (heavy swapping) and you start getting into " "O(N^2) and O(N^3) levels of overhead, which is bad. The 3.X system may also " "need to allocate KVM during a swap operation to create a new list node which " "can lead to a deadlock if the system is trying to pageout pages in a low-" "memory situation." msgstr "" -"Фрагментация вызывает другие проблемы. Являясь последовательным списком в " -"3.X и имея такое огромную фрагментацию, выделение и освобождение в области " +"Фрагментация вызывает другие проблемы. Являясь последовательным списком в 3." +"X и имея такое огромную фрагментацию, выделение и освобождение в области " "подкачки становится алгоритмом сложности O(N), а не O(1). Вместе с другими " "факторами (частое обращение к области подкачки) вы получаете сложность " "уровней O(N^2) и O(N^3), что плохо. В системе 3.X также может потребоваться " "выделение KVM во время работы с областью подкачки для создания нового узла " "списка, что в условии нехватки памяти может привести к блокировке, если " "система попытается сбросить страницы в область подкачки." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:330 +#: documentation/content/en/articles/vm-design/_index.adoc:329 msgid "" "Under 4.X we do not use a sequential list. Instead we use a radix tree and " "bitmaps of swap blocks rather than ranged list nodes. We take the hit of " "preallocating all the bitmaps required for the entire swap area up front but " "it winds up wasting less memory due to the use of a bitmap (one bit per " "block) instead of a linked list of nodes. The use of a radix tree instead " "of a sequential list gives us nearly O(1) performance no matter how " "fragmented the tree becomes." msgstr "" "В 4.X мы не используем последовательный список. Вместо этого мы используем " "базисное дерево и битовые карты блоков области подкачки, а не ограниченный " "список узлов. Мы принимаем предварительное выделение всех битовых карт, " "требуемых для всей области подкачки, но при этом тратится меньше памяти, " "потому что мы используем битовые карты (один бит на блок), а не связанный " "список узлов. Использование базисного дерева вместо последовательного списка " "даёт нам производительность O(1) вне зависимости от фрагментации дерева." #. type: Title === -#: documentation/content/en/articles/vm-design/_index.adoc:331 +#: documentation/content/en/articles/vm-design/_index.adoc:330 #, no-wrap msgid "How is the separation of clean and dirty (inactive) pages related to the situation where you see low cache queue counts and high active queue counts in systat -vm? Do the systat stats roll the active and dirty pages together for the active queue count?" -msgstr "" -"Как разделение чистых и грязных (неактивных) страниц связано с ситуацией, " -"когда вы видите маленький счетчик очереди кэша и большой счетчик активной " -"очереди в выдаче команды systat -vm? Разве системная статистика не считает " -"активные и грязные страницы вместе за счетчик активной очереди?" +msgstr "Как разделение чистых и грязных (неактивных) страниц связано с ситуацией, когда вы видите маленький счетчик очереди кэша и большой счетчик активной очереди в выдаче команды systat -vm? Разве системная статистика не считает активные и грязные страницы вместе за счетчик активной очереди?" #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:336 +#: documentation/content/en/articles/vm-design/_index.adoc:335 msgid "" "Yes, that is confusing. The relationship is \"goal\" verses \"reality\". " "Our goal is to separate the pages but the reality is that if we are not in a " "memory crunch, we do not really have to." msgstr "" "Да, это запутывает. Связь заключается в \"желаемом\" и \"действительном\". " "Мы желаем разделить страницы, но реальность такова, что пока у нас нет " "проблем с памятью, нам это на самом деле не нужно." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:338 +#: documentation/content/en/articles/vm-design/_index.adoc:337 msgid "" "What this means is that FreeBSD will not try very hard to separate out dirty " "pages (inactive queue) from clean pages (cache queue) when the system is not " "being stressed, nor will it try to deactivate pages (active queue -> " "inactive queue) when the system is not being stressed, even if they are not " "being used." msgstr "" "Это означает, что FreeBSD не будет очень сильно стараться над отделением " "грязных страниц (неактивная очередь) от чистых страниц (очередь кэша), когда " -"система не находится под нагрузкой, и не будет деактивировать страницы (" -"активная очередь -> неактивная очередь), когда система не нагружена, даже " +"система не находится под нагрузкой, и не будет деактивировать страницы " +"(активная очередь -> неактивная очередь), когда система не нагружена, даже " "если они не используются." #. type: Title === -#: documentation/content/en/articles/vm-design/_index.adoc:339 +#: documentation/content/en/articles/vm-design/_index.adoc:338 #, no-wrap msgid "In man:ls[1] the / vmstat 1 example, would not some of the page faults be data page faults (COW from executable file to private page)? I.e., I would expect the page faults to be some zero-fill and some program data. Or are you implying that FreeBSD does do pre-COW for the program data?" -msgstr "" -"В примере с man:ls(1) и `vmstat 1` выше могут ли некоторые страничные " -"нарушения быть страничными нарушениями данных (COW из выполнимого файла в " -"приватные страницы)? Иными словами, я ожидаю, что часть страничных нарушений " -"будет связана с заполнением нулями, а часть — с программными данными. Или вы " -"гарантируете, что FreeBSD выполняет предварительно COW для данных программы?" +msgstr "В примере с man:ls(1) и `vmstat 1` выше могут ли некоторые страничные нарушения быть страничными нарушениями данных (COW из выполнимого файла в приватные страницы)? Иными словами, я ожидаю, что часть страничных нарушений будет связана с заполнением нулями, а часть — с программными данными. Или вы гарантируете, что FreeBSD выполняет предварительно COW для данных программы?" #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:345 +#: documentation/content/en/articles/vm-design/_index.adoc:344 msgid "" "A COW fault can be either zero-fill or program-data. The mechanism is the " "same either way because the backing program-data is almost certainly already " "in the cache. I am indeed lumping the two together. FreeBSD does not pre-" "COW program data or zero-fill, but it _does_ pre-map pages that exist in its " "cache." msgstr "" "Страничное нарушение COW может быть связано или с заполнением нулями, или с " "данными программы. Механизм в любом случае один и тот же, потому что " "хранилище данных программы уже в кэше. Я на самом деле не рад ни тому, ни " "другому. FreeBSD не выполняет предварительное COW данных программы и " "заполнение нулями, но она _выполняет_ предварительно отображение страниц, " "которые имеются в её кэше." #. type: Title === -#: documentation/content/en/articles/vm-design/_index.adoc:346 +#: documentation/content/en/articles/vm-design/_index.adoc:345 #, no-wrap msgid "In your section on page table optimizations, can you give a little more detail about pv_entry and vm_page (or should vm_page be vm_pmap-as in 4.4, cf. pp. 180-181 of McKusick, Bostic, Karel, Quarterman)? Specifically, what kind of operation/reaction would require scanning the mappings?" -msgstr "" -"В вашем разделе об оптимизации таблицы страниц, не могли бы вы более " -"подробно рассказать о pv_entry и vm_page (или vm_page должна быть vm_pmap-" -"как в 4.4, cf. pp. 180-181 of McKusick, Bostic, Karel, Quarterman)? А именно " -"какое действие/реакцию должно потребоваться для сканирования отображений?" +msgstr "В вашем разделе об оптимизации таблицы страниц, не могли бы вы более подробно рассказать о pv_entry и vm_page (или vm_page должна быть vm_pmap-как в 4.4, cf. pp. 180-181 of McKusick, Bostic, Karel, Quarterman)? А именно какое действие/реакцию должно потребоваться для сканирования отображений?" #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:350 +#: documentation/content/en/articles/vm-design/_index.adoc:349 msgid "" "A `vm_page` represents an (object,index#) tuple. A `pv_entry` represents a " "hardware page table entry (pte). If you have five processes sharing the " "same physical page, and three of those processes's page tables actually map " "the page, that page will be represented by a single `vm_page` structure and " "three `pv_entry` structures." msgstr "" "`vm_page` представляет собой пару (object,index#). `pv_entry` является " "записью из аппаратной таблицы страниц (pte). Если у вас имеется пять " "процессов, совместно использующих одну и ту же физическую страницу, и в трёх " "таблицах страниц этих процессов на самом деле отображается страница, то " "страница будет представляться одной структурой `vm_page` и тремя структурами " "`pv_entry`." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:353 +#: documentation/content/en/articles/vm-design/_index.adoc:352 msgid "" "`pv_entry` structures only represent pages mapped by the MMU (one `pv_entry` " "represents one pte). This means that when we need to remove all hardware " "references to a `vm_page` (to reuse the page for something else, page it " "out, clear it, dirty it, and so forth) we can simply scan the linked list of " "pv_entry's associated with that vm_page to remove or modify the pte's from " "their page tables." msgstr "" "Структуры `pv_entry` представляют страницы, отображаемые MMU (одна структура " "`pv_entry` соответствует одной pte). Это означает, что, когда нам нужно " "убрать все аппаратные ссылки на `vm_page` (для того, чтобы повторно " "использовать страницу для чего-то ещё, выгрузить её, очистить, пометить как " "грязную и так далее), мы можем просто просмотреть связный список структур " "`pv_entry`, связанных с этой `vm_page`, для того, чтобы удалить или изменить " "pte из их таблиц страниц." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:360 +#: documentation/content/en/articles/vm-design/_index.adoc:359 msgid "" "Under Linux there is no such linked list. To remove all the hardware page " "table mappings for a `vm_page` linux must index into every VM object that " "_might_ have mapped the page. For example, if you have 50 processes all " "mapping the same shared library and want to get rid of page X in that " "library, you need to index into the page table for each of those 50 " "processes even if only 10 of them have actually mapped the page. So Linux " "is trading off the simplicity of its design against performance. Many VM " "algorithms which are O(1) or (small N) under FreeBSD wind up being O(N), " "O(N^2), or worse under Linux. Since the pte's representing a particular " "page in an object tend to be at the same offset in all the page tables they " "are mapped in, reducing the number of accesses into the page tables at the " "same pte offset will often avoid blowing away the L1 cache line for that " "offset, which can lead to better performance." msgstr "" "В Linux нет такого связного списка. Для того, чтобы удалить все отображения " "аппаратной таблицы страниц для `vm_page`, linux должен пройти по индексу " "каждого объекта VM, который _может_ отображать страницу. К примеру, если у " "вас имеется 50 процессов, которые все отображают ту же самую динамическую " "библиотеку и хотите избавиться от страницы X в этой библиотеке, то вам нужно " "пройтись по индексу всей таблицы страниц для каждого из этих 50 процессов, " "даже если только 10 из них на самом деле отображают страницу. Так что Linux " "использует простоту подхода за счет производительности. Многие алгоритмы VM, " "которые имеют сложность O(1) или (N малое) во FreeBSD, в Linux приобретают " "сложность O(N), O(N^2) или хуже. Так как pte, представляющий конкретную " "страницу в объекте, скорее всего, будет с тем же смещением во всех таблицах " "страниц, в которых они отображаются, то уменьшение количества обращений в " "таблицы страниц по тому же самому смещению часто позволяет избежать " "разрастания кэша L1 для этого смещения, что приводит к улучшению " "производительности." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:362 +#: documentation/content/en/articles/vm-design/_index.adoc:361 msgid "" "FreeBSD has added complexity (the `pv_entry` scheme) to increase performance " "(to limit page table accesses to _only_ those pte's that need to be " "modified)." msgstr "" "Во FreeBSD введены дополнительные сложности (схема с `pv_entry`) для " "увеличения производительности (уменьшая количество обращений _только_ к тем " "pte, которые нужно модифицировать)." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:366 +#: documentation/content/en/articles/vm-design/_index.adoc:365 msgid "" "But FreeBSD has a scaling problem that Linux does not in that there are a " "limited number of `pv_entry` structures and this causes problems when you " "have massive sharing of data. In this case you may run out of `pv_entry` " "structures even though there is plenty of free memory available. This can " "be fixed easily enough by bumping up the number of `pv_entry` structures in " "the kernel config, but we really need to find a better way to do it." msgstr "" "Но во FreeBSD имеется проблема масштабирования, которой нет в Linux, потому " "что имеется ограниченное число структур `pv_entry`, и это приводит к " "возникновению проблем при большом объёме совместно используемых данных. В " "этом случае у вас может возникнуть нехватка структур `pv_entry`, даже если " "свободной памяти хватает. Это может быть достаточно легко исправлено " "увеличением количества структур `pv_entry` при настройке, но на самом деле " "нам нужно найти лучший способ делать это." #. type: Plain text -#: documentation/content/en/articles/vm-design/_index.adoc:369 +#: documentation/content/en/articles/vm-design/_index.adoc:368 msgid "" "In regards to the memory overhead of a page table verses the `pv_entry` " "scheme: Linux uses \"permanent\" page tables that are not throw away, but " "does not need a `pv_entry` for each potentially mapped pte. FreeBSD uses " "\"throw away\" page tables but adds in a `pv_entry` structure for each " "actually-mapped pte. I think memory utilization winds up being about the " "same, giving FreeBSD an algorithmic advantage with its ability to throw away " "page tables at will with very low overhead." msgstr "" "Что касается использования памяти под таблицу страниц против схемы с " "`pv_entry`: Linux использует \"постоянные\" таблицы страниц, которые не " "сбрасываются, но ему не нужны `pv_entry` для каждого потенциально " "отображаемого pte. FreeBSD использует \"сбрасываемые\" таблицы страниц, но " "для каждого реально отображаемого pte добавляется структура `pv_entry`. Я " "думаю, что использование памяти будет примерно одинакова, тем более что у " "FreeBSD есть алгоритмическое преимущество, заключающееся в способности " "сбрасывать таблицы страниц с очень малыми накладными расходами."